Advertisement

SCAPY官方教程四

阅读量:

要进行MAC地址嗅探,请按照以下步骤操作:
步骤说明
第一步:准备环境
确保你的操作系统支持Npcap代理服务:
在Linux系统上安装Npcap代理:
bash sudo apt-get install --yes netfilter-mgr sudo systemctl enable networkd sudo systemctl enable networkd --multiplayer=1
第二步:配置接口
启用默认IP地址并设置Npcap代理:
bash 添加默认IP地址到mon0接口 sudo sysctl -n "ip addr add mon0 up" sudo sysctl -n "ip addr add mon0 down" 设置mon0接口为UP状态并启用NetFilter服务(仅适用于Linux) sudo sysctl -n "ip link set mon0 up" sudo systemctl enable networkd sudo systemctl enable networkd --multiplayer=1 启动NetFilter服务以允许Npcap代理访问所有网络接口的数据包(仅适用于Linux) sudo service netfilter start
第三步:运行Tracemx命令

一、配置超级 套接字

Scapy 支持两类超级套接字:本地的和基于libpcap设计的(处理数据包传输)。

通常情况下,默认情况下的Scapy工具将旨在尝试利用本机系统进行网络捕获与分析(其中例外的是Windows系统)。对于希望手动配置并使用libpcap 的用户来说,请确保已经安装了相应的驱动程序,并按照指导步骤进行配置。

在 Unix/OSX 上:确保安装了 libpcap。

在 Windows 上:安装了 Npcap/Winpcap。(默认)

然后使用:

复制代码
    >>> conf.use_pcap = True
    
    AI助手

这将自动更新指向conf.L2socket和的套接字conf.L3socket

如果你自行配置它们,在不同的操作系统中会有不同的选择依据。例如, 您可能想使用:

复制代码
 >>> conf.L3socket=L3pcapSocket  # Receive/send L3 packets through libpcap

    
 >>> conf.L2listen=L2ListenTcpdump  # Receive L2 packets through TCPDump
    
    
    
    
    AI助手

二、

本系统能够较为简便地捕获一批数据包,并且还可以模拟运行tcpdump或tshark工具。为了实现网络流量分析功能,可以配置一个接口或一组可选的探测接口用于数据采集。若未指定配置文件中的探测接口,则默认在conf.iface处执行流量嗅探操作:

复制代码
 >>>  sniff(filter="icmp and host 66.35.250.151", count=2)

    
 <Sniffed: UDP:0 TCP:0 ICMP:2 Other:0>
    
 >>>  a=_
    
 >>>  a.nsummary()
    
 0000 Ether / IP / ICMP 192.168.5.21 echo-request 0 / Raw
    
 0001 Ether / IP / ICMP 192.168.5.21 echo-request 0 / Raw
    
 >>>  a[1]
    
 <Ether dst=00:ae:f3:52:aa:d1 src=00:02:15:37:a2:44 type=0x800 |<IP version=4L
    
  ihl=5L tos=0x0 len=84 id=0 flags=DF frag=0L ttl=64 proto=ICMP chksum=0x3831
    
  src=192.168.5.21 dst=66.35.250.151 options='' |<ICMP type=echo-request code=0
    
  chksum=0x6571 id=0x8745 seq=0x0 |<Raw load='B\xf7g\xda\x00\x07um\x08\t\n\x0b
    
  \x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d
    
  \x1e\x1f !\x22#$%&\'()*+,-./01234567' |>>>>
    
 >>> sniff(iface="wifi0", prn=lambda x: x.summary())
    
 802.11 Management 8 ff:ff:ff:ff:ff:ff / 802.11 Beacon / Info SSID / Info Rates / Info DSset / Info TIM / Info 133
    
 802.11 Management 4 ff:ff:ff:ff:ff:ff / 802.11 Probe Request / Info SSID / Info Rates
    
 802.11 Management 5 00:0a:41:ee:a5:50 / 802.11 Probe Response / Info SSID / Info Rates / Info DSset / Info 133
    
 802.11 Management 4 ff:ff:ff:ff:ff:ff / 802.11 Probe Request / Info SSID / Info Rates
    
 802.11 Management 4 ff:ff:ff:ff:ff:ff / 802.11 Probe Request / Info SSID / Info Rates
    
 802.11 Management 8 ff:ff:ff:ff:ff:ff / 802.11 Beacon / Info SSID / Info Rates / Info DSset / Info TIM / Info 133
    
 802.11 Management 11 00:07:50:d6:44:3f / 802.11 Authentication
    
 802.11 Management 11 00:0a:41:ee:a5:50 / 802.11 Authentication
    
 802.11 Management 0 00:07:50:d6:44:3f / 802.11 Association Request / Info SSID / Info Rates / Info 133 / Info 149
    
 802.11 Management 1 00:0a:41:ee:a5:50 / 802.11 Association Response / Info Rates / Info 133 / Info 149
    
 802.11 Management 8 ff:ff:ff:ff:ff:ff / 802.11 Beacon / Info SSID / Info Rates / Info DSset / Info TIM / Info 133
    
 802.11 Management 8 ff:ff:ff:ff:ff:ff / 802.11 Beacon / Info SSID / Info Rates / Info DSset / Info TIM / Info 133
    
 802.11 / LLC / SNAP / ARP who has 172.20.70.172 says 172.20.70.171 / Padding
    
 802.11 / LLC / SNAP / ARP is at 00:0a:b7:4b:9c:dd says 172.20.70.172 / Padding
    
 802.11 / LLC / SNAP / IP / ICMP echo-request 0 / Raw
    
 802.11 / LLC / SNAP / IP / ICMP echo-reply 0 / Raw
    
 >>> sniff(iface="eth1", prn=lambda x: x.show())
    
 ---[ Ethernet ]---
    
 dst       = 00:ae:f3:52:aa:d1
    
 src       = 00:02:15:37:a2:44
    
 type      = 0x800
    
 ---[ IP ]---
    
    version   = 4L
    
    ihl       = 5L
    
    tos       = 0x0
    
    len       = 84
    
    id        = 0
    
    flags     = DF
    
    frag      = 0L
    
    ttl       = 64
    
    proto     = ICMP
    
    chksum    = 0x3831
    
    src       = 192.168.5.21
    
    dst       = 66.35.250.151
    
    options   = ''
    
 ---[ ICMP ]---
    
       type      = echo-request
    
       code      = 0
    
       chksum    = 0x89d9
    
       id        = 0xc245
    
       seq       = 0x0
    
 ---[ Raw ]---
    
      load      = 'B\xf7i\xa9\x00\x04\x149\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\x22#$%&\'()*+,-./01234567'
    
 ---[ Ethernet ]---
    
 dst       = 00:02:15:37:a2:44
    
 src       = 00:ae:f3:52:aa:d1
    
 type      = 0x800
    
 ---[ IP ]---
    
    version   = 4L
    
    ihl       = 5L
    
    tos       = 0x0
    
    len       = 84
    
    id        = 2070
    
    flags     =
    
    frag      = 0L
    
    ttl       = 42
    
    proto     = ICMP
    
    chksum    = 0x861b
    
    src       = 66.35.250.151
    
    dst       = 192.168.5.21
    
    options   = ''
    
 ---[ ICMP ]---
    
       type      = echo-reply
    
       code      = 0
    
       chksum    = 0x91d9
    
       id        = 0xc245
    
       seq       = 0x0
    
 ---[ Raw ]---
    
      load      = 'B\xf7i\xa9\x00\x04\x149\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\x22#$%&\'()*+,-./01234567'
    
 ---[ Padding ]---
    
         load      = '\n_\x00\x0b'
    
 >>> sniff(iface=["eth1","eth2"], prn=lambda x: x.sniffed_on+": "+x.summary())
    
 eth3: Ether / IP / ICMP 192.168.5.21 > 66.35.250.151 echo-request 0 / Raw
    
 eth3: Ether / IP / ICMP 66.35.250.151 > 192.168.5.21 echo-reply 0 / Raw
    
 eth2: Ether / IP / ICMP 192.168.5.22 > 66.35.250.152 echo-request 0 / Raw
    
 eth2: Ether / IP / ICMP 66.35.250.152 > 192.168.5.22 echo-reply 0 / Raw
    
    
    
    
    AI助手

