Slide 1

Slide 1 text

Block Cipher Mode by oalieno

Slide 2

Slide 2 text

⽬錄 • ECB Mode • ECB Mode / Cut & Paste • ECB Mode / Prepend Oracle Attack • CBC Mode • CBC Mode / Bit-Flipping Attack • CBC Mode / Padding Oracle Attack • CTR Mode

Slide 3

Slide 3 text

Block Cipher

Slide 4

Slide 4 text

Block Cipher 加密 16 bytes 明⽂ 16 bytes 密⽂ 密鑰 • 輸入輸出長度固定 • 以 AES 為例 • 輸入明⽂ 16 bytes • 輸出密⽂ 16 bytes • 密鑰長度有 16, 24, 32 bytes 三種 最常⾒

Slide 5

Slide 5 text

Block Cipher 我要加密的明⽂不是 16 bytes 怎麼辦 ? 切成很多個 16 bytes

Slide 6

Slide 6 text

加密 16 bytes 明⽂ 16 bytes 密⽂ 密鑰 加密 14 bytes 明⽂ + 2 bytes 填充 ( padding ) 16 bytes 密⽂ 密鑰 30 bytes 明⽂ Block Cipher

Slide 7

Slide 7 text

加密 Block Cipher • 這裡不討論加密演算法裡⾯的細節 • 把它當作⼀個⿊盒⼦函式來⽤就好了

Slide 8

Slide 8 text

Block Cipher Mode

Slide 9

Slide 9 text

Block Cipher Mode • AES 是 Block Cipher,輸入輸出長度固定 • 所以要加密任意長度的明⽂,需要⼀些額外加⼯ • ⼀些常⾒的加⼯模式:ECB, CBC, CFB, OFB, CTR...

Slide 10

Slide 10 text

ECB Mode

Slide 11

Slide 11 text

ECB Mode Encryption Encrypt Plaintext Ciphertext Key Encrypt Plaintext Ciphertext Key Encrypt Plaintext Ciphertext Key

Slide 12

Slide 12 text

ECB Mode Decryption Decrypt Ciphertext Plaintext Key Decrypt Ciphertext Plaintext Key Decrypt Ciphertext Plaintext Key

Slide 13

Slide 13 text

ECB Mode https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation ECB 模式的缺點:相同的明⽂區塊會加密出相同的密⽂區塊

Slide 14

Slide 14 text

ECB Mode / Cut & Paste

Slide 15

Slide 15 text

ECB Mode / Cut & Paste Encrypt user:hi;money:10 A Key Encrypt ;id=015647659901 B Key Encrypt 5874573959304852 C Key

Slide 16

Slide 16 text

ECB Mode / Cut & Paste Decrypt A user:hi;money:10 Key Decrypt C 5874573959304852 Key Decrypt C 5874573959304852 Key 錢錢變多了xD

Slide 17

Slide 17 text

ECB Mode / Prepend Oracle Attack

Slide 18

Slide 18 text

The Oracle • 使⽤ AES ECB Mode • 伺服器將我們的明⽂ prepend 在 fl ag 前⾯作加密 def oracle(plain): aes = AES.new(KEY, AES.MODE_ECB) return aes.encrypt(plain + flag)

Slide 19

Slide 19 text

找 fl ag[0] Encrypt AAAAAAAAAAAAAAAC Ciphertext Key Encrypt TF{FLAG}… Ciphertext Key 先塞 15 個垃圾 讓 fl ag 的第⼀個字元掉進來

Slide 20

Slide 20 text

塞 15 個⼀樣的垃圾 + 爆搜最後⼀個 byte 找 fl ag[0] Encrypt AAAAAAAAAAAAAAA\00 Ciphertext Key Encrypt CTF{FLAG}… Ciphertext Key

Slide 21

Slide 21 text

找 fl ag[0] Encrypt AAAAAAAAAAAAAAA\01 Ciphertext Key Encrypt CTF{FLAG}… Ciphertext Key 塞 15 個⼀樣的垃圾 + 爆搜最後⼀個 byte

Slide 22

Slide 22 text

