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, 反调试, 堆喷射, 多线程攻击, 威胁模拟, 字符串编码, 恶意软件开发, 情报收集, 技术调研, 混淆技术, 漏洞研究, 端点可见性, 系统驱动漏洞, 网络安全, 虚拟机保护, 隐私保护