En esta habitación aprenderemos:

  • Inyección SQL, explotando manualmente y con la herramienta SQLMap.
  • Ruptura de hashes de contraseñas.
  • Uso de túneles ssh para revelar servicios ocultos.
  • Usar un payload de Metasploit para conseguir privilegios de administración.

Desplegamos la máquina y accedemos a la web. Parece un portal de juegos.

¿Cuál es el nombre del personaje que lleva un rifle de francotirador? La pista nos dice búsqueda inversa de imagen, pero es bastante conocido, es el agente 47 de la saga de juegos Hitman.

Agent 47

Obtener acceso vía SQLi (Inyección de SQL)

Vamos a aprender sobre SQL (Structured Query Language) y cómo podemos manipularlo potencialmente para comunicarnos con la base de datos.

SQL es un lenguaje estándar para guardar, editar y obtener datos de bases de datos. Una petición o query puede parecerse a esto.

SELECT * FROM users WHERE username = :username AND password := password

In la máquina con la que estamos trabajando, cuando intentamos autenticarnos, cogerá los valores que hemos puesto en usuario y contraseña y los insertará directamente en la petición de arriba.

Si encuentra los datos que hemos puesto, nos permite seguir. De otro modo, nos mostrará un mensaje de error.

Aquí hay una potencial vulnerabilidad, porque puedes poner tu nombre de usuario como otra petición SQL.

Vamos a manipular dicha petición y autenticarnos sin credenciales legítimas.

Si ponemos como usuario admin y nuestra contraseña como: ‘ or 1==1 – - lo insertará en la petición y autenticará nuestra sesión.

La petición SQL que se ejecutará en el servidor sería así:

SELECT * FROM users WHERE username = admin AND password := ' or 1=1 -- - 

El SQL extra que ponemos como nuestra contraseña ha cambiado la petición de arriba para romper la petición inicial y proceder (con el usuario admin) si 1==1 (una condición que siempre es cierta) y luego comentar el resto de la petición para impedir que se rompa.

Pero la máquina no tiene un usuario admin en su base de datos. Aún así, podemos identificarnos sin conocer credenciales utilizando la secuencia que hemos visto.

Usamos «’ or 1==1 – - » como usuario y dejamos la contraseña en blanco.

Cuando nos identificamos, ¿a qué página nos redirige?

portal.php

Usando SQLMap

SQLMap es una herramienta de inyección de bases de datos de código abierto. Viene preinstalada en Kali o se puede descargar de aquí.

Hay muchas clases de inyección SQL (booleana, basada en tiempo, etc) y SQLMap automatiza el proceso completo probando diferentes técnicas.

Vamos a usar SQLMap para volcar la base de datos completa de GameZone.

Usando la página en la que nos hemos identificado, vamos a apuntar SQLMap hacia la prestación de búsqueda de reseñas de juegos.

Primero, necesitamos interceptar con Burpsuite una petición hecha en la parte de búsqueda.

Capturando la peticion con Burp

Guardamos esa petición en un archivo de texto y podemos pasarla a SLQMap para usar nuestra sesión de usuario autenticado.

Podemos guardar seleccionando y haciendo clic derecho, para elegir la opción «Copy to file» o bien copiar y pegar en un archivo de texto que se llame request.txt, por ejemplo.

Para pasarlo a SQLMap ejecutamos:

sqlmap -r request.txt --dbms=mysql --dump
  • -r se usa para interceptar la petición que hemos hecho antes y guardado en el archivo request.txt
  • –dbms le sice a SQLMap con qué tipo de base de datos estamos trabajando.
  • –dump intenta volcar la base de datos completa.

SQLMap probará diferentes métodos e identificará alguno que sea vulnerable. Eventualmente, nos dará como resultado la base de datos.

Resultado de SQLMap

En la tabla de usuarios, ¿cuál es la contraseña hasheada?

ab5db915fc9cea6c78df88106c6500c57f2b52901ca6c0c6218f04122c3efd14

¿Cuál es el nombre asociado con la contraseña?

agent47

¿Cuál es el nombre de la otra tabla? (Si vamos hacia arriba la veremos)

post

Rompiendo contraseñas con John the Ripper

John es un rompedor de contraseñas que viene instalado en Kali Linux. Vamos a usarlo para romper el hash que hemos conseguido.

El programa funciona tomando una lista de palabras, creando su hash de acuerdo al algoritmo que le hayamos pasado a John y comparando con la contraseña que le pasamos. Si los hashes coinciden, tenemos éxito.

No se pueden invertir los hashes, por eso necesitamos comparar.

