Ques/Help/Req HTB PikaTwoo. Проходим одну из самых сложных машин c Hack The Box

XakeR

Member
Регистрация
13.05.2006
Сообщения
1 912
Реакции
0
Баллы
16
Местоположение
Ukraine
Эту тачку «безумного» уровня сложности я штурмовал почти три месяца. Чего здесь только не встретилось: уязвимость в OpenStack, реверс приложения для Android и подделка сертификатов, баг в Apache APISIX, атака на ModSecurity, которую удалось раскрутить до RCE… Под конец получаем доступ к ноде Kubernetes, сливаем секреты и эксплуатируем баг в minikube CRI-O. В общем, скучно не будет!

warning​


Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.



Разведка​




Перво‑наперво добавляем IP-адрес машины к себе в /etc/hosts:

10.10.11.199 pikatwoo.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.4p1;
  • 80 и 8080 — веб‑сервер Nginx 1.18.0;
  • 443 — тоже веб‑сервер, поле сертификата commonName раскрывает новый домен api.pokatmon-app.htb;
  • 4369 — служба Erlang Port Mapper; сканер заодно показывает нам динамический порт ноды Rabbit — 25672 (также открыт);
  • 5000 — очередной веб‑сервер, выполняющий редирект на новый домен pikatwoo.pokatmon.htb;
  • 5672 — служба RabbitMQ 3.8.9;
  • 35357 — веб‑сервер, выполняющий редирект на домен pikatwoo.htb.

Первым делом для новых доменов создаем запись в /etc/hosts и проверяем сайты.

10.10.11.199 pikatwoo.htb pokatmon-app.htb api.pokatmon-app.htb pokatmon.htb pikatwoo.pokatmon.htb

Запрос на порт 80 приводит нас на сайт Pokatdex со списком героев. Но при выборе любого из них получаем ошибку в формате JSON.

Главная страница сайта при выборе персонажа

HTTPS-сервер сразу вернул ошибку, зато на порте 35357 работает OpenStack.

Ошибка на сайте сервера на порте 35357

По запросу «OpenStack ports» первая ссылка в Google дает понять, что на порте 5000 работает сервис Keystone, а порт 8080 отвечает за Swift (OpenStack Object Storage). Для проверки сделаем запросы к обоим сервисам.

curl -s | jq .Информация о сервисе Swift OpenStackcurl -s | jq .Информация о сервисе Keystone OpenStack

Поскольку Burp Suite автоматически строит карту сайта, видим, что на pokatmon.htb доступен файл CHANGELOG, из которого узнаём о существовании некоего приложения для Android, а также WAF ModSecurity.

Карта сайта

Мы знаем версии установленного ПО, поэтому можем попробовать поискать в интернете описания уязвимостей и эксплоиты.



Точка входа​




Служба Keystone входит в облачную платформу OpenStack и обеспечивает аутентификацию клиентов API, обнаружение служб и распределенную многопользовательскую авторизацию. В случае с Keystone поиск эксплоитов оказался нелегкой задачей, но все же находим уязвимость с идентификатором CVE-2021-38155, которая позволит определить существующих пользователей.

Список уязвимостей для Keystone OpenStack

Суть бага в том, что если мы попробуем несколько раз авторизоваться от имени существующего пользователя, то он будет на время заблокирован и нам вернут соответствующее сообщение. Для имени пользователя, аккаунта которого не существует, мы такого сообщения не получим. Возьмем список имен из набора SecLists и попробуем авторизоваться с каждым из имен и десятью разными паролями с помощью Burp Intruder. Для авторизации используем запрос к /v3/auth/tokens со следующими данными.

{ «auth»: { «identity»:{ «methods»:[«password»], «password»:{ «user»:{ «password»:«§admin§», «name»:«§admin§», «domain»:{ «id»:«default»}}}}}}Burp Intruder — вкладка PositionsРезультат перебора

В итоге получаем двух пользователей: admin и andrew. Перебор паролей ничего не дает, поэтому переходим к другому сервису.

OpenStack Object Store (Swift) — ПО для облачного хранилища, позволяющее хранить и извлекать большое количество данных с помощью простого API. По запросу «keystone swift» получаем документацию, из которой узнаём о том, что можно получить доступ к открытым данным, зная только имя пользователя и используя префикс AUTH_. Попробуем перебрать хранилище пользователя andrew.

ffuf -u -t 256 -w directory_2.3_medium_lowercase.txt -acРезультат перебора каталога

Получаем один каталог, который содержит приложение для Android.

Файлы в каталоге android

Видимо, это приложение, которое упоминалось в ченжлоге. Скачиваем его для анализа.



Точка опоры​




В качестве виртуальной машины я использую AVD из Android Studio. После запуска виртуального смартфона проверим, определилось ли устройство в adb.

adb devices Устройства adb

Теперь с помощью adb установим скачанное приложение и запустим уже с мобильного устройства.

adb install pokatmon-app.apk Главное окно приложения

Нас встречает форма авторизации, но, введя тестовые данные, мы не получаем доступ к серверу.

Ошибка приложения

На хостовой системе запускаем Wireshark и смотрим, куда идут запросы. В трафике отмечаем DNS-запрос для резолва api.pokatmon-app.htb.

Перехваченные пакеты в Wireshark

В качестве своего DNS-сервера используем dnsmasq. Для найденного адреса сделаем запись в файле /etc/dnsmasq.conf и запустим dnsmasq.

address=/api.pokatmon-app.htb/10.10.11.199

А теперь перезапустим виртуальную машину, но с указанием DNS-сервера и повторим запрос на сервер.

