Nivel 18-23
Last updated
Last updated
Ingresamos las credenciales para el nivel 18.
Usuario: natas18
Contraseña: 6OG1PbKdVjyBlpxgD4DDbRG6ZLlCGgCJ
Tras iniciar sesión, nos encontramos con la página de inicio del Nivel 18. Se nos muestra en la página para hacer Login con nuestro usuario y contraseña pero que iniciemos sesión con las credenciales típicas admin:admin.
En el código fuente, la directiva
nos sugiere que el valor de PHPSESSID
puede asumir hasta 640 posibles valores. Este número es lo suficientemente bajo como para permitir un ataque de fuerza bruta contra la variable PHPSESSID
con el fin de realizar un Session Hijacking. Por lo que realizamos un script que lo haga por nosotros.
Ingresamos las credenciales para el nivel 19.
Usuario: natas19
Contraseña: tnwER7PdfWkxsG4FNWUtoAZ9VyZTJqJr
Tras iniciar sesión, nos encontramos con la página de inicio del Nivel 19. Se nos muestra en la página para hacer Login con nuestro usuario y contraseña. Como los valores de PHPSESSID
no siguen un patrón secuencial, es necesario analizar la aleatoriedad para intentar predecirlos. Para lograr esto, debemos recolectar una cantidad significativa de valores de PHPSESSID
generados y luego aplicar técnicas estadísticas para entender el patrón.
Recopilación de PHPSESSID
:
Genera una lista de valores PHPSESSID
realizando solicitudes al servidor y guarda los valores en un archivo.
Análisis de los IDs recopilados:
Calcula el porcentaje de aparición de cada longitud de PHPSESSID
.
Analiza la frecuencia de caracteres en cada posición de los PHPSESSID
para identificar patrones.
Estadísticas:
Muestra estadísticas sobre la frecuencia de caracteres en cada posición del PHPSESSID
basado en los datos recopilados.
Este script es útil para evaluar la aleatoriedad de los valores PHPSESSID
y puede ayudar a predecir futuros valores de sesión.
El análisis muestra que los PHPSESSID
de longitud 18 son los más comunes. En los PHPSESSID
de longitud 18, varios caracteres tienen una precisión del 100% en sus posiciones respectivas, lo que sugiere que estos caracteres son consistentes y predecibles.
Ahora podemos intentar con un ataque de fuerza bruta porque el rango de soluciones posibles es razonable (16x16x16).
Ingresamos las credenciales para el nivel 20.
Usuario: natas20
Contraseña:p5mCvP7GS2K6Bmt3gqhM2Fc1A5T8MVyw
Tras iniciar sesión, nos encontramos con la página de inicio del Nivel 20. Se nos muestra en la página para cambiar nuestro nombre pero debemos iniciar sesión como administrador.
En este nivel, es realista decir que el ID de sesión no puede ser predicho. De hecho, parece ser totalmente aleatorio.
Al observar el código fuente, podemos ver que se definieron manejadores personalizados para la gestión del almacenamiento de sesiones. En nuestro caso, los que nos interesan son myread()
y mywrite()
.
En myread()
podemos ver que el contenido del archivo de sesión se divide utilizando (salto de línea) como carácter separador.
Además, para llenar el array $_SESSION
, se espera que cada línea tenga la forma clave valor.
Para autenticarse como administrador, la página verifica si la sesión contiene la clave admin
y si su valor es 1
.
Cuando se envía un parámetro llamado name
, se inicializa una nueva sesión y el valor de name
se almacena en ella.
Este código realiza un ataque de manipulación de sesión en un desafío de seguridad web.
Primera Solicitud:
Envía una solicitud GET a la URL objetivo con los parámetros name='admin\nadmin 1'
y debug=''
.
Este parámetro name
incluye un salto de línea (), que puede manipular cómo el servidor trata la información de la sesión.
Guarda la cookie de sesión (PHPSESSID
) que recibe como respuesta.
Segunda Solicitud:
Envía una segunda solicitud GET usando la misma cookie de sesión obtenida en la primera solicitud.
Debido a la manipulación de la sesión en la primera solicitud, la segunda puede devolver una respuesta diferente, posiblemente dando acceso a privilegios administrativos o información sensible.
Ingresamos las credenciales para el nivel 21.
Usuario: natas21
Contraseña: BPhv63cKE1lkQl04cE5CuFTzXe15NfiH
Tras iniciar sesión, nos encontramos con la página de inicio del Nivel 21. Se nos muestra que la página ha sido colocada en otra URL por lo que revisamos el código fuente.
La función print_credentials()
en la página principal verifica si $_SESSION
tiene el parámetro admin
y si su valor es igual a 1.
En la página "experimenter", si $_REQUEST
contiene la clave submit
, todos los atributos contenidos se guardan en $_SESSION
.
El ataque se define de la siguiente manera: Al pasar admin=1
en la página de "experimenter", podremos obtener la contraseña para Natas22.
Este código realiza dos solicitudes HTTP GET: la primera establece el valor admin=1
en la sesión para obtener la cookie de sesión, y la segunda usa esa cookie para acceder a la página principal y obtener las credenciales para el siguiente nivel.
Ingresamos las credenciales para el nivel 22.
Usuario: natas22
Contraseña: d8rwGBl0Xslg3b76uh3fEbSlnOUBlozz
Tras iniciar sesión, nos encontramos con la página de inicio del Nivel 22. NO se nos muestra nada relevante por lo que revisamos el código fuente.
Viendo el código fuente realizamos este comando:
Autenticación Básica:
curl
realiza una solicitud HTTP a la URL especificada utilizando las credenciales de autenticación básica (natas22
y d8rwGBl0Xslg3b76uh3fEbSlnOUBlozz
). Esto asegura que solo los usuarios autenticados puedan acceder a la página.
Solicitud GET con Parámetro revelio
:
La solicitud GET se envía a la URL con el parámetro revelio
en la cadena de consulta. Según el código PHP proporcionado anteriormente, este parámetro se usa para revelar las credenciales del siguiente nivel si el usuario está autenticado como administrador.
Mostrar Encabezados y Respuesta:
La opción -i
incluye los encabezados HTTP en la respuesta, por lo que puedes ver información adicional sobre la respuesta, como el código de estado HTTP y otros encabezados.
Ingresamos las credenciales para el nivel 23.
Usuario: natas23
Contraseña: dIUQcI3uSus1JEOSSWRAEXBG8KbR8tRs
Tras iniciar sesión, nos encontramos con la página de inicio del Nivel 23. Se nos muestra para ingresar una contraseña por lo que revisamos el código fuente para más información.
Viendo el código fuente realizamos este comando:
Autenticación Básica:
-u natas23:D0vlad33nQF0Hz2EP255TP5wSW9ZsRSE
Proporciona las credenciales necesarias para autenticar al usuario natas23
con la contraseña D0vlad33nQF0Hz2EP255TP5wSW9ZsRSE
.
Método GET:
-XGET
Realiza una solicitud GET al servidor.
Parámetro passwd
:
?passwd=20%20iloveyou
Envía la contraseña 20 iloveyou
, que debe cumplir con los requisitos de la página para revelar las credenciales del siguiente nivel.