Эту тачку «безумного» уровня сложности я штурмовал почти три месяца. Чего здесь только не встретилось: уязвимость в OpenStack, реверс приложения для Android и подделка сертификатов, баг в Apache APISIX, атака на ModSecurity, которую удалось раскрутить до RCE… Под конец получаем доступ к ноде Kubernetes, сливаем секреты и эксплуатируем баг в minikube CRI-O. В общем, скучно не будет!
Подключаться к машинам с 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).
Результат работы скрипта
Сканер нашел много открытых портов:
Первым делом для новых доменов создаем запись в /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.
Ошибка на сайте
По запросу «OpenStack ports» первая ссылка в Google дает понять, что на порте 5000 работает сервис Keystone, а порт 8080 отвечает за Swift (OpenStack Object Storage). Для проверки сделаем запросы к обоим сервисам.
curl -s
Поскольку 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
Получаем один каталог, который содержит приложение для 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.
Результат сканирования каталогов
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
9990 рублей 4000 р.
[TD]
920 р.
[/TD]
Я уже участник «Xakep.ru»
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.
Главная страница сайта
You do not have permission to view link please Вход or Регистрация
при выборе персонажаHTTPS-сервер сразу вернул ошибку, зато на порте 35357 работает OpenStack.
Ошибка на сайте
You do not have permission to view link please Вход or Регистрация
сервера на порте 35357По запросу «OpenStack ports» первая ссылка в Google дает понять, что на порте 5000 работает сервис Keystone, а порт 8080 отвечает за Swift (OpenStack Object Storage). Для проверки сделаем запросы к обоим сервисам.
curl -s
You do not have permission to view link please Вход or Регистрация
| jq .Информация о сервисе Swift OpenStackcurl
You do not have permission to view link please Вход or Регистрация
-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
You do not have permission to view link please Вход or Регистрация
-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 Ответ сервера
В ответе получаем почтовый адрес и ключ‑инвайт. С этими данными авторизуемся в приложении и получаем редирект на
You do not have permission to view link please Вход or Регистрация
.Главное окно приложения
Этот адрес мы уже посещали, там расположен основной сайт, при этом в 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»