
Windows CLFS LPE exploit PoC для исследований в области безопасности
🚨 EXPLOIT PoC — ТОЛЬКО ДЛЯ ИССЛЕДОВАНИЙ БЕЗОПАСНОСТИ, АНАЛИЗА УЯЗВИМОСТЕЙ И ЗАЩИТНЫХ ЦЕЛЕЙ
🚨 EXPLOIT PoC — ТОЛЬКО ДЛЯ ИССЛЕДОВАНИЙ БЕЗОПАСНОСТИ, АНАЛИЗА УЯЗВИМОСТЕЙ И ЗАЩИТНЫХ ЦЕЛЕЙ
CVE-2025-60709 — это уязвимость локального повышения привилегий (LPE) в драйвере CLFS.sys (Common Log File System) Windows. Она позволяет атакующему с локальным выполнением кода повысить привилегии от стандартного пользователя до NT AUTHORITY\SYSTEM через переполнение буфера при разборе контейнеров CLFS, получая примитив произвольной записи в память ядра.
Этот репозиторий содержит две реализации:
| Поле | Деталь |
|---|---|
| CVE ID | CVE-2025-60709 |
| Тип | Локальное повышение привилегий (LPE) |
| Компонент | CLFS.sys (драйвер Common Log File System) |
| Целевая ОС | Windows 11 24H2 (сборка 26100.3485+) |
| Архитектура | Только x64 |
| Вектор | Переполнение буфера при разборе контейнера CLFS |
| Воздействие | Повышение до NT AUTHORITY\SYSTEM |
| Предварительные условия | Локальное выполнение кода (стандартный пользователь) |
CVE-2025-60709/
├── CVE-2025-60709.c (5.3 КБ, 157 строк) — Оригинальный эксплойт на C
├── CVE-2025-60709.go (9.2 КБ, 285 строк) — Порт на Go (демо, обучающая)
└── README.txt (4.2 КБ, 132 строки) — Оригинальная документация
┌─────────────────────────────────────────────────────────────┐
│ CVE-2025-60709 LPE │
└─────────────────────────────────────────────────────────────┘
[1] ОБХОД ЗАЩИТЫ
├─ KillETW() → Патчит EtwEventWrite в ntdll с помощью RET (0xC3)
└─ KillAMSI() → Патчит AmsiScanBuffer в amsi.dll с помощью RET (0xC3)
[2] HEAP GROOMING (подготовка памяти)
└─ GroomLookaside()
├─ Создаёт 4096 файлов: C:\Windows\Temp\groom_00000.blf
├─ Вызывает CreateLogFile() + AddLogContainer() для каждого
└─ Истощает lookaside списки → гарантирует предсказуемый макет кучи
[3] ПРИМИТИВ ПРОИЗВОЛЬНОЙ ЗАПИСИ — ClfsArbWrite(Address, Value)
├─ Создаёт неправильно сформированный буфер CLFS (0x102010 байт)
│ ├─ Действительная подпись CLFS в +0x00: 0x0201
│ ├─ Oversized cbRecord в +0x100: 0xFF00 (65 280 байт)
│ ├─ Маркер теневой зоны в +0x9A8: 0x13371337
│ └─ Поддельный CClfsContainerContext по смещению (0xFF00 + 0x100):
│ ├─ pContainer = TargetAddress - 0x10
│ └─ cbContainer = Value (записываемые данные)
├─ Вычисляет корректную контрольную сумму CLFS (драйвер проверяет)
├─ Записывает неправильный контейнер → C:\Windows\Temp\evil.blf
├─ Создаёт журнал, указывающий на evil.blf
├─ Вызывает ClfsReadRestartArea() → запускает разбор в ядре
└─ Драйвер переполняет буфер → записывает Value по адресу Address ✓
[4] КРАЖА ТОКЕНА SYSTEM
├─ Читает EPROCESS процесса SYSTEM через PsInitialSystemProcess
└─ Извлекает токен по адресу EPROCESS + 0x4C0
[5] ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
└─ ClfsArbWrite(CurrentEprocess + 0x4C0, SystemToken)
└─ Перезаписывает токен текущего процесса токеном SYSTEM ✓
[6] ЗАПУСК ПОЛЕЗНОЙ НАГРУЗКИ C2
├─ VirtualAlloc(PAGE_EXECUTE_READWRITE)
├─ Копирует 1789-байтовый shellcode beacon
├─ CreateThread() → выполняется как NT AUTHORITY\SYSTEM
└─ Beacon: IPv6 + DoH C2 → резервный канал Gmail drafts
└─ sRDI + обфускация сна + ETW/AMSI уже пропатчены
[7] ПЕРСИСТЕНТНОСТЬ
└─ Sleep(INFINITE) → процесс сохраняет токен SYSTEM
| Поле | Смещение | Описание |
|---|---|---|
EPROCESS_TOKEN | 0x4C0 | Токен безопасности процесса |
EPROCESS_PID | 0x440 | Идентификатор процесса (PID) |
EPROCESS_LINKS | 0x448 | Связанный список активных процессов |
EPROCESS_NAME | 0x5A8 | Имя процесса (ImageFileName) |
⚠️ Эти смещения различаются между сборками Windows. Требуется обновление для других версий.
Легитимный контейнер CLFS:
[Заголовок 0x100 байт][Запись: cbRecord байт реальных данных]
Неправильный контейнер (evil.blf):
[Действительный заголовок][cbRecord=0xFF00 → ядро читает 65 280 байт]
↓
Переполнение в ядре → достигает поддельного CClfsContainerContext
↓
pContainer = TargetKernelAddress - 0x10
cbContainer = ValueToWrite
↓
Драйвер использует поддельную структуру → записывает ValueToWrite по адресу TargetKernelAddress
CVE-2025-60709.c| Функция | Назначение |
|---|---|
GetKernelBase() | ZwQuerySystemInformation(SystemModuleInformation) → база ntoskrnl.exe |
KillETW() | VirtualProtect + перезапись EtwEventWrite в ntdll.dll с 0xC3 (RET) |
KillAMSI() | Загрузка amsi.dll + перезапись AmsiScanBuffer с 0xC3 (RET) |
GroomLookaside() | Создание 4096 журналов CLFS для истощения lookaside списков → детерминированная куча |
ClfsArbWrite() | Ядро эксплойта — примитив произвольной записи в память ядра |
main() | Оркестровка атаки: ETW→AMSI→groom→кража токена→arb write→beacon |
| Аспект | Версия C | Версия Go |
|---|---|---|
| Тип | Рабочий эксплойт (согласно документации) | Только обучающая демонстрация |
| API | Прямой доступ (ntdll, clfsw32, advapi32) | Обёртки syscall.NewLazyDLL() |
| Контрольная сумма CLFS | Полный алгоритм | Упрощённый заполнитель |
| Ядерные адреса | Реальные | Жёстко заданный заполнитель (0x123456) |
| Полезная нагрузка C2 | Шеллкод 1789 байт | Тестовые байты NOP (0x90) |
| Ожидаемый результат | Повышение до SYSTEM | Сообщение "Arb write failed (yeah)" |
Версия C (требуется Visual Studio Build Tools + Windows SDK):
cl /O1 /MT /link ntdll.lib advapi32.lib clfsw32.lib CVE-2025-60709.c
Версия Go (требуется Go 1.19+ на Windows x64):
go build -ldflags="-s -w" -o CVE-2025-60709.exe CVE-2025-60709.go