HTB Instant
Реверсим приложение для Android и захватываем сервер
Наша цель — получение прав суперпользователя на машине Instant с учебной площадки Hack The Box. Уровень сложности задания — средний.
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /
:
10.10.11.37 instant.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '' ',' | sed s/,$//)nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A
).

Сканер нашел всего два открытых порта: 22 — служба OpenSSH 9.6p1 — и 80 — веб‑сервер Apache 2.4.58. Сразу идем смотреть сайт и находим там ссылку на загрузку файла APK (формат приложений для Android).

Точка входа
Для первичного анализа APK будем использовать фреймворк MobSF. Можно скачать его с GitHub и развернуть локально либо использовать общедоступный вариант по адресу mobsf.live. Я воспользовался вторым вариантом.
Заходим на сайт и загружаем приложение на анализ.

Спустя несколько минут статус задачи сканирования поменяется и будет доступна ссылка с отчетом. Среди общей статистики нам также доступен декомпилированный код приложения. Хотя для декомпиляции лучше обратиться к Decompiler.com.

Листаем страницу отчета и отмечаем любые данные, которые могут пригодиться для более детального изучения файла. Очень важная информация — это список URL, найденных в файле.

Так мы узнаём о новом домене mywalletv1.
, поэтому обновляем запись в файле /
.
10.10.11.37 instant.htb mywalletv1.instant.htb
Также MobSF пробует найти различные секреты, токены и ключи. Второй очень похож на часть JWT.

Поочередно просматриваем декомпилированные файлы Java, в которых используются URL-адреса. В файле AdminActivities.
выполняется запрос на http://
и используется токен JWT.

Декодировать JWT можно на сайте JWT.io. В данных токена видим роль Admin.

При обращении к API profile
через браузер получим ошибку 401.

Однако, применив найденный JWT, мы получаем код ответа 200 вместе с запрошенными данными.

JWT рабочий, а значит, можно исследовать API.
Точка опоры
API
Больше ничего интересного я не нашел, поэтому переходим к следующему шагу — декомпиляции APK на уже упомянутом Decompiler.com.

Попробуем найти новые точки API, которые не были указаны в MobSF. Для этого используем всем известную команду grep
.
grep -iR instant.htb ./

И находим новый поддомен — судя по имени, это Swagger UI. Обновляем запись в файле /
и открываем новый сайт в браузере.
10.10.11.37 instant.htb mywalletv1.instant.htb swagger-ui.instant.htb

Изучаем новые API и пробуем для теста запросить список пользователей.
curl -X GET "http://swagger-ui.instant.htb/api/v1/admin/list/users" -H "accept: application/json" | jq

Сервер ответил кодом 401. Попробуем использовать найденный ранее JWT.
curl -X GET "http://swagger-ui.instant.htb/api/v1/admin/list/users" -H "accept: application/json" -H "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6IkFkbWluIiwid2FsSWQiOiJmMGVjYTZlNS03ODNhLTQ3MWQtOWQ4Zi0wMTYyY2JjOTAwZGIiLCJleHAiOjMzMjU5MzAzNjU2fQ.v0qyyAqDSgyoNFHU7MgRQcDA0Bw99_8AEXKGtWZ6rYA" | jq

Сервер вернул данные, а значит, мы можем использовать API с тем же токеном.
Path traversal
Обрати внимание на API для получения логов /
.

В параметре log_file_name
должно быть передано имя файла. Попробуем выполнить обход каталога и прочитать файл /
.
curl -X GET "http://swagger-ui.instant.htb/api/v1/admin/read/log?log_file_name=../../../../../../../etc/passwd" -H "accept: application/json" -H "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6IkFkbWluIiwid2FsSWQiOiJmMGVjYTZlNS03ODNhLTQ3MWQtOWQ4Zi0wMTYyY2JjOTAwZGIiLCJleHAiOjMzMjU5MzAzNjU2fQ.v0qyyAqDSgyoNFHU7MgRQcDA0Bw99_8AEXKGtWZ6rYA" | jq

info
Подробное объяснение техники path traversal ты можешь найти в статье «File Inclusion и Path Traversal. Разбираем две базовые веб‑уязвимости».
Уязвимость path traversal присутствует, а значит, мы можем читать произвольные файлы в системе. Проверим, нет ли у пользователя закрытых ключей SSH.
curl -X GET "http://swagger-ui.instant.htb/api/v1/admin/read/log?log_file_name=../../../../../../../home/shirohige/.ssh/id_rsa" -H "accept: application/json" -H "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6IkFkbWluIiwid2FsSWQiOiJmMGVjYTZlNS03ODNhLTQ3MWQtOWQ4Zi0wMTYyY2JjOTAwZGIiLCJleHAiOjMzMjU5MzAzNjU2fQ.v0qyyAqDSgyoNFHU7MgRQcDA0Bw99_8AEXKGtWZ6rYA" | jq

Сохраняем ключ на локальную машину, назначаем права (chmod
) и подключаемся к серверу от имени пользователя shirohige
.

Локальное повышение привилегий
Теперь нам необходимо собрать информацию. Я буду использовать для этого скрипты PEASS.
Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на удаленный хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много всего, давай пройдемся по важным для нас моментам.
Для локального хоста прослушиваются порты 8808 и 8888.

В файле с переменными окружения Instant-Api
находим секретный ключ.

Получен хеш пароля из файла базы данных по следующему пути:
/home/shirohige/projects/mywallet/Instant-Api/mywallet/instance/instant.db

В каталоге /
есть директория backups
, доступная текущему пользователю.

Среди недавно перезаписанных файлов находим бэкап сессионных файлов Solar-PuTTY.

В файле сессии Solar-PuTTY /
есть зашифрованный блоб данных.

Для его расшифровки будем использовать утилиту SolarPuTTYDecrypt. Однако для этого потребуется пароль.

Вернемся к найденному файлу базы данных instant.
. Скачаем его на локальную машину и просмотрим с помощью DB
. Из таблицы wallet_users
получим два хеша PBKDF2.

Я не нашел способа перебрать хеши с помощью hashcat, поэтому воспользовался скриптом WerkzeugHashCracker.
python3 app.py -w Wordlist/small_rockyou.txt 'pbkdf2:sha256:600000$YnRgjnim$c9541a8c6ad40bc064979bc446025041ffac9af2f762726971d8a28272c550ed'

С подобранным паролем удалось расшифровать и данные Solar-PuTTY
.

В файле лежат учетные данные пользователя root
, и нам ничто не мешает авторизоваться от его имени по SSH.

Машина захвачена!