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助手
