パケットキャプチャしている端末を見つけ出す

f:id:canning:20190526164621p:plain:w600

ARPプロトコルのことを調べているときに、Wiresharkなんかでパケットを盗聴している端末を見つけ出す方法があることを知ったので、実際に試してみました。

github.com

普段の動作

パソコンがインターネットを通じて通信するとき、
送信するときは
「アプリが送るデータをソケットAPIでネットワークスタックに依頼」
->「OSが適時パケットの分割とヘッダの負荷」
->「NICから物理的な信号として送出」
受信するときは
NICがブロードキャストor自分宛の通信か判断」
->「OSが受け取ったパケットを組み立て」
->「組み立て終わったデータがアプリへ」

という流れ。
(のはず…)

なので、普通の動きでは自分宛以外のパケットを認識することはできない。
でもこのNICに対して、自分宛以外でもパケットを拾うように設定することもできる。
これをプロミスキャスモードといいます。

f:id:canning:20190526164536p:plain:w450

f:id:canning:20190526165718p:plain:w450

プロミスキャスモード

Wiresharkなどのパケットキャプチャソフトはこうした設定でネットワーク上のパケットの様子を調べることができます。

f:id:canning:20190526170219p:plain:w450

でも全部を取り込んでいる、という点を突いて、キャプチャしている端末を見つけることができます。

パケットキャプチャしている端末を見つける

NICでは宛先macアドレスを見てブロードキャストor自分宛?を判断していて、
似たような判断はOSでもやっているのですが、そのチェックの粒度には差があって、
NICでは厳密にmacアドレスの最初から最後を見ますが、OSでは最初の何バイトかを見て判断しています。

f:id:canning:20190526171930p:plain:w600

なので、このチェック粒度の差とプロミスキャスモードを組み合わせて、ARPパケットを送りつけてあげることで、キャプチャ端末を特定することができます。

どういうことかというと、ぱっと見ブロードキャストなパケットで、しかもARP要求を送ってあげると
そのパケットは無事APPの層まで到達して、ARP応答が戻ってくる、という仕組みです。

f:id:canning:20190526172858p:plain:w600

環境

パケットキャプチャ側をRaspberry Piで、
ARPパケットをVirtual BoxCent OSから送信します。

パケットの送信にはScapyというPythonのライブラリを使用いたしました。

まずキャプチャ側のNICをプロミスキャスモードにして、

f:id:canning:20190526180754p:plain:w600

ARP要求パケットを送出。

f:id:canning:20190526181048p:plain:w600

その様子をWiresharkで観察

f:id:canning:20190526181533p:plain:w600

ARPレスポンスが返ってくる。やったぜ。

参考

社内の盗聴者を見つけ出す---フリーツール「PromiScan」の使い方(中) | 日経 xTECH(クロステック)
ARPを利用してプロミスキャスモードの盗聴ホストを特定してみた - sonickun.log
盗聴者特定ツール
sniffer - How can I detect if someone is sniffing network packets on the LAN? - Information Security Stack Exchange