katagaitai CTF勉強会 #5 Crypto

Preview:

Citation preview

CTF勉強会 #5

Crypto

2016.07.16 TOKYO / 2016.08.28 OSAKA

trmr (@trmr105)

katagaitai

注意事項

本スライドは勉強会で利用したものを元に作成しています

勉強会では問題サーバを利用しましたがすでに停止しています

問題サーバのIPやホスト名が出てくる箇所は、随時読み替えをお願いします

リンク切れ等ご容赦ください

最後のページに勉強会参加者のwriteupを載せています

ぜひそちらも参照してください

2

#5 はじまるよー!

katagaitai CTF勉強会の歴史

2012年~2014年:某所での下積み時代

2014年冬:CTF勉強会 #1 (関東|関西)

2015年夏:CTF勉強会 #2 (関東)

2015年冬:CTF勉強会 #3 Hard (関東)

2015年冬:CTF勉強会 #4 Medium (関東|関西)

2016年夏:CTF勉強会 #5 Medium(関東|関西)

2016年夏:CTF勉強会 #6 Easy

下記URLで過去の勉強会資料を公開中

http://www.slideshare.net/bata_24

http://www.slideshare.net/trmr105

イマココ!

3

同時期2本つらかった…。

katagaitai勉強会とは

好きなことを分かり合える人を増やしたい!

4

katagaitaiと愉快な仲間たち #5を担当する人

bata(@bata_24)

trmr(@trmr105)

#6を担当する人

yagihash(@yagihashoo)

shironoo(@shironoo)

Special Thanks!

askn(@asai_ken)

ysk(@y_sk256)

5

We are katagaitai!

and so on..

今日の問題

[hack you 2014] Crypto200 – hashme

[Plaid CTF 2014] Crypto250 - Parlor

[ebCTF 2013] bin400 – MD5 COLLIDING

6

今日の問題を選んだ理由

ハッシュ関数をやりたかった!

#3 #4でブロック暗号をやった!

公開鍵暗号はどうしよう…。

「簡単」「意味不明」に二極化しそう

CTFの暗号問題として易しめ

その分午後が難しいのでOK

7

熟考したうえでの出題!

CTFとハッシュ関数8

CTFにおけるハッシュ問題の分類

大きく以下のように分類

9

利用ハッシュ関数

公知のハッシュ

独自ハッシュ

利用脆弱性

アルゴリズム

プロトコル

原像

衝突

レングスエクステンション

分類

その他(主にPPC)

CTFにおけるハッシュ問題の分類

大きく以下のように分類

10

利用ハッシュ関数

公知のハッシュ

独自ハッシュ

利用脆弱性

アルゴリズム

プロトコル

原像

衝突

レングスエクステンション

分類

その他(主にPPC)

注目!

原像攻撃 ハッシュ値から元のメッセージを復元する攻撃

CTFでの傾向

出題頻度は低い

原像攻撃が可能なハッシュ関数が少ない

参考問題

hack you too - Everybody lies

11

ハッシュ関数

𝑀

ℎ(𝑀)

ハッシュ値から元のメッセージを復元!!

[参考]第二原像攻撃

特定のメッセージと同じハッシュ値を生成する別のメッセージを復元する攻撃

12

ハッシュ関数

𝑀

ℎ(𝑀)

ハッシュ関数

𝑀′

同じハッシュ値を出力するメッセージを復元!

衝突攻撃

任意のメッセージと同じハッシュ値を生成する別のメッセージを特定する攻撃

CTFでの傾向

出題頻度:高

参考問題

ebCTF 2013 - bin400

Hack.lu 2013 - Geier's Lambda

BkP 2014 - Xorxes the Hash

HITCON CTF 2014 – wtf6

Olympic CTF 2014 - LHC

SECCON 2015 - Please give me MD5

13

ハッシュ関数

𝑀

ℎ(𝑀)

ハッシュ関数

𝑀′ 同じハッシュ値を出力するペアを発見!※Mはどんな値でも可

ハッシュレングスエクステンション

説明は後述

CTFでの傾向

出題頻度:高

レングスエクステンション自体が問題ではなく、レングスエクステンションで解けると思いつかせることに焦点を当てた問題が増えてる

参考問題

hack you 2012 - hashme

Plaid 2014 – Parlor

Olympic CTF 2014 – Emdee

Gits 2015 – Knockers

14

その他(主にPPC)

ハッシュ関数を利用したプロトコルの脆弱性を探す問題

例題

与えられたハッシュに対して下記条件を満たす入力を探索

いかに高速に入力値を探索するかが重要

ハッシュでなくても問題は成立するためハッシュ問題とするかは?

参考問題

SECUINSIDE CTF 2014 Final - HashGame

HITCON 2014 – ginger

Hack.lu 2015 – Checkcheckcheck

BkP 2016 – ltseorg

15

入力1のハッシュ

入力2のハッシュ

入力3のハッシュ

+

+

与えられたハッシュ=

今日やるのはこれ

大きく以下のように分類

16

利用ハッシュ関数

公知のハッシュ

独自ハッシュ

利用脆弱性

アルゴリズム

プロトコル

原像

衝突

レングスエクステンション

分類

その他(主にPPC)Hash Length Extension

Collision

[hack you 2014]Crypto200 - hashme

17

朝の待ち時間の有効活用①サーバにつなげてみよう

$ nc katagaitai.orz.hm 7777 (17777 or 27777 or 37777)

②ローカルで待ち受けてみよう

# socat tcp-listen:7777,fork,reuseaddr exec:"stdbuf -i0 -o0 python crypto200.py“

③問題を眺めてみよう

18 10分

