lunes, 27 de agosto de 2018

Explotación Web (IV): Solución Reto Hackerfire "Kept in Secret" (II)

Decía en el anterior post que en éste iba a solucionar el reto de explotación Web de la plataforma HackerFire, que en el citado post resolví con sqlmap, de forma manual, es decir, sin utilizar ninguna herramienta para ello.

Recuerdo la información sobre el reto a resolver:

Este reto tiene el título "Kept in Secret" y mi valoración sobre su dificultad es: ☆☆.

Su enunciado dice lo siguiente:


Now that you know the basic ideas behind SQL injection, can you use the techniques you've learned to extract the password for the admin?.

Solución: Tal y como dice el enunciado se trata de obtener la password del administrador mediante SQL injection.

Accedo a la web y me encuentro lo siguiente (compacto un poco la información que se muestra para que se vea mejor):
Como ya realicé el registro ("Register") cuando escribí el post anterior,  introduzco el usuario y password, "a" y "a" en ambos casos, en el formulario "Login" y se muestra la relación de usuarios.


Introduzco a' order by 4# y obtengo lo siguiente:
Por tanto, parece que la consulta de la que se muestra la información tiene sólo 3 columnas (las correspondientes a "Username", "Name" y "Description).

Intento obtener el nombre de las tablas de la base de datos, para lo que introduzco a' union select 1,table_name,3 from information_schema.tables where table_schema = database()# y se muestra lo siguiente:
La base de datos contiene una única tabla: "users".

Intento ahora ver el nombre de las columnas de esa tabla, para lo que introduzco a' union select 1,column_name,3 from information_schema.columns where table_schema = database()#  y se muestra lo siguiente:
Finalmente, introduzco a' union select 1,username,password from users# y obtengo:
Por tanto, la solución del reto es: flag{pa55w0rd5_ar3_b1g_s3cr3t5}.

sábado, 18 de agosto de 2018

Explotación Web (III): : Solución Reto Hackerfire "Kept in Secret" (I)

En este post la solución a uno de los retos de explotación Web de la plataforma HackerFire.

Este reto tiene el título "Kept in Secret" y mi valoración sobre su dificultad es: ☆☆.

Su enunciado dice lo siguiente:


Now that you know the basic ideas behind SQL injection, can you use the techniques you've learned to extract the password for the admin?.

Solución: Tal y como dice el enunciado se trata de obtener la password del administrador mediante SQL injection.

Accedo a la web y me encuentro lo siguiente:
Tras el registro ("Register") y posterior introducción de usuario y password en el formulario "Login", busco ("Search") el usuario con el que me he conectado("a"); y obtengo lo siguiente:
En esta ocasión, para resolver este reto utilizo sqlmap, que, tal y como se dice en su página oficial, es una herramienta de código abierto de prueba de penetración que automatiza el proceso de detección y explotación de vulnerabilidades de inyección SQL.

En primer lugar obtengo las bases de datos mediante el siguiente comando: sqlmap.py -u "http://challenges.hackerfire.com:30005/profiles.php?search=a" --dbs
Como vemos, sqlmap detecta que el Sistema de Gestión de Base de Datos es 'MySQL' por lo que no es necesario realizar pruebas para otros DBMS´s y pulsamos la tecla "Enter":
Tras finalizar la ejecución, tal y como se observa en la figura anterior, veo que existen dos bases de datos: "information_schema" y "Secrets".

A continuación obtengo las tablas de la base de datos "Secrets" mediante el siguiente comando: sqlmap.py -u "http://challenges.hackerfire.com:30005/profiles.php?search=a" -D Secrets --tables
Como se ve en la figura anterior hay una única tabla, "users", en la base de datos "Secrets".

Obtengo ahora las columnas y el contenido de la tabla "users" mediante el siguiente comando: sqlmap.py -u "http://challenges.hackerfire.com:30005/profiles.php?search=a" -D Secrets -T users --dump
En la figura anterior veo las columnas de la tabla "users" y el vaciado o volcado del contenido de ésta lo deja en un fichero CSV. Abro ese archivo y veo que la fila correspondiente al nombre de usuario "admin" contiene lo siguiente:

1,Admin,admin,flag{pa55w0rd5_ar3_b1g_s3cr3t5},doing admin duties

Por tanto, ya tengo la password del administrador, que es la solución del reto:  flag{pa55w0rd5_ar3_b1g_s3cr3t5}.

En el siguiente post resolveré este reto de forma manual, es decir, sin utilizar ninguna herramienta para ello.

Explotación Web (II): Solución Reto CTFLearn "Inj3ction Time"

En este post la solución a otro de los retos de explotación Web de la plataforma CTFLearn.

Este reto tiene el título "Inj3ction Time" y mi valoración sobre su dificultad es: ☆☆.

Su enunciado dice lo siguiente:


I stumbled upon this website: http://web.ctflearn.com/web8/ and I think they have the flag in their somewhere. UNION might be a helpful command.

Solución: Al igual que en el anterior, por el título parece evidente que se trata de un reto de SQL injection.

Antes que nada comentar que no soy ningún experto en SQL, sólo sé lo que recuerdo de mi época de programador, que fue hace mucho tiempo, y tampoco soy un especialista en este tipo de ataques web, por lo que si explico mal la solución de este reto agradecería que algún amable lector de este humilde blog me corrija.

En cualquier caso, lo que hice para intentar resolver este reto fue lo siguiente:

Accedo a la web y me encuentro lo siguiente:
Introduzco 1 en "ID:" y obtengo el mismo resultado:
Introduzco 2 en "ID:" y cambian los datos que se muestran:
Introduzco 1 or 1 = 1# en "ID:", lo que en el caso de que esta web sea vulnerable a SQL injection nos debería devolver todas las filas de la tabla, ya que 1 = 1 es siempre verdadero; y se muestra lo siguiente:
Por tanto, esta web es vulnerable a SQL injection.

Asimismo, parece que la consulta de la que se muestra la información tiene, al menos, 4 columnas (la correspondiente a "ID" más aquellas que se corresponderían a los tres datos que se muestran para cada "ID"). Intento verificar si esto es así introduciendo 1 or 1 = 1 order by 5# en "ID:"; y obtengo lo siguiente:
Por tanto, la consulta original tiene menos de 5 columnas y, además, como no se muestra ningún mensaje de error sino que únicamente desaparece la información que se está mostrando, yo diría que esta página es sólo vulnerable a Blind SQL Injection (Inyección SQL ciega), es decir, si la consulta que realizo es verdadera se muestra la información correspondiente mientras que si es falsa no se muestra resultado alguno.

Intento ahora ver el nombre de las tablas de la base de datos, para lo que introduzco 1 or 1 = 1 union select 1,table_name,3,4 from information_schema.tables where table_schema = database()# en "ID"; y se muestra lo siguiente:
La base de datos tiene dos tablas: "w0w_y0u_f0und_m3" y "webeight". Por el nombre de las tablas, parece claro que la que contiene la bandera es la primera de ellas.

Intento ahora ver el nombre de las columnas de esas dos tablas, para lo que introduzco 1 or 1 = 1 union select 1,column_name,3,4 from information_schema.columns where table_schema = database()# en "ID"; y se muestra lo siguiente:
Por los resultados obtenidos hasta el momento, creo que la bandera se encuentra en la columna "f0und_m3" de la tabla "w0w_y0u_f0und_m3", por lo que introduzco 1 or 1 = 1 union select 1, f0und_m3,3,4 from w0w_y0u_f0und_m3# en "ID":
Por tanto, la solución del reto es: abctf{uni0n_1s_4_gr34t_c0mm4nd}.

viernes, 17 de agosto de 2018

Explotación Web (I): Solución Reto CTFLearn "Basic Injection"

En este post la solución a uno de los retos de explotación Web de la plataforma CTFLearn.

Este reto tiene el título "Basic Injection" y mi valoración sobre su dificultad es: ☆☆.

Su enunciado dice lo siguiente:


See if you can leak the whole database. https://web.ctflearn.com/web4/


Solución: Por el título parece evidente que se trata de un reto de SQL injection. Pruebo con lo más básico de este tipo de ataques.

Accedo a la web
 introduzco ' or 1 = 1# en "Input", obteniendo lo siguiente:
Por tanto, la solución del reto es: fl4g_giv3r.

Codificación (II): Solución Reto CTFLearn "Privacy Matters"

En este post la solución a otro de los retos de codificación de la plataforma CTFLearn.

Este reto tiene el título "Privacy Matters" y mi valoración sobre su dificultad es: ☆☆.

Su enunciado dice lo siguiente:


The URL that has the flag got corrupted again... here it is: êööòõ¼±±åñæçòçð°ëñ±ðëåîçø´²±è÷îî±øûÛÓüɱ


Solución: Al tratarse de una URL supongo que el principio de la cadena de caracteres que nos dan se corresponde con http. La representación unicode de "ê" en decimal es 234 y la de "h" es 104. Por tanto, pruebo con un pequeño script en Python para ver si nos revela la URL (resto 130 a la representación decimal unicode de cada carácter de la URL corrupta para obtener la representación decimal unicode de cada carácter de la URL original y muestro esta última):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

cipher = "êööòõ¼±±åñæçòçð°ëñ±ðëåîçø´²±è÷îî±øûÛÓüɱ"
solution = ""
for x in cipher:
     solution = solution + (chr(ord(x)-130))

print solution

Tras ejecutar este script obtengo:
Por tanto, la URL original es: https://codepen.io/niclev20/full/vyYQzG/.

Accedo a esa URL:
Y, pulsando "Change View > Editor View" o a través del código fuente de la página, enseguida encuentro la solución al reto: "ABCTF{harder_this_time}".