@@ -87,7 +87,7 @@ func (at *ARPTable) Delete(ip netip.Addr) {
8787func (at * ARPTable ) Refresh () error {
8888 at .Lock ()
8989 defer at .Unlock ()
90- cmd := exec .Command ("sh" , "-c" , "ip -br neigh" )
90+ cmd := exec .Command ("sh" , "-c" , "ip -4 - br neigh" )
9191 out , err := cmd .Output ()
9292 if err != nil {
9393 return err
@@ -175,7 +175,7 @@ func NewARPSpoofer(conf *ARPSpoofConfig) (*ARPSpoofer, error) {
175175 arpspoofer .gwIP = gwIP
176176 }
177177 if gwMAC , ok := arpspoofer .arpTable .Get (arpspoofer .gwIP ); ! ok {
178- probeIP (arpspoofer .gwIP )
178+ doPing (arpspoofer .gwIP )
179179 time .Sleep (probeThrottling )
180180 err = arpspoofer .arpTable .Refresh ()
181181 if err != nil {
@@ -294,8 +294,7 @@ func (ar *ARPSpoofer) Stop() error {
294294 return err
295295}
296296
297- func doProbe (ip netip.Addr ) error {
298- // TODO: add manual packet crafting
297+ func doPing (ip netip.Addr ) error {
299298 ping := exec .Command ("sh" , "-c" , fmt .Sprintf ("ping -c1 -t1 -w1 %s" , ip ))
300299 if err := ping .Start (); err != nil {
301300 return err
@@ -306,8 +305,14 @@ func doProbe(ip netip.Addr) error {
306305 return nil
307306}
308307
309- func probeIP (ip netip.Addr ) error {
310- return doProbe (ip )
308+ func (ar * ARPSpoofer ) doProbe (ip netip.Addr ) error {
309+ // TODO: add parsing ARP replies
310+ ap , err := ar .newARPRequest (ar .hostMAC , ar .hostIP , ip )
311+ if err != nil {
312+ return err
313+ }
314+ ar .packets <- ap
315+ return nil
311316}
312317
313318func (ar * ARPSpoofer ) probeTargetsOnce () {
@@ -316,7 +321,7 @@ func (ar *ARPSpoofer) probeTargetsOnce() {
316321 wg .Add (1 )
317322 go func (ip netip.Addr ) {
318323 defer wg .Done ()
319- doProbe (ip )
324+ doPing (ip )
320325 }(ip )
321326 time .Sleep (probeThrottling )
322327 }
@@ -338,7 +343,7 @@ func (ar *ARPSpoofer) probeTargets() {
338343 wg .Add (1 )
339344 go func (ip netip.Addr ) {
340345 defer wg .Done ()
341- doProbe (ip )
346+ doPing (ip )
342347 }(ip )
343348 time .Sleep (probeThrottling )
344349 }
@@ -390,6 +395,20 @@ func (ar *ARPSpoofer) newARPReply(srcMAC, dstMAC net.HardwareAddr, srcIP, dstIP
390395 return & Packet {addr : dstMAC , data : eth .ToBytes ()}, nil
391396}
392397
398+ func (ar * ARPSpoofer ) newARPRequest (srcMAC net.HardwareAddr , srcIP , dstIP netip.Addr ) (* Packet , error ) {
399+ arp , err := layers .NewARPPacket (layers .OperationRequest , srcMAC , srcIP , network .LoopbackMAC , dstIP )
400+ if err != nil {
401+ ar .logger .Debug ().Msg (err .Error ())
402+ return nil , err
403+ }
404+ eth , err := layers .NewEthernetFrame (network .BroadcastMAC , srcMAC , layers .EtherTypeARP , arp .ToBytes ())
405+ if err != nil {
406+ ar .logger .Debug ().Msg (err .Error ())
407+ return nil , err
408+ }
409+ return & Packet {addr : network .BroadcastMAC , data : eth .ToBytes ()}, nil
410+ }
411+
393412func (ar * ARPSpoofer ) spoofTargets () {
394413 for _ , targetIP := range ar .targets {
395414 if targetMAC , ok := ar .arpTable .Get (targetIP ); ! ok {
0 commit comments