Guardamos ese hash obtenido en un archivo de texto hash.txt y ejecutamos lo siguiente.

john hast.txt --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-SHA256
  • hash.txt es el archivo donde hemos pegado el hash obtenido.
  • –wordlist= le indica dónde tenemos la lista de posibles contraseñas que queremos probar por fuerza bruta.
  • –format= le dice el formato del hash, el algoritmo que debe usar.

Si no encontramos cuál es el tipo de hash, podemos usar hashID en Python o buscar en identificador de hashes.com.

En Pentestmonkey tenemos una hoja resumen de los tipos de formato de John the Ripper para saber cómo pasarlos exactamente.

Enseguida nos da la contraseña.

videogamer124

Ahora que la tenemos, tratamos de conectar por ssh con la máquina:

ssh agent47@IP_Objetivo

¿Cuál es la bandera de usuario?

649ac17b1480ac13ef1e4fa579dac95c

Exponiendo servicios con túneles inversos de ssh

El reenvío de puertos inverso por ssh (Reverse SSH port forwarding) especifica qué puerto del servidor remoto ha de ser desviado a un host y puerto determinados en la parte local.

Túnel inverso de ssh

Túnel local

-L es un túnel local (Tú <– Cliente).

Si un sitio está bloqueado, podemos desviar el tráfico a un servidor que poseamos y verlo. Por ejemplo, si Imgur está bloqueado en el trabajo, puedes hacer:

ssh -L 9000:imgur.com:80 usuario@ejemplo.com

Con esta instrucción, si nos vamos a localhost:9000 en el navegador de nuestra máquina local, cargará el tráfico de imgur.com usando nuestro otro servidor.

Si nos fijamos, 9000 es mi puerto y 80 es el puerto que quiero reconducir a mi puerto 9000 por el túnel.

El esquema Tú <– Cliente es en este caso 9000 <– 80.

Túnel remoto

-R es un túnel remoto (Tú –> Cliente).

En este caso, desvías tu tráfico al otro servidor para que los demás lo vean. Es como el ejemplo anterior, pero al revés.

Vamos a usar en la máquina objetivo una herramienta llamada ss para investigar los sockets que están corriendo en un host.

ss -tulpn
  • -t muestra los sockets TCP.
  • -u muestra los sockets UDP.
  • -l muestra solo los que están a la escucha.
  • -p muestra los procesos usando el socket.
  • -n no resuelve los nombres de los servicios.

¿Cuántos sockets TCP están corriendo?

5

Podemos ver que un servicio que corre en el puerto 10000 está bloqueado desde el exterior mediante una regla de cortafuegos (podemos ver esto desde la lista de IPtable, pero no sé cómo, porque no somos superusuario, lo cual es necesario para que IPtable nos muestre cosas).

Sin embargo, usando un túnel ssh podemos exponer el puerto para verlo localmente.

En nuestra máquina local ejecutamos:

ssh -L 9000:localhost:10000 agent47@IP_Objetivo

Una vez completado el túnel, abrimos en el navegador localhost:9000 y podemos acceder al servidor web recién expuesto.

Nos identificamos con las credenciales de agent47 y accedemos.

¿Cuál es el nombre del CMS expuesto?

Webmin

¿Cuál es la versión del CMS?

1.580

Escalada de privilegios con Metasploit

Nos pide que usemos Metasploit para encontrar un payload que ejecutar contra la máquina.

La pista nos dice que el payload correcto nos dará acceso de administrador y que la bandera está en /root/root.txt

sudo msfconsole # Inicio Metasploit
search webmin # Nos salen opciones de exploits y auxiliares de Webmin
use 4 # Elegimos la opción 4 que parece adecuada
show options # vemos las opciones y que es para Webmin 1.580

Vamos poniendo las opciones, pero por alguna razón, no acaba de funcionar.

Si investigamos el exploit encontramos en su documentación que la vulnerabilidad se basa en que un usuario autenticado puede poner comandos de sistema tras /file/show.cgi/bin/ y los ejecuta con privilegios de root.

En el ejemplo que pone el documento vemos que si se pone lo siguiente en la barra del navegador:

https://servidorwebmin.com/file/show.cgi/bin/echo|ls -l|

Ejecuta echo y ls -l que nos descarga en un archivo que al abrir nos dice lo que queremos, el resultado del comando ls.

Si tenemos privilegios de administrador por culpa de esta vulnerabilidad, deberíamos poder leer la bandera con:

http://localhost:9000/file/show.cgi/bin/echo|cat /root/root.txt|

Cosa que conseguimos.

a4b945830144bdd71908d12d902adeee