0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SSRF on HostHeader Poisoning を確認するツールを作った

Posted at

はじめに

ホストヘッダを改ざんしてSSRFできるかどうかのリストが多くなってきたのでWindows Script Hostで自動化してみた。


ホストヘッダを改ざんしたSSRF

診断対象のWebサイトの手前に(ステルスを含む)WAF/LBなどのリバースプロキシがいて、そいつが任意のサーバへ転送可能である。

という状態。

  1. 診断対象にTCP/SSL接続して・・・
  2. Hostヘッダを診断対象ではないホスト名にしたHTTPリクエストを送ると・・・
  3. 診断対象とは異なる別のWebサイトへhttpリクエストメッセージが飛んでいく・・・

というような状態かどうかを調べるツール

図だとこんな感じ

想定しているネットワーク図

あまりない状態だけど、クラウドの普及に伴い気軽にLB/WAFを通信経路上に配置できるので、昔よりは少し多いような気がしないでもないような気がする。

インターネット側のホスト名(FQDN)が指定できれば、匿名プロキシだし、内部ネットワークのホスト名が指定できると、クラウド環境とかだと少し危険なSSRFという事になる。


ssrfHostPoisonCheck.vbsの設計

  1. 「【ホスト名】【/で始まるパス】」という行を入力してもらい
  2. 【ホスト名】をHostヘッダに、【/で始まるパス】をリクエストラインにしたテキストファイルを一時ファイルとして生成する(「Connection: close」ヘッダも追加して1往復後に閉じるようにする)
  3. そのテキストファイルを通信プログラム(StreamRelay.NET.exe)に食わせる
  4. サーバからの返答(HTTPレスポンスライン)を出力する
  5. 次の行に移る

という繰り返し処理

おまけ機能として、SSL2/SSL3/TLS1.0/TLS1.1/TLS1.2で接続できるかどうか、TRACE/TRACK/OPTIONS/NONAMEメソッドでの反応を調べる繰り返し処理も埋め込んでみたけど、これはおまけ機能


使い方

  1. nc.exeとかsslcatとかでも使えるとは思うけど、通信プログラムにStreamRelay.NET.exeを前提としているので、StreamRelay.NET.exeをダウンロードして、インストールする(解凍する)
  2. StreamRelay.NET.exeには、.NET FRamework4以上が必要です
  3. ssrfHostPoisonCheck.vbsをダウンロードしてインストールする(解凍する)
  4. ssrfHostPoisonCheck.vbsをテキストエディタで開き、StreamRelay.NET.exeのパスに89行目(ver1.2の場合)を書き換える
  5. コマンドラインから以下のコマンドで実行できます。
c:\> cscript.exe ssrfHostPoisonCheck.vbs
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

usage: cscript.exe ssrfHostPoisonCheck.vbs <<ListFile>> <<TargetHost/IP>> <<TargetPort>> <<Options>>
       Options
            -ssl : Enable SSL/TLS
            -VirtualHostName <<HostName>> : Set VirtualHostName
            -RoleName <<RoleName>> : Set Role-Name
            -DefaultPath <<Path>> : Set Default URL Path
            -SSLProtocolCheck : SSL/TLS Protocol Check
            -HttpMethodCheck : HTTP Method Check

                   ver1.2
                   create by active@window.goukaku.com

SSRFのリストファイルの元ネタとなるURLの一覧とか


SSRFのリストファイルの書式

  • 空行は無視
  • 行頭が「#」はコメントとみなす
  • 行単位で、「【ホスト名】【/で始まるパス】」という書式
  • 行単位で、「【/で始まるパス】」という書式の場合は、ホストヘッダには既定値が入る
  • ホストヘッダの既定値とは、スクリプトの引数で指定する(-VirtualHostNameオプション)、または接続先ホスト名に指定した値(<<TargetHost/IP>> オプション)のこと
  • 「\${DEFAULT_PATH}」と「\${ROLE_NAME}」のマクロがある(これらはスクリプトの引数で設定できる)
  • 「\${DEFAULT_PATH}」の既定値は空文字列
  • 「\${ROLE_NAME}」の既定値は「DefaultRole」

例えば・・・

SSRFのリストファイルのサンプル

list.lst
169.254.169.254/latest/user-data
169.254.169.254/latest/meta-data/
169.254.169.254:80/latest/user-data
169.254.169.254:80/latest/meta-data/
www.ntt.com/
127.0.0.1/${DEFAULT_PATH}
/-_-http://www.example.com/
c:\> cscript.exe ssrfHostPoisonCheck.vbs list.lst 192.0.2.1 443 -ssl -VirtualHostName www.example.com -DefaultPath webapp/login

一般的には・・・

  • 「-DefaultPath」には診断対象の起点となるURLのパスでよいと思う
  • 「<<TargetHost/IP>>」にはDNSで名前解決したIPアドレスを入れて・・・
  • 「-VirtualHostName」に、診断対象のホスト名を指定する
  • 大抵はSSL/TLSなので「-ssl」オプションは必須

・・・かな・・・


おまけ

  • 「-SSLProtocolCheck」は、「<<TargetHost/IP>>」に対してSSL2/SSL3/TLS1.0/TLS1.1/TLS1.2で接続できるかどうか試します
  • 「-HttpMethodCheck」は、「TRACE/TRACK/NONAME/OPTIONS」メソッドを試してみます

デバグモード

ver1.2の場合は、ssrfHostPoisonCheck.vbsの72行の「IsDebug」の値を「1」にすると、デバグモードになって、テンポラリフォルダに、送信したHTTPリクエストメッセージと、受信したHTTPレスポンスメッセージを保持したデバグファイルが生成されます。


目次へ戻る

目次というか最初の一歩

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?