找 fl ag[0] Encrypt AAAAAAAAAAAAAAAC Ciphertext Key Encrypt CTF{FLAG}… Ciphertext Key 找到了 fl ag 的第⼀個 byte

Slide 23

Slide 23 text

找 fl ag[1] Encrypt AAAAAAAAAAAAAACT Ciphertext Key Encrypt F{FLAG}… Ciphertext Key 先塞 14 個垃圾 讓 fl ag 的前兩個字元掉進來

Slide 24

Slide 24 text

找 fl ag[1] Encrypt AAAAAAAAAAAAAAC\00 Ciphertext Key Encrypt CTF{FLAG}… Ciphertext Key 塞 14 個⼀樣的垃圾 + 已知的 fl ag 第⼀個 byte + 爆搜最後⼀個 byte

Slide 25

Slide 25 text

找 fl ag[1] Encrypt AAAAAAAAAAAAAAC\01 Ciphertext Key Encrypt CTF{FLAG}… Ciphertext Key 塞 14 個⼀樣的垃圾 + 已知的 fl ag 第⼀個 byte + 爆搜最後⼀個 byte

Slide 26

Slide 26 text

找 fl ag[1] Encrypt AAAAAAAAAAAAAACT Ciphertext Key Encrypt CTF{FLAG}… Ciphertext Key 找到了 fl ag 的第⼆個 byte

Slide 27

Slide 27 text

Finally • 這樣⼀直做下去就能解密出 fl ag 的所有字元了 • 最多需要做 len( fl ag) * 257 次

Slide 28

Slide 28 text

CBC Mode

Slide 29

Slide 29 text

CBC Mode Encryption Encrypt Plaintext Ciphertext Key IV ⊕ Encrypt Plaintext Ciphertext Key ⊕

Slide 30

Slide 30 text

CBC Mode Decryption Decrypt Ciphertext Plaintext Key IV ⊕ Decrypt Ciphertext Plaintext Key ⊕

Slide 31

Slide 31 text

CBC Mode • 每塊密⽂都依賴前⾯所有的明⽂ • 相同的區塊明⽂會加密出不同的區塊密⽂ • 有⼀個初始化向量 ( Initial Vector ),簡稱 IV

Slide 32

Slide 32 text

CBC Mode / Bit-Flipping Attack

Slide 33

Slide 33 text

CBC Mode / Bit-Flipping Attack Decrypt Ciphertext …b5 Key …49 ⊕ Decrypt Ciphertext Plaintext Key ⊕ ⊕ 1 ⊕ 1

Slide 34

Slide 34 text

CBC Mode / Bit-Flipping Attack Decrypt Ciphertext …b4 Key …48 ⊕ Decrypt Ciphertext Plaintext Key ⊕

Slide 35

Slide 35 text

CBC Mode / Bit-Flipping Attack Decrypt …04 …91 Key IV ⊕ Decrypt Ciphertext …e3 Key ⊕ ⊕ 1 ⊕ 1

Slide 36

Slide 36 text

CBC Mode / Bit-Flipping Attack Decrypt …03 …f3 Key IV ⊕ Decrypt Ciphertext …e2 Key ⊕

Slide 37

Slide 37 text

CBC Mode / Bit-Flipping Attack Decrypt …04 …91 Key IV ⊕ Decrypt Ciphertext …e3 Key ⊕ ⊕ e3 ⊕ 66 ⊕ e3 ⊕ 66

Slide 38

Slide 38 text

CBC Mode / Bit-Flipping Attack Decrypt …81 …1c Key IV ⊕ Decrypt Ciphertext …66 Key ⊕ 將解密的明⽂改成我們指定的 0x66

Slide 39

Slide 39 text

CBC Mode / Bit-Flipping Attack • 透過修改 IV 和 Ciphertext 來控制 Plaintext • 其他 CFB, OFB, CTR 也存在相同的攻擊⽅式

Slide 40

Slide 40 text

CBC Mode / Padding Oracle Attack

Slide 41

Slide 41 text