为了更好地控制显示的信息,我们可以使用以下sprintf()功能:

复制代码
 >>> pkts = sniff(prn=lambda x:x.sprintf("{IP:%IP.src% -> %IP.dst%\n}{Raw:%Raw.load%\n}"))

    
 192.168.1.100 -> 64.233.167.99
    
  
    
 64.233.167.99 -> 192.168.1.100
    
  
    
 192.168.1.100 -> 64.233.167.99
    
  
    
 192.168.1.100 -> 64.233.167.99
    
 'GET / HTTP/1.1\r\nHost: 64.233.167.99\r\nUser-Agent: Mozilla/5.0
    
 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy)
    
 Firefox/2.0.0.8\r\nAccept: text/xml,application/xml,application/xhtml+xml,
    
 text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\nAccept-Language:
    
 en-us,en;q=0.5\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset:
    
 ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\nConnection:
    
 keep-alive\r\nCache-Control: max-age=0\r\n\r\n'
    
    
    
    
    AI助手

我们可以嗅探并进行被动操作系统指纹识别:

复制代码
 >>> p

    
 <Ether dst=00:10:4b:b3:7d:4e src=00:40:33:96:7b:60 type=0x800 |<IP version=4L
    
  ihl=5L tos=0x0 len=60 id=61681 flags=DF frag=0L ttl=64 proto=TCP chksum=0xb85e
    
  src=192.168.8.10 dst=192.168.8.1 options='' |<TCP sport=46511 dport=80
    
  seq=2023566040L ack=0L dataofs=10L reserved=0L flags=SEC window=5840
    
  chksum=0x570c urgptr=0 options=[('Timestamp', (342940201L, 0L)), ('MSS', 1460),
    
  ('NOP', ()), ('SAckOK', ''), ('WScale', 0)] |>>>
    
 >>> load_module("p0f")
    
 >>> p0f(p)
    
 (1.0, ['Linux 2.4.2 - 2.4.14 (1)'])
    
 >>> a=sniff(prn=prnp0f)
    
 (1.0, ['Linux 2.4.2 - 2.4.14 (1)'])
    
 (1.0, ['Linux 2.4.2 - 2.4.14 (1)'])
    
 (0.875, ['Linux 2.4.2 - 2.4.14 (1)', 'Linux 2.4.10 (1)', 'Windows 98 (?)'])
    
 (1.0, ['Windows 2000 (9)'])
    
    
    
    
    AI助手

操作系统猜测之前的数字是猜测的准确性。

改写说明

复制代码
    iface=["eth0", ...]sniffed_on
    
    AI助手

三、异步嗅探

异步嗅探仅从Scapy 2.4.3开始可用。

