TDCTF Academy Logo TDCTF ACADEMY

Int 3: ️ Padding Oracle Attack - Membongkar Enkripsi CBC tanpa Key

Target: Mengeksploitasi padding oracle untuk mendekripsi data tanpa mengetahui kunci - attack klasik di kriptografi
Tools: python3


Praktikum

Konsep: AES-CBC melakukan padding (PKCS#7) - jika padding salah saat dekripsi, server mengembalikan error. Attacker bisa menggunakan oracle ini untuk mendekripsi data byte by byte hanya dengan 256 percobaan per byte!

cd ~ && mkdir crypto-int3 && cd crypto-int3

python3 << 'PYEOF'
import os

# === SETUP: Simulasi server dengan padding oracle ===
KEY = os.urandom(16)
IV = os.urandom(16)

def encrypt(plaintext):
"""AES-CBC encrypt (simplified for demo)"""
from Crypto.Cipher import AES
cipher = AES.new(KEY, AES.MODE_CBC, IV)
return IV + cipher.encrypt(plaintext + b'\x10' * 16) # padding dummy

def padding_oracle(ciphertext):
"""Server: return True jika padding valid, False jika tidak"""
from Crypto.Cipher import AES
iv = ciphertext[:16]
ct = ciphertext[16:]
cipher = AES.new(KEY, AES.MODE_CBC, iv)
try:
pt = cipher.decrypt(ct)
# Cek padding (PKCS#7)
pad_len = pt[-1]
if pad_len < 1 or pad_len > 16:
return False
if pt[-pad_len:] != bytes([pad_len] * pad_len):
return False
return True
except:
return False

# === ATTACK: Padding Oracle ===
print("=== Padding Oracle Attack Demonstration ==*")
print()

# Encrypt a message
plaintext = b"Transaksi: Rp 500.000 ke Rek 1234"
iv, ct = encrypt(plaintext)[:16], encrypt(plaintext)[16:]
print(f"Plaintext: {plaintext}")
print(f"IV: {iv.hex()}")
print(f"Ciphertext: {ct.hex()}")
print()

# Attack simulation
print("Server akan mengembalikan:")
print(" ✅ True - jika padding VALID (byte trial benar)")
print(" ❌ False - jika padding INVALID (byte trial salah)")
print()
print("Attacker memodifikasi CIPHERTEXT byte-by-byte")
print("sampai server mengembalikan True → berarti byte benar!")
print()
print("Dengan 256 percobaan per byte, attacker bisa")
print("mendekripsi seluruh pesan tanpa tahu KEY! 🔓")
print()

# Demo: trial satu byte
print("=== Demo: Trial Byte Pertama ==*")
for trial in range(256):
modified_ct = bytearray(ct)
modified_ct[15] = trial # modifikasi byte terakhir blok pertama
if padding_oracle(iv + bytes(modified_ct)):
print(f" Oracle True pada byte 0x{trial:02x} ({chr(trial) if 32<=trial<127 else '?'})")
break
PYEOF

Temuan

Aspek Detail
Kondisi Server memberikan feedback padding valid/invalid
Cara kerja Modifikasi ciphertext byte-by-byte, cek oracle response
Kompleksitas 256 percobaan × 16 byte per blok = ~4000 requests
Dampak Dekripsi penuh tanpa key!
Contoh nyata CVE-2013-0169 (ASP.NET), Lucky13 attack (TLS)

Refleksi: Padding oracle adalah contoh klasik mengapa error message yang terlalu informatif berbahaya. Mitigasi: gunakan Authenticated Encryption (GCM) - jika ciphertext diubah, MAC verification gagal sebelum padding dicek. Inilah kenapa GCM direkomendasikan di atas CBC.


Generated by @farishhz Agent Pentest Pipeline - TDCTF Security Academy

PADA HALAMAN INI