Kali Linux2022.1 でハッキングラボをつくってみる8 Wiresharkでパケットキャプチャ１

# はじめに
「ハッキング・ラボのつくりかた」を参考に、同書の内容がKaliLinux2022.1でも有効なのか試行錯誤している記事です。今回からは、Wiresharkでのパケットキャプチャ・分析を行ってきたいと思います。この記事は、同書のp.422-435に対応しています。

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::
# プロミスキャスモード
他のホストのパケットをキャプチャするには、LANアダプタをプロミスキャス・モードにする。
メニューバーの「キャプチャ」>「オプション」へとすすみ、インターフェースの一覧からプロミスキャス・モードが適用されているか、確認できる。
モードを適用したいネットワークインターフェースにチャックマークを入れることで、プロミスキャス・モードを適用する。
![VirtualBox_kali-linux-2022プロミスキャス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/dc47eb2d-9bc9-6fd7-16b1-b7bf57a214c6.png)

# 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の表示フィルタ](https://wiki.wireshark.org/DisplayFilters)から引用すると、次のようなフィルタの構文がよく使用される。

| フィルタの構文 | 説明 |
| :--: | :--: |
| ip.addr == 10.0.0.1<br>または<br>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<br>または<br>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<br>または<br>http \|\| dns | HTTPまたはDNSを表示する |
| tcp.port == 80 | ポート80(TCP)のパケットを表示する |
| tcp.srcport == 80 | 送信元ポートが80のパケットを表示する |
| tcp.dstport == 80 | 宛先ポートが80のパケットを表示する |
| tcp.port < 1024<br>あるいは<br>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のキャプチャフィルタ](https://wiki.wireshark.org/CaptureFilters)から引用。
| フィルタの構文 | 説明 |
| :--: | :--: |
| host 192.168.1.10 | (送信元や宛先の)IPアドレスが192.168.1.10のパケットをキャプチャする。 |
| ip src host 10.0.0.2 | 送信元IPアドレスが10.0.0.2のパケットだけをキャプチャする。 | port 53 | 53番ポートの通信をキャプチャする |
| 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よりも高機能だが、サポートしているソフトウェアが少ない。
テキストエディタで処理した場合は、テキスト形式でエクスポートすることもできる。
メニューの「ファイル」＞「エキスパートパケット解析」＞「プレインテキストとして」をクリックする。

# ストリームを表示
巨大なデータの送受信の際には、セッション内で何が起きたのかを把握するには、１つ１つのパケットを見るより。全体の流れを見たほうが良い。
メニューの「分析」＞「追跡」に「TCPストリーム」「UDPストリーム」「TLSストリーム」といった項目がある。これらを選択する。
これで、データ内にテキストがあれば、読み取れる。

# おわりに
参考にしたもの
「ハッキング・ラボのつくりかた」(IPUSIRON著)

https://e-words.jp/w/SSDP.html

https://wiki.wireshark.org/DisplayFilters

https://www.wireshark.org/docs/wsug_html_chunked/ChWorkBuildDisplayFilterSection.html

https://wiki.wireshark.org/CaptureFilters