Эксплуатация уязвимости PrintNightmare

Взлом принтер

В этой статье рассмотрим эксплуатации уяз­вимости PrintNightmare, которая поз­воля­ет повысить при­виле­гии в Windows с помощью бага в сис­теме печати (CVE-2021-1675). Будем эксплуатировать уяз­вимость PrintNightmare на примере машины Driver с пло­щад­ки Hack The Box.

Еще по теме: Эксплуатация уязвимости Microsoft Office CVE-2017-11826

Эксплуатация уязвимости PrintNightmare

Для начала до­бав­им IP-адрес машины в /etc/hosts:

Начнем со сканирования портов. Это стан­дар­тная операция при любом пентесте. Сканирование портов позволит определить, какие служ­бы на машине при­нима­ют соеди­нение.

Самый популярный сканер — это Nmap. Следующий скрипт улучшит резуль­таты сканирования:

Он дей­ству­ет в два эта­па. На пер­вом про­изво­дит­ся обыч­ное быс­трое ска­ниро­вание, на вто­ром — более тща­тель­ное ска­ниро­вание, с исполь­зовани­ем име­ющих­ся скрип­тов (опция A).

Результат работы скрипта Nmap

Скрипт находит четыре откры­тых пор­та:

  • 80 (HTTP) — веб‑сер­вер Microsoft IIS/10.0;
  • 445 — служ­ба SMB;
  • 135 — служ­ба уда­лен­ного вызова про­цедур (Microsoft RPC). Исполь­зует­ся для опе­раций кон­трол­лер — кон­трол­лер и кон­трол­лер — кли­ент;
  • 5985 — этот порт отве­чает за служ­бу уда­лен­ного управле­ния WinRM.

Пер­вым делом я быстренько взгля­нул на SMB. Моей целью было понять, что данная служ­ба может дать. Сделать это можно коман­дой:

Получаем однознач­ный ответ:

Получается, SMB мож­но временн0 про­пус­тить — без авто­риза­ции здесь искать нечего.

С WinRM на дан­ном эта­пе нам может помочь толь­ко брут, а при прохождении заданий с HTB это не круто. Так что давайте смот­реть веб.

Зап­рос учет­ных дан­ных

Первым делом, введем популярные комбинации рас­простра­нен­ных логинов и паролей по умолчанию. Сочета­ние логина и пароля admin:admin откры­вает глав­ную стра­ницу сай­та.

Глав­ная стра­ница сай­та

Пос­ле быстрого анализа сай­та оста­нав­лива­емся на стра­нице Firmware Updates, на которой находим фор­му заг­рузки фай­лов.

Стра­ница Firmware Updates
Стра­ница Firmware Updates

В начале я попытал­ся заг­рузить исполня­емые фай­лы .exe, но это не при­нес­ло ров­ным сче­том ничего. Но есть и дру­гие фор­маты фай­лов, которые поз­волят выпол­нить опре­делен­ные опе­рации, хоть их и огра­ничен­ное количес­тво. Один из таких фор­матов — SCF (shell command files).

Фай­лы SCF мож­но исполь­зовать для опе­раций вро­де «Свер­нуть все окна» или «Открыть про­вод­ник Windows». А еще файл SCF может исполь­зовать­ся для дос­тупа к опре­делен­ному пути UNC, что может при­вес­ти к утеч­ке поль­зователь­ско­го хеша NetNTLMv2. Это про­изой­дет, потому что Windows попыта­ется аутен­тифици­ровать­ся на этом общем ресур­се, исполь­зуя имя и пароль поль­зовате­ля.

Утечка хеша NTLM

Поп­робу­ем это про­экс­плу­ати­ровать. Сна­чала соз­дадим файл SCF @test.scf со сле­дующим содер­жимым ( @ поз­волит помес­тить файл ввер­ху спис­ка фай­лов в катало­ге, в дан­ном слу­чае это необя­затель­но).

Данный файл дол­жен свер­нуть все окна, это опре­деля­ет параметр Command в дирек­тиве [Taskbar]. Но это нам не важ­но, так как хит­рость кро­ется в дру­гом: в дирек­тиве [Shell] параметр IconFile ука­зыва­ет UNC-путь к икон­ке фай­ла. Имен­но это и зас­тавит уда­лен­ный хост попытать­ся авто­ризо­вать­ся на нашем ресур­се.

По­лучить аутен­тифика­цион­ные дан­ные целево­го поль­зовате­ля при под­клю­чении к нашему SMB-ресур­су можно с помощью Responder. Давайте акти­виру­ем наш «отлавли­ватель», а затем заг­рузим упо­мяну­тый файл.

От­ловлен­ный хеш пароля поль­зовате­ля Tony
От­ловлен­ный хеш пароля поль­зовате­ля Tony

И получа­ем желан­ный хеш, который теперь нуж­но взломать. Я для этих целей обыч­но исполь­зую hashcat, но этой прог­рамме нуж­но ука­зать тип хеша. К счастью, в справ­ке уже все ука­зано и нам нуж­но лишь най­ти под­ходящий номер. Для это­го мы отоб­ража­ем при­мер всех видов хешей и отби­раем тот, где встре­чает­ся NetNTLMv2.

