TDCTF Academy Logo TDCTF ACADEMY

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

PADA HALAMAN INI