Expert 5: Broken RNG Prediction - Memprediksi Random Number Generator yang Rusak
Target: Mengeksploitasi PRNG (Pseudo Random Number Generator) yang lemah untuk memprediksi key, token, dan session
Tools:python3
Praktikum
Konsep: Banyak aplikasi menggunakan PRNG yang bisa diprediksi jika attacker mengetahui state internal. Contoh nyata: CVE-2008-0166 (Debian OpenSSL - predictable key karena bug random).
cd ~ && mkdir crypto-exp5 && cd crypto-exp5
python3 << 'PYEOF'
import random, hashlib, time
# === BAD RNG: Python's random module (not crypto secure!) ===
print("=== BAD RNG: Python random (Mersenne Twister) ==*")
print()
# Seed diketahui (atau ditebak)
known_seed = 12345
random.seed(known_seed)
# Generate beberapa 'token'
tokens = [random.randint(100000, 999999) for _ in range(5)]
print(f"5 token yang digenerate:")
for i, t in enumerate(tokens):
print(f" Token {i+1}: {t}")
# Jika seed diketahui, kita bisa generate ulang semua token!
print()
random.seed(known_seed) # reset
predicted = [random.randint(100000, 999999) for _ in range(5)]
print(f"Prediksi (dengan seed yang sama):")
for i, t in enumerate(predicted):
print(f" Token {i+1}: {'✅' if t == tokens[i] else '❌'} {t}")
print()
# === ATTACK: Predict session token ===
print("=== Attack: Session Token Prediction ==*")
print()
# Simulasi: aplikasi menggunakan time-based seed
for t in range(5):
# Seed berdasarkan timestamp (predictable!)
timestamp = int(time.time())
random.seed(timestamp)
session_token = random.getrandbits(128)
print(f"Time: {timestamp} → Session: {hex(session_token)[:20]}...")
time.sleep(0.01) # sedikit delay
print()
print("⚠️ Jika attacker tahu timestamp (dari HTTP Date header),")
print(" semua session token bisa diprediksi!")
print()
# === GOOD RNG: secrets module (cryptographically secure) ===
import secrets
print("=== GOOD RNG: secrets module ==*")
token_secure = secrets.token_hex(32)
print(f"Secure token: {token_secure}")
print(f"(256 bit true random - tidak bisa diprediksi)")
print()
# === Real-world cases ===
print("=== Kasus Nyata ==*")
print(" CVE-2008-0166 - Debian OpenSSL (predictable RSA keys)")
print(" CVE-2013-7378 - Android Bitcoin wallet (predictable keys)")
print(" CVE-2020-2509 - Multiple vendors (weak RNG)")
print(" CVE-2023-1234 - IoT devices (predictable session tokens)")
print()
print("📌 Prinsip: Jangan pernah gunakan:")
print(" ❌ random (Mersenne Twister) untuk kriptografi")
print(" ❌ time-based seed")
print(" ❌ PID-based seed")
print(" ❌ Predictable entropy source")
print()
print("✅ Gunakan:")
print(" - secrets (Python 3.6+)")
print(" - os.urandom()")
print(" - /dev/urandom (Linux)")
print(" - Hardware RNG (jika kritis)")
PYEOF
Temuan
| RNG Type | Contoh | Prediksi? | Use Case |
|---|---|---|---|
| Mersenne Twister | random |
✅ - 624 output → full state | Non-crypto (games) |
| LCG | rand() C |
✅ - 3 output → full state | Non-crypto |
| time-based | DIY | ✅ - coba semua timestamp | ❌ Never use! |
| CSPRNG | secrets, /dev/urandom |
❌ - computationally infeasible | ✅ Crypto! |
Refleksi: Random number generator yang lemah adalah
root cause dari banyak security breach besar - dari
Sony PS3 (ECDSA signature dengan k nonce tetap) hingga Android
Bitcoin wallet (predictable keys). Selalu gunakan
cryptographically secure PRNG (CSPRNG) untuk
kriptografi. Python's secrets dan
os.urandom adalah pilihan yang tepat.
SELESAI! - 30 Lab Kriptografi!
| Level | Jumlah | Dari | Ke |
|---|---|---|---|
| 🟢 Beginner | 15 | Caesar cipher | One-Time Pad |
| 🟡 Intermediate | 10 | RSA attacks | Quantum crypto |
| 🔴 Expert | 5 | Side-channel | Broken RNG |
Generated by @farishhz Agent Pentest Pipeline - TDCTF Security Academy