Slide 1

Slide 1 text

2019-09-18 OWASP Night SSRF基礎 OWASP Kansai ボードメンバー はせがわようすけ

Slide 2

Slide 2 text

長谷川陽介 (はせがわようすけ) (株)セキュアスカイ・テクノロジー 取締役CTO [email protected] http://utf-8/jp/ 千葉大学 非常勤講師 OWASP Kansai ボードメンバー OWASP Japan ボードメンバー CODE BLUEカンファレンス レビューボードメンバー

Slide 3

Slide 3 text

OWASP Night / 2019-09-18 #owaspjapan t OWASP Kansai Chapter 自分たちの直面するWebセキュリティの問題を 自分たちの手で解決したい! 日本で2番目の OWASP Local Chapter 2014年3月から 京都・大阪・神戸・奈良 で Local Chapter Meeting (勉強会) を開催 Webセキュリティの悩み事を気楽に相談し情報共有できる場  スキル、役職、業種、国籍、性別、年齢に関係なし

Slide 4

Slide 4 text

OWASP Night / 2019-09-18 #owaspjapan t SSRFって? 10分でわかるSSRF

Slide 5

Slide 5 text

OWASP Night / 2019-09-18 #owaspjapan t SSRFって? サーバーから他のサーバーへリクエストを発行するときに、リクエス ト先を攻撃者が指定することができる脆弱性  内部ネットワーク上のサーバーへ間接的にアクセス可能になる example.jp 内部ネットワーク上のホスト intra.example.jp 攻撃者 http://example.jp/post?url= http://intra.example.com/news http://intra.example.com/

Slide 6

Slide 6 text

OWASP Night / 2019-09-18 #owaspjapan t SSRFって? (例) example.jp example.com example.comニュース 今日のニュースは○△□です。 example.comニュース 今日のニュースは○△□です。 おもしろいニュース見つけたよ! http://example.com/news 正規の処理 - メッセージ内でURLが指定されるとサムネイルを表示する http://example.jp/post? text = おもしろいニュース見つけたよ! & url=http://example.com/news http://example.com/news

Slide 7

Slide 7 text

OWASP Night / 2019-09-18 #owaspjapan t SSRFって? (例) example.jp intra.example.jp [社外秘] 組織変更のお知らせ [社外秘] 組織変更のお知らせ 攻撃 - 内部ネットワーク内の情報が外部から取得される http://example.jp/post? url=http://intra.example.jp/ http://intra.example.jp/

Slide 8

Slide 8 text

OWASP Night / 2019-09-18 #owaspjapan t クラウドのメタデータ漏えいが特に狙われる 各クラウドサービスはインスタンス上からHTTP GETでメタデータ が取得可能  AWS  GCP  Azure http://169.254.169.254/latest/meta-data/ http://169.254.169.254/latest/meta-data/iam/security-credentials/ロール名 http://metadata.google.internal/computeMetadata/v1/ ※リクエストヘッダーに Metadata-Flavor: Google が必要 http://169.254.169.254/metadata/ ※リクエストヘッダーに Metadata: true が必要 ※これ以外のURLもあります

Slide 9

Slide 9 text

OWASP Night / 2019-09-18 #owaspjapan t SSRF対策 接続可能なURLをアプリケーション内で事前に定義しておく  iptables等でOS/コンテナレベルで接続先を制限する XXEの脆弱性をなくす $target_list = array('http://example1.jp/', 'http://example2.jp/', 'http://example3.jp/'); if (isset($_GET['url']) { $url = $_GET['url']; if (in _array($url, $target_list, true)) { $c = curl_init($url); .... } } iptables -A OUTPUT -m owner ! --uid-owner root -d 169.254.169.254 -j DROP // ※ここまで固定である必要はないが、攻撃者が接続先をコントロールできないようにすることが重要

Slide 10

Slide 10 text

