Advertisement

SCAPY官方教程八

阅读量:

Scapy 是一个强大的网络协议分析工具,用于获取与机器网络配置相关的核心信息。它通过绑定功能实现对接口列表、IPv4 和 IPv6 路由等数据的访问,并支持跨平台运行。用户可以通过 Scapy 的 getiflist() 方法获取接口列表,并使用 conf.ifaces 对象访问特定接口信息。
对于 IPv4 路由,用户可以使用 conf.route 获取当前路径,并通过 conf.route.route() 方法查找特定 IP 地址对应的路由信息(如接口、目标 IP 和默认 gateway)。同样地,IPv6 路由可以通过 conf.route6 实现功能。
此外,用户可以利用 Scapy 的记录器进行日志管理,并通过自定义脚本扩展其功能。例如,在 Python 中导入 Scapy 模块后即可编写自动化工具或持续监控网络活动。

一、Scapy 路由

Scapy必须了解与其机器相关的大量网络配置信息才能正确地将数据包路由到目标位置。例如,在接口列表中包含了IPv4和IPv6地址等关键信息。

这意味着 Scapy 已经提供了获取这些信息的绑定机制。这些绑定专为不同操作系统设计。这将帮助您理解如何利用它们在各种应用场景中。

Scapy 基于一些高级功能,并具有操作系统特有的功能;此页面仅限于展示跨平台的信息。

列出接口

用于get_if_list()获取接口列表

复制代码
 >>> get_if_list()

    
 ['lo', 'eth0']
    
    
    
    
    AI助手

另外一种方法是通过该[conf.ifaces](https://scapy.readthedocs.io/en/latest/api/scapy.interfaces.html#scapy.interfaces.NetworkInterfaceDict "conf.ifaces")对象来获取网络接口信息。在本例中,该对象会以列表形式呈现。为了获取编号为2的接口,请调用dev_from_index()方法。

复制代码
 >>> conf.ifaces

    
 SRC  INDEX  IFACE  IPv4       IPv6                      MAC
    
 sys  2      eth0   10.0.0.5   fe80::10a:2bef:dc12:afae  Microsof:12:cb:ef
    
 sys  1      lo     127.0.0.1  ::1                       00:00:00:00:00:00
    
 >>> conf.ifaces.dev_from_index(2)
    
 <NetworkInterface eth0 [UP+BROADCAST+RUNNING+SLAVE]>
    
    
    
    
    AI助手

IPv4 路由

建议您参考上述内容进行调整或修改

该库中的conf.route模块支持该功能可以帮助您直接获取所需路由信息。

复制代码
 >>> conf.route

    
   3. Network          Netmask          Gateway   Iface  Output IP  Metric
    
 0.0.0.0          0.0.0.0          10.0.0.1  eth0   10.0.0.5   100
    
 10.0.0.0         255.255.255.0    0.0.0.0   eth0   10.0.0.5   0
    
 127.0.0.0        255.0.0.0        0.0.0.0   lo     127.0.0.1  1
    
 168.63.129.16    255.255.255.255  10.0.0.1  eth0   10.0.0.5   100
    
 169.254.169.254  255.255.255.255  10.0.0.1  eth0   10.0.0.5   100
    
    
    
    
    AI助手

查询对应 IP 地址的路由信息:conf.route.route() 会返回 (interface, outgoing_ip, gateway)

复制代码
 >>> conf.route.route("127.0.0.1")

    
 ('lo', '127.0.0.1', '0.0.0.0')
    
    
    
    
    AI助手

IPv6 路由

如同 IPv4 一样,在配置参数中也包含了conf.route6这一功能模块

获取路由器IP地址

复制代码
 >>> gw = conf.route.route("0.0.0.0")[2]

    
 >>> gw
    
 '10.0.0.1'
    
    
    
    
    AI助手

获取接口的本地IP/IP

利用conf.iface

复制代码
 >>> ip = get_if_addr(conf.iface)  # default interface

    
 >>> ip = get_if_addr("eth0")
    
 >>> ip
    
 '10.0.0.5'
    
    
    
    
    AI助手

获取接口的本地MAC/MAC

复制代码
 >>> mac = get_if_hwaddr(conf.iface)  # default interface

    
 >>> mac = get_if_hwaddr("eth0")
    
 >>> mac
    
 '54:3f:19:c9:38:6d'
    
    
    
    
    AI助手

通过 IP 获取 MAC

复制代码
 >>> mac = getmacbyip("10.0.0.1")

    
 >>> mac
    
 'f3:ae:5e:76:31:9b'
    
    
    
    
    AI助手

二、Scapy构建自己的工具

您可以通过开发Scapy来创建自己的自动化工具。当需要扩展功能时,您不需要深入修改其源代码。

在你的工具中使用 Scapy

您可以在您的工具中方便使用 Scapy。导入所需内容并进行操作。

第一个示例采用IP或主机名作为第一个参数,并发出ICMP回显请求以获取完整响应信息。

复制代码
 #! /usr/bin/env python

    
  
    
 import sys
    
 from scapy.all import sr1,IP,ICMP
    
  
    
 p=sr1(IP(dst=sys.argv[1])/ICMP())
    
 if p:
    
     p.show()
    
    
    
    
    AI助手

配置 Scapy 的记录器

该Python模块实现了对日志记录器的自动配置。此定制化的记录器支持基于颜色和频率的过滤功能等特性内容。其默认设置为WARNING级别(非交互模式下)。如果需要调整,则可以通过如下方式修改:

复制代码
 import logging

    
 logging.getLogger("scapy").setLevel(logging.CRITICAL)
    
    
    
    
    AI助手

禁用几乎所有日志。(如果发生严重故障,Scapy 将无法正常工作)

在交互模式下,默认的日志级别是INFO

更多示例

该系统运行 ARP ping 过程,并以 LaTeX 格式展示其发现的信息。

复制代码
 #! /usr/bin/env python

    
 # arping2tex : arpings a network and outputs a LaTeX table as a result
    
  
    
 import sys
    
 if len(sys.argv) != 2:
    
     print("Usage: arping2tex <net>\n  eg: arping2tex 192.168.1.0/24")
    
     sys.exit(1)
    
  
    
 from scapy.all import srp, Ether, ARP, conf
    
 conf.verb = 0
    
 ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=sys.argv[1]),
    
              timeout=2)
    
  
    
 print(r"\begin{tabular}{|l|l|}")
    
 print(r"\hline")
    
 print(r"MAC & IP\ ")
    
 print(r"\hline")
    
 for snd,rcv in ans:
    
     print(rcv.sprintf(r"%Ether.src% & %ARP.psrc%\ "))
    
 print(r"\hline")
    
 print(r"\end{tabular}")
    
    
    
    
    AI助手

