Writeup - Wargame Natas - Parte 1
El wargame Natas, es un juego creado por OverTheWire en conjunto con NESSoS para enseñar lo básico de la seguridad web orientado desde el lado del servidor.
Cada nivel posee su propia web, los que pueden ser accedidos desde cualquier navegador a la direccion http://natasX.natas.labs.overthewire.org, donde la X corresponde al nivel en que nos encontremos.
Para poder acceder a cada nivel debemos ingresar el usuario y password correspondiente, donde el usuario corresponde al nivel (por ejemplo, para el nivel 0 el usuario es natas0
), y la password es la flag
adquirida en el reto anterior. Por lo tanto, debemos resolver el reto del nivel actual para poder obtener la password del siguiente nivel.
Solución Natas 0
En el nivel 0, OverTheWire nos brinda la siguiente información:
- Usuario: natas0
- Password: natas0
- URL: http://natas0.natas.labs.overthewire.org
Al ingresar al sitio, lo primero que nos aparece es un pop-up solicitando las credenciales del nivel:
Ingresamos los datos brindados anteriormente, y vemos el mensaje Puedes encontrar la password del siguiente nivel en esta página:
Si revisamos el código de la página haciendo clic derecho sobre esta, y seleccionado la opción View Page Source
en Firefox:
Esto nos abrirá una nueva pestaña, donde veremos el código de la página, la cual, posee un comentario con la password del siguiente nivel:
Solución Natas 0 > 1
Para ingresar al nivel 1, nos brindan la siguiente información:
- Usuario: natas1
- URL: http://natas1.natas.labs.overthewire.org
Al igual que en el reto anterior, debemos ingresar las correspondientes al nivel, que en este caso es para el nivel 1.
El mensaje que se nos muestra es: Puedes encontrar la password del siguiente nivel en esta página, pero el clic derecho se encuentra bloqueado!.
Para poder ver código de la página, podemos usar la combinación de teclas CTRL+U
, lo que nos permite encontrar la password del siguiente reto:
Solución Natas 1 > 2
Para ingresar al nivel 2, nos brindan la siguiente información:
- Usuario: natas2
- URL: http://natas2.natas.labs.overthewire.org
Esta vez, el mensaje que nos muestra es: No hay nada en esta página.
Si volvemos a revisar el código, vemos que se encuentra el enlace a una imagen:
La imagen en este caso no posee información útil:
Pero si ingresamos al directorio donde se encuentra almacenada, encontramos un archivo de texto:
Y al abrir el archivo, vemos que contiene la password del nivel 3:
Solución Natas 2 > 3
Para ingresar al nivel 3, nos brindan la siguiente información:
- Usuario: natas3
- URL: http://natas3.natas.labs.overthewire.org
Al igual que en el reto anterior, nos indican que no se encuentra nada en la página.
Al revisar el código de la página, nos encontramos con el comentario que dice: No más fuga de información, ni siquiera en Google.
Esto nos indica que no hay información indexada en google, y para lograr esto, se utiliza el archivo robots.txt
. Este le “enseña” a los motores de búsqueda que información indexar:
Ahora revisamos el contenido del directorio /s3cr3t
:
Y vemos el contenido del archivo users.txt
:
Solución Natas 3 > 4
Para ingresar al nivel 4, nos brindan la siguiente información:
- Usuario: natas4
- URL: http://natas4.natas.labs.overthewire.org
El mensaje de este nivel es el siguiente: Acceso no permitido. Está visitando desde “”, mientras que los usuarios autorizados deben proceder únicamente de “http://natas5.natas.labs.overthewire.org/“.
Al hacer clic en Refresh page
, el mensaje cambia automáticamente:
Si revisamos la comunicación que se genera mediante la opción inspeccionar (clic derecho > Inspect Element(Q) > Network
), vemos que en el encabezado del mensaje GET
que se genera al hacer clic en Refresh page
, se indica el Header Referer
, este especifica la dirección de la página anterior desde la que se accedió a la actual:
Para poder modificar este campo y enviar la información solicitada para obtener la password, usamos un Interception Proxy
(también puede ser mediante algún script). Un Interception Proxy
es una herramienta que permite capturar la comunicación cliente/servidor, analizarla, y poder modificarla. Dentro de estas herramientas, se encuentran: Burp Suite
y ZAP
.
Para este caso, utilizaré la herramienta Burp Suite
en su versión Community
.
Para usar este proxy, debemos configurar nuestro navegador para que envíe la comunicación hacia esta herramienta. En Firefox, debemos ir a Preferences > Network Settings
, y configurar en HTTP Proxy
la dirección de este y el puerto (por defecto es 8080):
NOTA: se recomienda instalar el certificado de Burp Suite en el navegador.
Iniciamos Burp con un proyecto temporal, y nos vamos al pestaña Proxy > Intercept
:
Ahora le damos clic una vez más en Refresh page
, y en Burp nos aparecerá lo siguiente:
Lo que sucedió, es que Burp interceptó la comunicación enviada por el navegador, y ahora podemos modificar el Header Referer con la información especificada en el reto. Una vez modificado el encabezado, le damos clic en Forward
:
Y al enviar el mensaje modificado, vemos que en nuestro navegador aparece la password para natas5:
Solución Natas 4 > 5
Para ingresar al nivel 5, nos brindan la siguiente información:
- Usuario: natas5
- URL: http://natas5.natas.labs.overthewire.org
Al ingresar al nivel 5, vemos el mensaje Acceso deshabilitado, No estás logueado.
Si interceptamos el tráfico con Burp, vemos que el Header Cookie
tiene como parámetro loggedin=0
:
Revisemos qué sucede cuando modificamos este valor, y lo cambiamos por un 1
:
Vemos que esto nos brinda la password del siguiente nivel:
Solución Natas 5 > 6
Para ingresar al nivel 6, nos brindan la siguiente información:
- Usuario: natas6
- URL: http://natas6.natas.labs.overthewire.org
Al ingresar, vemos un campo para hacer consultas, además, de un enlace a un código:
Si ingresamos un dato cualquiera, este nos muestra el mensaje Wrong secret:
Si revisamos el código del enlace que nos brindan, vemos que es un código PHP
, el que valida lo que ingresamos en el campo Input secret
:
Lo que hace es validar si lo que enviamos mediante el método POST
es igual a lo que tiene asignado en la variable $secret
, nos mostrará la password de natas7.
Además, vemos que se está incluyendo el archivo includes/secret.inc
. Por lo tanto, intentamos ver que tiene:
Al revisar, vemos que no tiene nada, pero si vemos su código, nos damos cuenta que encontramos el valor de $secret
:
Ahora copiamos este valor en el campo de consulta del inicio, y este nos trae de vuelta la password de natas7:
Solución Natas 6 > 7
Para ingresar al nivel 7, nos brindan la siguiente información:
- Usuario: natas7
- URL: http://natas7.natas.labs.overthewire.org
Al ingresar, vemos que se encuentran dos enlaces, uno al Home
y el otro a About
:
Al ingresar a cada uno de estos, no se nos presenta información útil:
Al revisar el código, vemos que tiene un comentario indicando lo siguiente: Pista: la password para el usuario web natas8 está en /etc/natas_webpass/natas8.
Esto nos indica que debemos revisar el archivo natas8
que se encuentra en /etc/natas_webpass/
. La pista nos señala que es posible que se encuentre una vulnerabilidad LFI
, lo que nos permitirá ver el contenido de un archivo local en el servidor.
Por lo tanto, intentamos pasarle la ruta del archivo en la variable page
, y vemos que nos trae de vuelta la password para natas8:
Solución Natas 7 > 8
Para ingresar al nivel 8, nos brindan la siguiente información:
- Usuario: natas8
- URL: http://natas8.natas.labs.overthewire.org
Al ingresar, vemos que se presenta un campo para hacer queries y un enlace con un código:
Si revisamos el código, vemos que este tiene una función llamada encodeSecret
y una variable con el nombre encodedSecret
:
Si revisamos dicha función, lo que hace es tomar el valor de la variable secret
y la codifica en base64
. Luego, invierte el string que este genera y le aplica la función bin2hex
. Esto da como resultado el valor de encodedSecret
, que es el que nos muestran en el código: 3d3d516343746d4d6d6c315669563362
.
Por lo tanto, para saber que enviar en esta query, debemos realizar lo inverso a la función anterior.
Para lograr esto, se creó el siguiente script en PHP. Este muestra el paso a paso de lo que hace cada parte de la función:
Al ejecutarlo, vemos que nos entrega un valor (oubWYf2kBq
), el cual si lo ingresamos en el navegador, nos brinda la password del siguiente nivel:
Solución Natas 8 > 9
Para ingresar al nivel 9, nos brindan la siguiente información:
- Usuario: natas9
- URL: http://natas9.natas.labs.overthewire.org
En este nivel, nos piden ingresar Encuentra palabras que contengan:
Si revisamos el código presentado en el enlace, este valida si el valor de la variable key
no se encuentra vacía (parámetro que pasamos en la query), y en caso de no estarlo, ejecuta un passthru
. El cual, permite ejecutar un programa externo, que en este caso, es un grep
:
Por lo tanto, si le pasamos algún dato a esa variable, buscará palabras dentro de un diccionario y mostrará el contenido que tenga lo que le ingresamos. Entonces, si le ingresamos una a
, este nos traerá todo lo que contenga una a
:
Como sabemos que passthru
permite ejecutar código, intentamos ejecutar un ls
, pero antes de este, le pondremos un ;
. Este es usado para ejecutar varios comandos en Linux en una única línea:
Si revisamos la URL, podemos observar que no aparece ;ls
, si no que, %3Bls
, esto se debe a que sea realizó una codificación de URL, donde ;
se codifica como %3B
.
Ahora sabemos que se pueden inyectar comandos, por lo tanto, intentamos leer el archivo con la password del siguiente reto usando un cat /etc/natas_webpass/natas10
:
Solución Natas 9 > 10
Para ingresar al nivel 10, nos brindan la siguiente información:
- Usuario: natas10
- URL: http://natas10.natas.labs.overthewire.org
Este reto es similar al anterior, pero si revisamos el código que nos entregan, podemos ver que en este caso, no podemos usar los caracteres ;
, |
y &
:
Por lo tanto, como no se pueden usar los caracteres del reto anterior, se utilizaran expresiones regulares con el grep
de la función. En este caso, ejecutaremos el comando . /etc/natas_webpass/natas11 #
:
.
expresión regular que hace match con cualquier carácter./etc/natas_webpass/natas11
archivo que leeremos mediantegrep
.#
corresponde a un comentario, el cual, nos permite omitir todo lo que viene después del archivo a leer.