hashmeを見てみよう

0を入力した場合

19

名前入力を要求

証明書を発行

hashmeを見てみよう

1を入力した場合

20

①証明書を要求

②証明書を入力③Welcome!

で、何すればいいの?

hashmeを見てみよう21

crypto200.py

hashmeを見てみよう

0を入力するとgen_cert関数に遷移

22

hashmeを見てみよう

0を入力するとgen_cert関数に遷移

23

①ユーザの入力値にrole=”anonymous”を付与

hashmeを見てみよう

0を入力するとgen_cert関数に遷移

24

② “SALT+①の値”のハッシュ値を生成

①ユーザの入力値にrole=”anonymous”を付与

hashmeを見てみよう

0を入力するとgen_cert関数に遷移

25

③鍵と②の値をXoRし「証明書」を生成

② “SALT+①の値”のハッシュ値を生成

①ユーザの入力値にrole=”anonymous”を付与

hashmeを見てみよう

0を入力するとgen_cert関数に遷移

26

③鍵と②の値をXoRし「証明書」を生成

② “SALT+①の値”のハッシュ値を生成

①ユーザの入力値にrole=”anonymous”を付与

サーバしか知らない鍵とSALTの値でrole=‘anonymous’の「証明書」を生成

hashmeを見てみよう 1を入力するとauth関数に遷移

27

①鍵と入力された「証明書」を

XoR

hashmeを見てみよう 1を入力するとauth関数に遷移

28

①鍵と入力された「証明書」を

XoR

② “SALT+①の値”のハッシュ値を生成

hashmeを見てみよう 1を入力するとauth関数に遷移

29

①鍵と入力された「証明書」を

XoR

② “SALT+①の値”のハッシュ値を生成

③ role=”administrator”が付与されていればflag

hashmeを見てみよう 1を入力するとauth関数に遷移

30

サーバの鍵とSALTの値で生成されたrole=‘administrator’の「証明書」が必要

①鍵と入力された「証明書」を

XoR

② “SALT+①の値”のハッシュ値を生成

③ role=”administrator”が付与されていればflag

問題の要点 1.証明書の権限

自分で作成できる証明書はrole=anonymous

flag獲得に必要な証明書はrole=administrator

2.ローカルで証明書を偽造する

鍵とSALTを手に入れる必要あり

3.サーバに証明書を偽造させる

role=administratorを付与できない

31

入力にuser&role=administratorを付与してもはじかれる

「文字,数字,_」のみ入力可能…

今回のハッシュ関数(hashme)32

あやしい固定値

暗号問題はぐぐる33

hashmeはMD5やSHA-1などをベースにしたハッシュ関数

暗号問題はぐぐる34

hashmeはMD5やSHA-1などをベースにしたハッシュ関数

Merkle-Damgård構造

Merkle-Damgård構造35

Hello, World

m1 m2 m3

①メッセージを分割

pad

②パディング付与

Merkle-Damgård構造36

内部状態𝐼𝑉 …

Hello, World

m1 m2 m3

①メッセージを分割

pad

②パディング付与

関数

R

関数

R

関数

R

関数

R

③分割したメッセージごとに処理を繰り返して内部状態を生成

Merkle-Damgård構造37

内部状態𝐼𝑉 …

Hello, World

m1 m2 m3

①メッセージを分割

pad

②パディング付与

関数

R

関数

R

関数

R

関数

R

③分割したメッセージごとに処理を繰り返して内部状態を生成

e4d7f1b4ed2e42d15898f4b27b019da4

出力関数

④内部状態からハッシュ値を出力

Merkle-Damgård構造

Merkle-Damgård構造を利用したハッシュ関数

MD4

MD5

SHA-1

SHA-2 family

それらをベースにした独自ハッシュ

CTF目線のMerkle-Damgård構造

レングスエクステンション攻撃が可能

38

ハッシュレングスエクステンション

39

例)MD5の場合40

内部状態𝐼𝑉 …

Hello, World

m1 m2 m3 pad

関数

R

関数

R

関数

R

関数

R

出力関数

e4d7f1b4ed2e42d15898f4b27b019da4

注目!

MD5もMerkle-Damgård構造で構成

MD5の出力関数41

内部状態𝐼𝑉 …

関数

R

関数

R

関数

R

関数

R

出力関数

MD5もMerkle-Damgård構造で構成

内部状態

A:32bit

B:32bit

C:32bit

D:32bit

内部状態は128bit

MD5の出力関数

Finalize処理

42

内部状態

A:32bit

B:32bit

C:32bit

D:32bit

A:32bit B:32bit C:32bit D:32bit

内部状態をそのまま出力

出力関数

ハッシュ値

MD5の内部状態復元

ハッシュ値があれば

43

e4d7f1b4ed2e42d15898f4b27b019da4

MD5の内部状態復元

ハッシュ値があれば

44

A:32bit B:32bit C:32bit D:32bit

e4d7f1b4ed2e42d15898f4b27b019da4

32bitごとに分割

MD5の内部状態復元

ハッシュ値があれば

45

内部状態

A:32bit

B:32bit

C:32bit

D:32bit

A:32bit B:32bit C:32bit D:32bit

内部状態を復元可能

e4d7f1b4ed2e42d15898f4b27b019da4

32bitごとに分割

レングスエクステンション46

内部状態𝐼𝑉

???????????

m1 pad

関数

F

関数

F

e4d7f1b4ed2e42d15898f4b27b019da4

ハッシュ値から内部状態を復元

手に入る!

分からない…

レングスエクステンション47

内部状態𝐼𝑉

???????????

m1 pad

関数

F

関数

F

