Diese Präsentation wurde erfolgreich gemeldet.
Die SlideShare-Präsentation wird heruntergeladen. ×

katagaitai CTF勉強会 #5 Crypto

katagaitai CTF勉強会 #5 Crypto

Herunterladen, um offline zu lesen

2016年夏に東京と大阪で実施したkatagaitai CTF勉強会資料です。
ハッシュレングスエクステンション、衝突に関するCTF問を扱っています。

2016年夏に東京と大阪で実施したkatagaitai CTF勉強会資料です。
ハッシュレングスエクステンション、衝突に関するCTF問を扱っています。

Weitere Verwandte Inhalte

katagaitai CTF勉強会 #5 Crypto

  1. 1. CTF勉強会 #5 Crypto 2016.07.16 TOKYO / 2016.08.28 OSAKA trmr (@trmr105) katagaitai
  2. 2. 注意事項  本スライドは勉強会で利用したものを元に作成しています  勉強会では問題サーバを利用しましたがすでに停止していま す  問題サーバのIPやホスト名が出てくる箇所は、随時読み替えを お願いします  リンク切れ等ご容赦ください  最後のページに勉強会参加者のwriteupを載せています  ぜひそちらも参照してください 2
  3. 3. #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本 つらかった…。
  4. 4. katagaitai勉強会とは 好きなことを分かり合える人を増やしたい! 4
  5. 5. 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..
  6. 6. 今日の問題  [hack you 2014] Crypto200 – hashme  [Plaid CTF 2014] Crypto250 - Parlor  [ebCTF 2013] bin400 – MD5 COLLIDING 6
  7. 7. 今日の問題を選んだ理由  ハッシュ関数をやりたかった!  #3 #4でブロック暗号をやった!  公開鍵暗号はどうしよう…。  「簡単」「意味不明」に二極化しそう  CTFの暗号問題として易しめ  その分午後が難しいのでOK 7 熟考したうえでの 出題!
  8. 8. CTFとハッシュ関数8
  9. 9. CTFにおけるハッシュ問題の分類  大きく以下のように分類 9 利用ハッシュ関数 公知のハッシュ 独自ハッシュ 利用脆弱性 アルゴリズム プロトコル 原像 衝突 レングスエクス テンション 分類 その他 (主にPPC)
  10. 10. CTFにおけるハッシュ問題の分類  大きく以下のように分類 10 利用ハッシュ関数 公知のハッシュ 独自ハッシュ 利用脆弱性 アルゴリズム プロトコル 原像 衝突 レングスエクス テンション 分類 その他 (主にPPC) 注目!
  11. 11. 原像攻撃  ハッシュ値から元のメッセージを復元する攻撃  CTFでの傾向  出題頻度は低い  原像攻撃が可能なハッシュ関数が少ない  参考問題  hack you too - Everybody lies 11 ハッシュ 関数 𝑀 ℎ(𝑀) ハッシュ値から 元のメッセージを 復元!!
  12. 12. [参考]第二原像攻撃  特定のメッセージと同じハッシュ値を生成する別のメッ セージを復元する攻撃 12 ハッシュ 関数 𝑀 ℎ(𝑀) ハッシュ 関数 𝑀′ 同じハッシュ値を 出力する メッセージを復元!
  13. 13. 衝突攻撃  任意のメッセージと同じハッシュ値を生成する別のメッセージを特定する攻 撃  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はどんな値でも可
  14. 14. ハッシュレングスエクステンション  説明は後述  CTFでの傾向  出題頻度:高  レングスエクステンション自体が問題ではなく、レングスエクステンションで解け ると思いつかせることに焦点を当てた問題が増えてる  参考問題  hack you 2012 - hashme  Plaid 2014 – Parlor  Olympic CTF 2014 – Emdee  Gits 2015 – Knockers 14
  15. 15. その他(主にPPC)  ハッシュ関数を利用したプロトコルの脆弱性を探す問題  例題  与えられたハッシュに対して下記条件を満たす入力を探索  いかに高速に入力値を探索するかが重要  ハッシュでなくても問題は成立するためハッシュ問題とするかは?  参考問題  SECUINSIDE CTF 2014 Final - HashGame  HITCON 2014 – ginger  Hack.lu 2015 – Checkcheckcheck  BkP 2016 – ltseorg 15 入力1のハッシュ 入力2のハッシュ 入力3のハッシュ + + 与えられたハッシュ=
  16. 16. 今日やるのはこれ  大きく以下のように分類 16 利用ハッシュ関数 公知のハッシュ 独自ハッシュ 利用脆弱性 アルゴリズム プロトコル 原像 衝突 レングスエクス テンション 分類 その他 (主にPPC) Hash Length Extension Collision
  17. 17. [hack you 2014] Crypto200 - hashme17
  18. 18. 朝の待ち時間の有効活用 ① サーバにつなげてみよう $ 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分
  19. 19. hashmeを見てみよう  0を入力した場合 19 名前入力を要求 証明書を発行
  20. 20. hashmeを見てみよう  1を入力した場合 20 ① 証明書を要求 ② 証明書を入力 ③ Welcome! で、何すればいいの?
  21. 21. hashmeを見てみよう21  crypto200.py
  22. 22. hashmeを見てみよう  0を入力するとgen_cert関数に遷移 22
  23. 23. hashmeを見てみよう  0を入力するとgen_cert関数に遷移 23 ① ユーザの入力値に role=”anonymous”を付与
  24. 24. hashmeを見てみよう  0を入力するとgen_cert関数に遷移 24 ② “SALT+①の値”のハッシュ値を 生成 ① ユーザの入力値に role=”anonymous”を付与
  25. 25. hashmeを見てみよう  0を入力するとgen_cert関数に遷移 25 ③ 鍵と②の値をXoRし 「証明書」を生成 ② “SALT+①の値”のハッシュ値を 生成 ① ユーザの入力値に role=”anonymous”を付与
  26. 26. hashmeを見てみよう  0を入力するとgen_cert関数に遷移 26 ③ 鍵と②の値をXoRし 「証明書」を生成 ② “SALT+①の値”のハッシュ値を 生成 ① ユーザの入力値に role=”anonymous”を付与 サーバしか知らない鍵とSALTの値で role=‘anonymous’の「証明書」を生成
  27. 27. hashmeを見てみよう  1を入力するとauth関数に遷移 27 ① 鍵と入力された「証明書」を XoR
  28. 28. hashmeを見てみよう  1を入力するとauth関数に遷移 28 ① 鍵と入力された「証明書」を XoR ② “SALT+①の値”のハッシュ値を 生成
  29. 29. hashmeを見てみよう  1を入力するとauth関数に遷移 29 ① 鍵と入力された「証明書」を XoR ② “SALT+①の値”のハッシュ値を 生成 ③ role=”administrator” が付与されていればflag
  30. 30. hashmeを見てみよう  1を入力するとauth関数に遷移 30 サーバの鍵とSALTの値で生成された role=‘administrator’の「証明書」が必要 ① 鍵と入力された「証明書」を XoR ② “SALT+①の値”のハッシュ値を 生成 ③ role=”administrator” が付与されていればflag
  31. 31. 問題の要点  1.証明書の権限  自分で作成できる証明書はrole=anonymous  flag獲得に必要な証明書はrole=administrator  2.ローカルで証明書を偽造する  鍵とSALTを手に入れる必要あり  3.サーバに証明書を偽造させる  role=administratorを付与できない 31 入力にuser&role=administrator を付与してもはじかれる 「文字,数字,_」のみ入力可能…
  32. 32. 今回のハッシュ関数(hashme)32 あやしい固定値
  33. 33. 暗号問題はぐぐる33 hashmeはMD5やSHA-1などをベースにしたハッシュ関数
  34. 34. 暗号問題はぐぐる34 hashmeはMD5やSHA-1などをベースにしたハッシュ関数 Merkle-Damgård構造
  35. 35. Merkle-Damgård構造35 Hello, World m1 m2 m3 ① メッセージを分割 pad ② パディング付与
  36. 36. Merkle-Damgård構造36 内部 状態𝐼𝑉 … Hello, World m1 m2 m3 ① メッセージを分割 pad ② パディング付与 関 数 R 関 数 R 関 数 R 関 数 R ③ 分割したメッセージごとに処理 を繰り返して内部状態を生成
  37. 37. Merkle-Damgård構造37 内部 状態𝐼𝑉 … Hello, World m1 m2 m3 ① メッセージを分割 pad ② パディング付与 関 数 R 関 数 R 関 数 R 関 数 R ③ 分割したメッセージごとに処理 を繰り返して内部状態を生成 e4d7f1b4ed2e42d15898f4b27b019da4 出力 関数 ④ 内部状態からハッシュ値を出力
  38. 38. Merkle-Damgård構造  Merkle-Damgård構造を利用したハッシュ関数  MD4  MD5  SHA-1  SHA-2 family  それらをベースにした独自ハッシュ  CTF目線のMerkle-Damgård構造  レングスエクステンション攻撃が可能 38
  39. 39. ハッシュレングス エクステンション39
  40. 40. 例)MD5の場合40 内部 状態𝐼𝑉 … Hello, World m1 m2 m3 pad 関 数 R 関 数 R 関 数 R 関 数 R 出力 関数 e4d7f1b4ed2e42d15898f4b27b019da4 注目!  MD5もMerkle-Damgård構造で構成
  41. 41. MD5の出力関数41 内部 状態𝐼𝑉 … 関 数 R 関 数 R 関 数 R 関 数 R 出力 関数  MD5もMerkle-Damgård構造で構成 内部状態 A:32bit B:32bit C:32bit D:32bit 内部状態は128bit
  42. 42. MD5の出力関数  Finalize処理 42 内部状態 A:32bit B:32bit C:32bit D:32bit A:32bit B:32bit C:32bit D:32bit 内部状態をそのまま出力 出力 関数 ハッシュ値
  43. 43. MD5の内部状態復元  ハッシュ値があれば 43 e4d7f1b4ed2e42d15898f4b27b019da4
  44. 44. MD5の内部状態復元  ハッシュ値があれば 44 A:32bit B:32bit C:32bit D:32bit e4d7f1b4ed2e42d15898f4b27b019da4 32bitごとに分割
  45. 45. MD5の内部状態復元  ハッシュ値があれば 45 内部状態 A:32bit B:32bit C:32bit D:32bit A:32bit B:32bit C:32bit D:32bit 内部状態を復元可能 e4d7f1b4ed2e42d15898f4b27b019da4 32bitごとに分割
  46. 46. レングスエクステンション46 内部 状態𝐼𝑉 ??????????? m1 pad 関 数 F 関 数 F e4d7f1b4ed2e42d15898f4b27b019da4 ハッシュ値から内部状態を復元 … 手に入る! 分からない…
  47. 47. レングスエクステンション47 内部 状態𝐼𝑉 ??????????? m1 pad 関 数 F 関 数 F e4d7f1b4ed2e42d15898f4b27b019da4 ハッシュ値から内部状態を復元 … 分からない… 関 数 R m’1 関 数 R m’2 メッセージを付加することが可能 NEW 内部 状態 893e3aa5b11ca4a0722deeacf66901bb
  48. 48. レングスエクステンション48 内部 状態𝐼𝑉 ??????????? m1 pad 関 数 F 関 数 F e4d7f1b4ed2e42d15898f4b27b019da4 ハッシュ値から内部状態を復元 … 分からない… 関 数 R m’1 関 数 R m’2 メッセージを付加することが可能 NEW 内部 状態 893e3aa5b11ca4a0722deeacf66901bb 元の文字列(不明)に m’1, m’2を付与したハッシュ値
  49. 49.  元のメッセージ(+padding)値に、任意のメッセージを付与し たハッシュ値を導出可能 49 𝑚𝑑5𝑠𝑢𝑚(hello) = e4d7f1b4ed2e42d15898f4b27b019da4 たとえXが分からなくても X レングスエクステンション
  50. 50.  元のメッセージ(+padding)値に、任意のメッセージを付与し たハッシュ値を導出可能 50 𝑚𝑑5𝑠𝑢𝑚(hello) = e4d7f1b4ed2e42d15898f4b27b019da4 𝑚𝑑5𝑠𝑢𝑚( + + )=893e3aa5b11ca4a0722deeacf66901bb たとえXが分からなくても X+pad+任意のメッセージのハッシュ値は導出できる X X レングスエクステンション pad 任意のM
  51. 51. 今回のハッシュ関数(hashme)51
  52. 52. 今回のハッシュ関数(hashme)52 Merkle-Damgårdっぽい 出力部分は?
  53. 53. hashmeの出力関数  Finalize処理 53 内部状態 A:32bit B:32bit C:32bit D:32bit A:32bitB:32bit C:32bitD:32bit MD5と違って、 内部状態を順番変えて出力してる!! e4d7f1b4ed2e42d15898f4b27b019da4
  54. 54. hashmeの出力関数  Finalize処理 54 内部状態 A:32bit B:32bit C:32bit D:32bit A:32bitB:32bit C:32bitD:32bit MD5と違って、 内部状態を順番変えて出力してる!! e4d7f1b4ed2e42d15898f4b27b019da4 問題なくハッシュ値から 内部状態を復元可能 レングスエクステンションが可能
  55. 55. hashmeの認証関数  parse_qs  ユーザの入力を辞書に変換する関数  parse_qsで作成した辞書のキー’role’の要素が’administrator’なら FLAGゲット → どのようにユーザの入力を辞書に変換している? 55
  56. 56. parse_qs56 /usr/lib/python2.7/urlparse.py キーが重複している場合、 両方の要素が辞書に登録
  57. 57. flagの取り方を考える  通常サーバは次のハッシュ値を生成  hashme(SALT+user=‘’&role=anonymous) 57 {role:anonymous}のみ登録
  58. 58. flagの取り方を考える  通常サーバは次のハッシュ値を生成  hashme(SALT+user=‘’&role=anonymous)  上記ハッシュ値を元にレングスエクステンションを実施し て、&role=administratorを付与すると、次のハッシュ値が手 に入るはず  hashme(SALT+user=‘’&role=anonymous+pad+&role=administrator) 58 {role:anonymous+pad}と {role:administrator}が共に登録 {role:anonymous}のみ登録
  59. 59. hashmeの認証関数  parse_qs  ユーザの入力を辞書に変換する関数  parse_qsで作成した辞書のキー’role’の要素が’administrator’なら FLAGゲット → どのようにユーザの入力を辞書に変換している? 59 If ‘administrator’ in data[‘role’] → FLAG獲得!
  60. 60. 方針  レングスエクステンションでrole=‘administrator’を付与して やればよい  しかしこの問題はあと2つハードルがある  直接ハッシュ値が手に入らない  サーバだけが知ってる鍵でXoR  若干MD5と異なるハッシュ関数が採用  既存のツールがそのまま使えない  方針  1. サーバにて鍵でXoRしたハッシュ値を発行  2. 鍵を導出し、ハッシュ値を手に入れる  3. レングスエクステンションで権限付与  4. 2で導出した鍵で権限を付与したハッシュ値をXoR 60 どうやって 鍵を導出する? 少しMD5と仕様 が違う?
  61. 61. 実習  とりあえずやってみましょう  Writeupを同梱しているので分からない人は参考に  解けた人は本資料の最後のおまけをやってみてください  Plaid CTF 2014 – Parlor  nc katagaitai.orz.hm 4321 (or 14321, 24321, 34321)  質問、要望、音楽のリクエストなど→ #katagaitaiCTF 40分61
  62. 62. 解答  方針  1. サーバにて鍵でXoRしたハッシュ値を発行  2. 鍵を導出し、ハッシュ値を手に入れる  3. ハッシュレングスエクステンションで権限付与  4. 2で導出した鍵で権限を付与したハッシュ値をXoR 62 鍵の導出パート ハッシュレングス エクステンション パート
  63. 63. 解答(鍵の導出)  方針  1. サーバにて鍵でXoRしたハッシュ値を発行  2. 鍵を導出し、ハッシュ値を手に入れる 63 ハッシュ値の形式は? KEY KEY KEY KEY KEY auth_str hashme(SALT+auth_str) auth_strは自分で 入力した値 鍵は繰り返し利用
  64. 64. 解答(鍵の導出)  方針  1. サーバにて鍵でXoRしたハッシュ値を発行  2. 鍵を導出し、ハッシュ値を手に入れる 64 ハッシュ値の形式は? KEY KEY KEY KEY KEY auth_str hashme(SALT+auth_str) auth_strは自分で 入力した値 auth_str 鍵は繰り返し利用 KEY KEY Auth_strをXoRすれば鍵が手に入る
  65. 65. 解答(鍵の導出)  方針  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. 66. 解答(鍵の導出)66 solve_key.py Auth_strをXoRして鍵を導出 実行結果
  67. 67. 解答(ハッシュレングスエクステンション)  hashme関数 67
  68. 68. 解答(ハッシュレングスエクステンション)  hashme関数 68 hashmeの処理に使われるiの値がSALTに依存 → SALTは手に入れることができない → hashmeの処理を実行できない → レングスエクステンションできない → 詰んだ
  69. 69. 解答(ハッシュレングスエクステンション)  hashme関数 69 hashmeの処理に使われるiの値がSALTに依存 → SALTは手に入れることができない → hashmeの処理を実行できない → レングスエクステンションできない → 詰んだ i & 0x1f → 32通りしかない → 全部試せばいい
  70. 70. 解答(ハッシュレングスエクステンション)70 ログインしたい ユーザを作成 証明書、鍵を入力 solver_hashme.py
  71. 71. 71 解答(ハッシュレングスエクステンション) solver_hashme.py
  72. 72. 72 解答(ハッシュレングスエクステンション) 証明書からハッシュ値 を取り出し solver_hashme.py
  73. 73. 73 解答(ハッシュレングスエクステンション) 証明書からハッシュ値 を取り出し solver_hashme.py 内部状態を再構成
  74. 74. 74 解答(ハッシュレングスエクステンション) 証明書からハッシュ値 を取り出し solver_hashme.py 内部状態を再構成 レングスエクステンションを実施して ログイン施行を32回実施
  75. 75. 75 解答(ハッシュレングスエクステンション) 実行結果 Flagゲット!
  76. 76. 解答  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. 77. おまけ(宿題)77
  78. 78. [Plaid CTF 2014] Crypto250 Parlor78
  79. 79. アクセスしてみる ① サーバにつなげてみよう $ nc katagaitai.orz.hm 4321 (14321 or 24321 or 34321) 79
  80. 80. ゲームの仕組  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で指定した値
  81. 81. ゲームの仕組  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 値を指定
  82. 82. ゲームの仕組  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した金額を 失う…
  83. 83. ゲームの還元率  勝つ確率は2^(-odds)、倍率は2^(odds)。  還元率は100%  ギャンブルとしては割がいい  が、$1000→$1,000,000,000まで増やすのはかなりの強運が必要  100万回程度アクセスすれば可能かも?  1アクセス1秒としても278時間程度必要 83
  84. 84. Hint 1 : 問題の整理  なぜこの問題が難しいのか  リモートサーバに対する100万回アクセスが困難 → ローカルで実施する場合100万回計算は短時間で可能  なぜローカルで実施できないのか  md5の入力値のprefixが手に入らないためハッシュ値が計算できない → 入力値のprefixが手に入らなくてもハッシュ値が計算できれば? 84 入力値がなくともハッシュ値を計算できる手法を利用
  85. 85. Hint 2 : ハッシュ値の出力  レングスエクステンション  レングスエクステンションには元のハッシュ値が必要  今回の問題ではハッシュ値は直接出力されない  ハッシュ値の特定  どうやればできるだけハッシュ値を出力できるか 85 md5(input) md5(input) % 2^oddsのみ出力
  86. 86. Hint 3 : ハッシュ値の特定  ハッシュ値の特定  残りの不明箇所を推測  推測した値が正しいか答え合わせする必要  サーバのハッシュ値との比較  正しい答えを知っているオラクルはサーバしかない  どうすれば、サーバと推測した値の答え合わせができる? 86 ハッシュ値の大部分を特定!不明な箇所を推測
  87. 87. Hint 3 : ハッシュ値の特定  ハッシュ値の特定  残りの不明箇所を推測  推測した値が正しいか答え合わせする必要  サーバのハッシュ値との比較  正しい答えを知っているオラクルはサーバしかない  どうすれば、サーバと推測した値の答え合わせができる? 87 ハッシュ値の大部分を特定!不明な箇所を推測 Let’s Try!
  88. 88. [ebCTF 2013] bin400 – md5colliding88
  89. 89. md5collidingを見てみよう89
  90. 90. 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
  91. 91. 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つ作成してください
  92. 92. 注意点  bin400用のサーバは用意してません  プロのexeこわい  作成したファイルは以下を確認してください  ① 実行結果  指定の出力となっていること  ② md5結果  同じmd5ハッシュ値を出力すること  ③ sha1結果  異なるsha1ハッシュ値を出力すること 92 今回の勉強会ではサーバを用意していないため、 作成した5つのファイルの確認を上記手順で行ってください
  93. 93. MD593
  94. 94. MD5の構造94  Merkle-Damgård構造  SHA-1, SHA-2も同様の構造 内部 状態𝐼𝑉 … Hello, World m1 m2 m3 pad 処 理 R 処 理 R 処 理 R 処 理 R 出力 関数 e4d7f1b4ed2e42d15898f4b27b019da4
  95. 95. MD5の構造95  Merkle-Damgård構造  SHA-1, SHA-2も同様の構造 内部 状態𝐼𝑉 … Hello, World m1 m2 m3 pad 処 理 R 処 理 R 処 理 R 処 理 R 出力 関数 e4d7f1b4ed2e42d15898f4b27b019da4 注目!
  96. 96. MD5のラウンド処理96  メッセージを512bit(32bit*16)ごとに切り分け  512bitのブロックに対して64回処理を実施する 関数Fの処理は変化しますが、 複雑になるため省略します
  97. 97. MD5のラウンド処理97 𝐼𝑉 128bit(固定値) A B C D 32bit*4に分割 代入 m1
  98. 98. MD5のラウンド処理98 𝐼𝑉 A B C D m1[0] 512bitメッセージをさらに16個に分割 m1[15]m1[1] … ① F関数を通す ② 分割メッセージを足す ③ 固定値Kを足す ④ ローテーションシフト
  99. 99. MD5のラウンド処理99 𝐼𝑉 A B C D m1[15]m1[1] … m1[0]の出力を入力とし、 m1[1]を用いて同様の処理を 実施
  100. 100. MD5のラウンド処理100 … 2巡目に突入! m1[0] m1[15]m1[1] … 入力メッセージは1巡目と同じ 2巡目はF関数の処理が変更!
  101. 101. 101 … … … …
  102. 102. 102 … … … … 512bitのメッセージブロックに対し 16回の処理を4巡実施 最後の出力をIHVと呼ぶ
  103. 103. MD5の構造103  Merkle-Damgård構造  SHA-1, SHA-2も同様の構造 𝐼𝑉 … Hello, World m1 m2 pad 処 理 R 処 理 R 処 理 R 出力 関数 e4d7f1b4ed2e42d15898f4b27b019da4 1回の処理Rの説明 𝐼𝐻𝑉 注目!
  104. 104. MD5のラウンド処理104 𝐼𝐻𝑉 A B C D m2[15]m2[1] … … 2回目のラウンド処理からは IVではなくIHVが入力
  105. 105. 105 … … … … 同様に16回の処理を4巡実施
  106. 106. MD5の構造106  Merkle-Damgård構造  SHA-1, SHA-2も同様の構造 𝐼𝑉 … Hello, World m1 m2 pad 処 理 R 処 理 R 処 理 R 出力 関数 e4d7f1b4ed2e42d15898f4b27b019da4 𝐼𝐻𝑉 𝐼𝐻𝑉 padまで繰り返した IHVを出力
  107. 107. 伝えたかったこと  複雑な処理を暗記してほしいわけではなく  伝えたかったこと1  これ正攻法で解析は無理だな、という感覚 107
  108. 108. 伝えたかったこと  複雑な処理を暗記してほしいわけではなく  伝えたかったこと1  これ正攻法で解析は無理だな、という感覚  伝えたかった事2  #3#4の参加者の人たちはこう思うはず。  あれ?ハッシュ関数ってブロック暗号に似てない? 108 FEAL-4
  109. 109. MD5の衝突109
  110. 110. Wangの衝突攻撃110  2004年 WangらによりMD5の衝突攻撃が報告  Crypto2004(暗号のトップカンファレンス)  正式な発表でなくランプセッションで発表  事前のePrintでみんな興味深々  一気に世界的なニュースに 無名の女性研究者が 一晩で世界を変えた! 色んな裏話もあるらしい Slashdot.も白熱 Schneier神も白熱
  111. 111. MD5の衝突とは111 𝐼𝑉 m0 ℎ(𝑚) ℎ(𝑚′) 処 理 R 𝐼𝐻𝑉 処 理 R 𝐼𝐻𝑉 処 理 R 𝐼𝑉 m’0 m’1 m’2 処 理 R 𝐼𝐻𝑉 処 理 R 𝐼𝐻𝑉 処 理 R m1 m2 mとm’という2つの 異なるメッセージを入力 h(m)とh(m’)が 同じ値を出力
  112. 112. 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 と場合、衝突
  113. 113. 差分解析(#3#4でやったやつ)  入力情報ペアに差分を与えて、 出力ペアの差分を観測  [参考]FEALの差分解析  1.ラウンドごとの入出力差分解析  2.1を元に全体の入出力差分解析  この考え方をMD5に適用!  MD5の差分パスを見つけるなんてCTFでは出ない  研究レベルの難問  衝突探索の考え方だけ説明 113
  114. 114. 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’
  115. 115. 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を発生させる
  116. 116. 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’が 同じ値となる
  117. 117. 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’)は 衝突
  118. 118. 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
  119. 119. 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 自分で「差分パス」を発見するのは難しい → 先人の知恵に頼る
  120. 120. 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
  121. 121. FastCollをやってみた121 2つのバイナリを 出力 同一のMD5出力 異なるSHA1出力 超簡単にMD5の衝突メッセージをGET
  122. 122. FastCollをやってみた122 1024bit(512bit*2) を末尾に付加して、MD5の 値を衝突させている 元ファイル FastColl
  123. 123. Chosen Prefix Collision  MD5の衝突攻撃:あるメッセージと衝突するメッセージを 探索  Chosen Prefix Collison:任意の2つのメッセージを衝突させら れる接尾メッセージを探索  異なる12個の任意のPDFのハッシュ値を衝突  PS3を用いて2日間で実施 123 Hello, World! Goodbye, World! a3hae,3x esd7dh0s+ + ekah397hal.. suffixを探索!
  124. 124. Hash Crash  Chosen Prefix Collision 用のツール  CUDA環境が必要  下記URLで公開  https://marc-stevens.nl/p/hashclash/ 124
  125. 125. [再掲]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. 126. 方針126  方針1:Chosen Prefix Attackを利用  ① 5つのPE32バイナリを作成  ② それぞれにChosen Prefix Attackを利用しハッシュ値をそろえる  時間がかかる。CTF期間中にできる?  方針2:FastCollを利用  ① 5つの出力をする1つのバイナリを作成  ② FastCollを利用し衝突するメッセージを導出  ③ 衝突メッセージを5つに増やす 5つの出力? 衝突メッセージ を増やす?
  127. 127. 実習  とりあえずやってみましょう  (さっきと同じ)解けた人はおまけをやってみてください  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
  128. 128. 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
  129. 129. 解答(FastColl)129  ① 5つの出力をする1つのバイナリを作成  ② FastCollを利用し衝突するメッセージを導出  ③ 衝突メッセージを5つに増やす
  130. 130. 解答(5つの出力)130
  131. 131. 解答(5つの出力)  ハッシュに関係ないパラメータ(ファイル名など)で出力 を変更するコードを生成  例)自身のファイル名で出力を変更  同じバイナリでもファイル名が変わると出力が変わる 131
  132. 132. 解答(5つの出力)  ファイル名を変更して実行すると出力が変わる  もちろん現状では同じMD5、SHA1を出力する 132
  133. 133. 解答(衝突ペアの生成)  FastCollを利用し衝突ペアを生成  MD5で衝突を起こし、SHA1ペアは異なるメッセージペア 133 2つのバイナリを 出力 同一のMD5出力 異なるSHA1出力
  134. 134. 解答(衝突ペアの生成)  衝突ペアのファイル名をそれぞれ変更し実行  元データと同様の出力  PE32形式は末尾に不要データが付与されても無視 134 条件を満たす2つのメッセージを手に入れた
  135. 135. 解答(衝突ペアの増加)  FASTCOLLによりm2, m’2が付与されたと仮定  下記メッセージが衝突  md5[m1 m2]  md5[m1 m’2] 135 m1 R m2 R m’2 R
  136. 136. 解答(衝突ペアの増加)  さらに[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
  137. 137. 解答(衝突ペアの増加)  さらに[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
  138. 138. 解答(衝突ペアの増加)  さらに[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. 139. 解答(衝突ペアの増加)139  1_msg1.exe = 1.exe+m2  1_msg2.exe = 1.exe+m’2 1.exe R m2 R m’2 R
  140. 140. 解答(衝突ペアの増加)  1_msg1.exeからさらに衝突ペアを導出 140
  141. 141. 解答(衝突ペアの増加)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
  142. 142. 解答(衝突ペアの増加)  付与されたデータ部分を抽出  data1 = m3  data2 = m’3  それぞれ1_msg2.exeに連結する 142
  143. 143. 解答(衝突ペアの増加)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
  144. 144. 解答(衝突ペアの増加)  下記の特性を持つ4つのメッセージを導出  MD5ハッシュはすべて衝突  SHA1ハッシュはすべて異なる 144 メッセージを5個まで増やして、 それぞれのファイル名を変更すればOK
  145. 145. 参考文献  [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
  146. 146. Writeups & Implressions146
  147. 147. 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. 148. 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. 149. 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

×