MAGAZINE

ルーターマガジン

Python

mitmproxyによるHTTP通信情報収集時に、リクエスト情報で対象の通信を判別する方法

2020.01.17
Pocket

こんにちは。学生アルバイトの橋本です。今回は, 以前の記事でご紹介した, mitmproxyで通信内容を自動取得する方法の発展として, request時のpostパラメータなどを用いる方法をご紹介します。

本編

mitmproxyのインストールや端末側の設定方法は以前の記事をご覧ください。

今回は, postパラメータをmitmproxyで確認してmitmdumpでそれらを取り出すために, 例としてログインページでの通信を見ていきます。これは以前のmechanize入門記事のために作成されたログインとログアウトだけを行うページです。このページをAndroid端末で開き, IDのテキストボックスにsample_id、パスワードのテキストボックスにsample_passを入力してログインボタンを押した時の通信をmitmproxyで確認すると次の画像のようになっています。 この画像の最上部にはリクエストラインが記載され, リクエスト形式(getかpostか)とリクエスト先のurlが確認できます。その下でrequestのタブを選ぶと,リクエストヘッダが表示され, User-Agentやcookieが確認できます。その下にはリクエストボディとしてpostしたパラメータが記載されています。

では、これらの情報をインラインスクリプトでmitmdumpを使って取得してみましょう。実行したコードとその結果を載せます。

get_request_params.py
#実行コマンド
#mitmdump -s get_request_params.py

def response(flow):
    if 'login' in flow.request.url:
        print('---------------------------------------------')
        print('リクエストurlは' + flow.request.url)
        print('User-Agentは' + flow.request.headers.get('User-Agent', ''))
        body = flow.request.urlencoded_form
        print(body)
        print('ログインIDは' + body.pop('id'))
        print('ログインpassは' + body.pop('pass'))
        print('---------------------------------------------')
        #レスポンスをファイルとして保存する場合
        file_contents = flow.response.content
        with open('response.txt',"wb") as f:
            f.write(file_contents)

実行結果 flowが通信そのものを扱うオブジェクトであり, flow.requestからurl, ヘッダーの情報, postしたパラメータを取得しているのがわかると思います。ここで注意が必要なのが, flow.request.urlencoded_formで取得したbodyはMultiDictという特殊なオブジェクトに格納されているのでpopメソッドで中身を文字列として取り出す必要があります。 これらのrequest情報から取得したい通信を見分けて, responseを保存することができます。

終わりに

今回はmitmproxyで実際に取得する通信を見分けるのに役立つリクエスト情報を取得しました。これを使えば, 例えば, Content-Typeを見て画像を受け取っている通信を見分けて画像を保存したり, アカウントログインが必要なページで、ログイン時のpostパラメータから特定のアカウントが行う通信だけを取得するといったことができます。 さらに詳細な使い方を知りたくなった方はmitmproxyの公式サイトを参照してください!https://mitmproxy.org/ 

Pocket

CONTACT

お問い合わせ・ご依頼はこちらから