curtishoughton/MS16-032-Cobalt-Strike-LPE-BOF
GitHub: curtishoughton/MS16-032-Cobalt-Strike-LPE-BOF
MS16-032 本地权限提升漏洞的 Cobalt Strike BOF 实现,支持自动提升至 SYSTEM 并直接注入 beacon。
Stars: 0 | Forks: 0
# MS16-032 Beacon Object File (BOF)
MS16-032 本地权限提升漏洞(CVE-2016-0099)的 Cobalt Strike Beacon Object File (BOF) 实现,支持直接 beacon 注入。
## 概述
MS16-032 利用 Windows Secondary Logon Service (`seclogon`) 中的竞态条件来获取 SYSTEM token 并注入新的 beacon。
## 易受攻击的系统
- Windows 7(所有版本)
- Windows 8 / 8.1(所有版本)
- Windows 10(补丁前)
- Windows Server 2008 / 2008 R2
- Windows Server 2012 / 2012 R2
**注意:** 系统必须是未修补的(即在 2016 年 3 月的 KB3139914 之前)。需要 2 个或以上的逻辑处理器。
## 功能
- 纯 BOF 实现(无 CRT 依赖)
- 正确的 MS16-032 竞态条件利用
- 通过 Early Bird APC 直接进行 beacon 注入(无 `CreateRemoteThread`)
- RW->RX 内存保护(无 RWX 分配)
- 通过互锁标志实现线程的干净关闭(无 `TerminateThread`)
- 完整的 token 验证(类型、SID、完整性级别)
- 双进程创建回退机制(`CreateProcessWithTokenW` / 模拟)
- CPU 数量预先检查
- 具有可配置尝试次数的重试循环
## 安装说明
### 前置条件
- Cobalt Strike 4.0+
- MinGW-w64 交叉编译器
### 编译
```
# 构建两种架构
make
# 或者单独构建
make x64
make x86
```
或者手动编译(`-o` 标志用于设置正确的输出文件名):
```
x86_64-w64-mingw32-gcc -c ms16032_inject.c -o ms16032_inject.x64.o -masm=intel
i686-w64-mingw32-gcc -c ms16032_inject.c -o ms16032_inject.x86.o -masm=intel
```
**重要:** 输出文件必须命名为 `ms16032_inject.x64.o` / `ms16032_inject.x86.o`,并与 `ms16032_inject.cna` 放在同一个目录下。
### 加载到 Cobalt Strike
1. 将编译后的 `.o` 文件与 `ms16032_inject.cna` 和 `beacon.h` 放在一起
2. 在 Cobalt Strike 中:`Script Manager` -> `Load` -> 选择 `ms16032_inject.cna`
## 使用说明
```
beacon> ms16032_inject
```
自动提升至 SYSTEM 并为指定的 listener 注入新的 beacon。
## 工作原理
### 漏洞原理 (CVE-2016-0099)
Windows Secondary Logon Service (`seclogon`) 以 SYSTEM 权限运行,并处理来自客户端进程的 `CreateProcessWithLogonW` 请求。当它处理请求时,会打开客户端进程的 token 来创建新进程。这里存在一个竞态条件:当多个线程同时调用 `CreateProcessWithLogonW` 时,该服务可能会混淆它正在服务的客户端,并将其自身的 **SYSTEM token** 分配为子进程的主 token。
### 利用过程
1. **预先检查**:验证是否存在 2 个或以上的逻辑 CPU(竞态所需)
2. **竞态条件**:10 个线程同时使用伪造凭据和 `CREATE_SUSPENDED` 疯狂调用 `CreateProcessWithLogonW`
3. **Token 检查**:每个线程通过 `OpenProcessToken` 打开挂起的子进程的 token,并检查它是否为 SYSTEM(SID `S-1-5-18`)
4. **Token 验证**:验证该 token 是否为具有系统级完整性的主 token
5. **Token 捕获**:成功后,复制 SYSTEM token 以供使用
### 注入过程
1. **进程创建**:使用捕获的 token(通过 `CreateProcessWithTokenW` 或模拟回退)以 SYSTEM 权限生成 `dllhost.exe`
2. **内存分配**:在目标进程中分配 RW 内存
3. **Shellcode 写入**:将 beacon shellcode 写入分配的内存中
4. **内存保护**:将内存属性从 RW 翻转为 RX(无 RWX)
5. **APC 注入**:在挂起的线程上排队一个用户 APC —— 在入口点之前执行
6. **执行**:恢复线程,APC 触发,beacon 启动
## OPSEC 注意事项
### 优点
- 没有文件写入磁盘
- 没有 RWX 内存分配 (RW->RX)
- 没有 `CreateRemoteThread`(使用 APC 注入)
- 所有生成的进程都带有 `CREATE_NO_WINDOW` 标志
- BOF 在进程内运行(无 fork & run)
- 通过互锁标志实现线程的干净关闭
### 缺点
- 在竞态期间创建挂起的 `cmd.exe` 进程(产生进程创建事件)
- 对子进程调用 `OpenProcessToken`
- 向 `dllhost.exe` 进程注入
- 多次快速调用 `CreateProcessWithLogonW`(产生 seclogon 活动)
### 检测向量
- Sysmon Event ID 1:连续快速出现多个挂起的 `cmd.exe` 进程
- Sysmon Event ID 10:对子进程调用 `OpenProcessToken`
- Sysmon Event ID 1:`dllhost.exe` 由异常的父进程生成
- ETW:向 seclogon 快速调用 `CreateProcessWithLogonW`
### 规避改进
您可以在 `ms16032_inject.c` 中修改注入目标:
```
// Default
wchar_t target[] = L"C:\\Windows\\System32\\dllhost.exe";
// Alternatives:
// wchar_t target[] = L"C:\\Windows\\System32\\RuntimeBroker.exe";
// wchar_t target[] = L"C:\\Windows\\System32\\svchost.exe";
```
## 故障排除
### "需要2个或更多逻辑 CPU"
竞态条件仅在多处理器系统上有效。单 CPU 的虚拟机将始终失败。
### 尝试所有次数后仍无 SYSTEM token
- **系统已修补**:使用 `systeminfo` 检查是否存在 KB3139914
- **竞态未触发**:重新运行 —— 竞态条件是概率性的
- **seclogon 未运行**:Secondary Logon 服务必须正在运行(`sc query seclogon`)
### Beacon 未回连
- 验证 listener 配置是否正确
- 检查 SYSTEM 上下文中的防火墙规则
- 尝试 SMB 或 TCP listener
- 确保架构匹配(x64 对应 x86)
### "无法生成 SYSTEM 进程"
- 需要 `SeImpersonatePrivilege` —— 这在管理员/服务上下文中是标准配置
- 如果两种创建方法都失败,请尝试从不同的用户上下文中运行
## 参考
- [Microsoft 安全公告 MS16-032](https://docs.microsoft.com/en-us/security-updates/securitybulletins/2016/ms16-032)
- [CVE-2016-0099](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-0099)
## 法律免责声明
本工具仅用于授权的安全测试和教育目的。未经授权访问计算机系统是违法行为。在测试之前,请务必获得适当的授权。
标签:BOF, Cobalt Strike, SCP, Web报告查看器, 协议分析, 攻击诱捕, 权限提升, 欺骗防御