コンテンツにスキップ

応答とデバッグ

応答の見方と、リクエストが期待通りかを確認する方法です。

res = send_request_cgi(...)
fail_with(Failure::Unreachable, "#{peer} - no response") if res.nil?
fail_with(Failure::UnexpectedReply, "HTTP #{res.code}") unless res.code == 200
print_status(res.headers['Server'].to_s)
print_line(res.body[0, 200])
cookies = res.get_cookies
loc = res.redirection if res.redirect?
json = res.get_json_document
html = res.get_html_document
xml = res.get_xml_document
inputs = res.get_hidden_inputs
メソッド戻り値
get_json_documentJSON をパースした値。構文エラー時は空の Hash
get_html_documentNokogiri の HTML ドキュメント
get_xml_documentNokogiri の XML ドキュメント
get_hidden_inputsフォームごとの hidden フィールドを収めた Array<Hash>
get_cookiesSet-Cookie から作成した Cookie 文字列
redirectionLocation ヘッダの URI。取得できない場合は nil
title = res.get_html_document.at('title')&.text
token = res.get_html_document.at_xpath("//input[@name='csrf_token']/@value")&.text
session_id = res.get_hidden_inputs.dig(0, 'sessionid')

execute_command の成否は、その API が実際に返す応答に合わせます。

実際の応答扱いの例
コマンド実行中にリクエストがタイムアウトする非同期実行を確認できる場合に限り、res.nil? を成功として扱う
HTTP 200 と JSON({"result": ...} など)res.code == 200 と get_json_document を確認する
HTTP 500 の HTML エラーページステータスコードとタイトル・本文を確認する
res = send_request_cgi(...)
fail_with(Failure::Unreachable, "#{peer} - no response") if res.nil?
json = res.get_json_document
fail_with(Failure::UnexpectedReply, "HTTP #{res.code}") unless res.code == 200 && json.is_a?(Hash) && json.key?('result')

get_json_document は JSON の構文エラー時に空の Hash を返すため、期待するキーまで確認します。この例では HTTP 200 と result キーを成功条件にしています。

send_request_cgi({ ... }, datastore['HttpClientTimeout'] || 30)

遅い upload やログインではモジュール側の advanced オプション HttpClientTimeout を延ばします。

set HttpTrace true
set HttpTraceHeadersOnly false
set VERBOSE true
run

生の送受信が見えます。資格情報が log / spool に残る点に注意します。

通常の検証環境では不要ですが、HttpClient には次のような evasion オプションがあります。

  • HTTP::uri_encode_mode
  • HTTP::pad_get_params / HTTP::pad_post_params
  • HTTP::shuffle_get_params / HTTP::shuffle_post_params
  • HTTP::header_folding
  • HTTP::method_random_case

show evasion / show advanced で確認します。

  • 応答処理と fail_with
  • URI ヘルパー
  • 同梱 wiki: docs/metasploit-framework.wiki/How-to-Send-an-HTTP-Request-Using-HttpClient.md
  • 同梱 wiki: docs/metasploit-framework.wiki/How-to-parse-an-HTTP-response.md