e4d7f1b4ed2e42d15898f4b27b019da4

ハッシュ値から内部状態を復元

分からない…

関数

R

m’1

関数

R

m’2

メッセージを付加することが可能

NEW内部状態

893e3aa5b11ca4a0722deeacf66901bb

レングスエクステンション48

内部状態𝐼𝑉

???????????

m1 pad

関数

F

関数

F

e4d7f1b4ed2e42d15898f4b27b019da4

ハッシュ値から内部状態を復元

分からない…

関数

R

m’1

関数

R

m’2

メッセージを付加することが可能

NEW内部状態

893e3aa5b11ca4a0722deeacf66901bb

元の文字列(不明)にm’1, m’2を付与したハッシュ値

元のメッセージ(+padding)値に、任意のメッセージを付与したハッシュ値を導出可能

49

𝑚𝑑5𝑠𝑢𝑚(hello) = e4d7f1b4ed2e42d15898f4b27b019da4

たとえXが分からなくても

X

レングスエクステンション

元のメッセージ(+padding)値に、任意のメッセージを付与したハッシュ値を導出可能

50

𝑚𝑑5𝑠𝑢𝑚(hello) = e4d7f1b4ed2e42d15898f4b27b019da4

𝑚𝑑5𝑠𝑢𝑚( + + )=893e3aa5b11ca4a0722deeacf66901bb

たとえXが分からなくても

X+pad+任意のメッセージのハッシュ値は導出できる

X

X

レングスエクステンション

pad 任意のM

今回のハッシュ関数(hashme)51

今回のハッシュ関数(hashme)52

Merkle-Damgårdっぽい

出力部分は?

hashmeの出力関数

Finalize処理

53

内部状態

A:32bit

B:32bit

C:32bit

D:32bit

A:32bitB:32bit C:32bitD:32bit

MD5と違って、内部状態を順番変えて出力してる!!

e4d7f1b4ed2e42d15898f4b27b019da4

hashmeの出力関数

Finalize処理

54

内部状態

A:32bit

B:32bit

C:32bit

D:32bit

A:32bitB:32bit C:32bitD:32bit

MD5と違って、内部状態を順番変えて出力してる!!

e4d7f1b4ed2e42d15898f4b27b019da4

問題なくハッシュ値から内部状態を復元可能

レングスエクステンションが可能

hashmeの認証関数

parse_qs

ユーザの入力を辞書に変換する関数

parse_qsで作成した辞書のキー’role’の要素が’administrator’ならFLAGゲット

→ どのようにユーザの入力を辞書に変換している?

55

parse_qs56

/usr/lib/python2.7/urlparse.py

キーが重複している場合、両方の要素が辞書に登録

flagの取り方を考える

通常サーバは次のハッシュ値を生成

hashme(SALT+user=‘’&role=anonymous)

57

{role:anonymous}のみ登録

flagの取り方を考える

通常サーバは次のハッシュ値を生成

hashme(SALT+user=‘’&role=anonymous)

上記ハッシュ値を元にレングスエクステンションを実施して、&role=administratorを付与すると、次のハッシュ値が手に入るはず

hashme(SALT+user=‘’&role=anonymous+pad+&role=administrator)

58

{role:anonymous+pad}と{role:administrator}が共に登録

{role:anonymous}のみ登録

hashmeの認証関数

parse_qs

ユーザの入力を辞書に変換する関数

parse_qsで作成した辞書のキー’role’の要素が’administrator’ならFLAGゲット

→ どのようにユーザの入力を辞書に変換している?

59

If ‘administrator’ in data[‘role’]→ FLAG獲得!

方針

レングスエクステンションでrole=‘administrator’を付与してやればよい

しかしこの問題はあと2つハードルがある

直接ハッシュ値が手に入らない

サーバだけが知ってる鍵でXoR

若干MD5と異なるハッシュ関数が採用

既存のツールがそのまま使えない

方針

1. サーバにて鍵でXoRしたハッシュ値を発行

2. 鍵を導出し、ハッシュ値を手に入れる

3. レングスエクステンションで権限付与

4. 2で導出した鍵で権限を付与したハッシュ値をXoR

60

どうやって鍵を導出する?

少しMD5と仕様が違う?

実習

とりあえずやってみましょう

Writeupを同梱しているので分からない人は参考に

解けた人は本資料の最後のおまけをやってみてください

Plaid CTF 2014 – Parlor

nc katagaitai.orz.hm 4321 (or 14321, 24321, 34321)

質問、要望、音楽のリクエストなど→ #katagaitaiCTF

40分61

解答

方針

1. サーバにて鍵でXoRしたハッシュ値を発行

2. 鍵を導出し、ハッシュ値を手に入れる

3. ハッシュレングスエクステンションで権限付与

4. 2で導出した鍵で権限を付与したハッシュ値をXoR

62

鍵の導出パート

ハッシュレングスエクステンションパート

解答(鍵の導出)

方針

1. サーバにて鍵でXoRしたハッシュ値を発行

2. 鍵を導出し、ハッシュ値を手に入れる

63

ハッシュ値の形式は?

KEY KEY KEY KEY KEY

auth_str hashme(SALT+auth_str)

auth_strは自分で入力した値

鍵は繰り返し利用

解答(鍵の導出)

方針

1. サーバにて鍵でXoRしたハッシュ値を発行

2. 鍵を導出し、ハッシュ値を手に入れる

64

ハッシュ値の形式は?

KEY KEY KEY KEY KEY

auth_str hashme(SALT+auth_str)

auth_strは自分で入力した値

auth_str

鍵は繰り返し利用

KEY KEY

Auth_strをXoRすれば鍵が手に入る

