EpSiLoNPoInTOrI/IKEV2-POC
GitHub: EpSiLoNPoInTOrI/IKEV2-POC
这是一个针对Windows IKEv2双重释放漏洞的混淆漏洞利用原型,用于安全研究和红队测试。
Stars: 3 | Forks: 0
# EpSiLoNPoInTIkEv2.cpp
## 描述
`EpSiLoNPoInTIkEv2.cpp` 是一个针对 Windows 的 C/C++ 原型漏洞利用程序,其开发基于对
**`ikeext.dll` 中 double-free 漏洞的利用**(Windows 的 IKEv2 驱动程序),在当前研究中被引用为
`CVE-2026-33824`。
该项目包含:
- 一套完整的混淆层(虚拟机、控制流混淆、字符串隐藏、伪造二进制签名、内联 ASM 反分析)。
- 一个完整的 IKEv2 漏洞利用引擎(构建数据包、SKF 分片、多线程堆整理、ROP 链、任意读写原语)。
- 绕过 Windows Defender、AMSI 和 ETW 的机制。
- 一个集成的、监听端口 4444 的反向 shell 监听器。
- 一个用于检查可疑内存区域的局部 GUI(ListView、ComboBox、状态栏)。
## 代码架构
### 1. 混淆层 (`EpSi_OBF_ENDL` / 受 obfusheader 启发)
代码使用了一层重度混淆,通过 `#define EpSi_OBF_ENDL` 在编译时启用。
基于 [obfusheader.h](https://github.com/ac3ss0r/obfusheader.h) 进行改编和扩展。
#### 伪造二进制签名 (`FAKE_SIGNS == 1`)
自定义的 PE 段被注入到二进制文件中,以欺骗已知保护器的扫描器:
- `.vmp0`, `.vmp1`, `.vmp2` → VMProtect
- `UPX0` → UPX
- `.enigma1`, `.enigma2` → Enigma Protector
- `.winlice` → Themida
- `.petite`, `.aspack`, `.adata`, `.rlp`, `.vlizer`, `.arch`, `.alien`, `.pwdprot`,
`.dsstext`, `logicoma`, `__wibu00`, `__wibu01`, `PETETRIS`, `.tw`, `.rdata` (Nuitka), `.text` (Screen2Exe) 等。
- 模仿 Enigma (`0x45,0x6e,0x69,...`) 和 Denuvo (`0x64,0x65,0x6E,...`) 的编码字符串。
- `FAKE_DONGLE[]` 数组模仿硬件加密狗:`skeydrv.dll`, `HASPDOSDRV`,
`MARXDEV1.SYS`, `WIBUKEY`, `SNTNLUSB`, `RNBOspro` 等。
#### 算术虚拟机 (`VIRT == 1`)
所有算术和逻辑运算都可以路由到内部虚拟机 (`Obfh_VirtualMachine`):
- 操作码 (`OP__ADD`, `OP__SUB`, ..., `OP__NOP`) 在编译时通过 `__COUNTER__` 和 `RND()` 随机生成。
- 每个操作码都是加密的:`_VM_ENCRYPT_INT(value) = (value - _VM_MUTATOR_KEY) * ~SALT_CMD`。
- 操作数经过加盐、取反 (`* -1`),并混入垃圾值传递。
- 虚拟机本身填充了 `goto`、负的假 `case`、`BREAK_STACK_*`(内联 ASM `xor; jz; .byte 0xE8; cpuid`)、假的 JMP (`.byte 0xFF, 0x25`) 和用于欺骗反编译器的 x86_64 假代码块。
- 暴露的宏:`VM_ADD`, `VM_SUB`, `VM_MUL`, `VM_DIV`, `VM_MOD`, `VM_EQU`, `VM_NEQ`,
`VM_LSS`, `VM_GTR`, `VM_LEQ`, `VM_GEQ`, `VM_OBF_INT`, `VM_ADD_DBL`, `VM_MUL_DBL` 等。
#### 混淆的控制流 (`NO_CFLOW != 1`)
- `#define if(cond)`:每个 `if` 注入一个 `__s_rdtsc()` 调用和一个死代码 `BAD_CALL`。
- `#define else`:在真正的 `else` 之前注入一个死代码 `else if (0) { BAD_CALL; }`。
- `#define while(...)`:通过 `__s_rdtsc() != 0.1` 和一个荒谬的指针检查来限定条件。
- `#define for(...)`:通过 `OBFUS_CONDITION_BLOCK` 限定条件。
- `#define switch(...)`:通过 `OBFUS_CONDITION_BLOCK` 限定条件。
- `#define break`:在每个 `break` 前注入 `if (OBFUS_CONDITION_BLOCK) BREAK_STACK_1`。
#### 字符串隐藏 (`HIDE_STRING`)
- `STACK_STRING(str)`:通过复合字面量将字符串压入栈。
- `HIDE_STRING(str)`:结合 `obfh_process_hidden_string()` 和 `__s_rdtsc()`,并使用死代码 `BAD_JMP` 在二进制文件中隐藏字符串。
#### API 代理(完整的动态解析)
所有 CRT 和 Win32 函数都被重定向:
- **CRT** 通过 `GetProcAddress(LoadLibraryA("msvcrt"), ...)` 动态解析:`printf`, `scanf`,
`sprintf`, `strlen`, `strcmp`, `strcpy`, `strtok`, `memset`, `memcpy`, `strchr`, `strrchr`,
`rand`, `realloc`, `calloc`, `fopen`, `fclose`, `fread`, `fwrite`, `exit`, `snprintf`,
`vsprintf`, `vsnprintf`, `getenv`, `system`, `abort`, `atexit`, `getcwd`, `tolower`, `toupper`。
- **Win32** 通过所有参数上的 `obfh_int_proxy()` 包装器:`CreateFile`,
`ReadFile`, `WriteFile`, `CloseHandle`, `VirtualAlloc`, `VirtualFree`, `CreateThread`,
`WaitForSingleObject`, `WaitForMultipleObjects`, `ExitProcess`, `GetModuleHandle`,
`GetModuleFileName`, `HeapCreate`, `HeapAlloc`, `HeapFree`, `GlobalAlloc`, `GlobalFree`,
`GetTempPath`, `SetEvent`, `ResetEvent`, `Sleep`, `memmove`, `GetParent`, `GetWindowRect`,
`GetClientRect`, `SetWindowPos`, `SetConsoleTextAttribute`, `GetDesktopWindow`, `GetStockObject`。
- `GetProcAddress` 被 `GetProcAddress_custom` 替换:手动遍历 `IMAGE_EXPORT_DIRECTORY`
(解析 PE:`e_lfanew`, `IMAGE_NT_HEADERS`, `IMAGE_DIRECTORY_ENTRY_EXPORT`, `AddressOfFunctions`,
`AddressOfNames`, `AddressOfNameOrdinals`)。
- `LoadLibraryA` 被混淆为 6 个嵌套包装器的链 (`LoadLibraryA_0` 到 `LoadLibraryA_proxy`),
通过易失性变量 `_k, _e, _r, _n, _e, _l` 和 `sprintf` 逐字符重建 DLL 名称。
#### 反调试 (`ANTI_DEBUG_V2 == 1`)
- 专用线程 (`ThreadCompareDRs`):`SuspendThread` 主线程,`GetThreadContext`
并检查 `CONTEXT_DEBUG_REGISTERS`,验证 `Dr0`–`Dr3`, `Dr7`,通过 `ad_ZeroDRs` 清零。
- `IsDebuggerPresent_proxy`:动态加载 `kernel32.dll`,通过易失性变量 (`_I, _s, _D, _e,
_b, _u, _g, _g, _e, _r, _P, _r, _e, _s, _e, _n, _t`) 逐字符重建函数名 `IsDebuggerPresent`,
通过 `GetProcAddress` 调用。
- 宏 `ANTI_DEBUG`:双重检查 `IsDebuggerPresent() || IsDebuggerPresent_proxy()`,
触发 `loop()` (无限循环), `.byte 0xED` (特权 IN 指令), `BREAK_STACK_1`, `ret` ASM,
然后是 `crash()` (`int $3` + `.byte 0xED, 0x00`)。
#### BREAK_STACK 宏(反栈分析)
9 种内联 ASM 变体序列插入到敏感函数中:
`xor; jz; .byte 0xE8; cpuid` (在 `eax`, `ebx`, `edx` 上的变体), 假操作码 `0x50`, `0x20`,
`0x00`, `0xEB, 0xE1` (x86), `0xFF, 0x25, 0xF1, 0xF2, 0xF3, 0xF4` (x86_64)。
### 2. IKEv2 引擎 / 漏洞利用
#### 依赖项
```
#include "runassys/ntnative.h"
#include "runassys/runassys.h"
#include "runassys/ntdll-stubs/ntdll-stubs.c"
#include "runassys/ntdll-stubs/ntdll.def.c"
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "bcrypt.lib")
#pragma comment(lib, "Version.lib")
```
#### 漏洞利用常量
- 目标:`IKEEXT_BASE_ADDRESS = 0x180000000`
- Double free 偏移:`g_IkeextDoubleFreeOffset = 0x12B960`
- IKE 载荷处理程序:`g_IkeextProcessIkePayload = 0x52220`
- ikeext 的 PE 目录:导出 (`0x1790A0`)、导入 (`0x179110`)、异常 (`0x183000`)、
重定位 (`0x18C000`)、加载配置 (`0x12AE70`)、调试 (`0x155CD0`)。
- 内部结构偏移:`g_Offset_MMSA_SecurityRealmBlob = 0x208`,
`g_Offset_PacketContext_Blob = 0xC8`。
- IKEv2 端口:`500 (UDP)`,回调 shell:`4444`。
#### 定义的 IKEv2 结构体
`IKE_HEADER`, `IKE_SA_PAYLOAD`, `IKE_PROPOSAL_PAYLOAD`, `IKE_TRANSFORM_PAYLOAD`,
`IKE_NONCE_PAYLOAD` (32 字节随机数), `IKE_KEY_EXCHANGE_PAYLOAD` (DH 256 字节),
`IKE_NOTIFY_PAYLOAD`, `IKE_VENDOR_ID_PAYLOAD`, `IKE_SKF_FRAGMENT_PAYLOAD`。
配置的变换:AES-CBC-128 (`12`)、PRF HMAC-SHA2-256 (`5`),
INTEG HMAC-SHA2-256-128 (`12`)、DH MODP-2048 (`14`)。
#### 自定义 DDoS 结构体
- `IKE_DDOS_AMPLIFIER_PAYLOAD`:放大系数 + 64 字节触发数据。
- `IKE_DDOS_LOOP_PAYLOAD`:循环计数器 + 32 字节循环代码。
- `IKE_DDOS_MEMORY_PAYLOAD`:分配大小/数量 + 64 字节堆喷洒数据。
#### 堆整理
- `HEAP_GROOM_CONTEXT`:堆句柄、目标地址、线程、停止标志、已分配块。
- `HEAP_GROOM_THREAD_PARAMS`:块大小、迭代次数、线程 ID、SRWLOCK、`use_nt_allocate`。
- `GROOM_CONFIG`:线程数、迭代次数、延迟、块大小、最小/最大空闲百分比。
- 参数:4 个线程,`0x1000` 大小的块,1000 次迭代,碎片率在 30–70% 之间。
#### ROP 链
完整的 `ROP_CHAIN` 结构包含所有必要的 gadget:
`pop_rax/rcx/rdx/r8/r9/rsp`, `mov_rax_rsp`, `mov_rcx_rsp`, `mov_rcx_rax`, `mov_rax_rcx`,
`mov_rcx_rdx`, `xor_rax/rcx/rdx`, `jmp_rsp`, `call_rax`, `ret`, `virtual_protect`,
`disable_cfg`, `disable_cet`, `add_rsp`, `sub_rsp`, `stack_pivot`。
大小为 512 的 gadget 数组 (`rop_chain[MAX_ROP_CHAIN_SIZE]`)。
#### ROP gadget 扫描器
大约 50 多个字节签名模式的表 `g_rop_patterns[]`,用于在模块中定位 gadget:
`pop rax; ret`, `pop rcx; ret`, `pop rdx; ret`, ..., `mov [rcx], rax; ret`,
`mov rax, [rcx]; ret`, `jmp rsp`, `VirtualProtect prologue`,
`mov [gs:0x60], rax; ret`, `jmp [rax+0x58]; ret`, `lea rax, [rip+0x0]; jmp rax`,
`add rsp, 0x28; ret`, `cmp rdx/r8/r9, 0x0; je/jne; ret` 等。
#### 漏洞利用全局变量
```
uint64_t g_KernelBase, g_IkeextBase, g_SystemEprocess;
uint64_t g_IkeextDoubleFreeOffset = 0x12B960;
uint64_t g_IkeextProcessIkePayload = 0x52220;
uint64_t g_PopRax, g_PopRcx, g_PopRdx, g_PopR8, g_PopR9, g_PopRsp;
uint64_t g_MovRaxRsp, g_JmpRsp, g_VirtualProtect, g_DisableCFG, g_StackPivot;
uint64_t g_NtoskrnlBase, g_Kernel32Base, g_NtdllBase, g_HeapBase, g_ShellcodeAddr;
SOCKET g_Socket; struct sockaddr_in g_Target;
EXPLOIT_CONTEXT g_ExploitCtx; ROP_CHAIN g_RopChain;
HEAP_GROOM_CONTEXT g_GroomContext;
MODULE_DATA g_Modules; ROP_GADGET g_Gadgets;
std::vector g_Regions;
```
#### 主流程 (`main`)
1. `InitializeCriticalSection`, `init_debug_info`。
2. `is_hostile_environment()` → 如果检测到沙箱/虚拟机则退出。
3. `disable_amsi()`, `disable_defender()`, `disable_etw()`, `patch_etw()`。
4. `start_shell_listener()` → 在端口 4444 启动反向 shell 监听器。
5. 解析 `argv[1]`(目标 IP)+ `argv[2]`(端口,默认 500)。
6. `init_udp_socket()` + `inet_pton` + `test_target_reachability()`。
7. 构建并发送分片的 IKEv2 数据包(SKF,最多 `SKF_FRAGMENTS + 1` 个数据包)。
8. 触发 double free,进行堆整理,放置 shellcode,执行 ROP 链。
## 当前状态
**该项目正在完善中,尚未完全具备功能。**
- 某些引用的函数(`disable_amsi`, `disable_defender`, `disable_etw`,
`patch_etw`, `is_hostile_environment`, `test_target_reachability`, `start_shell_listener`,
`stop_shell_listener`, `print_usage`, `init_debug_info`)已声明,但根据构建状态可能
不完整或缺失。
- ikeext 的偏移是静态的,特定于某个 Windows 版本。尚无最终的动态偏移解析机制。
- ROP 链已构建,但 shellcode 的放置和激活在当前状态下尚未完全集成。
- GUI 的某些部分(ListView、ComboBox、区域扫描)已部分集成。
- 该项目可能需要对构建系统、`runassys/` 依赖项和链接库进行调整才能编译。
## 免责声明
此代码库包含一个针对底层网络利用向量(IKEv2/ikeext.dll, Windows)的
攻击性安全研究原型。
此代码的使用严格限于您拥有明确授权的测试、研究或实验环境。
作者对任何非法、未经授权或破坏性使用此代码不承担任何责任。
代码按原样提供,不保证其功能、稳定性或无不良影响。
**该项目仍在完善中,当前状态下并非完全功能。**
标签:API钩子, Conpot, CVE-2026-33824, DNS 反向解析, DOM解析, GUI工具, IKEv2协议, PE文件操作, ROP链, Shellcode, Web报告查看器, Windows安全, 中高交互蜜罐, 二进制安全, 内存攻击, 双重释放漏洞, 反向Shell, 反调试, 堆喷射, 多线程攻击, 威胁模拟, 字符串编码, 恶意软件开发, 情报收集, 技术调研, 混淆技术, 漏洞研究, 端点可见性, 系统驱动漏洞, 网络安全, 虚拟机保护, 隐私保护