BBLABSBBLABS
LaboratoriosAprender desde 0FuncionesPreciosTestimoniosDetrás de BBLABS
  1. Home
  2. Labs
  3. 0-click-ATO — Account Takeover via OTP Brute Force + Email Case-Sensitivity Bypass
Insane1h

0-click-ATO — Account Takeover via OTP Brute Force + Email Case-Sensitivity Bypass

By @gorka

Exploit a case-sensitive OTP tracking system to brute-force the admin password reset

$600

That's what a company paid for this bug on YesWeHack. Here it is, rebuilt for you to find it yourself.

958 views20 completedUpdated Nov 2026
Log in to start

Learn to find this bug

This bug paid $600 on YesWeHack.

Create your account and practice real bugs that got paid. Download the environment, find it and learn the exact technique — your path to your first bounty.

650

hunters training

50

labs from real hacks

380

completions

$12,000

paid out for these bugs

40 flags captured this week
Create account
I already have an account

Access to all labs · no commitment · cancel anytime

Hackers who solved it· 8

sharat chandra1
@sharat chandraOct 2026
zuk4r12
@zuk4r1Sep 2026
flyingwhales3
@flyingwhalesAug 2026
telecasacasa45
@telecasacasa45Jul 2026
zynap
@zynapJul 2026
kaneki
@kanekiJul 2026
AL
@alex.burja.2000Jul 2026
benjaminnocervigni
@benjaminnocervigniJun 2026

Objectives

1
Discover the admin account
2
Identify the vulnerability in the password reset flow
3
Write a Python3 exploit script to brute-force the OTP
4
Take over the admin account and capture the flag

Information

Platform
YesWeHack
Difficulty
Insane
Duration
1h
Bounty
$600
Completed
20
Creator
gorka@gorka
Collaborators
antoniorivera@antoniorivera
Updated
Nov 2026

Download the environment

Reproduce it and find the bug yourself

Create account

Tools

BurpSuitePython

Prerequisites

  • Python3 with `requests` library
  • Basic understanding of HTTP APIs
  • Understanding of brute-force attacks

Tags

API Abuse

Achievement you'll earn

Solve this lab to unlock this shareable achievement

Solve this lab to unlock this shareable achievement

Community writeups

Free · no account

The checklist I run on every new target

47 checks ordered by cost: first what can get you in trouble, then the cheap stuff, and finally the expensive stuff — which is where the big bounties are. I'll send it to your inbox right now.

Unsubscribe in one click, from any email.

Deployment

# Using autodeploy
bash autodeploy.sh

# Or manually
docker compose up --build -d

Access the lab at: http://localhost:1337

Attack Chain

1. Login as user@securecam.io
2. Use "Invite to Camera Group" to discover admin@securecam.io
3. Analyze password reset flow:
   - POST /api/auth/forgot-password → generates 4-digit OTP
   - POST /api/auth/reset-password → email + new_password + otp
   - 4 failed attempts → email blocked
4. Discover: OTP tracking is case-sensitive, password reset is case-insensitive
5. Write Python3 exploit:
   - Generate email case variants (admin@, Admin@, aDmin@, etc.)
   - For each variant: request OTP → try 4 codes → move to next variant
6. Run exploit → password reset → login as admin → flag

Vulnerability Details

The server stores OTP attempts using the exact email string as the key (case-sensitive).
After 4 failed attempts for a specific email string, it is blocked.

However, the actual user lookup for password reset uses LOWER(email) = LOWER(?),
meaning all case variants of the email update the same user's password.

This means each case variant of the admin email (e.g., Admin@securecam.io, aDmIn@securecam.io)
gets its own 4 fresh OTP attempts, effectively bypassing the rate limit.

With 16 alphabetic characters in admin@securecam.io, there are 2^16 = 65,536 possible case variants,
each with 4 attempts = 262,144 total attempts, far exceeding the 10,000 possible 4-digit OTP codes.

Remediation

  1. Normalize email before OTP tracking: Convert to lowercase before storing in the OTP rate-limit store
  2. Global rate limiting: Implement rate limiting based on the normalized email, not the raw input
  3. Longer OTP codes: Use 6+ digit codes to increase the keyspace
  4. Account lockout: Lock the actual account after N failed reset attempts (not just the email variant)
  5. Time-based OTP expiration: Expire OTPs after a short window (e.g., 5 minutes)

Interactive Writeup

Access the step-by-step interactive writeup at: http://localhost:1337/writeup

Attribution

Bug Bounty Labs by @_.gorkaaa.b

The community

This isn't a platform with users.It's people breaking the same things you are.

Inside people ask, share what they found and solve together what would block anyone on their own. It's free to join: no account, no plan, no email required.

Join the BBLABS community on Discord
Join the Discord

Free and open. You don't need a BBLABS account to join.

BBLABS LogoBBLABS

Laboratorios de hacking basados en hackeos reales. Aprende practicando sobre entornos vulnerables, con la resolución explicada paso a paso.

Producto

  • Funcionalidades
  • Precios
  • Labs
  • Aprender desde 0
  • Blog
  • Detrás de BBLABS

Legal

  • Términos
  • Privacidad
  • Cookies
  • Entrar
  • Crear cuenta

Para cualquier duda, bug, soporte o sugerencia puedes escribir a team@bblabs.es

© 2026 BBLABS. Todos los derechos reservados.