【问题标题】:Port scanner - icmp packets端口扫描器 - icmp 数据包
【发布时间】:2017-09-14 16:00:14
【问题描述】:

我写了一个 UDP 端口扫描器。我向同一网络中的另一台设备发送了一个数据包,但这里有个小问题,为什么如果我在不同的端口上发送 10 个数据包(每个端口都关闭),wireshark 只接收一个数据包。我应该收到 10 个 ICMP 数据包,类型为: 3. 我应该对我的代码进行哪些更改才能获得这些数据包?

using PcapDotNet.Core;
using PcapDotNet.Packets;
using PcapDotNet.Packets.Ethernet;
using PcapDotNet.Packets.IpV4;
using PcapDotNet.Packets.Transport;
using System;
using System.Collections.Generic;

namespace SendingASinglePacketWithSendPacket
{
class Program
{
    static void Main(string[] args)
    {
        IList<LivePacketDevice> allDevices = LivePacketDevice.AllLocalMachine;
        PacketDevice selectedDevice = allDevices[2];


        for (int i = 1; i < 10; i++)
        {
            new Sender().SendUDPandGetStatus(selectedDevice, (ushort)i);
        }


        System.Console.ReadKey();
    }
}

class Sender
{
    public void SendUDPandGetStatus(PacketDevice selectedDevice, ushort port)
    {
        using (PacketCommunicator communicator = selectedDevice.Open(100, PacketDeviceOpenAttributes.Promiscuous, -1))
        {           
            communicator.SendPacket(BuildUdpPacket(port));
        }
    }

    private static Packet BuildUdpPacket(ushort destinationPort)
    {
        EthernetLayer ethernetLayer = new EthernetLayer
        { 
            Destination = new MacAddress("14:cc:20:2c:7e:36"),
            Source = new MacAddress("9C:4E:36:17:86:48"),

            EtherType = EthernetType.None,
        };

        IpV4Layer ipV4Layer =new IpV4Layer
        {
            Source = new IpV4Address("192.168.0.104"),
            CurrentDestination = new IpV4Address("192.168.0.105"),
            Fragmentation = IpV4Fragmentation.None,
            HeaderChecksum = null, 
            Identification = 123,
            Options = IpV4Options.None,
            Ttl = 30,
            TypeOfService = 0,
        };

        UdpLayer udpLayer = new UdpLayer
        {
            SourcePort = 4050,
            DestinationPort = destinationPort,
            Checksum = null, 
            CalculateChecksumValue = true,
        };

        PacketBuilder builder = new PacketBuilder(ethernetLayer, ipV4Layer, udpLayer);
        return builder.Build(DateTime.Now);
    }
}
}

Wireshark 结果:

如果我在行放置断点,我只会添加:

new Sender().SendUDPandGetStatus(selectedDevice, (ushort)i);

按F5键(5s间隔),得到正确结果。

【问题讨论】:

  • ICMP 是一条 ping 消息,如果您有路由循环,它将被阻止。尝试使用 from cmd.exe >PING 192.168.0.104 并查看响应。检查生存时间以指示经过了多少路由器消息。
  • 您可能是对的,但就我而言,我有两台计算机连接到同一个路由器。我检查了 tracert 命令和更高的 TTL 值 - 相同。我认为问题在于:“Linux 2.4.20 内核将无法到达的目标消息限制为每秒一条”。如果我添加“ System.Threading.Thread.Sleep(1000);”在for循环里面,问题消失了。我可以推断出 windows 上的限制与 linux 上的相同。
  • 获取 IP 地址和掩码并确保您有路由。您可能希望 ping 子网中的每个设备以查看您可以访问哪些设备。还要转到目标设备和 ping 源设备。我怀疑您有一条单向路线,而不是返回路线。
  • 传输有两个方向。问题在于收到的 ICMP 数据包。我不能超过每秒一个(所有端口都关闭的情况)。

标签: c# networking udp pcap.net


【解决方案1】:

这是我在 Nmap 文档中找到的:

Nmap 检测到速率限制并相应减慢以避免 用目标机器将使用的无用数据包淹没网络 降低。不幸的是,Linux 风格的每秒一个数据包的限制 使 65,536 端口扫描需要超过 18 小时。超速的想法 您的 UDP 扫描包括并行扫描更多主机,执行 首先快速扫描流行的端口,从后面扫描 防火墙,并使用 --host-timeout 跳过慢速主机。

Documentation

【讨论】:

  • Linux 机器不像 windows 可以有多个 IP 地址。所以你可以使用多个 IP 来欺骗 Nmap。
  • 我在几台 Windows 机器上测试过 - 效果相同,但在 linux 上一切正常。我期待相反的行为..
  • 只有一个 IP 的窗口仍然有每秒一个数据包的限制。对于多个 IP,每个 IP 地址将有一个数据包。因此,如果您有 5 个 IP 地址,则每秒将有 5 个数据包。
  • 是的,但仅使用一个 IP 地址进行了测试。
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多