The Oracle • 使⽤ AES CBC Mode 配上 PKCS#7 Padding Scheme • 伺服器能幫我們解密訊息 • 如果解密出來的訊息 Padding 錯誤會噴錯 def unpad(data): if not all([x == data[-1] for x in data[-data[-1]:]]): raise ValueError return data[:-data[-1]] def oracle(cipher): aes = AES.new(KEY, AES.MODE_CBC) try: plain = unpad(aes.decrypt(cipher)) except ValueError: return False return True

Slide 42

Slide 42 text

PKCS#7

Slide 43

Slide 43 text

PKCS#7 : Cryptographic Message Syntax https://tools.ietf.org/html/rfc2315 後⾯要填充 6 個 bytes 34 83 E6 2F 20 0A 33 AC 49 41 06 06 06 06 06 06 明⽂ • 這個標準裡⾯定義了⼀種 Padding 的格式 • 要填充 5 個 bytes 就填充 5 個 0x05 • 要填充 2 個 bytes 就填充 2 個 0x02

Slide 44

Slide 44 text

Padding 錯誤 • 怎麼樣會 Padding 錯誤? • 抓最後⼀個 byte 就可以知道 Padding 長度 都要等於最後⼀個 byte 34 83 E6 2F 20 0A 33 AC 49 41 06 ab 06 06 06 06

Slide 45

Slide 45 text

Python Implementation def pad(data): p = 16 - len(data) % 16 return data + bytes([p]) * p def unpad(data): if not all([x == data[-1] for x in data[-data[-1]:]]): raise ValueError return data[:-data[-1]]

Slide 46

Slide 46 text

解 plaintext[-1]

Slide 47

Slide 47 text

Padding Oracle Attack …47 Decrypt Ciphertext …69 Key ⊕ 未知的明⽂ 已知的密⽂

Slide 48

Slide 48 text

Padding Oracle Attack …00 Decrypt Ciphertext …2e Key ⊕ 不知道 只知道 Padding 錯誤 暴⼒嘗試最後⼀個 byte

Slide 49

Slide 49 text

Padding Oracle Attack …01 Decrypt Ciphertext …2f Key ⊕ 不知道 只知道 Padding 錯誤 暴⼒嘗試最後⼀個 byte

Slide 50

Slide 50 text

Padding Oracle Attack …02 Decrypt Ciphertext …2c Key ⊕ 不知道 只知道 Padding 錯誤 暴⼒嘗試最後⼀個 byte

Slide 51

Slide 51 text

Padding Oracle Attack …2f Decrypt Ciphertext …01 Key ⊕ 推論 ( 很⼤機率 ) Padding 正確 暴⼒嘗試最後⼀個 byte 2f 47 ⊕ ⊕ 69 = 明⽂ 原本的密⽂

Slide 52

Slide 52 text

解 plaintext[-2]

Slide 53

Slide 53 text

Padding Oracle Attack …7d47 Decrypt Ciphertext …6869 Key ⊕ 部分未知的明⽂ 已知的密⽂

Slide 54

Slide 54 text

Padding Oracle Attack …002c Decrypt Ciphertext …1502 Key ⊕ 不知道 只知道 Padding 錯誤 暴⼒嘗試倒數第⼆個 byte 47 69 02 ⊕ ⊕ 2c = 設定明⽂最後⼀個 byte 為 02

Slide 55

Slide 55 text

Padding Oracle Attack …012c Decrypt Ciphertext …1402 Key ⊕ 不知道 只知道 Padding 錯誤 暴⼒嘗試倒數第⼆個 byte

Slide 56

Slide 56 text

Padding Oracle Attack …022c Decrypt Ciphertext …1702 Key ⊕ 不知道 只知道 Padding 錯誤 暴⼒嘗試倒數第⼆個 byte

Slide 57

Slide 57 text

Padding Oracle Attack …172c Decrypt Ciphertext …0202 Key ⊕ 推論 Padding 正確 17 7d ⊕ ⊕ 68 = 明⽂ 原本的密⽂ 暴⼒嘗試倒數第⼆個 byte

Slide 58

Slide 58 text

Summary • 總共有三層迴圈 • 猜 0 - 255 直到猜出⼀個 byte • ⼀次解出⼀個 byte 直到解完⼀個 block • ⼀次解出⼀個 block 直到解完所有 blocks • 解出⼀個 block 最多需要 4096 次嘗試