解答(鍵の導出)

方針

1. サーバにて鍵でXoRしたハッシュ値を発行

2. 鍵を導出し、ハッシュ値を手に入れる

65

ハッシュ値の形式は?

KEY KEY KEY KEY KEY

auth_str hashme(SALT+auth_str)

auth_strは自分で入力した値

auth_str

鍵は繰り返し利用

KEY KEY

Auth_strをXoRすれば鍵が手に入る

鍵をXoRすれば

hashme(auth_str)が手に入る

解答(鍵の導出)66

solve_key.py

Auth_strをXoRして鍵を導出

実行結果

解答(ハッシュレングスエクステンション)

hashme関数

67

解答(ハッシュレングスエクステンション)

hashme関数

68

hashmeの処理に使われるiの値がSALTに依存→ SALTは手に入れることができない→ hashmeの処理を実行できない→ レングスエクステンションできない→ 詰んだ

解答(ハッシュレングスエクステンション)

hashme関数

69

hashmeの処理に使われるiの値がSALTに依存→ SALTは手に入れることができない→ hashmeの処理を実行できない→ レングスエクステンションできない→ 詰んだ

i & 0x1f→ 32通りしかない→ 全部試せばいい

解答(ハッシュレングスエクステンション)70

ログインしたいユーザを作成

証明書、鍵を入力

solver_hashme.py

71 解答(ハッシュレングスエクステンション)

solver_hashme.py

72 解答(ハッシュレングスエクステンション)

証明書からハッシュ値を取り出し

solver_hashme.py

73 解答(ハッシュレングスエクステンション)

証明書からハッシュ値を取り出し

solver_hashme.py

内部状態を再構成

74 解答(ハッシュレングスエクステンション)

証明書からハッシュ値を取り出し

solver_hashme.py

内部状態を再構成

レングスエクステンションを実施してログイン施行を32回実施

75 解答(ハッシュレングスエクステンション)

実行結果

Flagゲット!

解答

FLAG{2016_is_5th_aniversary_of_katagaitai}

katagaitaiは今年で結成5周年を迎えました

前身の活動を入れればもうちょい長い?

これもひとえにみなさまのおかげ

残念ながらメンバーの平均年齢もほぼ+5歳…

yagihash, shironooの加入で若返れるか?

[参考]Flickr’s API Attack

http://netifera.com/research/flickr_api_signature_forgery.pdf

[参考] hash extender

https://github.com/iagox86/hash_extender

76

おまけ(宿題)77

[Plaid CTF 2014]Crypto250 Parlor

78

アクセスしてみる

①サーバにつなげてみよう

$ nc katagaitai.orz.hm 4321 (14321 or 24321 or 34321)

79

ゲームの仕組

1) set your odds : oddsを指定

odds = 2^入力値がmoduloとして扱われる

2) set your bet : betするmoneyを指定

3) play a round : 下記のゲームを開始

80

md5(secret + ) % odds

秘密の値(our number) 1で指定した値

ゲームの仕組

1) set your odds : oddsを指定

odds = 2^入力値がmoduloとして扱われる

2) set your bet : betするmoneyを指定

3) play a round : 下記のゲームを開始

81

md5(secret + ) % odds

秘密の値(our number) 1で指定した値

your number

値を指定

ゲームの仕組

1) set your odds : oddsを指定

odds = 2^入力値がmoduloとして扱われる

2) set your bet : betするmoneyを指定

3) play a round : 下記のゲームを開始

4) 総金額が1,000,000,000を超えるとFLAGゲット!

82

md5(secret + ) % odds

秘密の値(our number) 1で指定した値

your number

値を指定

≡ 0

≡0

bet * oddsの金額をゲット

betした金額を失う…

ゲームの還元率

勝つ確率は2^(-odds)、倍率は2^(odds)。

還元率は100%

ギャンブルとしては割がいい

が、$1000→$1,000,000,000まで増やすのはかなりの強運が必要

100万回程度アクセスすれば可能かも?

1アクセス1秒としても278時間程度必要

83

Hint 1 : 問題の整理

なぜこの問題が難しいのか

リモートサーバに対する100万回アクセスが困難

→ ローカルで実施する場合100万回計算は短時間で可能

なぜローカルで実施できないのか

md5の入力値のprefixが手に入らないためハッシュ値が計算できない

→ 入力値のprefixが手に入らなくてもハッシュ値が計算できれば?

84

入力値がなくともハッシュ値を計算できる手法を利用

Hint 2 : ハッシュ値の出力

レングスエクステンション

レングスエクステンションには元のハッシュ値が必要

今回の問題ではハッシュ値は直接出力されない

ハッシュ値の特定

どうやればできるだけハッシュ値を出力できるか

85

md5(input)

md5(input) % 2^oddsのみ出力

Hint 3 : ハッシュ値の特定

ハッシュ値の特定

残りの不明箇所を推測

推測した値が正しいか答え合わせする必要

サーバのハッシュ値との比較

正しい答えを知っているオラクルはサーバしかない

どうすれば、サーバと推測した値の答え合わせができる?

86

ハッシュ値の大部分を特定!不明な箇所を推測

Hint 3 : ハッシュ値の特定

ハッシュ値の特定

残りの不明箇所を推測

推測した値が正しいか答え合わせする必要

サーバのハッシュ値との比較

正しい答えを知っているオラクルはサーバしかない

どうすれば、サーバと推測した値の答え合わせができる?

87

ハッシュ値の大部分を特定!不明な箇所を推測

Let’s Try!

[ebCTF 2013]bin400 – md5colliding

88

md5collidingを見てみよう89

md5collidingを見てみよう90