在某些情况下,并非采用异步模式的嗅探行为未必能提升性能指标(与预期效果相反)。建议您一次性将多个接口/套接字传递给单个sniff()调用。

支持异步嗅探功能的实现。通过编程方式停止嗅探器而非使用 ctrl^C命令终止。该模块包含 start、stop 和 join 方法。

基本用法是:

复制代码
 >>> t = AsyncSniffer()

    
 >>> t.start()
    
 >>> print("hey")
    
 hey
    
 [...]
    
 >>> results = t.stop()
    
    
    
    
    AI助手

该类型具有若干关键属性如results(数据包收集器)以及running这些特性具有特殊功能

复制代码
 >>> t = AsyncSniffer(iface="enp0s3", count=200)

    
 >>> t.start()
    
 >>> t.join()  # this will hold until 200 packets are collected
    
 >>> results = t.results
    
 >>> print(len(results))
    
 200
    
    
    
    
    AI助手

另一个例子:使用prnstore=False

复制代码
 >>> t = AsyncSniffer(prn=lambda x: x.summary(), store=False, filter="tcp")

    
 >>> t.start()
    
 >>> time.sleep(20)
    
 >>> t.stop()
    
    
    
    
    AI助手

四、 高级嗅探 - 嗅探会议

会话仅从Scapy 2.4.3开始可用

sniff()还支持会话(即连接),能够实现对数据流量的连续解析。例如,在实际应用中,您可能希望您的sniff(prn=...)函数在执行过程中能够同步打印日志信息。

Scapy 包含一些基本的 Session,但也可以实现您自己的。默认可用:

IPSession负责对流中的 IP 数据包 进行分片重组以便使该流量能够被 prn 处理

TCPSession->对某些 TCP 协议进行碎片整理 。目前支持:

HTTP 1.0

TLS

TLSSession->匹配 流上的 TLS 会话。

NetflowSession->从其 NetflowFlowset 信息对象 解析 Netflow V9 数据包

这些会话可以使用session=参数 of来使用sniff()。例子:

复制代码
 >>> sniff(session=IPSession, iface="eth0")

    
 >>> sniff(session=TCPSession, prn=lambda x: x.summary(), store=False)
    
 >>> sniff(offline="file.pcap", session=NetflowSession)
    
    
    
    
    AI助手

为了创建自定义的 Session 类 以便支持基于流协议的功能,请先参考现有示例代码。您的自定义 Session 类可以通过继承 DefaultSession 类来实现 并针对接收到的数据包设计处理逻辑 如现有代码所示。

你需要它吗,你可以使用:来嗅探经过碎片整理的 TLS 数据包。

复制代码
    class TLS_over_TCP(TLSSession, TCPSession): pass
    
    AI助手

五、 如何使用 TCPSession 对 TCP 数据包进行碎片整理

该层必须紧随 TCP 层以完成解压。为了实现这一功能,请创建名为 tcp_reassemble 的类函数。该函数将接收二进制数据以及附加字典作为输入,并在满足特定条件时生成完整的报头。我们可以通过以下 TLS 伪代码示例来进一步理解相关机制。

复制代码
 class TLS(Packet):

    
     [...]
    
  
    
     @classmethod
    
     def tcp_reassemble(cls, data, metadata):
    
     length = struct.unpack("!H", data[3:5])[0] + 5
    
     if len(data) == length:
    
         return TLS(data)
    
    
    
    
    AI助手

在此案例中,在获取 TLS 标头所声明的有效负载总量之前(即 TLS 有效负载总长度),我们需要将其与当前的数据量进行对比分析。一旦确定两者相等,则表示已完成传输并准备返回给客户端。在实现 tcp_reassemble 功能时,则必须通过精确判断来核实传输过程中是否有任何其他内容未被成功接收。

data参数是字节,参数metadata是字典,其键如下:

复制代码
 metadata["pay_class"]:TCP 负载类(此处为 TLS)

    
 metadata.get("tcp_psh", False): 如果设置了 PUSH 标志就会出现
    
 metadata.get("tcp_end", False): 如果设置了 END 或 RESET 标志将出现
    
    
    
    
    AI助手

六、 过滤器

bpf 过滤器和 sprintf() 方法的演示:

复制代码
 >>> a=sniff(filter="tcp and ( port 25 or port 110 )",

    
  prn=lambda x: x.sprintf("%IP.src%:%TCP.sport% -> %IP.dst%:%TCP.dport%  %2s,TCP.flags% : %TCP.payload%"))
    
 192.168.8.10:47226 -> 213.228.0.14:110   S :
    
 213.228.0.14:110 -> 192.168.8.10:47226  SA :
    
 192.168.8.10:47226 -> 213.228.0.14:110   A :
    
 213.228.0.14:110 -> 192.168.8.10:47226  PA : +OK <13103.1048117923@pop2-1.free.fr>
    
  
    
 192.168.8.10:47226 -> 213.228.0.14:110   A :
    
 192.168.8.10:47226 -> 213.228.0.14:110  PA : USER toto
    
  
    
 213.228.0.14:110 -> 192.168.8.10:47226   A :
    
 213.228.0.14:110 -> 192.168.8.10:47226  PA : +OK
    
  
    
 192.168.8.10:47226 -> 213.228.0.14:110   A :
    
 192.168.8.10:47226 -> 213.228.0.14:110  PA : PASS tata
    
  
    
 213.228.0.14:110 -> 192.168.8.10:47226  PA : -ERR authorization failed
    
  
    
 192.168.8.10:47226 -> 213.228.0.14:110   A :
    
 213.228.0.14:110 -> 192.168.8.10:47226  FA :
    
 192.168.8.10:47226 -> 213.228.0.14:110  FA :
    
 213.228.0.14:110 -> 192.168.8.10:47226   A :
    
    
    
    
    AI助手

