Nivel 24-29
Last updated
Last updated
Ingresamos las credenciales para el nivel 24.
Usuario: natas24
Contraseña: MeuqmfJ8DDKuTr5pcvzFKSwlxedZYEWd
Tras iniciar sesión, nos encontramos con la página de inicio del Nivel 24. Se nos muestra para ingresar una contraseña pero para más información revisamos el código fuente.
En este nivel, la contraseña se verifica utilizando la función strcmp()
. SegĂşn la documentaciĂłn, esta funciĂłn solo devuelve valores mayores que 0, menores que 0 e iguales a 0. Por lo tanto, nuestro objetivo es que el valor de retorno sea igual a 0.
En PHP, strcmp()
tiene un comportamiento extraño. De hecho, si los argumentos que se pasan no son cadenas, devuelve 0. AsĂ que, intentemos pasando el array vacĂo passwd[]
.
Para ello, realizamos este comando:
Ingresamos las credenciales para el nivel 25.
Usuario: natas25
Contraseña: ckELKUWZUfpOv6uxS6M7lXBpBssJZ4Ws
Tras iniciar sesiĂłn, nos encontramos con la página de inicio del Nivel 25. Se nos muestra un texto cientĂfico y que se puede traducir en otro idioma por lo que revisamos el cĂłdigo fuente.
A primera vista, parece que el parámetro lang
podrĂa ser el vehĂculo del ataque. SegĂşn el cĂłdigo fuente, se realizan algunas comprobaciones sobre Ă©l...
En primer lugar, no se permite incluir la cadena natas_webpass
, por lo que el acceso directo al archivo /etc/natas_webpass/natas26
no es factible.
En segundo lugar, se realiza una comprobaciĂłn contra la presencia de ../
. En este caso, se eliminan todas las ocurrencias de ../
en $filename
.
La cadena "..././"
se convertirá en ../
, por lo que ahora se nos permite acceder completamente al sistema de archivos, y luego, también al archivo de registro generado por logRequest()
.
Dado que /etc/natas_webpass/natas26
no es accesible directamente, podemos intentar acceder a él a través del archivo de registro. Afortunadamente, la función logRequest()
no realiza ninguna comprobaciĂłn sobre la variable $_SERVER['HTTP_USER_AGENT']
, por lo que podemos usarla para inyectar cĂłdigo PHP.
Este script en Python está diseñado para realizar un ataque de inyección a un servidor web. Aquà están los pasos que sigue:
ConfiguraciĂłn de la SesiĂłn:
Usa la biblioteca requests
para crear una sesiĂłn HTTP.
Se autentica en el servidor con las credenciales proporcionadas (auth_name
y auth_pass
).
ObtenciĂłn de Cookies:
Realiza una solicitud GET al servidor para obtener la cookie PHPSESSID
necesaria para la autenticaciĂłn en las siguientes peticiones.
Preparación de Parámetros y Cabeceras:
Define un parámetro lang
con una ruta de archivo construida que incluye el ID de la sesiĂłn (PHPSESSID
). Esta ruta parece estar diseñada para acceder a un archivo de log especĂfico.
Define una cabecera User-Agent
que contiene un cĂłdigo PHP para leer el contenido del archivo /etc/natas_webpass/natas26
.
EnvĂo de la Solicitud POST:
EnvĂa una solicitud POST al servidor con los parámetros y las cabeceras configuradas.
El cĂłdigo PHP en el User-Agent
intenta ejecutar y mostrar el contenido del archivo que contiene la contraseña de la siguiente etapa.
Procesamiento de la Respuesta:
Lee la respuesta lĂnea por lĂnea y busca cualquier lĂnea que contenga un corchete de cierre ]
, imprimiendo esas lĂneas en la consola.
Ingresamos las credenciales para el nivel 26.
Usuario: natas26
Contraseña: cVXXwxMS3Y26n5UZU89QgpGmWCelaQlE
Tras iniciar sesiĂłn, nos encontramos con la página de inicio del Nivel 26. Se nos muestra para ingresar unas coordenadas para dibujar una lĂnea por lo que revisamos el cĂłdigo fuente.
El cĂłdigo PHP realiza las siguientes acciones:
Define una clase Logger
con propiedades privadas $logFile
, $initMsg
, y $exitMsg
.
En el constructor (__construct
), inicializa estas propiedades.
$initMsg
se establece con un mensaje de inicio de sesiĂłn.
$exitMsg
se establece con un fragmento de cĂłdigo PHP que incluye un archivo especĂfico (presumiblemente un archivo de contraseña).
$logFile
se establece con la ruta a un archivo PHP de salida.
Crea una instancia de Logger
y la serializa.
Codifica la instancia serializada en Base64 y la imprime.
Luego, envĂa esta cadena como “drawing” en la Cookie. Será deserializada por el servidor y considerada como un Logger. En la funciĂłn de destrucciĂłn (ejecutada automáticamente), escribirá un archivo PHP para mostrar el archivo de contraseña.
Esta es la cadena generada: YToxOntpOjA7Tzo2OiJMb2dnZXIiOjM6e3M6MTU6IgBMb2dnZXIAbG9nRmlsZSI7czoxNDoiaW1nL291dHB1dC5waHAiO3M6MTU6IgBMb2dnZXIAaW5pdE1zZyI7czoyNDoiI+KAk3Nlc3Npb24gc3RhcnRlZOKAkyMKIjtzOjE1OiIATG9nZ2VyAGV4aXRNc2ciO3M6NTE6Ijw/cGhwIGluY2x1ZGVfb25jZSgnL2V0Yy9uYXRhc193ZWJwYXNzL25hdGFzMjcnKTs/PiI7fX0=
Ingresamos las credenciales para el nivel 27.
Usuario: natas27
Contraseña: u3RRffXjysjgwFU6b9xa23i6prmUsYne
Tras iniciar sesión, nos encontramos con la página de inicio del Nivel 27. Se nos muestra en la página para hacer Login con nuestro usuario y contraseña por lo que revisamos el código fuente.
CĂłdigo tomado de referencia para resolver el nivel Repositorio de referencia
Se importan re
y requests
.
Se definen el usuario objetivo (natas28
) y la URL del servidor.
Se crea una sesiĂłn de requests
con autenticación básica.
Se crea un nombre de usuario craftado de 65 caracteres.
Se hace una solicitud POST para crear este usuario.
Se hace otra solicitud POST con un nombre de usuario craftado de 64 caracteres para explotar una vulnerabilidad.
Se usa una expresión regular para extraer y mostrar la contraseña del usuario natas28
.
Ingresamos las credenciales para el nivel 28.
Usuario: natas28
Contraseña: 1JNwQM1Oi6J6j1k49Xyw7ZN6pXMQInVj
Tras iniciar sesión, nos encontramos con la página de inicio del Nivel 28. Se nos muestra algo para ingresar y buscar una broma.
DespuĂ©s de un par de consultas, me di cuenta de que, cuando se envĂa una solicitud POST, se nos redirige a search.php
y se agrega una enorme cadena de consulta a la URL:
Si limpiamos esta URL eliminando todo hasta query=
y luego decodificamos la URL, la consulta se ve asĂ:
G+glEae6W/1XjA7vRm21nNyEco/c+J2TdR0Qp8dcjPKriAqPE2++uYlniRMkobB1vfoQVOxoUVz5bypVRFkZR5BPSyq/LC12hqpypTFRyXA=
Esta es una cadena codificada en base64, pero los intentos de decodificarla en algo Ăştil usando CyberChef no dieron resultados.
Error de Padding PKCS#7 y Análisis del Modo ECB
DespuĂ©s de experimentar con la cadena de consulta y eliminar caracteres, obtuve un error de padding PKCS#7. Al buscar este error en Google, encontrĂ© informaciĂłn relacionada con AES, tamaños de bloque y temas criptográficos similares. El error parecĂa estar relacionado con un cifrado de bloque AES, donde:
Hay un tamaño de bloque fijo para cifrar/descifrar.
La informaciĂłn no cumplĂa con esta longitud debido a mis modificaciones.
Noté que el inicio y el final de la cadena de consulta eran siempre los mismos, independientemente de la consulta de un solo carácter. Mi idea original fue un ataque de padding oracle. Sin embargo, dado el error PKCS#7 y la información repetitiva, es más probable que se trate de un modo de cifrado ECB (Electronic Code Book).
El modo ECB es inseguro porque no hay interdependencia entre los bloques de datos. Esto significa que cada bloque de texto plano idéntico produce el mismo bloque de texto cifrado, lo que resulta en una falta de difusión. Los patrones de datos no se ocultan bien, lo que hace que el protocolo sea más vulnerable a ataques de repetición.
Según una pista útil de Wikipedia, el modo ECB puede hacer que los protocolos sin protección de integridad sean más susceptibles a ataques de repetición, ya que cada bloque se descifra de la misma manera. Esto permite la posibilidad de mezclar y combinar bloques para realizar un ataque de repetición.
Este script es una soluciĂłn para el desafĂo Natas28 en la plataforma OverTheWire. El objetivo es realizar una inyecciĂłn SQL a travĂ©s de una vulnerabilidad en el cifrado del parámetro query
en la URL de la aplicaciĂłn web. GitHub source
AutenticaciĂłn: Se autentica en el sitio web usando las credenciales de Natas28.
Cifrado y ManipulaciĂłn:
EnvĂa una solicitud inicial para obtener el texto cifrado correspondiente a una consulta trivial.
Crea una nueva consulta SQL maliciosa (new_sql
) que extrae nombres de usuario y contraseñas concatenados.
Manipula el cifrado de la consulta original para incluir la consulta SQL maliciosa, asegurando que los bloques de cifrado coincidan.
InyecciĂłn SQL: EnvĂa la consulta manipulada al servidor, que ejecuta el SQL malicioso.
ExtracciĂłn de Datos: Recupera el resultado de la inyecciĂłn SQL, buscando especĂficamente las credenciales para el siguiente nivel, natas29
.
Ingresamos las credenciales para el nivel 29.
Usuario: natas29
Contraseña: 31F4j3Qi2PnuhIZQokxXk1L3QT9Cppns
Tras iniciar sesión, nos encontramos con la página de inicio del Nivel 29. Se nos muestra texto pero al parecer no es legible.
Este script nos ayuda para el desafĂo Natas29 en la plataforma OverTheWire.
Define Credenciales: Usa las credenciales del desafĂo Natas29 directamente en el cĂłdigo.
Explota Vulnerabilidad en Perl:
EjecuciĂłn Remota de Comandos: EnvĂa una solicitud para ejecutar el comando whoami
en el servidor a través de una vulnerabilidad en la función open()
de Perl, mostrando el usuario actual del servidor.
ObtenciĂłn de Contraseña: EnvĂa otra solicitud para leer el archivo que contiene la contraseña del siguiente nivel (natas30
), obteniendo asĂ la contraseña necesaria para avanzar al siguiente desafĂo.
La URL intenta leer el contenido del archivo /etc/natas_webpass/natas30
en el servidor usando la vulnerabilidad de ejecuciĂłn remota de comandos en Perl. Luego, reemplaza los saltos de lĂnea en el contenido del archivo con espacios para hacer que el resultado sea más legible en una sola lĂnea.