下記条件を満たすPE32形式のファイルを5つ作成

① 5つのファイルはそれぞれ実行結果が異なること

C:¥>1.exe

All Eindbazen are wearing wooden

………………

C:¥>5.exe

All Eindbazen are cheap bastards

② 5つのファイルはすべて同じMD5ハッシュとなること

$ md5sum 1.exe

656ed3d6b9b227856f7621666ce73081 1.exe

………………

$ md5sum 5.exe

656ed3d6b9b227856f7621666ce73081 5.exe

③ 5つのファイルはすべて異なるSHA1ハッシュとなること

$ sha1sum 1.exe

d36e8ae2ad1bc32d451e04d5ee28624017130336 1.exe

………………

$ sha1sum 5.exe

b8a596e0ecbfdf7d266697c0274b34075b2147e3 5.exe

md5collidingを見てみよう91

下記条件を満たすPE32形式のファイルを5つ作成

① 5つのファイルはそれぞれ実行結果が異なること

C:¥>1.exe

All Eindbazen are wearing wooden

………………

C:¥>5.exe

All Eindbazen are cheap bastards

② 5つのファイルはすべて同じMD5ハッシュとなること

$ md5sum 1.exe

656ed3d6b9b227856f7621666ce73081 1.exe

………………

$ md5sum 5.exe

656ed3d6b9b227856f7621666ce73081 5.exe

③ 5つのファイルはすべて異なるSHA1ハッシュとなること

$ sha1sum 1.exe

d36e8ae2ad1bc32d451e04d5ee28624017130336 1.exe

………………

$ sha1sum 5.exe

b8a596e0ecbfdf7d266697c0274b34075b2147e3 5.exe

ハッシュ値が衝突するMD5ファイルを5つ作成してください

注意点

bin400用のサーバは用意してません

プロのexeこわい

作成したファイルは以下を確認してください

①実行結果

指定の出力となっていること

②md5結果

同じmd5ハッシュ値を出力すること

③ sha1結果

異なるsha1ハッシュ値を出力すること

92

今回の勉強会ではサーバを用意していないため、作成した5つのファイルの確認を上記手順で行ってください

MD593

MD5の構造94

Merkle-Damgård構造

SHA-1, SHA-2も同様の構造

内部状態𝐼𝑉 …

Hello, World

m1 m2 m3 pad

処理

R

処理

R

処理

R

処理

R

出力関数

e4d7f1b4ed2e42d15898f4b27b019da4

MD5の構造95

Merkle-Damgård構造

SHA-1, SHA-2も同様の構造

内部状態𝐼𝑉 …

Hello, World

m1 m2 m3 pad

処理

R

処理

R

処理

R

処理

R

出力関数

e4d7f1b4ed2e42d15898f4b27b019da4

注目!

MD5のラウンド処理96

メッセージを512bit(32bit*16)ごとに切り分け

512bitのブロックに対して64回処理を実施する

関数Fの処理は変化しますが、複雑になるため省略します

MD5のラウンド処理97

𝐼𝑉 128bit(固定値)

A B C D32bit*4に分割

代入

m1

MD5のラウンド処理98

𝐼𝑉

A B C D

m1[0]

512bitメッセージをさらに16個に分割

m1[15]m1[1] …

① F関数を通す②分割メッセージを足す③固定値Kを足す④ローテーションシフト

MD5のラウンド処理99

𝐼𝑉

A B C D

m1[15]m1[1] …

m1[0]の出力を入力とし、m1[1]を用いて同様の処理を実施

MD5のラウンド処理100

2巡目に突入!

m1[0] m1[15]m1[1] …

入力メッセージは1巡目と同じ

2巡目はF関数の処理が変更!

101

102

512bitのメッセージブロックに対し16回の処理を4巡実施

最後の出力をIHVと呼ぶ

MD5の構造103

Merkle-Damgård構造

SHA-1, SHA-2も同様の構造

𝐼𝑉 …

Hello, World

m1 m2 pad

処理

R

処理

R

処理

R

出力関数

e4d7f1b4ed2e42d15898f4b27b019da4

1回の処理Rの説明

𝐼𝐻𝑉

注目!

MD5のラウンド処理104

𝐼𝐻𝑉

A B C D

m2[15]m2[1]

2回目のラウンド処理からはIVではなくIHVが入力

105

同様に16回の処理を4巡実施

MD5の構造106

Merkle-Damgård構造

SHA-1, SHA-2も同様の構造

𝐼𝑉 …

Hello, World

m1 m2 pad

処理

R

処理

R

処理

R

出力関数

e4d7f1b4ed2e42d15898f4b27b019da4

𝐼𝐻𝑉 𝐼𝐻𝑉

padまで繰り返したIHVを出力

伝えたかったこと

複雑な処理を暗記してほしいわけではなく

伝えたかったこと1

これ正攻法で解析は無理だな、という感覚

107

伝えたかったこと

複雑な処理を暗記してほしいわけではなく

伝えたかったこと1

これ正攻法で解析は無理だな、という感覚

伝えたかった事2

#3#4の参加者の人たちはこう思うはず。

あれ?ハッシュ関数ってブロック暗号に似てない?

108

FEAL-4

MD5の衝突109

Wangの衝突攻撃110

2004年WangらによりMD5の衝突攻撃が報告

Crypto2004(暗号のトップカンファレンス)

正式な発表でなくランプセッションで発表

事前のePrintでみんな興味深々

一気に世界的なニュースに

無名の女性研究者が一晩で世界を変えた!

色んな裏話もあるらしい

Slashdot.も白熱 Schneier神も白熱

MD5の衝突とは111