这是一个新的工具。它会持续扫描机器上的所有接口,并记录下所有遇到的 ARP 请求。即使是在监控模式下来自 Wi-Fi 卡的 802.11 数据帧也会被捕捉到。请特别注意使用 sniff() 方法时设置 store=0 的参数,并确保这会防止内存中累积过多的数据包。

复制代码
 #! /usr/bin/env python

    
 from scapy.all import *
    
  
    
 def arp_monitor_callback(pkt):
    
     if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at
    
     return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%")
    
  
    
 sniff(prn=arp_monitor_callback, filter="arp", store=0)
    
    
    
    
    AI助手

在实践中使用的示例案例中,请您参考Wifitap这一资源。
值得注意的是,Wifitap 已停止维护,但仍有效展示了 Scapy 的 Wi-Fi 功能。
代码资料可从github获取.

使用附加组件扩展 Scapy

如果你希望新增内容或补充模块,请直接将其注入Scapy的核心代码库。即便将这些修改整合至Scapy体系中,在独立模块进行部署也会更加便捷。

完成之后,请启动Scapy并将该文件导入以便实现目标操作。然而这种方法仍显不够便捷。另一种方法可以让该文件变为可执行,并使其调用名为interact()的Scapy函数以达到预期效果

复制代码
 #! /usr/bin/env python

    
  
    
 # Set log level to benefit from Scapy warnings
    
 import logging
    
 logger = logging.getLogger("scapy")
    
 logger.setLevel(logging.INFO)
    
  
    
 from scapy.all import *
    
  
    
 class Test(Packet):
    
     name = "Test packet"
    
     fields_desc = [ ShortField("test1", 1),
    
                 ShortField("test2", 2) ]
    
  
    
 def make_test(x,y):
    
     return Ether()/IP()/Test(test1=x,test2=y)
    
  
    
 if __name__ == "__main__":
    
     interact(mydict=globals(), mybanner="Test add-on v3.14")
    
    
    
    
    AI助手

如果将上面的清单放入 test_interact.py 文件并使其可执行,您将获得:

复制代码
 # ./test_interact.py

    
 Welcome to Scapy (0.9.17.109beta)
    
 Test add-on v3.14
    
 >>> make_test(42,666)
    
 <Ether type=0x800 |<IP |<Test test1=42 test2=666 |>>>
    
    
    
    
    AI助手

全部评论 (0)

还没有任何评论哟~