はじめに
「ハッキング・ラボのつくりかた」を参考に、同書の内容がKaliLinux2022.1でも有効なのか試行錯誤している記事です。今回からは、Wiresharkでのパケットキャプチャ・分析を行ってきたいと思います。この記事は、同書のp.422-435に対応しています。
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
プロミスキャスモード
他のホストのパケットをキャプチャするには、LANアダプタをプロミスキャス・モードにする。
メニューバーの「キャプチャ」>「オプション」へとすすみ、インターフェースの一覧からプロミスキャス・モードが適用されているか、確認できる。
モードを適用したいネットワークインターフェースにチャックマークを入れることで、プロミスキャス・モードを適用する。
wiresharkの起動
wireshark
コマンドを実行。
同書では、wiresharkから「rootで起動したため一部の機能がロードできなかった」というエラーが表示されること、その解決方法が呈示されますが、kalilinux2022.1では、デフォルトでkaliユーザーでログイン・操作するため、このエラーを考慮する必要はないでしょう。
キャプチャの開始
メニューの「キャプチャ」>「オプション」(ショートカットキーCtrk + k)をクリックする。「すべてのインターフェースにおいてプロミスキャスモードを有効化します」か有効化したいインターフェースにチェックを入れて、キャプチャしたいネットワークインターフェイスを選択して開始する。
フィルタ
httpのパケット
「表示フィルタ」に"http"と入力することで、httpのパケットを抽出することが可能
。「Protocol」にOCSPが表示されることがあるが、これは公開鍵証明書の執行状態を取得するためのプロトコル。
SSDP(httpを利用するネットワーク上の機器を自動的に発見・接続するUPnP(Universal Plug and Play)で用いられる通信プロトコル)が抽出されることもある。それが必要ない場合、"http &&tcp"で除外する。
getメソッドは、"http.request.method=="GET""で指定する。
表示フィルタ
キャプチャしたパケットの中から、特定のパケットを抽出・表示してくれるフィルタ
同書p.429の表とWiresharkの表示フィルタから引用すると、次のようなフィルタの構文がよく使用される。
フィルタの構文 | 説明 |
---|---|
ip.addr == 10.0.0.1 または ip.addr eq 10.0.0.1 |
送信元あるいは宛先が10.0.0.1であるパケットを表示する。 |
ip.addr != 10.0.0.1 | 送信元あるいは宛先が10.0.0.1でないパケットを表示する |
ip.addr == 10.0.0.1 && ip.addr == 10.0.0.2 または ip.addr == 10.0.0.1 and ip.addr == 10.0.0.2 |
10.0.0.1と10.0.0.2間の通信を表示する。 |
ip.src == 10.0.0.1/24 | 送信元IPアドレスが10.0.0.1/24のパケットを表示する |
http | HTTPプロトコルを表示する。 |
http or dns または http || dns |
HTTPまたはDNSを表示する |
tcp.port == 80 | ポート80(TCP)のパケットを表示する |
tcp.srcport == 80 | 送信元ポートが80のパケットを表示する |
tcp.dstport == 80 | 宛先ポートが80のパケットを表示する |
tcp.port < 1024 あるいは tcp.port<=1023 |
ポート番号が1024(TCP)未満(well-known)のパケットを表示する |
tcp.flags.ack == 1 | ACKフラグが立っているTCPを表示する。 |
tcp.flags.rest == 1 | リセットフラグが立っているTCPを表示する。 |
http.request | HTTP要求 |
(http.request.method == "GET") || (http.request.method == "POST") | HTTP要求におけるGETメソドまたはPOSTメソッドを表示する |
tcp contains traffic | "traffic"という文字列を含むtcpパケットを表示する。ユーザーIDといった特定の文字列を含んでいるパケットを調べる際に便利 |
tcp.matches "(traffic|network)" | "traffic"あるいは"network"という文字列を含むtcpパケットを表示する。正規表現を利用するときに用いる |
not http | HTTPプロトコルを含ませない |
!(arp or icmp or dns) | ARP、ICMP、DNSのプロトコルを表示しない |
udp contains 33:27:58 | "0x33 0x27 0x58"を含むUDPを表示する |
tcp.analysis.retransmission | TCPのRetransmission(再送)を表示する。パケットロスのトラブルシューティング、ソフトウェアのパフォーマンスの調査に活用できる |
おおむね、=がeq、&&がand、||がorといった感じで、演算子どうしが等価とされる。
キャプチャフィルタ
特定のパケットのみを収集したい場合に使用するフィルタ
メニューの「キャプチャ」>「キャプチャフィルタ」をクリックして、適用したいキャプチャフィルタを選択する。
同書のp.430-431とWiresharkのキャプチャフィルタから引用。
フィルタの構文 | 説明 |
---|---|
host 192.168.1.10 | (送信元や宛先の)IPアドレスが192.168.1.10のパケットをキャプチャする。 |
ip src host 10.0.0.2 | 送信元IPアドレスが10.0.0.2のパケットだけをキャプチャする。 |
tcp dst port 80 | 宛先ポート番号が80のパケットだけをキャプチャする |
not icmp | ICMPパケット以外をキャプチャする |
ether proto \ip | EthernetフレームのタイプがIPのものをキャプチャする。"ip"はキーワードに使われているので、値(ここではフレームタイプ)として使う場合には、バックスラッシュをつける |
tcp portrange 1-1024 | tcpポート1から1023までを指定する |
not broadcast and not multicast | ブロードキャストやマルチキャストのトラフィックを除外する |
他、and,not,or,<,>,=,!=などの演算子が表示フィルタと同様に利用できる。
キャプチャしたデータの保存
基本的にpcapかpcapng形式で保存する。
pcapngはpcapよりも高機能だが、サポートしているソフトウェアが少ない。
テキストエディタで処理した場合は、テキスト形式でエクスポートすることもできる。
メニューの「ファイル」>「エキスパートパケット解析」>「プレインテキストとして」をクリックする。
ストリームを表示
巨大なデータの送受信の際には、セッション内で何が起きたのかを把握するには、1つ1つのパケットを見るより。全体の流れを見たほうが良い。
メニューの「分析」>「追跡」に「TCPストリーム」「UDPストリーム」「TLSストリーム」といった項目がある。これらを選択する。
これで、データ内にテキストがあれば、読み取れる。
おわりに
参考にしたもの
「ハッキング・ラボのつくりかた」(IPUSIRON著)