
Учебный proof-of-concept для PrintNightmare (CVE-2021-1675/34527) с имитацией нерабочей полезной нагрузки, анализом вектора атаки, сопоставлением с MITRE, рекомендациями по обнаружению и шагами по устранению уязвимости.
Тип: Proof of Concept — Симуляция (нерабочий) CVE: CVE-2021-1675 + CVE-2021-34527 CVSS: 7.8 (LPE) / 8.8 (RCE) Псевдоним: PrintNightmare Исправлено: Июнь/Июль 2021 — KB5004945 Добавлено в CISA KEV: Июль 2021
⚠️ Полезная нагрузка этого PoC является явно вымышленной и не-вредоносной — всего 4 байта заголовка DCE/RPC, за которыми следует имя функции в ASCII. Она не выполняет код, не устанавливает драйвер, не повышает привилегии. Использование исключительно в целях обучения и разработки детектов.
Разработано: HKK$ cat ./vulnerability_summary.txtCVE-2021-1675, известный как PrintNightmare, — это критическая уязвимость удаленного выполнения кода и локального повышения привилегий в службе Windows Print Spooler. Ошибка позволяет атакующим выполнять произвольный код с привилегиями SYSTEM, эксплуатируя функцию RpcAddPrinterDriverEx(), используемую для удаленной установки драйверов принтера без надлежащей проверки контроля доступа.
Первоначально классифицированная как LPE (CVSS 7.8) и исправленная в «вторнике исправлений» в июне 2021 года, Microsoft переклассифицировала уязвимость как RCE (CVSS 8.8) 21 июня. Чтобы избежать путаницы, вектор RCE получил новый идентификатор, CVE-2021-34527 — оба обычно называют PrintNightmare.
$ cat ./timeline.txt08 июня 2021 Microsoft публикует первоначальный патч в «вторник исправлений» — CVE-2021-1675 (LPE, CVSS 7.8)
21 июня 2021 Microsoft переклассифицирует как RCE (CVSS 8.8)
29 июня 2021 Исследователи случайно публикуют PoC — полагая, что это та же уже исправленная уязвимость
01 июля 2021 CVE-2021-34527 присвоен вектору RCE — отличному от исходного LPE
02 июля 2021 Microsoft выпускает экстренный внеплановый патч: KB5004945
Июль 2021 CISA добавляет в каталог Known Exploited Vulnerabilities
Активная эксплуатация группами программ-вымогателей (Vice Society, Magniber и т.д.)
$ cat ./architecture.txt┌──────────────────────────────────────────────────────────────────────────┐
│ PRINTNIGHTMARE — СХЕМА АТАКИ │
│ │
│ АТАКУЮЩИЙ (аутентифицированный пользователь) WINDOWS PRINT SPOOLER │
│ (spoolsv.exe) │
│ 1. Аутентифицироваться с любой ┌────────────────────┐ │
│ действительной учетной записью домена │ Работает как SYSTEM│ │
│ │ │ Активен по умолчанию│ │
│ 2. Подключиться через RPC к │ на всех Windows, │ │
│ именованному каналу \pipe\spoolss │ включая DC │ │
│ │ └──────────┬─────────┘ │
│ 3. Вызвать RpcAddPrinterDriverEx() │ │
│ с путем к вредоносной DLL ────────────────────────────►│ │
│ (UNC: \\attacker\share\evil.dll) │ │
│ ┌─────────────────▼─────────┐ │
│ │ Print Spooler загружает │ │
│ │ драйвер (DLL) как SYSTEM │ │
│ │ без проверки источника │ │
│ │ или целостности │ │
│ └─────────────────┬─────────┘ │
│ │ │
│ ◄── RCE / LPE как SYSTEM ────────────────────────────────┘ │
│ Новый пользователь admin, reverse shell, │
│ развертывание программ-вымогателей и т.д. │
│ │
│ ───────────────────────────────────────────────────────────────────── │
│ ЭТОТ PoC: только TCP connect + 25 байт → без реального RPC → без эксплойта
└──────────────────────────────────────────────────────────────────────────┘
$ cat ./design_decisions.mdfake_rpc_payload = b"\x05\x00\x0b\x03RpcAddPrinterDriverEx"
Эта полезная нагрузка имеет 25 байт и демонстрирует две концепции одновременно:
Байты 0-3: Легитимный заголовок DCE/RPC
| Байт | Значение | Смысл |
|---|---|---|
\x05 | 5 | Версия протокола DCE/RPC (версия 5 — стандарт Windows) |
\x00 | 0 | Младшая версия 0 |
\x0b | 11 | Тип PDU: BIND — первый шаг согласования RPC |
\x03 | 3 | Флаги: `PFC_FIRST_FRAG(0x01) |
Байты 4-24: Имя функции в ASCII
RpcAddPrinterDriverEx — имя уязвимой функции, в открытом виде.
Почему эта полезная нагрузка не работает как реальный эксплойт?
Легитимный BIND RPC потребовал бы после 4-байтового заголовка:
- max_xmit_frag (2 байта)
- max_recv_frag (2 байта)
- assoc_group_id (4 байта)
- num_ctx_items (1 байт)
- context_elem[] → UUID интерфейса MS-RPRN:
{12345678-1234-ABCD-EF00-0123456789AB}
- transfer_syntaxes → UUID NDR
Без этой структуры Windows немедленно отклоняет пакет. Полезная нагрузка, по сути, является лишь проверкой связности — «могу ли я достичь порта 445 с этой вымышленной полезной нагрузкой?».
sock.connect((target_ip, 445))
Почему 445, а не 135 (RPC Endpoint Mapper)?
PrintNightmare использует SMB именованный канал \pipe\spoolss как транспорт — не прямой RPC. Реальный поток:
1. TCP connect → порт 445 (SMB)
2. SMB negotiate + session setup (аутентификация NTLM/Kerberos)
3. Tree connect → IPC$
4. Открытие именованного канала → \pipe\spoolss
5. DCE/RPC BIND → интерфейс MS-RPRN
6. Вызов RpcAddPrinterDriverEx() с NDR marshaling
PoC имитирует только шаг 1 — начальное TCP-соединение — без реализации шагов 2-6.
sock.settimeout(5): таймаут в 5 секунд предотвращает зависание PoC на хостах, которые не отвечают. Полезно для быстрого сканирования доступности порта.
| Аспект | CVE-2021-1675 | CVE-2021-34527 |
|---|---|---|
| Вектор | Локальный (LPE) | Удаленный (RCE) |
| CVSS | 7.8 | 8.8 |
| Аутентификация | Локальная учетная запись | Аутентифицированная учетная запись домена |
| Патч | Июнь 2021 (вторник исправлений) | Июль 2021 (внеплановый KB5004945) |
| Уязвимая функция | RpcAddPrinterDriverEx | RpcAddPrinterDriverEx |
| Сценарий | Локальное повышение привилегий | Удаленный RCE через SMB именованный канал |
Корневая причина в обоих случаях одна и та же: функция RpcAddPrinterDriverEx() не проверяет источник файлов драйвера, не накладывает надлежащих ограничений привилегий для установки драйверов и не проверяет подлинность или целостность загружаемых DLL.
$ cat ./mitre_mapping.ymltactic: Initial Access / Lateral Movement
- T1210 # Exploitation of Remote Services
# RPC-вызов через \pipe\spoolss на удаленный хост
# Требуется действительная учетная запись домена
tactic: Privilege Escalation
- T1068 # Exploitation for Privilege Escalation
# обычный пользователь → SYSTEM через Print Spooler
# CVE-2021-1675 (LPE): локальный процесс повышается до SYSTEM
tactic: Execution
- T1569.002 # System Services: Service Execution
# Вредоносная DLL загружается spoolsv.exe как SYSTEM
# Эквивалент выполнения кода через службу Windows