Slide 59

Slide 59 text

CTF Challenges 原汁原味 padding oracle attack : • CSAW CTF 2016 Quals - Neo • HITCON CTF 2016 Quals - Hackpad • BAMBOOFOX CTF 2018 - mini-padding padding 相關攻擊技巧 : • HITCON CTF 2017 Quals - Secret Server • HITCON CTF 2017 Quals - Secret Server Revenge • BAMBOOFOX CTF 2018 - baby-lea-revenge • BAMBOOFOX CTF 2018 - baby-lea-impossible

Slide 60

Slide 60 text

CTR Mode

Slide 61

Slide 61 text

CTR Mode Encryption ⊕ Encrypt a59c…0000 Ciphertext Key Plaintext ⊕ Encrypt a59c…0001 Ciphertext Key Plaintext Counter

Slide 62

Slide 62 text

CTR Mode Decryption ⊕ Encrypt a59c…0000 Plaintext Key Ciphertext ⊕ Encrypt a59c…0001 Plaintext Key Ciphertext Counter

Slide 63

Slide 63 text

CTR Mode • 利⽤ AES 去產⽣ xor key 然後做 xor cipher • 加密和解密都是⽤ AES Encryption,因為要產⽣相同的 xor key • Counter 會初始⼀個隨機數字,每次加⼀ • Block 之間沒有互相依賴,可平⾏運算

Slide 64

Slide 64 text

GCM Mode

Slide 65

Slide 65 text

GCM Mode Encryption https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38d.pdf a59c…0002 a59c…0001 a59c…0003 J0 inc32 inc32 IV Ek ⊕ Plaintext Ciphertext ⊕ MultH Ek Ek ⊕ Ciphertext Plaintext MultH ⊕ MultH [len(A)]64 || [len(C)]64 MultH ⊕ Associated Data ⊕ Auth Tag =

Slide 66

Slide 66 text

GCM Mode Encryption https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38d.pdf a59c…0002 a59c…0001 a59c…0003 J0 inc32 inc32 IV Ek ⊕ Plaintext Ciphertext ⊕ MultH Ek Ek ⊕ Ciphertext Plaintext MultH ⊕ MultH [len(A)]64 || [len(C)]64 MultH ⊕ Associated Data ⊕ Auth Tag = CTR Mode

Slide 67

Slide 67 text

GCM Mode Encryption https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38d.pdf a59c…0002 a59c…0001 a59c…0003 J0 inc32 inc32 IV Ek ⊕ Plaintext Ciphertext ⊕ MultH Ek Ek ⊕ Ciphertext Plaintext MultH ⊕ MultH [len(A)]64 || [len(C)]64 MultH ⊕ Associated Data ⊕ Auth Tag = Authentication

Slide 68

Slide 68 text

GCM Mode Encryption https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38d.pdf a59c…0002 a59c…0001 a59c…0003 J0 inc32 inc32 IV Ek ⊕ Plaintext Ciphertext ⊕ MultH Ek Ek ⊕ Ciphertext Plaintext MultH ⊕ MultH [len(A)]64 || [len(C)]64 MultH ⊕ Associated Data ⊕ Auth Tag = • len 是 bitlen • [10]64 → 000000000000000a 不是 16 bytes 的倍數會在後⾯補 \x00

Slide 69

Slide 69 text

GCM Mode Encryption https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38d.pdf 如果 len(IV) ≠ 96 IV [len(IV)]64 0 0 ⊕ MultH MultH MultH ⊕ IV J0 如果 len(IV) = 96 IV 00000001 J0 =

Slide 70

Slide 70 text

GCM Mode Encryption https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38d.pdf a59c…0002 a59c…0001 a59c…0003 J0 inc32 inc32 IV Ek ⊕ Plaintext Ciphertext ⊕ MultH Ek Ek ⊕ Ciphertext Plaintext MultH ⊕ MultH [len(A)]64 || [len(C)]64 MultH ⊕ Associated Data ⊕ Auth Tag = Ek 0 H H = Ek(0)

Slide 71

Slide 71 text

GCM Mode Encryption https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38d.pdf • 低位 32 bits 加⼀ modulo 232 • 剩下的⾼位不動 inc32

