Содержание статьи
Упражняться мы будем на виртуальной машине Response с площадки Hack The Box. Ее уровень сложности — Insane, и на сегодняшний день это самая сложная машина на HTB и первая в моей серии райтапов, которую мне не удалось пройти до конца. Однако даже получение двух пользовательских учеток оказалось захватывающим.
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /
:
10.10.11.163 response.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
).
Мы нашли всего два открытых порта: 22 — служба OpenSSH 8.2p1 и 80 — веб‑сервер Nginx 1.21.6. С SSH ничего не сделать, поэтому сразу переходим к вебу.
На сайте находим упоминание домена www.
, поэтому обновляем запись в файле /
:
10.10.11.163 response.htb www.response.htb
Чтобы расширить область тестирования, составим карту сайта с помощью Burp Discovery. Для этого в Burp History выбираем целевой адрес и в контекстном меню Engagement tools → Discover content.
Так находим нестандартный файл /
.
Точка входа
Копируем содержимое файла /
на локальную машину и изучаем. Этот файл содержит данные для обращения к домену api.
через сайт на домене proxy.
.
Так как обращение происходит к поддомену proxy
, добавляем в /
только его.
10.10.11.163 response.htb www.response.htb proxy.response.htb
Затем копируем данные для обращения и повторяем запрос.
POST /fetch HTTP/1.1Host: proxy.response.htbContent-Type: application/jsonContent-Length: 262{"url":"http://api.response.htb/","url_digest":"cab532f75001ed2cc94ada92183d2160319a328e67001a9215956a5dbf10c545","method":"GET","session":"6c2a752c873e8c03fc927a81647402d0","session_digest":"6ce5cbd27651561e9005287bc5d8cf3201aa6c4fe885057ae80b40af0b8951bd"}
Ответ от сервера закодирован в Base64, декодировать можно прямо в Burp Inspector.
Так как дальше данные представлены в формате JSON, можно красиво отобразить их при помощи утилиты jq.
Просмотрим также страницы /
и /
.
Раскрываем еще один сервис — chat.
. Добавляем его в файл /
и просматриваем ответ сервера.
10.10.11.163 response.htb www.response.htb proxy.response.htb chat.response.htb
Сайт оказался недоступен. Но можно обратиться к нему через сайт proxy
. Правда, для этого нам нужно подтвердить параметр url
подписью в параметре url_digest
, который сами вычислить мы не можем. Но параметр session
, где передается идентификатор веб‑сессии, тоже подтверждается подписью session_digest
.
Тогда пробуем вместо идентификатора сессии отправить ссылку, чтобы получить подпись для нее.
Как видишь, мы узнаем действительную подпись URL, отправленного вместо идентификатора сессии.
Точка опоры
Теперь проверим, придет ли нам ответ, если мы попробуем обратиться к чату. Первым делом сгенерируем для url
действительный url_digest
.
С подписью можно выполнить запрос к прокси‑сайту.
Способ получения подписи оказался рабочим. Но как бы я ни пытался эксфильтровать данные, все равно пришел к тому, что нужно писать свой проксирующий веб‑сервер. Работать он будет так:
- Через свой браузер обращаемся к внутреннему сайту, указывая IP-адрес написанного нами веб‑сервера.
- Наш сервер будет кодировать принятый запрос и отправлять на прокси‑сайт.
- После получения ответа от прокси‑сайта наш самописный сервер будет декодировать принятые данные и отправлять в качестве ответа браузеру.
Так как работать будем с сайтом http://
, сделаем запись в файл /
:
127.0.0.1 chat.response.htb
Сначала напишем оснастку веб‑сервера без всяких функций. В классе сервера ProxyServer
реализуем обработчики do_GET
и do_POST
, которые будут вызывать единый метод do_Multi
. Сперва просто будем выводить URL, к которому обратится браузер.
from http.server import BaseHTTPRequestHandler, HTTPServerfrom socketserver import ThreadingMixInclass ProxyServer(BaseHTTPRequestHandler): def do_GET(self): self.do_Multi('GET') def do_POST(self): self.do_Multi('POST') def do_Multi(self, method): uri = self.path target_url = 'http://chat.response.htb' + uri print(method + " " + target_url)class ThreadedHTTPServer(ThreadingMixIn, HTTPServer): passws = ThreadedHTTPServer(("0.0.0.0", 80), ProxyServer)print("Server started...")try: ws.serve_forever()except KeyboardInterrupt: passws.server_close()print("Server stopped.")
Запускаем сервер и обращаемся к http://
.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»