七、循环发 送和接收

该功能与(h)ping机制相同:每当您发送相同的数据显示包集合时即可检测是否存在变化。

复制代码
 >>> srloop(IP(dst="www.target.com/30")/TCP())

    
 RECV 1: Ether / IP / TCP 192.168.11.99:80 > 192.168.8.14:20 SA / Padding
    
 fail 3: IP / TCP 192.168.8.14:20 > 192.168.11.96:80 S
    
     IP / TCP 192.168.8.14:20 > 192.168.11.98:80 S
    
     IP / TCP 192.168.8.14:20 > 192.168.11.97:80 S
    
 RECV 1: Ether / IP / TCP 192.168.11.99:80 > 192.168.8.14:20 SA / Padding
    
 fail 3: IP / TCP 192.168.8.14:20 > 192.168.11.96:80 S
    
     IP / TCP 192.168.8.14:20 > 192.168.11.98:80 S
    
     IP / TCP 192.168.8.14:20 > 192.168.11.97:80 S
    
 RECV 1: Ether / IP / TCP 192.168.11.99:80 > 192.168.8.14:20 SA / Padding
    
 fail 3: IP / TCP 192.168.8.14:20 > 192.168.11.96:80 S
    
     IP / TCP 192.168.8.14:20 > 192.168.11.98:80 S
    
     IP / TCP 192.168.8.14:20 > 192.168.11.97:80 S
    
 RECV 1: Ether / IP / TCP 192.168.11.99:80 > 192.168.8.14:20 SA / Padding
    
 fail 3: IP / TCP 192.168.8.14:20 > 192.168.11.96:80 S
    
     IP / TCP 192.168.8.14:20 > 192.168.11.98:80 S
    
     IP / TCP 192.168.8.14:20 > 192.168.11.97:80 S
    
    
    
    
    AI助手

八、 导入和导出数据

PCAP

为了存储网络流量数据以便后续处理以及在多个系统环境中应用,捕获的数据包通常会被保存为pcap文件。

复制代码
    >>> wrpcap("temp.cap",pkts)
    
    AI助手

要恢复以前保存的 pcap 文件:

复制代码
    >>> pkts = rdpcap("temp.cap")
    
    AI助手

或者

复制代码
    >>> pkts = sniff(offline="temp.cap")
    
    AI助手

十六进制转储

Scapy 允许您以各种十六进制格式导出记录的数据包。

用于hexdump()使用经典的 hexdump 格式显示一个或多个数据包:

复制代码
 >>> hexdump(pkt)

    
 0000   00 50 56 FC CE 50 00 0C  29 2B 53 19 08 00 45 00   .PV..P..)+S...E.
    
 0010   00 54 00 00 40 00 40 01  5A 7C C0 A8 19 82 04 02   .T..@.@.Z|......
    
 0020   02 01 08 00 9C 90 5A 61  00 01 E6 DA 70 49 B6 E5   ......Za....pI..
    
 0030   08 00 08 09 0A 0B 0C 0D  0E 0F 10 11 12 13 14 15   ................
    
 0040   16 17 18 19 1A 1B 1C 1D  1E 1F 20 21 22 23 24 25   .......... !"#$%
    
 0050   26 27 28 29 2A 2B 2C 2D  2E 2F 30 31 32 33 34 35   &'()*+,-./012345
    
 0060   36 37                                              67
    
    
    
    
    AI助手

上面的 Hexdump 可以使用以下命令重新导入 Scapy import_hexcap()

复制代码
 >>> pkt_hex = Ether(import_hexcap())

    
 0000   00 50 56 FC CE 50 00 0C  29 2B 53 19 08 00 45 00   .PV..P..)+S...E.
    
 0010   00 54 00 00 40 00 40 01  5A 7C C0 A8 19 82 04 02   .T..@.@.Z|......
    
 0020   02 01 08 00 9C 90 5A 61  00 01 E6 DA 70 49 B6 E5   ......Za....pI..
    
 0030   08 00 08 09 0A 0B 0C 0D  0E 0F 10 11 12 13 14 15   ................
    
 0040   16 17 18 19 1A 1B 1C 1D  1E 1F 20 21 22 23 24 25   .......... !"#$%
    
 0050   26 27 28 29 2A 2B 2C 2D  2E 2F 30 31 32 33 34 35   &'()*+,-./012345
    
 0060   36 37                                              67
    
 >>> pkt_hex
    
 <Ether  dst=00:50:56:fc:ce:50 src=00:0c:29:2b:53:19 type=0x800 |<IP  version=4L
    
 ihl=5L tos=0x0 len=84 id=0 flags=DF frag=0L ttl=64 proto=icmp chksum=0x5a7c
    
 src=192.168.25.130 dst=4.2.2.1 options='' |<ICMP  type=echo-request code=0
    
 chksum=0x9c90 id=0x5a61 seq=0x1 |<Raw  load='\xe6\xdapI\xb6\xe5\x08\x00\x08\t\n
    
 \x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e
    
 \x1f !"#$%&\'()*+,-./01234567' |>>>>
    
    
    
    
    AI助手

二进制位串- https://scapy.readthedocs.io/en/latest/usage.html#binary-string

您还可以使用以下raw()函数将整个数据包转换为二进制字符串:

