使用Scapy进行网络扫描

使用Scapy进行网络扫描

在本节中,我们将创建一个简单的扫描器,扫描本地网络中的主机,并找到它们的 MAC 地址。 为了创建扫描器,我们首先需要了解地址解析协议 (ARP) 是什么以及如何使用它来创建网络扫描器。

地址解析协议 ARP 最简单的形式是一种转换工具,可以帮助我们将 IP 地址转换为 MAC 地址。 每当设备需要与同一本地网络中的设备通信时,它都需要设备的 MAC 地址。 IP 地址不用于本地通信。

假设设备 A 想要与本地网络中的设备 B 通信。 为了找到设备 B 的 MAC 地址,计算机 A 将首先查看由它维护的称为 ARP 缓存的内部列表,以查看计算机 B 的 IP 地址是否映射到其表中的物理 MAC 地址。 这也称为 ARP 表。 您可以通过键入 arp -a 命令来检查 PC 上的 ARP 表。

(base) D:\>arp -a

接口: 172.26.131.123 --- 0x10
  Internet 地址         物理地址              类型
  172.26.131.1          d4-61-xx-6b-xx-01     动态

您可以看到它列出了 IP 地址和与之关联的相应 MAC 地址。

如果本地不存在被请求设备对应的 MAC 地址,设备 A 将向整个网络发出广播请求,询问哪个设备具有相应的 IP。 在我们的例子中,它将是设备 B。那些不是设备 B 的设备将忽略此请求,而设备 B 将使用设备 B 的相应 MAC 地址给出答复。这样,设备 A 将知道 MAC 地址 设备 B。一旦两个设备相互了解,它们之间的通信就可以进行。 一旦设备 A 获得设备 B 的 MAC 地址,它将更新其 ARP 表。

现在我们了解了 ARP 的工作原理,我们可以开始使用 Scapy 创建我们自己的 ARP 扫描器,以找出这些设备的 MAC 地址。 你可能想知道为什么我们需要一个 ARP 扫描器。 好吧,知道设备的 MAC 地址可以帮助我们执行中间人攻击。;

使用 Scapy 的 ARP 扫描器

#-*- coding:utf-8 -*-
from scapy.all import Ether, ARP, srp

broadcast = "FF:FF:FF:FF:FF:FF"
ether_layer = Ether(dst = broadcast)
ip_range = "172.26.131.1/24"
arp_layer = ARP(pdst = ip_range)
packet = ether_layer / arp_layer
ans, unans = srp(packet, iface = "以太网", timeout=2)
for snd, rcv in ans:
    ip = rcv[ARP].psrc
    mac = rcv[Ether].src
    print("IP = ", ip, " MAC = ", mac)

--------------------------------------------------------
(base) D:\栏目\scapy>python 2.py
Begin emission:
Finished sending 256 packets.
.....*....*..*......................................................................*.........*...............*.........*............*...........................................................................................................................*.............................
Received 287 packets, got 9 answers, remaining 247 packets
IP =  172.26.131.1  MAC =  d4:xx:fe:6b:xx:01
IP =  172.26.131.7  MAC =  48:xx:7e:c7:xx:e8
IP =  172.26.131.8  MAC =  48:xx:7e:c2:xx:ee
IP =  172.26.131.78  MAC =  d4:xx:52:d0:xx:46
IP =  172.26.131.86  MAC =  00:xx:eb:5b:xx:73
IP =  172.26.131.102  MAC =  00:xx:7c:68:xx:38
IP =  172.26.131.111  MAC =  cc:xx:da:1d:xx:63
IP =  172.26.131.123  MAC =  b0:xx:aa:2f:xx:b8
IP =  172.26.131.244  MAC =  48:xx:7e:c7:xx:1f

ARP协议工作在以太网层,所以使用Scapy,我们将导入以太网层。让我们导入我们将使用的层和函数:
from scapy.all import Ether, ARP, srp

如果 MAC 地址的所有位都设置为 1,则表示该数据包是一个广播,它应该发送到网络中的每个设备。 Scapy 使用十六进制表示,因此我们将创建以下变量来表示广播地址: broadcast = “FF:FF:FF:FF:FF:FF”

然后,我们可以创建一个以太网层数据包并将目的地作为广播。 ether_layer = Ether(dst = broadcast)

我们还需要定义要扫描的 IP 范围。就我而言,我想扫描我的本地网络: ip_range = “172.26.131.1/24”

这表示我们要扫描从 IP 地址 172.26.131.1 到 172.26.131.255 的所有设备。最后 8 位称为位掩码,表示我们要扫描的主机数。记住一个IP地址是32位的,我们这里说我们要屏蔽24位,所以剩下的32-24 = 8位只能寻址,这意味着我们只扫描网络中的最后 256 台主机。

现在,要创建 ARP 层数据包,请使用以下命令: arp_layer = ARP(pdst = ip_range)

现在我们已经创建了两个层,Ether 和 ARP。 接下来,我们将创建一个包含这两个层的数据包: packet = ether_layer / arp_layer

接下来,我们将这个数据包作为广播发送。 为此,我们可以使用以下 srp 函数: ans, unans = srp(packet, iface = “以太网”, timeout=2)

packet 是我们想要发送的数据包的名称,iface 是我们想要用来发送这个数据包的网络接口卡,timeout 是为了确保如果我们在 2 秒内没有得到回复,这意味着设备很可能是离线的。

srp 返回已应答和未应答的数据包。 我们只对来自在线设备的应答数据包感兴趣。 现在,要获取在线设备的 IP 地址和 MAC 地址,我们可以编写以下代码。 我们可以遍历答案以查看 IP 和对应的 MAC 地址:

for snd, rcv in ans:
    ip = rcv[ARP].psrc
    mac = rcv[Ether].src
    print("IP = ", ip, " MAC = ", mac)

rcv 表示发送方已经收到的数据包。 获取IP地址可以使用ARP层,获取MAC地址可以使用以太层。 记住数据包中设置的字段对应于相应的层。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中可以使用scapy库来实现端口扫描探测。scapy是一个强大的网络包处理工具,可以用于构建、发送和解析网络数据包。 下面是使用scapy实现端口扫描探测的基本步骤: 1. 导入必要的模块和库: ```python from scapy.all import * import sys ``` 2. 定义一个函数来发送TCP SYN包并接收响应: ```python def scan_port(target_ip, port): src_port = RandShort() # 随机选择源端口号 response = sr1(IP(dst=target_ip)/TCP(sport=src_port, dport=port, flags="S"), timeout=1, verbose=0) if response is None: return "Closed" elif response.haslayer(TCP) and response.getlayer(TCP).flags == 0x12: send_rst = sr(IP(dst=target_ip)/TCP(sport=src_port, dport=port, flags="AR"), timeout=1, verbose=0) return "Open" elif response.haslayer(TCP) and response.getlayer(TCP).flags == 0x14: return "Closed" ``` 3. 定义一个函数来扫描指定范围的端口: ```python def scan_ports(target_ip, start_port, end_port): for port in range(start_port, end_port+1): result = scan_port(target_ip, port) print(f"Port {port}: {result}") ``` 4. 在主程序中调用函数进行端口扫描: ```python if __name__ == "__main__": target_ip = sys.argv[1] # 从命令行参数获取目标IP地址 start_port = int(sys.argv[2]) # 从命令行参数获取起始端口号 end_port = int(sys.argv[3]) # 从命令行参数获取结束端口号 scan_ports(target_ip, start_port, end_port) ``` 这样,你就可以通过运行Python脚本,并传入目标IP地址、起始端口号和结束端口号来实现端口扫描探测了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值