View
1.593
Download
2
Category
Preview:
Citation preview
CTF勉強会 #4
Crypto
2016.01.23 TOKYO / 2016.02.06 OSAKA
trmr (@trmr105)
katagaitai
注意事項
本スライドは勉強会で利用したものを元に作成しています。
勉強会では問題サーバを利用しましたが既に停止しています。
問題サーバのIPやホスト名が出てくる箇所がありますが、随時読み替えをお願いいたします。
リンク切れ等ご容赦ください。
勉強会時点で誤っていた個所を一部修正しています。
問題は下記URLに配置しています。
http://pastebin.com/RfwJn2MM
次ページに勉強会参加者有志のwriteupを載せています。
私のwriteupよりも100倍いい出来なので、ぜひそちらも参照してください。
2
Writeup & Impression3
katagaitai勉強会#4 開催後、reconで見つけたwriteupや感想です。
http://syagi.hatenablog.com/entry/2016/01/29/225258
linus404さん作。今頃は実装も終わってるはず。
http://encry1024.hatenablog.com/entry/2016/02/02/154645
encry1024さんによる感想。Rubyで回りきったのだろうか。
http://www.slideshare.net/YOKARO-MON/csaw-ctf-2014-quals-crypto300
you_0708さんによるwriteup。英語ですね。グローバルですね。
http://turn-up.hatenablog.com/entry/2016/02/01/192814
turn_upさんによる感想。加筆期待wktk。
https://fish.minidns.net/news/58
Kanataさんによる感想。上級編も感想書いてくれてましたね。ありがとうございます。
http://ydfj.blogspot.jp/2016/02/katagaitai-ctf-2016-med.html
Yudai Fujiwara さんによる感想。暇なときにコード書いたら連絡ください。
http://furutsuki.hatenablog.com/entry/2016/02/10/053531
Furutsukiさんによる感想。いずれ書いてください。
他載せられてない人。私のRecon力不足です。ごめんなさい。
もしwriteup書いたらtwitter等で連絡いただけると助かります。
Katagaitai勉強会とはなんぞや
好きなことを分かり合える人を増やしたい!
4
楽しみにしていること
Twitterの巡回 Writeup収集
#katagaitaiCTF
5
katagaitaiと愉快な仲間たち 今回発表する人
bata(@bata_24) リーダー
trmr(@trmr105) センセイ
資料レビュー
askn(@asai_ken) エース
運営手伝い
yagihash(@yagihashoo) シンジン
# 実は他にもいるらしい
# 総数は誰も知らない
We are katagaitai!
6
今日の問題
[CSAW CTF 2014] Crypto300 - FEAL
CODE
7
今日FEALをやるべき4つの理由
共通鍵暗号だから
公開鍵暗号の解き方がパターン化してる問題
2014年のCTFベスト暗号問題に選ばれていたから
Golden Flag Awards - http://golden-flags.com/
12月の上級編がこの問題と関連していたから
fealの後にsubmeに取り組むことをおすすめ
中級編と上級編の順番を逆にすればよかった…
最近の問題についていけてないから
子育てに追われている…
世の中の父親はすごい
8
とりあえずやってみよう
①問題につなげてみよう
$ nc katagaitai.orz.hm 8888 (18888 or 28888)
※ホスト名がリアルだけど、気にしない
つながりますか?
つながらない人は手をあげてください
9
とりあえずやってみよう
②ファイルを落としてみよう
以下のパスにサーバで動作しているpythonコードを置いてます
https://goo.gl/9XymPK
10
Pythonコードを見てみよう。11
本番サーバは違う値が入ってます。
※鍵の生成方法もちょっと変えてます。
(固定値にしてます)
最初の問題
まずはじめに次のSHA1ハッシュを要求される
SHA1ハッシュの末尾16ビットが”1”
入力値が与えられた文字列で始まる
入力長は21バイト
腕慣らしにやってみましょう。
終わったら問題を解き始めてください。
Solver: https://goo.gl/WUbcgb
20分12
C実装のが速度的によい
注意事項
CSAW CTFの問題はFEAL4.3ですが、元となった暗号FEAL
を解説します。
ほんのちょっとだけ仕様が違います。
スライド中に出てくる「+」はXoRです
13
暗号問題の解き方
CTFの暗号問題は二つに分けられる
「公表されている暗号」か「独自に作った暗号」
公表されている暗号
RSA, AESなど
過去に様々な研究者が解析し脆弱性を報告
独自に作った暗号
暗号を独自に作るのはものすごく大変
多くは公表されている暗号を基にして作成
14
暗号のソースコード15
コードを読んで脆弱性を見つけるのは難しい
暗号問題の解き方手順16
いかに初動であたりをつけるかが重要
マルウェアの解析手順 by JPCERTの中の人
表層解析
動的解析
静的解析
暗号の解析も同じ
表層解析 → 何の暗号かあたりをつける
動的解析 → 動かしてどのような問題か把握
静的解析 → 問題の重要な場所だけちゃんと読む
暗号問題の解き方
CTFの暗号問題は二つに分けられる
「公表されている暗号」か「独自に作った暗号」
公表されている暗号
RSA, AESなど
過去に様々な研究者が解析し脆弱性を報告
独自に作った暗号
暗号を独自に作るのはものすごく大変
多くは公表されている暗号を基にして作成
17
まずぐぐる
まずぐぐる
暗号問題はぐぐることが大事
ぐぐってみた18
Wikipedia!!
Wikipedia19
Differencial Cryptanalysis!!
さらにぐぐってみた20
攻撃コードがあった!!!!!
解けた!!!!!21
これで勝つる!!!!!
本番ならOKですが勉強会なので勉強します
共通鍵暗号と公開鍵暗号
公開鍵暗号 – 暗号化と復号に異なる鍵を利用
共通鍵暗号 – 共通の鍵を利用して暗号化/復号を実施
22
今日はこれ
共通鍵暗号のカテゴリー
大体このようなカテゴリわけできる(はず)
ストリーム暗号
LFSR型:snow, K-Cipher2 etc.
状態遷移型:RC4, trivium, chacha-20 etc.
ブロック暗号
Feistel構造:DES, MISTY, Camellia, FEAL etc.
SPN構造:AES, Serpent etc.
今日はこれ
23
上級編はこっち
[参考]Feistel構造24
暗号に求められること
Key (K) Key (K)
暗号化 暗号化
入力情報(鍵・平文)の適切な攪拌
出力の値は全く異なるのが望ましい
25
少しでも入力が違えば
差分解析
Plaintext A Plaintext A + ⊿
Key (K) Key (K)
暗号化 暗号化
diff
入力に差分
入力情報(鍵・平文)ペアに差分を与える
出力の差分を見ることで偏りがないか確認
出力差分に相関が出現!
26
FEAL-4のアルゴリズム
FEAL-4
4ラウンドFeistel構造
ラウンド毎にf関数にて処理
27
http://www.theamazingking.com
FEAL-4のラウンド関数
FEAL-4のラウンド関数f
Byte(8-bit)ごとの処理
G0,G1の2つの関数が存在
G関数は入力a,bが「0」ならば、出力は「0」 or 「4 (1<<2)」となる
28
http://www.theamazingking.com
FEALのラウンド関数の解析
次の条件を満たす入力を考える
X0=X1 and X2=X3
XoRで打ち消しが発生し、Y1およびY2が固定値に
29
http://www.theamazingking.com4(1<<2) 16(1<<4)G(X0+4) G(X3+16)
X0=X1 X2=X3
FEALのラウンド関数の差分
次の条件を満たす入力の出力差分を考える
X0=X1 and X2=X3
入力X, X’の出力の差分ΔYは?
30
http://www.theamazingking.com
FEALのラウンド関数の差分
次の条件を満たす入力の出力差分を考える
X0=X1 and X2=X3
入力X, X’の出力の差分ΔYは?
31
http://www.theamazingking.com4 16G(X0+4) G(X3+16) 4 16G(X’0+4) G(X’3+16)
ΔY0 = G(X0+4)+G(X’0+4), ΔY1 = 0, ΔY2 = 0, ΔY3 = G(X’3+16)+G(X’3+16)
ΔYに大きな偏り
X’0=X’1 X’2=X’3X0=X1 X2=X3
FEALのラウンド関数の解析
次のような入力ペアの出力差分を考える
X = 0x00000000 (X0=0x00, X1=0x00, X2=0x00, X3=0x00)
X’ = 0x80800000 (X0=0x80, X1=0x80, X2=0x00, X3=0x00)
32
http://www.theamazingking.comG0(4)=0x10 G1(16) G1(16)G0(84)=0x12
FEALのラウンド関数の解析
次のような入力ペアを考える
X = 0x00000000 (X0=0x00, X1=0x00, X2=0x00, X3=0x00)
X’ = 0x80800000 (X0=0x80, X1=0x80, X2=0x00, X3=0x00)
33
http://www.theamazingking.comG0(4)=0x10 G1(16) G1(16)G0(84)=0x12
ΔY0 = 0x02, ΔY1 = 0, ΔY2 = 0, ΔY3 =0
ΔX=0x80800000ならば必ずΔY=0x02000000
特定の入力差分において、出力差分が一定となる
FEALの差分解析34
http://www.theamazingking.com
1ラウンドなら特定の入力差分の際に出力差分に偏り
途中の値はわからない
出力の値はわかる
FEALの差分解析35
http://www.theamazingking.com
全体を通した際に出力差分は出るか?
1ラウンドなら特定の入力差分の際に出力差分に偏り
FEALの差分解析36
http://www.theamazingking.com
次の差分を持つ平文ペアを入力する
0x8080000080800000
0x80800000 0x80800000
暗号文に相関が出てほしい
FEALの差分解析37
http://www.theamazingking.com
次の差分を持つ平文ペアを入力する
0x8080000080800000
同じ鍵で暗号化されているため鍵の入力差分は0
0x80800000 0x80800000
0 0
0
FEALの差分解析38
http://www.theamazingking.com
次の差分を持つ平文ペアを入力する
0x8080000080800000
同じ鍵で暗号化されているため鍵の入力差分は0
0x80800000 0x80800000
0x80800000
0
0x02000000
ここの差分は不明
0
最終ラウンドへの左入力の差分は
0x02000000
右入力の差分は不明…
途中で出力の差分が出せなくなる
FEALの差分解析39
http://www.theamazingking.com
次の差分を持つ平文ペアを入力する
0x8080000080800000
同じ鍵で暗号化されているため鍵の入力差分は0
0x80800000 0x80800000
入力に差分を与えることで最終ラウンドの入力差分を
操作可能
今度は出力から考える
最終ラウンドにフォーカス
FEALの最終ラウンドの差分解析
左入力差分=0x02000000
右入力差分は特定できない
40
0x02000000
key
f
Output
?????
Output
FEALの最終ラウンドの解析
差分ではなく通常の処理で考える
41
key
f
暗号文(C1) 暗号文(C2)
入力(X1) 入力(X2)
FEALの最終ラウンドの解析42
key
f
暗号文(C1) 暗号文(C2)
C1+C2(=X2)
入力(X1) 入力(X2)
差分ではなく通常の処理で考える
FEALの最終ラウンドの差分解析
出力ペアの差分より最終ラウンドの右側の入力差分はC1+C2+C1’+C2’=ΔC1+ΔC2
43
key
f
暗号文(C1) 暗号文(C2)
入力(X1) 入力(X2)
key
f
暗号文(C1’) 暗号文(C2’)
入力(X1’) 入力(X2’)
C1+C2 C1’+C2’
出力から右入力差分を特定可能
FEALの最終ラウンドの差分解析44
0x02000000
key
f
出力差分(ΔC1)
ΔC1+ΔC2
入力差分(ΔX1) 入力差分(ΔX2)
出力差分(ΔC2)
最終ラウンドの全入出力差分を特定できた!
この値は?
FEALの最終ラウンドの差分解析
出力ペアの差分より最終ラウンドの右側の入力差分は
C1+C2+C1’+C2’=ΔC1+ΔC2
f関数の出力差分はf(C1+C2+key)+f(C1’+C2’+key)
45
key
f
暗号文(C1) 暗号文(C2)
入力(X1) 入力(X2)
key
f
暗号文(C1’) 暗号文(C2’)
入力(X1’) 入力(X2’)
C1+C2 C1’+C2’
f(C1+C2+key) f(C1’+C2’+key)
FEALの最終ラウンドの差分解析46
0x02000000
key
f
出力差分(ΔC1)
ΔC1+ΔC2
入力差分(ΔX1) 入力差分(ΔX2)
出力差分(ΔC2)
f(C1+C2+key)+f(C1’+C2’+key)
この値は?
ΔC1 = f(C1+C2+key)+f(C1’+C2’+key)+0x02000000
FEALの最終ラウンドの差分解析47
0x02000000
key
f
出力差分(ΔC1)
ΔC1+ΔC2
入力差分(ΔX1) 入力差分(ΔX2)
出力差分(ΔC2)
f(C1+C2+key)+f(C1’+C2’+key)
この値は?
ΔC1 = f(C1+C2+key)+f(C1’+C2’+key)+0x02000000
この式を満たすkeyを探索することで、値を特定可能!!!
何ができたか?48
http://www.theamazingking.com
K3を導出できた!
FEALの次のラウンド鍵解読49
http://www.theamazingking.com
K3を解読したので暗号文から逆算することで
3ラウンド目の出力が手に入る
FEALの次のラウンド鍵解読50
http://www.theamazingking.com
K3を解読したので暗号文から逆算することで
3ラウンド目の出力が手に入る
今度は3ラウンド目の入力差分と出力差分よりK2の鍵解読を実施
FEALの次のラウンド鍵解読51
http://www.theamazingking.com
K3を解読したので暗号文から逆算することで
3ラウンド目の出力が手に入る
今度は3ラウンド目の入力差分と出力差分よりK2の鍵解読を実施
これを繰り返すことでK1~K3を解読可能!
FEALの次のラウンド鍵解読52
http://www.theamazingking.com
K3を解読したので暗号文から逆算することで
3ラウンド目の出力が手に入る
今度は3ラウンド目の入力差分と出力差分よりK2の鍵解読を実施
これを繰り返すことでK1~K3を解読可能!
FEALの開始ラウンドの解析53
P1
key4
f
出力(C1)
P2
入力平文 入力平文
出力(C2)
key5
key0
FEALの開始ラウンドの解析54
P1
key4
f
出力(C1)
P2
入力平文 入力平文
出力(C2)
key5
key0
K4 = C1 + f(C2+K0) + P1
K5 = C2 + K4 + P1 + P2 = C1 + C2 + P2 + f(C2 + K0)
この式を満たすK0を探索することで、K4, K5の値を特定可能!!!
実習
とりあえずやってみましょう
先にwriteupを紹介します
katagaitai版
http://pastebin.com/eZaHEEQx
http://pastebin.com/UweM5NsT
他にも転がってる。Google先生は神。
解説はFEAL4でしたが問題はFEAL4.3です。
ちょっとだけある箇所が違います。
解けた人は上級編の問題をやってください
スライドはこちらhttp://www.slideshare.net/trmr105/katagaitai-ctf-3-crypto
残り15分になったらwriteupのコード解説しようと思ってます
音楽にリクエストがあれば@trmr105または#katagaitaiCTFでツイートしてください
東京ではともりなおにジャックされた
90分55
trmr版FEALの解き方 差分を使った解き方はいろいろある、と思う。
あくまで一例。
今回のwriteupの成り立ち
trmrがpythonで書く
速度が出ない
bata氏がCで書き直す
100倍高速化!!
Cは神
writeupの動かし方
1)writeup_feal.cをtest.cにリネーム
2)writeup_feal.pyを実行
※接続先のホスト名はPython実行前に確認&修正してください
※まずはローカルで試すのをおすすめ
56
解答
writeupを動かすと
57
HackerLikesHakka
本番でのとき方
1. ぐぐる
2. 暗号を特定する
3. 攻撃方針を決定する
4. 公開されている暗号との違いを特定
5. 攻撃する
6. フラグゲット!
今回のように考えて解く場合CSAW300点問題では無いはず
400~500点くらい?そもそもCSAWで出るのか説
58
参考文献
参考文献
The Amazing King
http://www.theamazingking.com
Wikipedia[英語版]
https://en.wikipedia.org/wiki/FEAL
暗号技術大全 (アップデート希望)
その他論文
59
Recommended