𝐼𝑉

m0

ℎ(𝑚)

ℎ(𝑚′)

処理

R𝐼𝐻𝑉

処理

R𝐼𝐻𝑉

処理

R

𝐼𝑉

m’0 m’1 m’2

処理

R𝐼𝐻𝑉

処理

R𝐼𝐻𝑉

処理

R

m1 m2

mとm’という2つの異なるメッセージを入力

h(m)とh(m’)が同じ値を出力

MD5の衝突とは112

𝐼𝑉

m0

ℎ(𝑚)

ℎ(𝑚′)

処理

R𝐼𝐻𝑉

処理

R𝐼𝐻𝑉

処理

R

𝐼𝑉

m’0 m’1 m’2

処理

R𝐼𝐻𝑉

処理

R𝐼𝐻𝑉

処理

R

m1 m2

mとm’という2つの異なるメッセージを入力

h(m)とh(m’)が同じ値を出力

出力の「差分」

ΔH=h(m)-h(m’)=0と場合、衝突

差分解析(#3#4でやったやつ)

入力情報ペアに差分を与えて、

出力ペアの差分を観測

[参考]FEALの差分解析

1.ラウンドごとの入出力差分解析

2.1を元に全体の入出力差分解析

この考え方をMD5に適用!

MD5の差分パスを見つけるなんてCTFでは出ない

研究レベルの難問

衝突探索の考え方だけ説明

113

MD5の差分解析114

𝐼𝑉

m0 m1 m2

ℎ(𝑚)

ℎ(𝑚′)

処理

R𝐼𝐻𝑉

処理

R𝐼𝐻𝑉

処理

R

𝐼𝑉

m’0 m’1 m’2

処理

R𝐼𝐻𝑉′

処理

R𝐼𝐻𝑉′

処理

R

ΔH = h(m)-h(m’)ΔH0=IHV0-IHV0’ ΔH1=IHV1-IHV1’

MD5の差分解析115

𝐼𝑉

m0 m1 m2

ℎ(𝑚)

ℎ(𝑚′)

処理

R𝐼𝐻𝑉

処理

R𝐼𝐻𝑉

処理

R

𝐼𝑉

m’0 m’1 m’2

処理

R𝐼𝐻𝑉′

処理

R𝐼𝐻𝑉′

処理

R

ΔH = h(m)-h(m’)ΔH0=IHV0-IHV0’ ΔH1=IHV1-IHV1’

ΔH0を打ち消すようなΔH1を発生させる

MD5の差分解析116

𝐼𝑉

m0 m1 m2

ℎ(𝑚)

ℎ(𝑚′)

処理

R𝐼𝐻𝑉

処理

R𝐼𝐻𝑉

処理

R

𝐼𝑉

m’0 m’1 m’2

処理

R𝐼𝐻𝑉′

処理

R𝐼𝐻𝑉′

処理

R

ΔH = h(m)-h(m’)ΔH0=IHV0-IHV0’ ΔH1=IHV1-IHV1’

ΔH0を打ち消すようなΔH1を発生させる

IHVとIHV’が同じ値となる

MD5の差分解析117

𝐼𝑉

m0 m1 m2

ℎ(𝑚)

ℎ(𝑚′)

処理

R𝐼𝐻𝑉

処理

R𝐼𝐻𝑉

処理

R

𝐼𝑉

m’0 m’1 m’2

処理

R𝐼𝐻𝑉′

処理

R𝐼𝐻𝑉′

処理

R

ΔH = h(m)-h(m’)ΔH0=IHV0-IHV0’ ΔH1=IHV1-IHV1’

ΔH0を打ち消すようなΔH1を発生させる

IHVとIHV’が同じ値となる

以降のmとm’が同じであればh(m)とh(m’)は

衝突

Wangの攻撃

ΔH0を打ち消すΔH1を出力する入力ペアを効率よく探索する手法を提案

Wangの発表のあとMD5に対する攻撃が活発化

Klimaや佐々木らによりさらに高速化

数秒で衝突探索できるまでに発展

118

[1] How to break MD5 and other hash functions, Xiaoyun Wang et al., http://merlot.usc.edu/csac-f06/papers/Wang05a.pdf

[3] On collisions for MD5, M. Stevens, http://www.win.tue.nl/hashclash/On%20Collisions%20for%20MD5%20-%20M.M.J.%20Stevens.pdf

[2] Finding MD5 Collisions on a Notebook PC Using Multi-message Modifications, V. Klima, http://eprint.iacr.org/2005/102.pdf

Wangの攻撃

ΔH0を打ち消すΔH1を出力する入力ペアを効率よく探索する手法を提案

Wangの発表のあとMD5に対する攻撃が活発化

Klimaや佐々木らによりさらに高速化

数秒で衝突探索できるまでに発展

119

[1] How to break MD5 and other hash functions, Xiaoyun Wang et al., http://merlot.usc.edu/csac-f06/papers/Wang05a.pdf

[3] On collisions for MD5, M. Stevens, http://www.win.tue.nl/hashclash/On%20Collisions%20for%20MD5%20-%20M.M.J.%20Stevens.pdf

[2] Finding MD5 Collisions on a Notebook PC Using Multi-message Modifications, V. Klima, http://eprint.iacr.org/2005/102.pdf

自分で「差分パス」を発見するのは難しい→ 先人の知恵に頼る

FastColl

あるメッセージから同じハッシュ値を出力する2つのメッセージを出力するツール

Wangの攻撃を改良したFast Collision Attackを実装

下記URLからダウンロード可能

https://marc-stevens.nl/research/software/download.php?fastcoll_v1.0.0.5-1_source.zip

ビルド手順

# apt-get install libboost-all-dev

# apt-get install lib32z1-dev

# apt-get install libbz2-dev

# g++ *.cpp *.hpp -lboost_program_options -lboost_filesystem -lboost_system

120

FastCollをやってみた121

2つのバイナリを出力

同一のMD5出力

異なるSHA1出力

超簡単にMD5の衝突メッセージをGET

FastCollをやってみた122

1024bit(512bit*2)を末尾に付加して、MD5の値を衝突させている

元ファイル

FastColl

Chosen Prefix Collision

MD5の衝突攻撃:あるメッセージと衝突するメッセージを探索

Chosen Prefix Collison:任意の2つのメッセージを衝突させられる接尾メッセージを探索

異なる12個の任意のPDFのハッシュ値を衝突

PS3を用いて2日間で実施

123

Hello, World!

Goodbye, World!

a3hae,3x

esd7dh0s+

+

ekah397hal..

suffixを探索!

Hash Crash Chosen Prefix Collision 用のツール

CUDA環境が必要

下記URLで公開

https://marc-stevens.nl/p/hashclash/

124

[再掲]md5colliding125

下記条件を満たすPE32形式のファイルを5つ作成

① 5つのファイルはそれぞれ実行結果が異なること

C:¥>1.exe

All Eindbazen are wearing wooden

………………

C:¥>5.exe

All Eindbazen are cheap bastards

② 5つのファイルはすべて同じMD5ハッシュとなること

$ md5sum 1.exe

656ed3d6b9b227856f7621666ce73081 1.exe

………………

$ md5sum 5.exe

656ed3d6b9b227856f7621666ce73081 5.exe

③ 5つのファイルはすべて異なるSHA1ハッシュとなること

$ sha1sum 1.exe

d36e8ae2ad1bc32d451e04d5ee28624017130336 1.exe

………………

$ sha1sum 5.exe

b8a596e0ecbfdf7d266697c0274b34075b2147e3 5.exe

方針126

方針1:Chosen Prefix Attackを利用

① 5つのPE32バイナリを作成

②それぞれにChosen Prefix Attackを利用しハッシュ値をそろえる

時間がかかる。CTF期間中にできる?

方針2:FastCollを利用

① 5つの出力をする1つのバイナリを作成

② FastCollを利用し衝突するメッセージを導出

③衝突メッセージを5つに増やす

5つの出力?

衝突メッセージを増やす?

実習

とりあえずやってみましょう

(さっきと同じ)解けた人はおまけをやってみてください

Plaid CTF 2014 – Parlor

nc katagaitai.orz.hm 4321 (or 14321, 24321, 34321)

もっと難しい衝突問題がやりたい人

HITCON CTF 2014 – wtf6

サーバ準備してないけど問題は下記からDL可能

https://github.com/ctfs/write-ups-2014/tree/master/hitcon-ctf-2014/wtf6

質問、要望、音楽のリクエストなど→ #katagaitaiCTF

40分127

FAQ

Q1. PE32バイナリの入手方法は?

A1.1. Visual Studioでexeファイルを作るとか

A1.2 mingw32で頑張る

インストール&使い方(Ubuntu 14.04 LTS)

# sudo apt-get install mingw32

# i586-mingw32msvc-gcc test.c

Q2. FastCollがビルドできない

A2. boostが必要。数ページ前を参考に。

128

解答(FastColl)129

① 5つの出力をする1つのバイナリを作成

② FastCollを利用し衝突するメッセージを導出

③衝突メッセージを5つに増やす

解答(5つの出力)130

解答(5つの出力)

ハッシュに関係ないパラメータ(ファイル名など)で出力を変更するコードを生成

例)自身のファイル名で出力を変更