OWASP Night / 2019-09-18 #owaspjapan t SSRF対策 こういうコードはよくない(いわゆるブラックリスト的な対策) 簡単に回避されてしまう  http://2852039166/ とか http://0xa9fea9fe/ とか  DNS Rebindingとか  302 w/ Location: http://169.254.169.254/latest/meta-data/ とか if (isset($_GET['url']) { $url = $_GET['url']; $target = substr($url, 0, 23); if ($target !== 'http://169.254.169.254/') { // 169.254.169.254でなければ通信を許可 curl_init($url); ... } } 良くないコード例

Slide 11

Slide 11 text

OWASP Night / 2019-09-18 #owaspjapan t まとめ SSRF概要  サーバーから攻撃者が指定した他のサーバー/サービスへリクエストが飛ぶ 攻撃 SSRFの脅威  機密情報の漏えい、他のプロトコルへの攻撃、任意コード実行など  近隣でどんなサービスが動いているかに依る 対策  接続可能なURLをアプリケーション内で事前に定義しておく  iptables等でOS/コンテナレベルで接続先を制限する  URLの検証は保険的な対策にしかならない(やらないよりはマシ)

Slide 12

Slide 12 text

OWASP Night / 2019-09-18 #owaspjapan t SSRFもうちょい深追い

Slide 13

Slide 13 text

OWASP Night / 2019-09-18 #owaspjapan t HTTP以外にも注意 通信処理系によってはHTTP以外も通信可能 例えば PHP cURL関数は様々なプロトコルをサポートしている  攻撃者がurlとして file:///etc/passwd などを指定可能 URL Fetch HTTP http:// file:// scp:// smtp:// ldap:// gopher:// $url = $_GET['url']; $c = curl_init($url); curl_exec($c); 良くないコード例(PHP)

Slide 14

Slide 14 text

OWASP Night / 2019-09-18 #owaspjapan t PHPのcURL関数 CURLOPT_PROTOCOLS Bitmask of CURLPROTO_* values. If used, this bitmask limits what protocols libcurl may use in the transfer. This allows you to have a libcurl built to support a wide range of protocols but still limit specific transfers to only be allowed to use a subset of them. By default libcurl will accept all protocols it supports. See also CURLOPT_REDIR_PROTOCOLS. Valid protocol options are: CURLPROTO_HTTP, CURLPROTO_HTTPS, CURLPROTO_FTP, CURLPROTO_FTPS, CURLPROTO_SCP, CURLPROTO_SFTP, CURLPROTO_TELNET, CURLPROTO_LDAP, CURLPROTO_LDAPS, CURLPROTO_DICT, CURLPROTO_FILE, CURLPROTO_TFTP, CURLPROTO_ALL PHP: curl_setopt Manual https://www.php.net/manual/ja/function.curl-setopt.php

Slide 15

Slide 15 text

OWASP Night / 2019-09-18 #owaspjapan t HTTP以外への攻撃 SSRFを用いて内部のHTTP以外のサーバーへも攻撃可能  file:、scp:、ftp: - ローカルフィル、ファイルサーバーへの攻撃  smtp:、pop3: - メールサーバーへの攻撃  ldap: - LDAPサーバーへの攻撃  gopher: - ??? URL Fetch HTTP http:// file:// scp:// smtp:// ldap:// gopher://

Slide 16

Slide 16 text

OWASP Night / 2019-09-18 #owaspjapan t gopher:プロトコル 改行などを含む任意文字をURLに載せて送出可能 $ nc -l 1337 Hello World from curl $ curl gopher://localhost:1337/-Hello%0aWorld%0afrom%20curl

Slide 17

Slide 17 text

OWASP Night / 2019-09-18 #owaspjapan t gopher:プロトコル 改行などを含む任意文字をURLに載せて送出可能 テキストベースの任意プロトコルのクライアントとして利用可能 $ nc -l 1337 Hello World from curl $ curl gopher://localhost:1337/-Hello%0aWorld%0afrom%20curl example.jp 内部ネットワーク上の メールサーバー mail.example.jp 攻撃者 http://example.jp/post?url= gopher://mail.example.jp:25/- MAIL%20FROM%3a%[email protected]%0a RCPT%20TO%3a%[email protected]%0a DATA%0a...%2E%0aQUIT%0a MAIL FROM: [email protected] RCPT TO: [email protected] DATA .... . QUIT 25/tcp