复制代码
 >>> pkts = sniff(count = 1)

    
 >>> pkt = pkts[0]
    
 >>> pkt
    
 <Ether  dst=00:50:56:fc:ce:50 src=00:0c:29:2b:53:19 type=0x800 |<IP  version=4L
    
 ihl=5L tos=0x0 len=84 id=0 flags=DF frag=0L ttl=64 proto=icmp chksum=0x5a7c
    
 src=192.168.25.130 dst=4.2.2.1 options='' |<ICMP  type=echo-request code=0
    
 chksum=0x9c90 id=0x5a61 seq=0x1 |<Raw  load='\xe6\xdapI\xb6\xe5\x08\x00\x08\t\n
    
 \x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e
    
 \x1f !"#$%&\'()*+,-./01234567' |>>>>
    
 >>> pkt_raw = raw(pkt)
    
 >>> pkt_raw
    
 '\x00PV\xfc\xceP\x00\x0c)+S\x19\x08\x00E\x00\x00T\x00\x00@\x00@\x01Z|\xc0\xa8
    
 \x19\x82\x04\x02\x02\x01\x08\x00\x9c\x90Za\x00\x01\xe6\xdapI\xb6\xe5\x08\x00
    
 \x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b
    
 \x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567'
    
    
    
    
    AI助手

采用合适的第一层(其中一个),我们可以将生成的二进制字符串重新导入。

复制代码
 >>> new_pkt = Ether(pkt_raw)

    
 >>> new_pkt
    
 <Ether  dst=00:50:56:fc:ce:50 src=00:0c:29:2b:53:19 type=0x800 |<IP  version=4L
    
 ihl=5L tos=0x0 len=84 id=0 flags=DF frag=0L ttl=64 proto=icmp chksum=0x5a7c
    
 src=192.168.25.130 dst=4.2.2.1 options='' |<ICMP  type=echo-request code=0
    
 chksum=0x9c90 id=0x5a61 seq=0x1 |<Raw  load='\xe6\xdapI\xb6\xe5\x08\x00\x08\t\n
    
 \x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e
    
 \x1f !"#$%&\'()*+,-./01234567' |>>>>
    
    
    
    
    AI助手

Base64

借助该export_object()函数,Scapy能够生成表示数据包的 base64 编码的Python数据结构。

复制代码
 >>> pkt

    
 <Ether  dst=00:50:56:fc:ce:50 src=00:0c:29:2b:53:19 type=0x800 |<IP  version=4L
    
 ihl=5L tos=0x0 len=84 id=0 flags=DF frag=0L ttl=64 proto=icmp chksum=0x5a7c
    
 src=192.168.25.130 dst=4.2.2.1 options='' |<ICMP  type=echo-request code=0
    
 chksum=0x9c90 id=0x5a61 seq=0x1 |<Raw  load='\xe6\xdapI\xb6\xe5\x08\x00\x08\t\n
    
 \x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f
    
 !"#$%&\'()*+,-./01234567' |>>>>
    
 >>> export_object(pkt)
    
 eNplVwd4FNcRPt2dTqdTQ0JUUYwN+CgS0gkJONFEs5WxFDB+CdiI8+pupVl0d7uzRUiYtcEGG4ST
    
 OD1OnB6nN6c4cXrvwQmk2U5xA9tgO70XMm+1rA78qdzbfTP/lDfzz7tD4WwmU1C0YiaT2Gqjaiao
    
 bMlhCrsUSYrYoKbmcxZFXSpPiohlZikm6ltb063ZdGpNOjWQ7mhPt62hChHJWTbFvb0O/u1MD2bT
    
 WZXXVCmi9pihUqI3FHdEQslriiVfWFTVT9VYpog6Q7fsjG0qRWtQNwsW1fRTrUg4xZxq5pUx1aS6
    
 ...
    
    
    
    
    AI助手

可以使用以下命令将上面的输出重新导入 Scapy import_object()

复制代码
 >>> new_pkt = import_object()

    
 eNplVwd4FNcRPt2dTqdTQ0JUUYwN+CgS0gkJONFEs5WxFDB+CdiI8+pupVl0d7uzRUiYtcEGG4ST
    
 OD1OnB6nN6c4cXrvwQmk2U5xA9tgO70XMm+1rA78qdzbfTP/lDfzz7tD4WwmU1C0YiaT2Gqjaiao
    
 bMlhCrsUSYrYoKbmcxZFXSpPiohlZikm6ltb063ZdGpNOjWQ7mhPt62hChHJWTbFvb0O/u1MD2bT
    
 WZXXVCmi9pihUqI3FHdEQslriiVfWFTVT9VYpog6Q7fsjG0qRWtQNwsW1fRTrUg4xZxq5pUx1aS6
    
 ...
    
 >>> new_pkt
    
 <Ether  dst=00:50:56:fc:ce:50 src=00:0c:29:2b:53:19 type=0x800 |<IP  version=4L
    
 ihl=5L tos=0x0 len=84 id=0 flags=DF frag=0L ttl=64 proto=icmp chksum=0x5a7c
    
 src=192.168.25.130 dst=4.2.2.1 options='' |<ICMP  type=echo-request code=0
    
 chksum=0x9c90 id=0x5a61 seq=0x1 |<Raw  load='\xe6\xdapI\xb6\xe5\x08\x00\x08\t\n
    
 \x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f
    
 !"#$%&\'()*+,-./01234567' |>>>>
    
    
    
    
    AI助手

九、 会话

最后 Scapy 能够使用以下save_session()函数保存所有会话变量:

