Upload
ryoichi-teramura
View
364
Download
3
Embed Size (px)
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