Hola chicos, continuamos con la segunda tarea de la unidad 2 del curso.
Se trata de acceder a la aplicación web vulnerable
DVWA contenida en una máquina virtual con un servidor web que la sirve. Contiene una serie de páginas con ejercicios relacionados con el hacking web, como
XSS, Command Execution o
SQL Injection; esta última técnica es la que utilizaremos.
Una vez levantada la máquina en un entorno de máquinas virtuales (
VirtualBox en este caso), podemos acceder a la misma desde cualquier navegador web accediendo a la dirección
IP indicada.
 |
| Máquina con DVWA corriendo |
En el navegador podremos acceder ya a los diferentes ejercicios utilizando el usuario y contraseña predeterminados en la máquina, que pueden consultarse de forma pública (
admin, password) o bien, si nos sentimos motivados, mediante un ataque de fuerza bruta (por ejemplo, con
Hydra).
 |
| Pantalla principal de la aplicación web |
Para esta práctica, siendo algo básico, configuraremos la aplicación para que ofrezca un nivel bajo de seguridad. Podemos hacerlo accediendo al área
DVWA Security.
 |
| Configuración de seguridad a nivel bajo |
Podemos ir ya al apartado de la inyección
SQL. Introduciendo en el campo
User ID un número, nos muestra los datos del usuario cuyo
ID coincide con dicho número.
 |
| Funcionamiento de la aplicación para SQL Injection |
Podemos realizar muchos tipos de inyección. La más sencilla es:
1' or '1'='1
De esta manera, nos arrojará los datos de los usuarios cuyo
ID sea 1, o en los que el carácter '1' sea igual al carácter '1'. Al cumplirse siempre esa condición, nos devuelve los datos de todos los usuarios.
 |
| Resultado de la primera inyección |
Lo siguiente que podemos hacer es conseguir la versión del gestor de bases de datos que maneja la aplicación. Podemos hacerlo introduciendo:
1' union select null,version() #
Lo que indicamos es que, de nuevo, nos devuelva los usuarios cuyo
ID es 1, y que además agregue (
union) un campo vacío (
null) y la versión del sistema gestor (
version()). El campo vacío se requiere, dado que para una unión es necesario que se muestren dos campos, igual que en la consulta original, o habrá error. Por último, el carácter # hace que se ignore el resto de la línea de consulta, evitando errores al haber más código tras el inyectado.
 |
| Resultado de la segunda inyección |
De la misma manera, podemos averiguar el usuario con el que la aplicación maneja el gestor de base de datos, sustituyendo la función que devuelve la versión (
version()) por la de usuario (
user()).
1' union select null,user() #
 |
| Resultado de la tercera inyección |
De nuevo, variando el mismo campo de la consulta, podemos averiguar el nombre de la base de datos, utilizando la función
database().
1' union select null,database() #
 |
| Resultado de la cuarta inyección |
Moviéndonos a consultas algo más avanzadas, podemos recuperar mediante la siguiente inyección todas las tablas contenidas dentro del gestor de bases de datos:
1' union select null,table_name from information_schema.tables #
Estamos, en combinación con los campos ya explicados, recopilando el campo
table_name de la tabla
tables en la base de datos
information_schema, que contiene datos sobre todas las tablas contenidas en el gestor.
 |
| Resultado de la quinta inyección |
Pero aún podemos "afinar" más aún la consulta. Especificando con una cláusula
where, podemos pedir solamente las tablas cuyo nombre comience por la cadena
user, intentando averiguar tablas que contengan datos de usuarios.
1' union select null,table_name from information_schema.tables where table_name like 'user%' #
 |
| Resultado de la sexta inyección |
Como vemos, el resultado son un par de tablas que nos indican los privilegios de cada usuario, y una que contiene datos de los mismos usuarios. Podemos indagar en las columnas que forman esta última tabla con una inyección más enrevesada:
1' union select null,concat(table_name,0x0a,column_name) from information_schema.columns where table_name = 'users' #
Estamos indicando que, pese a que necesitamos que los campos devueltos sean dos, el segundo sea la concatenación del nombre de la tabla
users, un salto de línea (representado en hexadecimal como
0x0a) y el nombre de cada columna.
 |
| Resultado de la séptima inyección |
Por último, y teniendo ya los campos de la tabla, podemos pedir un listado de todos los datos de cada usuario. Utilizaremos de nuevo una concatenación para mostrar múltiples resultados.
1' union select null, concat(first_name, 0x0a, last_name, 0x0a, user, 0x0a, password) from users #
 |
| Resultado de la octava inyección |
El resultado muestra todos los datos relevantes de cada usuario: nombre, apellido, nombre de usuario y contraseña cifrada (
hash).
Obtenidos estos
hashes, podemos copiarlos a un fichero de texto para poder realizar un ataque de fuerza bruta con diccionario sobre ellos y así obtener las contraseñas en plano. Los introduciremos en dicho fichero de la siguiente manera:
 |
| Fichero de texto con los usuarios y hashes |
Utilizaremos la herramienta
Hashcat para realizar el crackeo de los
hashes. En concreto, descargaremos también la herramienta
Hashcat GUI para que el proceso sea algo más gráfico. Descomprimiremos en cualquier lugar ambas herramientas y ejecutaremos esta última. (¡Necesitaremos saber dónde está la otra para introducir su binario en la GUI!)
 |
| Uso de Hashcat GUI para el crackeo de los hashes |
Introduciremos el diccionario
rockyou.txt en la pestaña
Wordlists and Markov. En la pestaña
Hashcat introduciremos el archivo con los
hashes en el campo
Hash File, el binario de
Hashcat actualizado en
Binary y opcionalmente un lugar donde guardar los resultados en
Output.
Cambiaremos además el
Hash Type a
MD5, formato en el que se suelen guardar las contraseñas en las bases de datos. Podemos verificarlo utilizando alguna página de comprobación del tipo de
hash, como puede ser
ésta. Finalmente, marcamos las opciones
Disable Pot File e
Ignore Usernames, de manera que ignora
hashes anteriormente encontrados e ignora los nombres de usuario del fichero de texto.
Hecho esto podemos pulsar el botón enorme
I'm a HashKiller y tener los resultados en apenas segundos, pudiendo seguir el proceso en la ventana de consola en la que se mostrará
Hashcat funcionando.
 |
| Seguimiento del crackeo en Hashcat |
Podemos apreciar los resultados del
crackeo en el fichero de resultados, viendo que ha sido todo un éxito; todas las contraseñas pudieron obtenerse.
 |
| Resultados del crackeo |
Y hasta aquí el ejercicio de hoy. Un saludo y espero que os sirva, pronto seguiremos trabajando!!
No hay comentarios:
Publicar un comentario