同じバイナリでもファイル名が変わると出力が変わる

131

解答(5つの出力)

ファイル名を変更して実行すると出力が変わる

もちろん現状では同じMD5、SHA1を出力する

132

解答(衝突ペアの生成)

FastCollを利用し衝突ペアを生成

MD5で衝突を起こし、SHA1ペアは異なるメッセージペア

133

2つのバイナリを出力

同一のMD5出力

異なるSHA1出力

解答(衝突ペアの生成)

衝突ペアのファイル名をそれぞれ変更し実行

元データと同様の出力

PE32形式は末尾に不要データが付与されても無視

134

条件を満たす2つのメッセージを手に入れた

解答(衝突ペアの増加) FASTCOLLによりm2, m’2が付与されたと仮定

下記メッセージが衝突

md5[m1 m2]

md5[m1 m’2]

135

m1

R

m2

R

m’2

R

解答(衝突ペアの増加) さらに[m1 m2]にFASTCOLLによりm3, m’3が付与されたと仮定

下記メッセージが衝突

md5[m1 m2 m3]

md5[m1 m’2 m’3]

136

m1

R

m2

R

m’2

R

m3

R

m’3

R

解答(衝突ペアの増加) さらに[m1 m2]にFASTCOLLによりm3, m’3が付与されたと仮定

下記メッセージが衝突

md5[m1 m2 m3]

md5[m1 m’2 m’3]

137

m1

R

m2

R

m’2

R

m3

R

m’3

R

[m1 m’2]にm3, m’3を付与

m3

R

m’3

R

解答(衝突ペアの増加) さらに[m1 m2]にFASTCOLLによりm3, m’3が付与されたと仮定

下記メッセージが衝突

md5[m1 m2 m3]

md5[m1 m’2 m’3]

138

m1

R

m2

R

m’2

R

m3

R

m’3

R

[m1 m’2]にm3, m’3を付与

m3

R

m’3

R

下記4メッセージが衝突