emulator -dns-server 10.10.16.46 -avd Pixel_3a_API_33_x86_64 Ошибка приложения

Наконец приложение может общаться с сервером. Теперь пропустим весь его трафик через Burp Proxy, для чего в настройках Burp создадим новый листенер на VPN-интерфейсе. Созданный листенер указываем в настройках прокси AVD.

Настройки Burp — листенеры ProxyНастройки Proxy AVD

Но снова не получаем доступ к серверу. Причину можем посмотреть в логах Burp Proxy. Все дело в SSL-сертификате.

Логи Burp Proxy

Чтобы ошибка исчезла, нам нужно установить сертификат Burp в виртуальное устройство. Для этого сначала скачиваем сам сертификат, конвертируем его в формат PEM и переименовываем. В Android имя сертификата — это его контрольная сумма.

wget localhost:8080/cert -O cert.der openssl x509 -inform der -in cert.der -out cert.pem openssl x509 -inform pem -subject_hash_old -in cert.pem cp cert.pem 9a5ba575.0 Вычисление контрольной суммы сертификата

Теперь нужно сохранить наш серт в каталоге /system/etc/security/cacerts/ устройства. Но просто записать его не получится, так как файловая система виртуальной машины доступна только для чтения. Перезапустим виртуальную машину с параметром -writable-system.

emulator -dns-server 10.10.16.46 -avd Pixel_3a_API_33_x86_64 -writable-system

А затем «рутуем» устройство и перемонтируем основной каталог. Если все проходит успешно, сохраняем сертификат Burp.

adb root adb remount adb push 9a5ba575.0 /system/etc/security/cacerts/ Запись сертификата на Android

Повторяем попытку авторизации и видим запрос в Burp Proxy.

Запросы в Burp Proxy

Я сразу отправил запрос в Burp Repeater, но оказалось, что у сервера заготовлены разные варианты ответа. Как можно видеть на скрине, на запрос без заголовка authorization сервер ответит, что данные не подписаны. А при изменении данных запроса сервер сообщит о несоответствии подписи.

Запросы на сервер

Тогда будем работать через само приложение. Я попробовал отправить базовую нагрузку ‘ or 1=1 — -, это могло бы помочь обойти авторизацию, присутствуй здесь возможность для SQL-инъекции. Оказалось, что приложение не позволяет вводить некоторые символы.

Главное окно приложения

Тогда придется понять, как формируется подпись. При просмотре содержимого APK-файла можно найти два ключа RSA.

Содержимое APK-файла

Через две‑три попытки подписать отправляемые данные с помощью приватного ключа получаем валидную подпись!

echo -n «app_beta_mailaddr=[email protected]&app_beta_code=1234″ | openssl dgst -sha256 -sign private.pem | base64 -w0Формирование подписи данных

Теперь подписываем данные с упомянутой ранее нагрузкой и делаем запрос на сервер.

echo -n «app_beta_mailaddr=’ or 1=1 — -&app_beta_code=1234″ | openssl dgst -sha256 -sign private.pem | base64 -w0curl -k -X POST -H ‘authorization: signature=oZ3SEZMP1n2xRV33Ruf9NNmW5x19GHJv5+Af/akn2dMfnViDpuTd6gP6vm0Zz42pS0VS6B/ymJsgzoekc1QZAjMyoZh9Q+TxZ1MzFFCx2iqiVD27frr+Bblw83VVDKG3Nx/cKkk6NRHeotNQRPhGmQUQrHLPeFWybleMoN5O3qrFnuPehDnYJVheiVyAMyNnJl1Lm7RGXdEva6CEyssNqIqrApbATs8ZQFFsNZgyQKMZh5u6X1sLuVXiSTkYA3fnmwrEyMNzfuvCJU9LUx4sOGRO/Zv9bVhO3knlriRfXN1DPRDX3YePUzhQrdFNApo72yRnmtsecfVJ08sz/huSgQ==’ ‘https://api.pokatmon-app.htb/public/validate’ —data «app_beta_mailaddr=’ or 1=1 — -&app_beta_code=1234″ 2>/dev/null| jq Ответ сервера

В ответе получаем почтовый адрес и ключ‑инвайт. С этими данными авторизуемся в приложении и получаем редирект на .

Главное окно приложения

Этот адрес мы уже посещали, там расположен основной сайт, при этом в Burp Proxy видим те же инвайт и почтовый ящик. Но обратим внимание и на веб‑сервер APISIX 2.10.1.

Ответ в Burp Proxy

Поищем готовые эксплоиты для гейтвея APISIX. Запрос «apisix Vulnerabilities» приводит к подборке статей про уязвимости. Из всех упомянутых CVE наиболее применима CVE-2021-43557, которая даст возможность обхода каталога. Тут стоит вернуться к сканированию каталогов, так как изначально я не придал значения множеству результатов с кодом ответа 403.

Результат сканирования каталогов

Присоединяйся к сообществу «Xakep.ru»!​


Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

-60%

1 year​


9990 рублей 4000 р.


[TD]

1 month_r​


920 р.
[/TD]

Я уже участник «Xakep.ru»
 

AI G

Moderator
Команда форума
Регистрация
07.09.2023
Сообщения
786
Реакции
2
Баллы
18
Местоположение
Метагалактика
Сайт
golo.pro
Native language | Родной язык
Русский
Sorry I couldn't contact the ChatGPT think tank :(
 
198 114Темы
635 085Сообщения
3 618 401Пользователи
EeOneНовый пользователь
Верх