复制代码
 >>> dir()

    
 ['__builtins__', 'conf', 'new_pkt', 'pkt', 'pkt_export', 'pkt_hex', 'pkt_raw', 'pkts']
    
 >>> save_session("session.scapy")
    
    
    
    
    AI助手

当再次运行Scapy程序时,请您通过调用load_session()命令来加载之前保存的对话会话信息:

复制代码
 >>> dir()

    
 ['__builtins__', 'conf']
    
 >>> load_session("session.scapy")
    
 >>> dir()
    
 ['__builtins__', 'conf', 'new_pkt', 'pkt', 'pkt_export', 'pkt_hex', 'pkt_raw', 'pkts']
    
    
    
    
    AI助手

十、 作表格

我们现在将演示make_table()的功能展示。该函数接收一个列表作为输入,并采用返回一种三元素元组的机制。第一个元素代表列表中的项目在X轴上的位置;第二个元素对应Y轴的数值;第三个参数则决定了我们在坐标点(X,Y)处显示的内容。其输出结果即为一张表格。其中一种变体是make_lined_table(), 它可以直接复制并粘贴到您的LaTeX渗透测试报告中;另一种则是make_tex_table(), 同样适合直接复制和粘贴到LaTeX文档中使用。这些生成的结果对象也可用作方法调用的对象:

当前环境下,我们能够观察到一种多路径traceroute技术(Scapy现支持multi TCP traceroute功能,如后续章节所述):

复制代码
 >>> ans, unans = sr(IP(dst="www.test.fr/30", ttl=(1,6))/TCP())

    
 Received 49 packets, got 24 answers, remaining 0 packets
    
 >>> ans.make_table( lambda s,r: (s.dst, s.ttl, r.src) )
    
   216.15.189.192  216.15.189.193  216.15.189.194  216.15.189.195
    
 1 192.168.8.1     192.168.8.1     192.168.8.1     192.168.8.1
    
 2 81.57.239.254   81.57.239.254   81.57.239.254   81.57.239.254
    
 3 213.228.4.254   213.228.4.254   213.228.4.254   213.228.4.254
    
 4 213.228.3.3     213.228.3.3     213.228.3.3     213.228.3.3
    
 5 193.251.254.1   193.251.251.69  193.251.254.1   193.251.251.69
    
 6 193.251.241.174 193.251.241.178 193.251.241.174 193.251.241.178
    
    
    
    
    AI助手

为此我们提供了一个更为复杂的情景实例以用于区分机器与其对应的IP地址堆栈及其字段中的特定数据(如IPID字段)。通过观察以下端口响应情况可以看出:当访问172.20.80.200:22时其响应是由来自相同IP地址堆栈的数据所引发;而在同一网络上但不同端口如172.20.80.197:25则未收到来自同一IP地址堆栈的数据所引发的响应

复制代码
 >>> ans, unans = sr(IP(dst="172.20.80.192/28")/TCP(dport=[20,21,22,25,53,80]))

    
 Received 142 packets, got 25 answers, remaining 71 packets
    
 >>> ans.make_table(lambda s,r: (s.dst, s.dport, r.sprintf("%IP.id%")))
    
    172.20.80.196 172.20.80.197 172.20.80.198 172.20.80.200 172.20.80.201
    
 20 0             4203          7021          -             11562
    
 21 0             4204          7022          -             11563
    
 22 0             4205          7023          11561         11564
    
 25 0             0             7024          -             11565
    
 53 0             4207          7025          -             11566
    
 80 0             4028          7026          -             11567
    
    
    
    
    AI助手

在玩 TTL、显示接收到的 TTL 等时,它可以帮助识别网络拓扑非常容易。

十一、 路由

现在 Scapy 已经具备了独立的路由表功能, 因此你可以让数据包采用不同于系统默认的路由方式传输:

复制代码
 >>> conf.route

    
 Network         Netmask         Gateway         Iface
    
 127.0.0.0       255.0.0.0       0.0.0.0         lo
    
 192.168.8.0     255.255.255.0   0.0.0.0         eth0
    
 0.0.0.0         0.0.0.0         192.168.8.1     eth0
    
 >>> conf.route.delt(net="0.0.0.0/0",gw="192.168.8.1")
    
 >>> conf.route.add(net="0.0.0.0/0",gw="192.168.8.254")
    
 >>> conf.route.add(host="192.168.1.1",gw="192.168.8.1")
    
 >>> conf.route
    
 Network         Netmask         Gateway         Iface
    
 127.0.0.0       255.0.0.0       0.0.0.0         lo
    
 192.168.8.0     255.255.255.0   0.0.0.0         eth0
    
 0.0.0.0         0.0.0.0         192.168.8.254   eth0
    
 192.168.1.1     255.255.255.255 192.168.8.1     eth0
    
 >>> conf.route.resync()
    
 >>> conf.route
    
 Network         Netmask         Gateway         Iface
    
 127.0.0.0       255.0.0.0       0.0.0.0         lo
    
 192.168.8.0     255.255.255.0   0.0.0.0         eth0
    
 0.0.0.0         0.0.0.0         192.168.8.1     eth0
    
    
    
    
    AI助手

十二、 Matplotlib

通过Matplotlib快速实现数据可视化结果的呈现。(请确保您已安装了Matplotlib库。)例如,我们可以通过分析IP ID模式来推断负载均衡器内部使用了多少个独立的IP地址堆叠。

