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 - hashme17
朝の待ち時間の有効活用
① サーバにつなげてみよう
$ 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 Parlor78
アクセスしてみる
① サーバにつなげてみよう
$ 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 – md5colliding88
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 D
32bit*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%2
0-%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%2
0-%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/K
PS_freestart80.pdf
 [5] The Keccak sponge function family, Guido Bertoni et al., http://keccak.noekeon.org/specs_sum
mary.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

katagaitai CTF勉強会 #5 Crypto