HTB Catch. Анализируем и перекомпилируем приложение для Android
Сегодня мы проанализируем приложение для Android, подберемся к скрытому сайту, поработаем с платформой Cachet, чтобы получить доступ к хосту, и рекомпилируем приложение, чтобы повысить привилегии. Все это в рамках прохождения средней по сложности машины Catch с площадки Hack The Box.
РАЗВЕДКА
Сканирование портов
Начинаем, как водится, со сканирования портов исследуемой машины. Ее IP сразу добавляем в /etc/hosts
:
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это 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 и 8000 — служба веб‑сервера Apache 2.4.41;
- порты 3000 и 5000 — какие‑то неизвестные приложения, работающие по протоколу HTTP.
Проходим к сайту на порте 80.
На сайте ничего необычного, скрытого или полезного не находим, кроме того, что предлагается загрузить какое‑то приложение.
После загрузки видим, что это программа для Android. На других портах работают Git (3000), чат Let’s Chat и платформа Cachet.
ТОЧКА ВХОДА
Как создать и развернуть виртуальную машину Android, а затем включить отладку, я уже писал в недавнем прохождении машины Routerspace, поэтому сразу перейдем к установке приложения.
При запуске приложения получаем ошибку соединения, а также раскрываем новый поддомен, который сразу добавляем в /etc/hosts
.
10.10.11.150 catch.htb status.catch.htb
Указанный адрес ведет на порт 443, который на сервере закрыт, поэтому попробуем вытянуть из приложения еще какие‑нибудь данные. Для этого я буду использовать мини‑песочницу для Android-приложений MobSF. В ней есть возможность статического и динамического анализа. Если тебе неохота устанавливать макет на свой хост, то можно пользоваться уже развернутой онлайновой версией.
Загружаем приложение и получаем отчет по статическому анализу.
Из важного сразу отмечаем забитые в приложение токены.
По второму токену определяем, что наша следующая цель — Let’s Chat. Вставляем его как токен доступа в заголовок Authorization
.
ТОЧКА ОПОРЫ
Чтобы этот токен автоматически вставлялся в каждый запрос, отправленный через браузер, воспользуемся функцией match/replace в опциях Burp Proxy. Там выбираем заголовок запроса в качестве типа и указываем замену пустого поля нашим заголовком.
Обновляем страницу чата в браузере, в результате чего получаем редирект на страницу /rooms
и список групп.
Можем получить сообщения из группы, выполнив запрос на адрес /rooms/<is>/messages
.
В группе 61b86b28d984e2451036eb17
находим пересланные учетные данные пользователя john.
Пробуем ввести эту учетку на всех веб‑сервисах и получаем доступ к платформе Cachet.
ПРОДВИЖЕНИЕ
В настройках платформы узнаем ее версию — 2.4.0-dev
.
Первым делом стоит проверить, есть ли для этой версии готовые эксплоиты. Самый надежный способ сделать это — поискать в интернете на сайтах вроде HackerOne, exploit-db и, конечно, GitHub.
В блоге Sonar описано несколько CVE. Нам интересна CVE-2021-39174, которая позволит прочитать переменные среды.
Зная номер CVE, мы найдем готовый эксплоит на GitHub.
Эксплоиту нужно указать URL, имя пользователя и пароль.
python3 exploit.py --url http://status.catch.htb:8000 -n john -p 'E}V!mywu_69T4C}W'
С полученными учетными данными подключаемся к SSH и забираем первый флаг.
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Теперь, когда мы получили доступ к хосту, нам необходимо собрать информацию. Делать мы это, как обычно, будем при помощи скриптов PEASS.
Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Загрузим на хост скрипт для Linux, дадим права на исполнение и запустим его. Из важного отметим найденный скрипт на Bash /opt/mdm/verify.sh
, а также файлы со списками доступа (ACLs).
Больше ничего интересного нет, поэтому просмотрим, какие процессы периодически могут запускаться на хосте. В этом нам поможет программа pspy64.
От имени пользователя root запускается найденный нами скрипт. Разберем, что он выполняет. Скрипт проходит по файлам в каталоге /opt/mdm/apk_bin
, копирует их в каталог /root/mdm/cerified_apps
и передает в функции sig_check
, comp_check
и app_check
.
В функции sig_check
с помощью утилиты jarsigner
проверяется подпись файла.
В функции comp_check
утилита apktool
декодирует файл, после чего из файла AndroidManifest.xml
парсится версия SDK.
И в последней функции app_check
из файла res/values/strings.xml
парсится название приложения, которое должно начинаться с Catch
. Результат вставляется в команду echo
.
Это путь к выполнению кода, причем в контексте пользователя root. Все, что нам нужно сделать, — это смастерить APK, который будет содержать файл res/values/strings.xml
и команду терминала в параметре app_name
. После чего этот файл нужно будет подписать.
Но еще удобнее — декомпилировать скачанный APK, внести изменения и рекомпилировать его. Для декомпиляции будем использовать apktool.
Теперь создадим файл /res/values/strings.xml
, содержащий конвейер команд, который выполняет команду chmod u+s /bin/bash
.
<string name="app_name">Catch|echo Y2htb2QgdStzIC9iaW4vYmFzaAo= | base64 -d | bash</string>
Назначение S-бита файлу командной оболочки поможет запустить ее от имени рута. Осталось собрать файл обратно с помощью того же apktool.
apktool b -f -d ./catchv1.0 -o ./catch_new.apk
Теперь подпишем файл с помощью jarsigner и загрузим на удаленный хост в каталог /opt/mdm/apk_bin
.
keytool -genkey -v -keystore r.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000 jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ./r.keystore ./catch_new.apk alias_name
Дождемся очередного выполнения скрипта, чтобы S-бит был назначен файлу командной оболочки.
Видим, что SUID выставлен, поэтому запускаем новый bash уже в привилегированном контексте и забираем флаг рута.