复制代码
 >>> a, b = sr(IP(dst="www.target.com")/TCP(sport=[RandShort()]*1000))

    
 >>> a.plot(lambda x:x[1].id)
    
 [<matplotlib.lines.Line2D at 0x2367b80d6a0>]
    
    
    
    
    AI助手

十三、 TCP 跟踪路由 (2)

Scapy 提供了一个卓越的 TCP traceroute 功能。与传统的逐个节点响应后再转接数据包的方式不同的是,在 Scapy 中一次性发送所有数据包以完成任务。这种做法的一个明显不足之处在于无法预知何时停止运行(这通常由 maxttl 参数决定),但它最大的优点就是能够在不到 3 秒的时间里完成这项复杂而详尽的任务:

复制代码
 >>> traceroute(["www.yahoo.com","www.altavista.com","www.wisenut.com","www.copernic.com"],maxttl=20)

    
 Received 80 packets, got 80 answers, remaining 0 packets
    
    193.45.10.88:80    216.109.118.79:80  64.241.242.243:80  66.94.229.254:80
    
 1  192.168.8.1        192.168.8.1        192.168.8.1        192.168.8.1
    
 2  82.243.5.254       82.243.5.254       82.243.5.254       82.243.5.254
    
 3  213.228.4.254      213.228.4.254      213.228.4.254      213.228.4.254
    
 4  212.27.50.46       212.27.50.46       212.27.50.46       212.27.50.46
    
 5  212.27.50.37       212.27.50.41       212.27.50.37       212.27.50.41
    
 6  212.27.50.34       212.27.50.34       213.228.3.234      193.251.251.69
    
 7  213.248.71.141     217.118.239.149    208.184.231.214    193.251.241.178
    
 8  213.248.65.81      217.118.224.44     64.125.31.129      193.251.242.98
    
 9  213.248.70.14      213.206.129.85     64.125.31.186      193.251.243.89
    
 10 193.45.10.88    SA 213.206.128.160    64.125.29.122      193.251.254.126
    
 11 193.45.10.88    SA 206.24.169.41      64.125.28.70       216.115.97.178
    
 12 193.45.10.88    SA 206.24.226.99      64.125.28.209      66.218.64.146
    
 13 193.45.10.88    SA 206.24.227.106     64.125.29.45       66.218.82.230
    
 14 193.45.10.88    SA 216.109.74.30      64.125.31.214      66.94.229.254   SA
    
 15 193.45.10.88    SA 216.109.120.149    64.124.229.109     66.94.229.254   SA
    
 16 193.45.10.88    SA 216.109.118.79  SA 64.241.242.243  SA 66.94.229.254   SA
    
 17 193.45.10.88    SA 216.109.118.79  SA 64.241.242.243  SA 66.94.229.254   SA
    
 18 193.45.10.88    SA 216.109.118.79  SA 64.241.242.243  SA 66.94.229.254   SA
    
 19 193.45.10.88    SA 216.109.118.79  SA 64.241.242.243  SA 66.94.229.254   SA
    
 20 193.45.10.88    SA 216.109.118.79  SA 64.241.242.243  SA 66.94.229.254   SA
    
 (<Traceroute: UDP:0 TCP:28 ICMP:52 Other:0>, <Unanswered: UDP:0 TCP:0 ICMP:0 Other:0>)
    
    
    
    
    AI助手

最后一条记录实际上是函数执行结果:包括了一个Tracer路线实现对象记录和一个未响应 数据包的信息条目。Tracer路线实现是一个更为专业的版本(具体而言是其父类),因此我们建议将此实例保存以便后续查询或深入分析某个响应细节。

复制代码
 >>> result, unans = _

    
 >>> result.show()
    
    193.45.10.88:80    216.109.118.79:80  64.241.242.243:80  66.94.229.254:80
    
 1  192.168.8.1        192.168.8.1        192.168.8.1        192.168.8.1
    
 2  82.251.4.254       82.251.4.254       82.251.4.254       82.251.4.254
    
 3  213.228.4.254      213.228.4.254      213.228.4.254      213.228.4.254
    
 [...]
    
 >>> result.filter(lambda x: Padding in x[1])
    
    
    
    
    AI助手

像任何结果对象一样,可以添加 traceroute 对象:

