MasaのITC Life

夢は起業家!全てにおいて凡人だけど頑張ることだけはいっちょ前!

プログラミング

CのRawSocketでARPスプーフィングしてみた!

投稿日:2019年7月24日 更新日:

今回はARPスプーフィングをC言語で実際に体感してみたいと思います。

VirtualBoxを用いて、ホストOS一台とゲストOS二台で行いました。 対象AはホストOSなので、MACアドレスは伏せました。盗聴者と対象BはゲストOSで、UbuntuとKali Linuxで実験しました。

ARPスプーフィングとは


簡単に言うと対象者のARPテーブルを書き換えることです。スプーフィングは英語のspoofのことで、"だます"という意味です。なので、ARPテーブルを書き換えて、対象をだますしてパケットを盗み見たり、妨害したりすることです。

例えば対象Aと対象Bが通信しているとします。これはPCでもよいですし、ルータのようなネットワーク機器をイメージすると分かりやすいかと思います。ARPスプーフィングを行う前は、赤色の経路をパケットが通過します。


しかしここで盗聴者が登場するとします。本来は関係のない盗聴者がARPスプーフィングを行い、対象Aと対象BのARPテーブルを書き換えることで、青色のような経路で通信させます。 なおARPテーブルの書き換えは、ARPリプライを使います。




青色に経路に変更することが出来るのは、最終的な目的地はIPアドレスで決まるのに対し、個々の通信はMACアドレスによって決まる仕組みを利用しているからです。例えば対象BのIPアドレスになりすまして盗聴者は、「 私のIPとMACアドレスは、〇〇〇ですよ!」と、対象BのIPアドレスと 自分のMACアドレスを対象Aに伝えます(ARPリプライ)。



こうすると、対象Aは「対象Bと通信するには、08:00:27:83:cb:b8(盗聴者)に送信すれば良いんだな」とアドレス解決(ARP)し、送信先を勘違いします。



その結果、対象Aは対象Bにパケットを送信していたつもりが、盗聴者に送っていたことになります。このとき盗聴者は対象Aから送られてきたパケットを対象Bに流すことで、あたかも対象Aと対象Bが直接やり取りしているかのように見せかけれます。




片方だけ書き換えた場合は、対象AB間の書き換えた側が送信したパケットしか見えません。なので対象AB間の通信(ex.アップリンク・ダウンリンク)を全て見るには、両方とも書き換える必要があります。


今回はCのRaw Socketを使って、実感してみます!

ライブラリのインクルード、マクロの定義、プロトタイプ宣言です。あとはarpパケットを構造体として定義します。


ARPパケットを作る関数です。ARPリクエストとARPリプライを送信するので、ARPパケットを作るという機能を関数化してあります。spoofed_ipが対象Bで、target_ipが対象Aです。仮引数にMACアドレスとIPアドレスを指定して、関数内でARPパケットのフォーマットに従ってパケットを完成させます。出来たARPパケットは戻り値として、作ったARPパケットのポインタを返します。

ARPリクエストをブロードキャストする関数です。この関数内で先ほどのARPパケットを作るための関数を呼び出して、ARPリクエストを作ります。作ったら、sendtoでブロードキャストします。ちなみにwriteでは思う通りにプログラムが動作しませんでした。

ARPリクエストを受信した対象はMACアドレスを入れて、盗聴者へ返信します。


対象からARPリプライが返ってきたら、そこに対象のMACアドレスが入っているので、それをこの関数の戻り値として返します。また対象からのARPリプライ以外のパケットは、不要なので無視します。


対象のMACアドレスを取得したら、素材が揃いました。

自分のMACアドレス・対象BのIPアドレス・対象AのMACアドレス・対象AのIPアドレスを入れて、対象Aに向けてARPリプライをユニキャストします。そうすると対象AのARPテーブルは書き換わります。


継続的に送信していないと、正しいARPリプライを対象Bから貰い、正しいARPテーブルに戻ってしまいます。


自分のMACアドレスを取得するための関数です。ioctlでSIOCGIFHWADDRを指定して取得します。


main関数です。実行時に対象AとBのIPアドレスそして、インタフェース名を指定して実行させます。


ARPスプーフィングを実際にやってみる


実行結果はこんな感じでARPテーブルが書き換わります。


対象AのARPテーブルです。盗聴者によって、対象Aが持つ対象B (192.168.198.5) のエントリー書き換えます。

実行後のARPテーブルです。対象B(192.168.198.5)のエントリーが盗聴者のMACアドレスに書き換わりました。

プログラム実行中の画面です。

今回は対象Aが持つ対象Bのエントリーを書き換えただけで終わりました。対象Aから送られてたパケットを盗聴者が、対象Bに流すコードも追記すれば、より本格的なものになります。



以上、ARPスプーフィングの体験でした。
最後まで読んでいただきありがとうございます。



参考:
https://github.com/SRJanel/arp_poisoning

-プログラミング

Copyright© MasaのITC Life , 2023 All Rights Reserved Powered by STINGER.