katagaitai CTF 勉強会 #5 -関東 |med おまけ問題 Parlor (Plaid CTF 2014) @m1z0r3勉強会
-
Upload
sonickun -
Category
Technology
-
view
599 -
download
7
Transcript of katagaitai CTF 勉強会 #5 -関東 |med おまけ問題 Parlor (Plaid CTF 2014) @m1z0r3勉強会
Parlor
m1z0r3 (crypto) meeting
sonickun
2016/7/27 m1z0r3 meeting 1
はじめに
Katagaitai CTF 勉強会行ってきました https://atnd.org/events/77451
m1z0r3からの参加者は7人くらい
復習大事
今日はParlaor解きます 勉強会参加した人なら解ける(た)よなあ?
初心者にはLength-extensionの簡単な問題を出します
2016/7/27 m1z0r3 meeting 2
Problem
Plaid CTF 2014 – Parlor (Crypto 250)
katagaitai CTF勉強会 #5 -関東|medおまけ問題
Task
2016/7/27 m1z0r3 meeting 3
The Plague is running a betting service to build up funds for his
massive empire. Can you figure out a way to beat the house?
The service is running at katagaitai.orz.hm:4321
アクセスしてみる
2016/7/27 m1z0r3 meeting 4
概要
Flag入手条件 お金を$1,000→$1,000,000,000に増やす
以下の式を満たすとbet額×oddsが手に入る(外せばbet没収)
できること odds(2^n)とbet額のセット
client_numberを設定してプレイ
所持金額の確認
secretの確認(確認するとsecretはリセットされる)
2016/7/27 m1z0r3 meeting 5
md5(secret + client_number) % odds = 0
※ secretは未知
問題の整理
この問題の難しいところ secretが未知なのでMD5ハッシュの値が分からない(操作できない)
勝利の必須条件 自分の思い通り(後述)のMD5ハッシュを計算する(ハッシュ値に合わせてoddsを調節してやればいい)
2016/7/27 m1z0r3 meeting 6
md5(secret + client_number) % odds = 0
方針secretが分からなくてもハッシュ値を
計算できる方法を使う
Length-extension Attack
詳しくはkatagaitai勉強会のtrmrさんの資料を参照
Length-extension Attackツール hashpump: https://github.com/bwall/HashPump
hash_extender: https://github.com/iagox86/hash_extender
2016/7/27 m1z0r3 meeting 7
y = Hash(secret + x)のxとyが既知である時、secretが逆算できなくも Hash(secret + x + y)が計算できる
方針(1/3)
“仮に”MD5ハッシュ値が分かっている場合…
↑このハッシュ値が作れる(”y”部分を変えていくらでも)
⇒下位ビットが0になるハッシュ値が作れた時、oddsを調整してPlay!
ex.) MD5の下位ビットが10…100の時、odds=2^2とすればWin
2016/7/27 m1z0r3 meeting 8
md5(secret + “x”) % odds = 0
md5(secret + “x”+ pad + “y”) % odds = 0
Extend!
client_nuber = “x” としたとき
方針(2/3)
課題:MD5ハッシュ値をどうやって求めるか
実はMD5 % oddsの値を教えてくれる
oddsの最大値は2^100なのでMD5の下位100/128bitがわかる!
2016/7/27 m1z0r3 meeting 9
md5(secret + “x”) % odds = 0
残りの28bitは…??
方針(3/3)
課題:MD5の残りの28bitをどうやって求めるか(ここが最難関)
⇒Length-extensionを駆使して28bitをブルートフォースする
2016/7/27 m1z0r3 meeting 10
100bit28bit
md5(secret + “x”+ pad + “y”)
client_number = “x” client_number = “x” + pad + “y”
md5(secret + “x”)
100bit28bit
サーバーから二つのハッシュの下位ビットを得る
求めたいやつ
このページがんばった
方針(3/3)
課題:MD5の残りの28bitをどうやって求めるか(ここが最難関)
⇒Length-extensionを駆使して28bitをブルートフォースする
2016/7/27 m1z0r3 meeting 11
100bit28bit
!
md5(secret + “x”+ pad + “y”)
100bit00..01
100bit00..02
100bitXX..XX
…
client_number = “x”
Length-
extension
client_number = “x” + pad + “y”
md5(secret + “x”)
Brute Force
100bit00..03
100bit28bit
100bit28bit
100bit28bit
100bit28bit
100bit28bit…
下位100bitが一致
サーバーから二つのハッシュの下位ビットを得る
求めたいやつ
↓ローカルの仕事(高速化必須)
このページがんばった
md5(secret+“x”)のLength-extensionの結果の下位100bitがmd5(secret+“x”+pad+“y”)
の下位100bitと一致するようにmd5(secret+“x”)の上位28bitを総当たりする
自分で思い通りのハッシュ値を作りたいぞ
Length-extension Attackでハッシュを量産するぞ
元のハッシュ値を知る必要があるぞ
下位100bitなら分かるぞ
残りの28bitは総当たりするぞ
2016/7/27 m1z0r3 meeting 12
攻撃の流れ思
考の流れ
攻撃手順まとめ
1. HASH1=md5(secret + “x”) の下位100bitを求める
2. HASH2=md5(secret + “x” + pad + “y”)の下位100bitを求める
3. HASH1のLength-extensionの結果の下位100bitがHASH2の下位100bitと一致するようにHASH1の上位28bitを総当たりする
4. HASH1のすべてのbitが求まる
5. HASH1に任意の文字でLength-extensionを施し、下位ビットが0になるようにする
6. 下位ビットの0の数に応じてoddsを設定しplayする(勝率100%)
7. 所持金が$1,000,000,000になるまで5と6を繰り返す
8. Flagゲット
2016/7/27 m1z0r3 meeting 13
Solver
https://gist.github.com/sonickun/01515eaa48b4d9831e42df40164f7720
2016/7/27 m1z0r3 meeting 14
2016/7/27 m1z0r3 meeting 15