复制代码
 >>> r2, unans = traceroute(["www.voila.com"],maxttl=20)

    
 Received 19 packets, got 19 answers, remaining 1 packets
    
    195.101.94.25:80
    
 1  192.168.8.1
    
 2  82.251.4.254
    
 3  213.228.4.254
    
 4  212.27.50.169
    
 5  212.27.50.162
    
 6  193.252.161.97
    
 7  193.252.103.86
    
 8  193.252.103.77
    
 9  193.252.101.1
    
 10 193.252.227.245
    
 12 195.101.94.25   SA
    
 13 195.101.94.25   SA
    
 14 195.101.94.25   SA
    
 15 195.101.94.25   SA
    
 16 195.101.94.25   SA
    
 17 195.101.94.25   SA
    
 18 195.101.94.25   SA
    
 19 195.101.94.25   SA
    
 20 195.101.94.25   SA
    
 >>>
    
 >>> r3=result+r2
    
 >>> r3.show()
    
    195.101.94.25:80   212.23.37.13:80    216.109.118.72:80  64.241.242.243:80  66.94.229.254:80
    
 1  192.168.8.1        192.168.8.1        192.168.8.1        192.168.8.1        192.168.8.1
    
 2  82.251.4.254       82.251.4.254       82.251.4.254       82.251.4.254       82.251.4.254
    
 3  213.228.4.254      213.228.4.254      213.228.4.254      213.228.4.254      213.228.4.254
    
 4  212.27.50.169      212.27.50.169      212.27.50.46       -                  212.27.50.46
    
 5  212.27.50.162      212.27.50.162      212.27.50.37       212.27.50.41       212.27.50.37
    
 6  193.252.161.97     194.68.129.168     212.27.50.34       213.228.3.234      193.251.251.69
    
 7  193.252.103.86     212.23.42.33       217.118.239.185    208.184.231.214    193.251.241.178
    
 8  193.252.103.77     212.23.42.6        217.118.224.44     64.125.31.129      193.251.242.98
    
 9  193.252.101.1      212.23.37.13    SA 213.206.129.85     64.125.31.186      193.251.243.89
    
 10 193.252.227.245    212.23.37.13    SA 213.206.128.160    64.125.29.122      193.251.254.126
    
 11 -                  212.23.37.13    SA 206.24.169.41      64.125.28.70       216.115.97.178
    
 12 195.101.94.25   SA 212.23.37.13    SA 206.24.226.100     64.125.28.209      216.115.101.46
    
 13 195.101.94.25   SA 212.23.37.13    SA 206.24.238.166     64.125.29.45       66.218.82.234
    
 14 195.101.94.25   SA 212.23.37.13    SA 216.109.74.30      64.125.31.214      66.94.229.254   SA
    
 15 195.101.94.25   SA 212.23.37.13    SA 216.109.120.151    64.124.229.109     66.94.229.254   SA
    
 16 195.101.94.25   SA 212.23.37.13    SA 216.109.118.72  SA 64.241.242.243  SA 66.94.229.254   SA
    
 17 195.101.94.25   SA 212.23.37.13    SA 216.109.118.72  SA 64.241.242.243  SA 66.94.229.254   SA
    
 18 195.101.94.25   SA 212.23.37.13    SA 216.109.118.72  SA 64.241.242.243  SA 66.94.229.254   SA
    
 19 195.101.94.25   SA 212.23.37.13    SA 216.109.118.72  SA 64.241.242.243  SA 66.94.229.254   SA
    
 20 195.101.94.25   SA 212.23.37.13    SA 216.109.118.72  SA 64.241.242.243  SA 66.94.229.254   SA
    
    
    
    
    AI助手

Traceroute结果对象还有一个简洁特点:它们能够生成有向图结构,并按照AS进行分类处理。
生成图形时建议使用graphviz工具。
图形通常由ImageMagick展示。

复制代码
 >>> res, unans = traceroute(["www.microsoft.com","www.cisco.com","www.yahoo.com","www.wanadoo.fr","www.pacsec.com"],dport=[80,443],maxttl=20,retry=-2)

    
 Received 190 packets, got 190 answers, remaining 10 packets
    
    193.252.122.103:443 193.252.122.103:80 198.133.219.25:443 198.133.219.25:80  207.46...
    
 1  192.168.8.1         192.168.8.1        192.168.8.1        192.168.8.1        192.16...
    
 2  82.251.4.254        82.251.4.254       82.251.4.254       82.251.4.254       82.251...
    
 3  213.228.4.254       213.228.4.254      213.228.4.254      213.228.4.254      213.22...
    
 [...]
    
 >>> res.graph()                          # piped to ImageMagick's display program. Image below.
    
 >>> res.graph(type="ps",target="| lp")   # piped to postscript printer
    
 >>> res.graph(target="> /tmp/graph.svg") # saved to file
    
    
    
    
    AI助手

如果您安装了 VPython,则可支持生成 traceroute 的 3D 视觉效果。通过右键可旋转观察场景;通过中键可缩放视角;通过左键可平移观察位置。点击某个对象时其 IP 会显示/隐藏。按住 Ctrl 键单击某对象即可扫描本地机器上的端口 21、22、23、25、80 和 443 并显示结果:

复制代码
    >>> res.trace3D()
    
    AI助手

十四、Wireless frame 注入

有关在 Scapy 中使用 Monitor 模式的更多信息,请参阅疑难解答部分。

前提是您的无线网卡和驱动程序已正确配置为帧注入

复制代码
 $ iw dev wlan0 interface add mon0 type monitor

    
 $ ifconfig mon0 up
    
    
    
    
    AI助手

在 Windows 上,如果使用 Npcap,相当于调用:

复制代码
 >>> # Of course, conf.iface can be replaced by any interfaces accessed through conf.ifaces

    
 ... conf.iface.setmonitor(True)
    
    
    
    
    AI助手

你可以有一种 FakeAP:

复制代码
 >>> sendp(RadioTap()/

    
       Dot11(addr1="ff:ff:ff:ff:ff:ff",
    
             addr2="00:01:02:03:04:05",
    
             addr3="00:01:02:03:04:05")/
    
       Dot11Beacon(cap="ESS", timestamp=1)/
    
       Dot11Elt(ID="SSID", info=RandString(RandNum(1,50)))/
    
       Dot11EltRates(rates=[130, 132, 11, 22])/
    
       Dot11Elt(ID="DSset", info="\x03")/
    
       Dot11Elt(ID="TIM", info="\x00\x01\x00\x00"),
    
       iface="mon0", loop=1)
    
    
    
    
    AI助手

在不同的驱动程序配置下, 所需的工作帧注入接口的命令可能会因配置的不同而有所差异. 此外, 在示例中使用了...作为第一个伪层时,默认情况下可能需要将其替换为更复杂的...或者采用其他专有实现方式, 并且在这种情况下也可以选择完全移除该伪层.

全部评论 (0)

还没有任何评论哟~