免杀专题
17、CVE-2019-1388UAC提权
1. 课程目标
学习CVE-2019-1388漏洞的原理和利用方法,这是一个利用证书对话框实现UAC绕过的经典漏洞。
1.1 学习目标
- 理解CVE-2019-1388漏洞原理
- 掌握漏洞利用步骤
- 了解受影响的Windows版本
- 学习防御和检测方法
2. 漏洞概述
| 属性 | 值 |
|---|---|
| CVE编号 | CVE-2019-1388 |
| 漏洞类型 | UAC绕过/本地提权 |
| 影响组件 | Windows证书对话框 |
| CVSS评分 | 7.8 (高) |
| 发现时间 | 2019年 |
| 补丁 | KB4525235 (2019年11月) |
2.1 受影响版本
- Windows 7
- Windows 8/8.1
- Windows 10 (1903之前)
- Windows Server 2008/2012/2016/2019
3. 漏洞原理
3.1 原理说明
1. 运行一个需要UAC提权的签名程序
2. 在UAC对话框中点击"显示发布者证书信息"
3. 证书对话框中有"颁发者"超链接
4. 点击超链接会以SYSTEM权限打开浏览器
5. 通过浏览器的"另存为"功能获得SYSTEM权限的文件对话框
6. 利用文件对话框启动cmd.exe获得SYSTEM shell
3.2 漏洞流程图
┌─────────────────────────────────────────────────────────┐
│ 1. 运行签名的提权程序(如hhupd.exe) │
│ 触发UAC对话框 │
└──────────────────────┬──────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 2. 点击"显示有关此发布者证书的信息" │
│ 打开证书详情对话框 │
└──────────────────────┬──────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 3. 点击"颁发者"字段的超链接 │
│ 关键:此操作继承了consent.exe的SYSTEM权限 │
└──────────────────────┬──────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 4. 以SYSTEM权限打开默认浏览器 │
│ 浏览器进程具有SYSTEM权限 │
└──────────────────────┬──────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 5. 在浏览器中按Ctrl+S打开"另存为"对话框 │
│ 文件对话框也具有SYSTEM权限 │
└──────────────────────┬──────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 6. 在地址栏输入cmd.exe并执行 │
│ 获得SYSTEM权限的命令行 │
└─────────────────────────────────────────────────────────┘
4. 手动利用步骤
4.1 准备工作
- 获取一个有签名的需要提权的可执行文件
- 推荐使用旧版本的
hhupd.exe(HTML Help可执行更新程序) - 其他可用文件:旧版Adobe、Flash更新程序等
4.2 详细步骤
步骤1: 右键以管理员身份运行目标程序
→ 出现UAC对话框
步骤2: 点击"显示有关此发布者证书的信息"
→ 打开证书窗口
步骤3: 在"常规"选项卡找到"颁发者"
→ 点击颁发者的URL链接(蓝色超链接)
步骤4: 等待浏览器打开(此时浏览器是SYSTEM权限)
→ 注意:不要点击UAC的"是"或"否"
步骤5: 在浏览器中按Ctrl+S
→ 打开"另存为"对话框
步骤6: 在文件名或地址栏输入:
C:\Windows\System32\cmd.exe
→ 按回车
步骤7: 获得SYSTEM权限的命令行
→ 执行whoami验证
5. 自动化利用代码
5.1 辅助脚本概念
由于这个漏洞主要依赖GUI操作,完全自动化需要模拟鼠标点击:
#include <windows.h>
#include <stdio.h>
// 注意:这是概念性代码,实际利用需要精确的坐标和时机
BOOL ExploitCVE2019_1388() {
printf("[*] CVE-2019-1388 利用演示\n");
printf("[!] 此漏洞需要GUI交互\n\n");
// 1. 启动目标程序触发UAC
printf("[1] 启动hhupd.exe...\n");
ShellExecuteW(NULL, L"runas", L"hhupd.exe", NULL, NULL, SW_SHOW);
Sleep(2000);
// 2. 模拟点击"显示证书信息"
// 需要找到UAC对话框并点击
HWND hUAC = FindWindowW(NULL, L"用户帐户控制");
if (hUAC) {
printf("[2] 找到UAC对话框\n");
// 模拟点击...这里需要精确的坐标
}
printf("[*] 后续步骤需要手动操作:\n");
printf(" - 点击证书链接\n");
printf(" - 在浏览器中Ctrl+S\n");
printf(" - 输入cmd.exe路径\n");
return TRUE;
}
int main() {
ExploitCVE2019_1388();
return 0;
}
5.2 PowerShell辅助脚本
# CVE-2019-1388 辅助信息脚本
# 检查系统是否打补丁
function Check-Patched {
$hotfix = Get-HotFix -Id KB4525235 -ErrorAction SilentlyContinue
if ($hotfix) {
Write-Host "[!] 系统已打补丁 KB4525235" -ForegroundColor Red
return $true
} else {
Write-Host "[+] 系统未打补丁,可能存在漏洞" -ForegroundColor Green
return $false
}
}
# 检查Windows版本
function Check-Version {
$os = Get-WmiObject Win32_OperatingSystem
Write-Host "[*] 系统版本: $($os.Caption) $($os.Version)"
$build = [int]$os.BuildNumber
if ($build -lt 18362) {
Write-Host "[+] 版本可能受影响" -ForegroundColor Green
} else {
Write-Host "[!] 版本可能已修复" -ForegroundColor Yellow
}
}
# 主函数
Write-Host "=== CVE-2019-1388 检查工具 ===" -ForegroundColor Cyan
Check-Version
Check-Patched
6. 技术细节分析
6.1 为什么浏览器有SYSTEM权限
consent.exe (SYSTEM权限)
↓ 创建
证书对话框 (继承SYSTEM权限)
↓ 点击超链接
ShellExecute() (以SYSTEM身份调用)
↓ 启动
浏览器进程 (继承SYSTEM权限)
6.2 关键点
- consent.exe: UAC的核心进程,运行在SYSTEM权限下
- 证书对话框: 作为consent.exe的子窗口,继承其权限
- 超链接处理: 使用ShellExecute打开URL,继承父进程权限
- 浏览器继承: 默认浏览器继承了SYSTEM权限
7. 检测与防御
7.1 检测方法
| 检测点 | 方法 |
|---|---|
| 进程监控 | consent.exe创建浏览器进程 |
| 权限异常 | 浏览器以SYSTEM权限运行 |
| 行为分析 | 浏览器执行cmd.exe |
7.2 防御措施
- 安装补丁: KB4525235
- 升级系统: Windows 10 1903+
- 限制证书对话框: 组策略配置
- 监控异常进程: SIEM规则
7.3 验证补丁
#include <windows.h>
#include <stdio.h>
BOOL IsPatched() {
// 检查KB4525235或更新的补丁
// 简化方法:检查Windows版本
OSVERSIONINFOEXW osvi = { sizeof(osvi) };
DWORDLONG dwlConditionMask = 0;
VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
osvi.dwBuildNumber = 18363; // 1909
if (VerifyVersionInfoW(&osvi, VER_BUILDNUMBER, dwlConditionMask)) {
return TRUE; // 版本足够新,已修复
}
return FALSE;
}
8. 相关漏洞
| CVE | 描述 |
|---|---|
| CVE-2019-1388 | 本课内容 |
| CVE-2019-0841 | Windows AppX提权 |
| CVE-2019-1405 | UPnP服务提权 |
9. 课后作业
9.1、作业1:环境搭建(必做)
- 搭建未打补丁的Windows 7/10虚拟机
- 准备利用所需的签名程序
9.2、作业2:手动利用(必做)
- 按照步骤手动利用漏洞
- 验证获得的权限级别
9.3、作业3:检测规则(进阶)
- 编写检测consent.exe异常行为的规则
- 监控SYSTEM权限的浏览器进程
10. 下一课预告
下一课我们将学习白名单DLL劫持绕UAC技术。