md5[m1 m2 m3]md5[m1 m2 m’3]md5[m1 m’2 m3]md5[m1 m’2 m’3]

→ 倍々ゲームで衝突メッセージを増殖可能

解答(衝突ペアの増加)139

1_msg1.exe = 1.exe+m2

1_msg2.exe = 1.exe+m’2

1.exe

R

m2

R

m’2

R

解答(衝突ペアの増加)

1_msg1.exeからさらに衝突ペアを導出

140

解答(衝突ペアの増加)141

1_msg1_msg1.exe = 1.exe+m2+m3

1_msg1_msg2.exe = 1.exe+m2+m’3

1.exe

R

m2

R

m’2

R

m3

R

m’3

R

解答(衝突ペアの増加)

付与されたデータ部分を抽出

data1 = m3

data2 = m’3

それぞれ1_msg2.exeに連結する

142

解答(衝突ペアの増加)143

1_msg1_msg1.exe = 1.exe+m2+m3

1_msg1_msg2.exe = 1.exe+m2+m’3

1_msg2_msg1.exe = 1.exe+m’2+m3

1_msg2_msg2.exe = 1.exe+m’2+m’3

m1

R

m2

R

m’2

R

m3

R

m’3

R

m3

R

m’3

R

解答(衝突ペアの増加)

下記の特性を持つ4つのメッセージを導出

MD5ハッシュはすべて衝突

SHA1ハッシュはすべて異なる

144

メッセージを5個まで増やして、それぞれのファイル名を変更すればOK

参考文献

[1] How to break MD5 and other hash functions, Xiaoyun Wang et al., http://merlot.usc.edu/csac-f06/papers/Wang05a.pdf

[2] Finding MD5 Collisions on a Notebook PC Using Multi-message Modifications, V. Klima, http://eprint.iacr.org/2005/102.pdf

[3] On collisions for MD5, M. Stevens, http://www.win.tue.nl/hashclash/On%20Collisions%20for%20MD5%20-%20M.M.J.%20Stevens.pdf

[4] Free Start Collision for full SHA-1, M. Stevens et al., https://marc-stevens.nl/research/papers/KPS_freestart80.pdf

[5] The Keccak sponge function family, Guido Bertoni et al., http://keccak.noekeon.org/specs_summary.html

[5] 新版暗号技術入門秘密の国のアリス, 結城浩

[6] 暗号技術大全, Bruce Schneier

145

Writeups & Implressions146

147

katagaitai勉強会#5の開催後に見つけたcryptoのwriteupや感想です。

漏れがあれば、連絡いただけると嬉しいです。

Parlor編

https://gist.github.com/icchyr/e07035fd52289ab491dbd71910af1467

icchyrさんによるwriteup。C++すげー。

http://www.slideshare.net/sonickun/katagaitai-ctf-5-med-parlor-plaid-ctf-2014

y_hag(Sonickun)さんによるwriteup。丁寧でこの勉強会資料が不要な勢い。

http://haberd4shery.tumblr.com/post/149744686783/katagaitai-ctf勉強会-感想など

haberd4sheryさんによるwriteup。宿題の提出ありがとうございます。

https://gist.github.com/Charo-IT/7d7281e56dfc66e0c5b0e6643267c9a6

Charo_ITさんによるwriteup。Cとrubyの組み合わせ一本。

#5 Writeups & Impressions

148

katagaitai勉強会#5の開催後に見つけたcryptoのwriteupや感想です。

漏れがあれば、連絡いただけると嬉しいです。

hashme&MD5colliding編

https://gist.github.com/inaz2/4128aa4bbda194ea98d3d18ddafa8a39

inaz2さんによるwriteup。よくブログ見てます。

https://gist.github.com/elliptic-shiho/242fb0bda5d8cead20a05fe1f36b9868

elliptic-shihoさんによるwriteup。よくtwitter見てます。

https://gist.github.com/icchyr/63ead572d4e1ba7e12b493b2f4b3087a

icchyrさんによるwriteup。main()で処理するところがicchyさんらしさですかね。ごめんなさい、適当に言いました。

https://gist.github.com/Charo-IT/61903c3ad41928a99705bc6b6222796d

Charo_ITさんによるwriteup。Rubyです。さすが。

http://ydfj.blogspot.jp/2016/08/katagaitaictf5-med.html?spref=tw

Theoldmoon0602(ふるつき)さんによるwriteup&感想。Pwntoolすごいですよね。あと解説を書いてくれるのが助かります。Parlorも頑張ってください。

#5 Writeups & Impressions

149

katagaitai勉強会#5の開催後に見つけたcryptoのwriteupや感想です。

漏れがあれば、連絡いただけると嬉しいです。

hashme&MD5colliding編

http://fish.minidns.net/news/78

Kanataさんの感想。暗号の世界は一部の偉人(神)で回っているのです。そして余談スライドは消したので当日の参加者限定です。

http://hama.hatenadiary.jp/entry/2016/07/21/211211

hamaさんの感想。院試終わったらParlorをお願いします。

http://turn-up.hatenablog.com/entry/2016/07/17/225522

Turn_upさんのwriteup&感想。Koshigaitaすぎですね。

https://kimiyuki.net/blog/2016/08/28/hack-you-2014-hashme/

https://kimiyuki.net/blog/2016/08/28/ebctf-2013-md5colliding/

ki6o4さんによるwriteup。数式で書いてくれてますねー。でもちょっと怪しい?

http://kotamanegi.hatenablog.com/entry/2016/08/30/235201

こたまねぎさんによる感想。ぜひParlorも取り組んでみてください。

#5 Writeups & Impressions