Slide 18

Slide 18 text

OWASP Night / 2019-09-18 #owaspjapan t SSRF with gopher gopherにより攻撃が行いやすくなる  gopherでなくてもHTTP通信ライブラリの実装で改行を送出できる場合は 同様の攻撃が可能 Redis (6379/tcp) への攻撃  場合によっては任意コード実行 SMTP/POP3等 - メールの送信、取得 任意のリクエストヘッダー付きのHTTP GET  AzureやGCPのメタデータ取得

Slide 19

Slide 19 text

OWASP Night / 2019-09-18 #owaspjapan t クラウドのメタデータ漏えいが特に狙われる 各クラウドサービスはインスタンス上からHTTP GETでメタデータ が取得可能  AWS  GCP  Azure http://169.254.169.254/latest/meta-data/ http://169.254.169.254/latest/meta-data/iam/security-credentials/ロール名 http://metadata.google.internal/computeMetadata/v1/ ※リクエストヘッダーに Metadata-Flavor: Google が必要 http://169.254.169.254/metadata/ ※リクエストヘッダーに Metadata: true が必要 ※これ以外のURLもあります

Slide 20

Slide 20 text

OWASP Night / 2019-09-18 #owaspjapan t リクエストヘッダー付きのSSRF? アプリケーションサーバーからのリクエストには特殊なリクエスト ヘッダーは付与されないはず!?  リクエストヘッダーが付いていなければSSRFは失敗する example.jp 169.254.169.254 攻撃者 http://example.jp/post?url =http://169.254.169.254/metadata/ GET /metadata/ HTTP/1.1 Host: 169.254.169.254 Metadata: true リクエストヘッダーが ついてないので失敗する

Slide 21

Slide 21 text

OWASP Night / 2019-09-18 #owaspjapan t リクエストヘッダー付きのSSRF? gopher経由で80/tcpへ送ることで任意のリクエストヘッダーを送信 することができる example.jp 169.254.169.254 攻撃者 http://example.jp/post?url= gopher://169.254.169.254:80/_GET%20... ... %0aMetadata%3a%20true GET /metadata/ HTTP/1.1 Host: 169.254.169.254 Metadata: true リクエストヘッダーが ちゃんとつく

Slide 22

Slide 22 text

OWASP Night / 2019-09-18 #owaspjapan t gopherによるSSRF プロトコルをhttp/httpsに制限すればいいのか?  HTTPで罠サイトにつなぎ302でgoopherにリダイレクトすることも可能 example.jp 169.254.169.254 攻撃者 攻撃者.jp http://example.jp/post? url=http://攻撃者.jp/ HTTP/1.1 302 Moved Location: gopher://169.254.169.254/... if (urlがHTTPなら) { urlに接続して コンテンツを取得 }

Slide 23

Slide 23 text

OWASP Night / 2019-09-18 #owaspjapan t gopherによるSSRF HTTPからgopherへのリダイレクトを受け入れるかどうかは実装に よる  curlコマンド - オプションによりgopherへもリダイレクト `curl -L http://redir-to-gopher.example.jp/`  PHP curl関数 - 設定によりgopherへもリダイレクト `curl_setopt($c, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_ALL);`  Node.js httpモジュール - gopherへのリダイレクトは不可

Slide 24

Slide 24 text

OWASP Night / 2019-09-18 #owaspjapan t まとめ SSRF概要  サーバーから攻撃者が指定した他のサーバー/サービスへリクエストが飛ぶ 攻撃 SSRFの脅威  機密情報の漏えい、他のプロトコルへの攻撃、任意コード実行など  近隣でどんなサービスが動いているかに依る 対策  接続可能なURLをアプリケーション内で事前に定義しておく  iptables等でOS/コンテナレベルで接続先を制限する  URLの検証は保険的な対策にしかならない(やらないよりはマシ)

Slide 25

Slide 25 text

OWASP Night / 2019-09-18 #owaspjapan t 質問? [email protected] @hasegawayosuke http://utf-8.jp/