При­мер NTLM-хешей, получен­ных в hashcat
При­мер NTLM-хешей, получен­ных в hashcat

Мы узна­ем режим: 5600. К тому же нам показы­вают хеш, который визу­аль­но по струк­туре похож на тот, что мы получи­ли в Responder. А теперь приш­ло вре­мя этот хеш переб­рать. Для перебо­ра будем исполь­зовать все тот же hashcat со сле­дующи­ми аргу­мен­тами:

  • -a 0 — режим перебо­ра, нулевой озна­чает по сло­варю;
  • -m [] — режим, тут ука­зыва­ем тип хеша, получен­ный ранее;
  • ksven.hash — файл, в котором записан хеш или хеши;
  • rockyou.txt — сло­варь с воз­можны­ми пароля­ми.

Ре­зуль­тат взло­ма хеша, пред­став­ленный hashcat
Ре­зуль­тат взло­ма хеша, пред­став­ленный hashcat

В ито­ге hashcat очень быс­тро находит пароль. Мы можем сра­зу же про­верить его в служ­бах WinRM и SMB с помощью CrackMapExec.

Про­вер­ка учет­ных дан­ных
Про­вер­ка учет­ных дан­ных

Учет­ные дан­ные подош­ли к служ­бе WinRM, поэто­му и мы получили ста­биль­ный дос­туп. Для дос­тупа заюзаем обо­лоч­ку Evil-WinRM.

Флаг поль­зовате­ля
Флаг поль­зовате­ля

Локальное повышение привилегий

Мы получили флаг поль­зовате­ля, так что теперь наша задача — добыть адми­нис­тра­тор­ские при­виле­гии. Пер­вым делом мож­но про­верить информа­цию о сис­теме (коман­да systeminfo) и о текущем поль­зовате­ле ( whoami /all), а так­же получить спи­сок запущен­ных про­цес­сов (коман­ды tasklist или ps).

Спи­сок запущен­ных про­цес­сов
Спи­сок запущен­ных про­цес­сов

В сис­теме работа­ет про­цесс служ­бы печати spoolsv.exe. Служ­ба Windows Print Spooler — это уни­вер­саль­ный интерфейс меж­ду ОС, при­ложе­ниями и локаль­ными или сетевы­ми прин­терами. Она поз­воля­ет раз­работ­чикам при­ложе­ний отправ­лять задания на печать. Про­верим ее работу через служ­бу RPC уда­лен­но:

Про­вер­ка работы служ­бы печати
Про­вер­ка работы служ­бы печати

На ум сра­зу при­ходит недав­няя нашумев­шая уяз­вимость CVE-2021-1675, она же PrintNightmare. Баг кро­ется в вызове RpcAddPrinterDriver дис­петче­ра оче­реди печати Windows. Кли­ент исполь­зует вызов RPC для добав­ления драй­вера на сер­вер, сох­раняя его в локаль­ном или уда­лен­ном катало­ге SMB. Пос­ле чего кли­ент ини­циали­зиру­ет объ­ект DRIVER_CONTAINER, исполь­зуемый в вызове RpcAddPrinterDriver, для заг­рузки драй­вера.

Драй­вер может содер­жать про­изволь­ный код, который будет выпол­нять­ся на сер­вере с пра­вами SYSTEM. Коман­ду может выпол­нить любой поль­зователь, про­шед­ший аутен­тифика­цию в служ­бе дис­петче­ра оче­реди печати. Про­ще говоря, имея минималь­ные при­виле­гии, мы можем выпол­нить любую DLL от име­ни SYSTEM.

На GitHub уже дос­таточ­но экс­пло­итов для этой уяз­вимос­ти, реали­зован­ных на раз­ных язы­ках и выпол­няющих раз­ные фун­кции. К при­меру, есть экс­пло­ит, который соз­даст нового поль­зовате­ля‑адми­нис­тра­тора. Ска­чаем его на локаль­ный хост и из катало­га с экс­пло­итом пов­торим под­клю­чение с помощью Evil-WinRM. Толь­ко в этот раз будем ука­зывать параметр -s, что поможет нам лег­ко заг­рузить в память скрипт на PowerShell.

Пос­ле под­клю­чения луч­ше выз­вать коман­ду menu и запат­чить AMSI коман­дой Bypass-4MSI.

Патч AMSI
Патч AMSI

За­тем заг­ружа­ем скрипт в память и вызыва­ем единс­твен­ную фун­кцию Invoke-Nightmare.

Экс­плу­ата­ция PrintNightmare
Экс­плу­ата­ция PrintNightmare

Под­клю­чаем­ся с учет­ными дан­ными нового поль­зовате­ля и забира­ем флаг адми­нис­тра­тора.

Флаг рута
Флаг рута

Ма­шина зах­вачена!

Еще по теме:

Дима (Kozhuh)

Эксперт в кибербезопасности. Работал в ведущих компаниях занимающихся аналитикой компьютерных угроз. Анонсы новых статей в Телеграме.

Добавить комментарий