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报告查看器, 协议分析, 攻击诱捕, 权限提升, 欺骗防御