ECB Mode
ECB (Electronic Codebook) เข้ารหัสแต่ละ block แยกกันด้วย key เดียว โดยไม่มีการ chain — plaintext block เดียวกันจึงให้ ciphertext block เดียวกันเสมอ นี่คือจุดอ่อนร้ายแรง: มองเห็น pattern ได้ (ECB penguin), สลับ block ได้ (block-swap/cut-and-paste), และถ้าเราควบคุม input บางส่วนได้จะถอดความลับทีละ byte (byte-at-a-time)
1. ทำไม ECB ถึงอันตราย
ECB แบ่ง plaintext เป็น block ขนาดคงที่ (AES = 16 byte) แล้ว C_i = Enc(P_i) แยกกันทุก block ไม่มี IV ไม่มี chaining ผลคือถ้า P_i = P_j แล้ว C_i = C_j เสมอ ข้อมูลโครงสร้าง (pattern) จึงรั่วออกมาทาง ciphertext ตรงๆ ตัวอย่างคลาสสิกคือ 'ECB penguin' — เข้ารหัสรูปด้วย ECB แล้วยังเห็นรูปเพนกวินได้
def is_ecb(ct, bs=16):
blocks = [ct[i:i+bs] for i in range(0, len(ct), bs)]
return len(blocks) != len(set(blocks))
# ทริก: ป้อน 'A'*32+ ให้ระบบเข้ารหัส แล้วเช็คว่ามี block ซ้ำติดกันไหม2. Block Swapping / Cut-and-Paste
เพราะแต่ละ block อิสระ ผู้โจมตีตัด-แปะ (cut-and-paste) ciphertext block ได้ ตัวอย่างคลาสสิก: ระบบสร้าง token จาก email + role ถ้าเราจัด input ให้คำว่า admin ตกลงใน block พอดี เราจะดึง ciphertext ของ block นั้นมาแปะทับ block role ได้ → ยกระดับเป็น admin โดยไม่รู้ key
- 1หา block size (มัก 16) ด้วยการเพิ่ม input ทีละ byte จน ciphertext โตขึ้น 1 block
- 2จัด input ให้ค่าที่ต้องการปลอม (เช่น 'admin' + padding) ตกลงใน 1 block เต็มพอดี
- 3ดึง ciphertext block ของค่านั้นเก็บไว้
- 4สร้าง token ใหม่ที่ทำให้ field เป้าหมาย (เช่น role) เริ่มต้นตรงขอบ block
- 5แปะ ciphertext block ที่เก็บไว้ทับตำแหน่ง role → ได้ token ปลอมที่ถอดออกมาเป็น admin
3. Byte-at-a-Time ECB Decryption
ถ้า oracle เข้ารหัส Enc(input || SECRET) โดยเราคุม input ได้ เราถอด SECRET ได้ทีละ byte: จัด input ให้ยาวจน byte แรกของ SECRET ตกที่ขอบ block สุดท้ายของ input พอดี แล้ว brute-force byte สุดท้ายทั้ง 256 ค่าเทียบ ciphertext block — ตรงเมื่อไรได้ byte นั้น แล้วเลื่อนไปทีละ byte
BS = 16
known = b''
for i in range(TARGET_LEN):
pad = b'A' * (BS - 1 - (len(known) % BS))
block_idx = len(known) // BS
# ciphertext เป้าหมายเมื่อ byte ถัดไปของ secret ตกที่ขอบ
target = oracle(pad)[block_idx*BS:(block_idx+1)*BS]
for b in range(256):
guess = pad + known + bytes([b])
if oracle(guess)[block_idx*BS:(block_idx+1)*BS] == target:
known += bytes([b]); break
print(known)4. สรุป & Quick Reference
| จุดอ่อน ECB | โจมตี | เงื่อนไข |
|---|---|---|
| block ซ้ำ → ciphertext ซ้ำ | ตรวจจับ ECB / อ่าน pattern | ส่ง input ซ้ำๆ ได้ |
| block อิสระ | block-swap / cut-and-paste | จัดตำแหน่ง field ใน input ได้ |
| Enc(input || secret) | byte-at-a-time decryption | คุม input prefix ได้ |
- ยืนยัน ECB ด้วย input ซ้ำ → หา ciphertext block ที่ซ้ำติดกัน
- AES block = 16 byte; ความยาว ciphertext เป็นทวีคูณของ 16 เสมอ
- ECB ไม่มี IV — ต่างจาก CBC ตรงนี้ (ใช้แยกสองโหมดออกจากกัน)
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติสงสัยว่าโจทย์เข้ารหัสด้วย ECB (มาจากขั้นตรวจสอบในหัวข้อ AES) มีแค่เครื่อง Kali เปล่าๆ ทำตามนี้ทีละขั้นเพื่อยืนยันแล้วโจมตีจริง
- 1ยืนยันก่อนว่าเป็น ECB จริง: ถ้าคุมส่ง input ได้ ส่ง `'A'*48` (หรือมากกว่า) แล้วดู ciphertext ด้วย `xxd` หรือ python — มี 16-byte block ซ้ำติดกันไหม
- 2ยืนยันแล้ว → ตัดสินใจว่าจะโจมตีแบบไหน: คุม input ก่อนความลับได้ไหม (byte-at-a-time) หรือแค่จัดตำแหน่ง field ในข้อมูลได้ (block-swap)
- 3Byte-at-a-time: หา block size ก่อนโดยเพิ่ม input ทีละ 1 byte จนความยาว ciphertext กระโดดขึ้น 16 byte พอดี (ยืนยัน block size = 16)
- 4เขียน python oracle function ที่เรียก endpoint/binary ส่ง input แล้วคืน ciphertext กลับมา แล้วรัน byte-at-a-time script (โค้ดเต็มอยู่ในหัวข้อด้านบน) ไล่ถอดทีละ byte
- 5ติด edge case ระหว่างทาง (padding เปลี่ยน length กะทันหัน / error) → ปรับ script ให้ตัด/pad input ให้ตรง block boundary ก่อน compare
- 6Block-swap: หา offset ที่ field เป้าหมาย (เช่น username, role) เริ่มต้น แล้ว craft input ให้คำที่ต้องการปลอม (เช่น 'admin' + padding) ตกลงเต็ม 1 block พอดี
- 7ส่ง request สร้าง token 2 แบบ: อันหนึ่งเก็บ ciphertext ของ block ที่ต้องการ (เช่น block ของคำว่า admin) อีกอันคือ token จริงที่จะแก้ แล้วเอา ciphertext block มาสลับ (cut-and-paste) ด้วย python
- 8ส่ง token ที่ปลอมแล้วกลับไปที่ server ทดสอบว่า auth bypass สำเร็จไหม (เช่นเข้าเป็น admin ได้)
- 9server เช็ค integrity/MAC (แก้ ciphertext แล้วถูกปฏิเสธทันที) → ECB attack ตรงๆ ใช้ไม่ได้ ต้องดูว่า MAC อ่อนพอจะ crack/ปลอมได้ไหม
- 10ถอด SECRET หรือปลอม token สำเร็จแล้ว → ตรวจ flag/privilege ที่ได้ และเช็ค format ตามที่โจทย์ต้องการ
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| ดู ciphertext เป็น hex หา block ซ้ำ | xxd, python3 | - | CyberChef (To Hex) |
| ยิง request ทดสอบ input ซ้ำๆ | curl, python3 (requests) | pip install requests | Burp Suite Repeater (ถ้ามี) |
| เขียน oracle + byte-at-a-time script | python3 | - | - |
| ตัด-แปะ (cut-and-paste) ciphertext block | python3 | - | CyberChef (การต่อ hex ด้วยมือ) |
| ทดสอบส่ง token ปลอมกลับ server | curl, python3 (requests) | - | - |
| เช็คว่า MAC/hash ที่ป้องกันอ่อนไหม | hashid, hashcat | - | hashes.com |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้