Slide 72

Slide 72 text

GCM Mode Encryption https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38d.pdf • MultH 是在 GF(2128) 下乘上 H • GF(2128) 的 reduction modulus 是 x128 + x7 + x2 + x + 1 • 從 bytes 轉成 GF(2128) 下的元素 • u is the variable of the polynomial • x0x1…x127 → x0 + x1u + … + x127u127 • '\x00…\x00\x01\x02' → x119+x126 MultH

Slide 73

Slide 73 text

Galois Field • Galois Field ( GF ) 或叫 Finite Field • GF(2128) 裡⾯的元素可以表⽰成⼀個 degree = 127 的多項式 • 加法和乘法就是做多項式的加法和除法 modulo ⼀個 degree = 128 的 irreducible polynomial • GCM Mode ⽤的 GF(2128) 是 modulo x128 + x7 + x2 + x + 1

Slide 74

Slide 74 text

GCM Mode Decryption https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38d.pdf a59c…0002 a59c…0001 a59c…0003 J0 inc32 inc32 IV Ek ⊕ Plaintext Ciphertext ⊕ MultH Ek Ek ⊕ Ciphertext Plaintext MultH ⊕ MultH [len(A)]64 || [len(C)]64 MultH ⊕ Associated Data ⊕ Auth Tag =

Slide 75

Slide 75 text

GCM Mode Decryption https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38d.pdf a59c…0002 a59c…0001 a59c…0003 J0 inc32 inc32 IV Ek ⊕ Plaintext Ciphertext ⊕ MultH Ek Ek ⊕ Ciphertext Plaintext MultH ⊕ MultH [len(A)]64 || [len(C)]64 MultH ⊕ Associated Data ⊕ Auth Tag = 這邊和加密時顛倒 其他都⼀樣

Slide 76

Slide 76 text

GCM Mode / Forbidden Attack

Slide 77

Slide 77 text

GCM Mode / Forbidden Attack • ⼜叫 Nonce Repeating Attack • 也就是當 IV 重複⽤的情況 • 假設可以拿到任意明⽂加密的結果 • 這個攻擊可以做到偽造簽章

Slide 78

Slide 78 text

GCM Mode / Forbidden Attack • T = AH4 + C1H3 + C2H2 + LH + Ek(J0) Tag Associated Data Ciphertext [len(A)]64 || [len(C)]64 • 在 Authentication 中做的 xor 就是 GF(2128) 中的加法 • Tag 可以表⽰成在 GF(2128) 中的式⼦如下 未知的只有藍⾊的部分

Slide 79

Slide 79 text

GCM Mode / Forbidden Attack • T1 = A1H4 + C11H3 + C12H2 + L1H + Ek(J0) • T2 = A2H4 + C21H3 + C22H2 + L2H + Ek(J0) • T1 - T2 = (A1 - A2)H4 + (C11 - C21)H3 + (C12 - C22)H2 + (L1 - L2)H • 做兩次加密拿到兩個 Tag • 兩個相減後只剩 H 未知,解⽅程式求根可得 H • 有 H 帶回原式可得 Ek(J0) 就可以偽造 Tag 了

Slide 80

Slide 80 text

CTF Challenges • UTCTF 2020 - Galois • VolgaCTF 2018 Quals - Forbidden

Slide 81

Slide 81 text

Real World Case

Slide 82

Slide 82 text

POODLE ATTACK CVE-2014-3566 • 發⽣在 SSL 3.0 • Padding Oracle Attack ㄏ • Server 透露了加密資料在解密後的 padding 格式是否是正確的 • Mutate 被加密的資料,然後透過 server 的反應來還原明⽂

Slide 83

Slide 83 text

POODLE ATTACK CVE-2014-3566 https://blog.trendmicro.com.tw/?p=10241

Slide 84

Slide 84 text

EFAIL ATTACK CVE-2017-17688 / CVE-2017-17689 CBC Bit-Flipping https://efail.de/

Slide 85

Slide 85 text

EFAIL ATTACK CVE-2017-17688 / CVE-2017-17689 https://efail.de/ Hacker Server ⽤⼾打開 email 就會載入圖片