Python之scapy(1)基础使用

news2024/7/16 19:20:28

Python之scapy(1)基础使用


Author: Once Day Date: 2024年6月4日

一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…

漫漫长路,有人对你微笑过嘛…

全系列文章可参考专栏: Python开发_Once-Day的博客-CSDN博客

参考文章:

  • 数据包工具–Scapy基础篇-CSDN博客
  • Introduction — Scapy 2.6.0 documentation
  • Scapy API reference — Scapy 2.6.0 documentation
  • 介绍 · Scapy 中文文档 (gitbooks.io)
  • GitHub - secdev/scapy: Scapy: the Python-based interactive packet manipulation program & library.
  • Npcap: Windows Packet Capture Library & Driver
  • GitHub - mfontanini/libtins: High-level, multiplatform C++ network packet sniffing and crafting
    library.
  • PcapPlusPlus

文章目录

  • Python之scapy(1)基础使用
        • 1. 概述
          • 1.1 scapy介绍
          • 1.2 同类C/C++项目
          • 1.3 scapy优点
          • 1.4 下载和安装
        • 2. 使用方法
          • 2.1 进入scapy交互界面
          • 2.2 构建报文
          • 2.3 序列化和反序列化
          • 2.4 读取pcap文件
          • 2.5 单个报文查看命令
          • 2.6 报文集合
          • 2.7 报文发送方法(lsc()查看)
          • 2.8 模糊字段报文
          • 2.9 注入原始字节序列
          • 2.10 路由表配置
        • 3. 具体使用实例
          • 3.1 SYN扫描
          • 3.2 TCP traceroute路由追踪
          • 3.3 sniff嗅探
          • 3.4 ACK扫描
          • 3.5 wireshark和scapy联动

1. 概述
1.1 scapy介绍

Scapy是一个功能强大的交互式数据包处理程序,用Python编写。它能让用户发送、嗅探、解析和伪造网络数据包,此外还可以扫描、探测、攻击和发现网络。

在这里插入图片描述

根据Scapy官网的描述,它的主要特点包括:

  • 支持大量协议,可以轻松构建任意类型的数据包。
  • 强大的数据包嗅探和注入能力。
  • 可以对网络进行扫描、跟踪路由、probing、单元测试等。
  • 轻量快速,无需再编写底层代码。

Scapy的上述特性使它成为网络安全专业人士和研究人员常用的工具,可以方便地进行数据包捕获与分析、漏洞利用、IDS测试等任务。相比Wireshark等同类工具,Scapy更加灵活和可定制,用户可以通过Python脚本实现自动化的复杂任务。

该项目由Philippe Biondi发起,目前在GPL 2.0许可证下发布,支持Linux、macOS、Windows等主流平台,多年来持续活跃开发和维护,社区用户众多。

1.2 同类C/C++项目

在C/C++中,有一些库提供了类似于Scapy的功能,用于数据包的捕获、构造、发送和分析,以下是几个比较常用的库:

  • Libpcap/WinPcap,一个底层的数据包捕获库,提供了在各种操作系统上捕获网络流量的API。许多网络工具(如Wireshark)的基础,Libpcap用于Unix-like系统,而WinPcap用于Windows。

  • libtins,一个高级的C++网络数据包嗅探和制作库。封装了libpcap/WinPcap,提供了更加面向对象和易于使用的接口。libtins支持多种协议,并且可以在Linux、macOS、Windows等平台上使用。

  • Pcapplusplus,一个基于C++的多平台网络嗅探和数据包处理框架。封装了libpcap/WinPcap/DPDK等底层库,提供了简单易用的API用于捕获、构造和编辑网络数据包。

  • libcrafter,一个C++的高层网络数据包制作库,允许用户容易地创建和解码网络数据包,支持多种协议。libcrafter的目标是提供一个简单直观的接口用于快速网络数据包制作。

  • libnet,提供了构造和注入低层网络数据包的C库API。它支持多种协议,并且可以在多个Unix-like系统上使用。

这些库在功能上与Scapy有一些重叠,可以用于网络数据包的处理和分析,但是通常没有Scapy那样广泛的协议支持和高层次的交互式使用方式。

1.3 scapy优点

参考scapy官方文档:Download and Installation — Scapy 2.6.0 documentation

scapy作为Python库,使用起来非常方便,相比于GUI发包程序,可操作性更好:

  • 强大的交互式数据包处理能力,Scapy允许用户发送、嗅探、解析和伪造多种协议的网络数据包。用户可以轻松地进行扫描、traceroute、探测、单元测试、攻击或者网络发现等常见任务。它可以替代hping、arpspoof、arp-sk、arping、p0f,甚至部分替代Nmap、tcpdump和tshark的功能。

  • 灵活构建数据包,与其他网络工具不同,Scapy不局限于作者预设的固定功能,而是让用户可以灵活地构建任意类型的数据包。用户可以自由地设置每个字段的值,并按照需要堆叠协议层。Scapy采用Python语法作为数据包描述的DSL,使得描述数据包非常简洁和强大。

  • 丰富的探测信息,使用Scapy进行网络探测时,它会提供探测过程中发送的所有数据包以及收到的所有响应,而不是解释后的结果。这样用户就可以从不同角度来分析这些原始数据,挖掘出所需的信息,同一组数据可以被多次利用,而无需重新探测。

  • 解码而非解释,许多网络工具试图对收到的响应进行解释,而不是仅仅解码呈现事实,这种做法容易带来理解偏差。Scapy坚持对响应解码而不解释,给出事实,把解释的工作留给用户来做,这避免了信息的丢失。

  • 合理的默认值,Scapy为数据包字段提供了合理的默认值,用户可以不必每次都去设置。比如发送IP包时,源地址可以根据路由表自动选择,校验和会被自动计算,MAC地址会根据出口网卡选择,传输层和网络层的协议类型会根据上层协议确定。

1.4 下载和安装

参考scapy官方文档:Download and Installation — Scapy 2.6.0 documentation

根据Scapy文档的Download and Installation部分,Scapy的下载和安装流程可以总结如下:

(1) 安装Python 3.7+,scapy新版本需要再3.7以上的python版本运行,旧版本支持情况如下:

Scapy version2.3.32.5.0>2.5.0
Python 2.2-2.6
Python 2.7
Python 3.4-3.6
Python 3.7-3.11

(2) 下载并安装Scapy,可以选择最新发布版本或当前开发版本,Scapy需要以root权限运行:

  • 最新发布版本可以直接用pip安装:
    $ pip install scapy
    
  • 当前开发版本需要先从GitHub克隆代码仓库,再用pip安装:
    $ git clone https://github.com/secdev/scapy.git
    $ cd scapy
    $ pip install .
    

(3) 根据平台的不同,安装一些依赖:

  • Linux,安装libpcap,确保内核选择了Packet sockets(CONFIG_PACKET)等选项。
  • Mac OS X,建议安装libpcap,可以通过Homebrew或MacPorts安装。
  • OpenBSD,建议安装libpcap。
  • Windows,需要安装Npcap。

(4) (可选)安装一些可选的依赖以启用特殊功能,主要通过pip安装:

(4.1) Matplotlib,用于绘图(plot()),下面是嗅探一段时间内的报文,并且按照报文顺序和长度关系打印图表:

>>> p=sniff(count=100)
>>> p
<Sniffed: TCP:80 UDP:5 ICMP:6 Other:9>
>>> p.plot(lambda x:len(x))
[<matplotlib.lines.Line2D at 0x181881d0c50>]

在这里插入图片描述

(4.2) PyX,用于2D图形(psdump()、pdfdump()) ,以PDF格式输出(通过LaTeX实现,需要安装texlive(Unix)和MikTex(Windows)):

  • Home (miktex.org)
  • TeX Live - TeX Users Group (tug.org)
>>> p=sniff(count=10)
>>> p.pdfdump(filename="py-test.pdf")

可以生成数据包的十六进制和网络协议字段的对比图,如下(Windows下不要用管理员shell运行,会触发错误):

在这里插入图片描述

(4.3) 生成jpg图片,需要安装Graphviz和ImageMagick,通过官网文档进行安装。

(4.4) 生成3D视图,需要安装VPython-Jupyter,通过pip install vpython直接安装。

(4.4) Cryptography,用于WEP解密和PKI操作等,后续再说。

(4.5) Nmap,用于指纹识别(nmap_fp())

(4.6) SoX,用于VOIP(voip_play())

(5) (可选)可以离线构建文档,包括HTML版本的文档和UML图,需要安装Sphinx和pylint等工具。

2. 使用方法
2.1 进入scapy交互界面

在scapy根目录或者PATH环境变量中含有scapy可执行文件的情况下,直接在命令行下输入以下命令:

ubuntu->~:$ scapy
                                      
                     aSPY//YASa       
             apyyyyCY//////////YCa       |
            sY//////YSpcs  scpCY//Pp     | Welcome to Scapy
 ayp ayyyyyyySCP//Pp           syY//C    | Version 2.5.0
 AYAsAYYYYYYYY///Ps              cY//S   |
         pCCCCY//p          cSSps y//Y   | https://github.com/secdev/scapy
         SPPPP///a          pP///AC//Y   |
              A//A            cyP////C   | Have fun!
              p///Ac            sC///a   |
              P////YCpc           A//A   | Craft packets before they craft
       scccccp///pSP///p          p//Y   | you.
      sY/////////y  caa           S//P   |                      -- Socrate
       cayCyayP//Ya              pY/Ya   |
        sY/PsY////YCc          aC//Yp 
         sc  sccaCY//PCypaapyCP//YSs  
                  spCPY//////YPSps    
                       ccaacs         
                                      
>>> IP()
<IP  |>
>>> _.show()
###[ IP ]### 
  version   = 4
  ihl       = None
  tos       = 0x0
  len       = None
  id        = 1
  flags     = 
  frag      = 0
  ttl       = 64
  proto     = hopopt
  chksum    = None
  src       = 127.0.0.1
  dst       = 127.0.0.1
  \options   \
2.2 构建报文

scapy构建一个报文非常容易,如下所示:

# 通过报文对应类型类实例化构建, 只填写必要参数
>>> a=IP(src="2.2.2.2", ttl=188)
>>> a
<IP  ttl=188 src=2.2.2.2 |>
# 报文字段直接通过成员来访问
>>> a.src
'2.2.2.2'
# 通过dir(a)可以查看支持的成员方法和函数
>> dir(a)
......
# 可以删除对应的成员, 字段就恢复到默认值
>>> del(a.src)
>>> a
<IP  ttl=188 |>
# 多个协议的报文可以按照如下方式拼接
>>> p = Ether()/IP()/TCP()
>>> p
<Ether  type=IPv4 |<IP  frag=0 proto=tcp |<TCP  |>>>

以下是Scapy支持的常见报文类型总结(实际支持的协议更多,无法完整列出):

函数名报文层次报文协议描述
Ether数据链路层以太网帧
Dot1Q数据链路层802.1Q VLAN 标签
ARP网络层地址解析协议
IP网络层IPv4 协议
IPv6网络层IPv6 协议
TCP传输层传输控制协议
UDP传输层用户数据报协议
ICMP网络层互联网控制消息协议
DHCP应用层动态主机配置协议
DNS应用层域名系统

Scapy有个特性被称为"层间组合"或"层间重载",允许使用 / 操作符将两个或多个层组合在一起,形成一个新的复合报文。

当使用 / 操作符组合两个层时,上层可以覆盖下层的一个或多个默认字段。这意味可以在组合层时,根据上层的信息来自动填充或修改下层的某些字段,而无需手动设置。

例如,当组合 IP 层和 TCP 层时,可以这样写:

packet = IP(dst="10.0.0.1")/TCP(dport=80)

在这个例子中,创建了一个 IP 报文,目标地址为 “10.0.0.1”,然后在其上叠加了一个 TCP 报文,目标端口为 80。这里,TCP 层的源端口字段会自动根据 IP 层的源地址进行计算和填充。

还可以在组合层时手动指定字段的值,覆盖默认的行为,例如:

packet = IP(dst="10.0.0.1")/TCP(sport=1024, dport=80)

这里,手动指定了 TCP 层的源端口为 1024,而不是使用默认的自动计算值。

除了使用 Scapy 内置的协议层,还可以使用字符串作为原始层(raw layer),原始层允许在报文中添加任意的字节序列,例如:

packet = IP(dst="10.0.0.1")/TCP(dport=80)/"GET /index.html HTTP/1.1\r\n\r\n"

在这个例子中,在 TCP 层之后添加了一个原始层,其中包含了一个 HTTP GET 请求的字节序列。

2.3 序列化和反序列化

scapy可以在字节流和报文实例类之间流畅切换,如下所示:

>>> ip = IP(src="2.2.2.2", ttl=188)
# 生成原始字节流
>>> raw(ip)
b'E\x00\x00\x14\x00\x01\x00\x00\xbc\x00{\xe4\x02\x02\x02\x02\x7f\x00\x00\x01'
# 从原始字节流生成IP报文实例
>>> IP(_)
<IP  version=4 ihl=5 tos=0x0 len=20 id=1 flags= frag=0 ttl=188 proto=ip chksum=0x7be4 src=2.2.2.2 dst=127.0.0.1 |> 

下面是一个更加复杂的实例展示:

>>> a=Ether()/IP(dst="www.slashdot.org")/TCP()/"GET /index.html HTTP/1.0 \n\n"                                            
>>> hexdump(a)
0000  6C B1 58 61 54 AA 02 11 11 11 11 11 08 00 45 00  l.XaT.........E.
0010  00 43 00 01 00 00 40 06 2D 54 C0 A8 00 66 68 12  .C....@.-T...fh.
0020  24 40 00 14 00 50 00 00 00 00 00 00 00 00 50 02  $@...P........P.
0030  20 00 70 51 00 00 47 45 54 20 2F 69 6E 64 65 78   .pQ..GET /index
0040  2E 68 74 6D 6C 20 48 54 54 50 2F 31 2E 30 20 0A  .html HTTP/1.0 .        
0050  0A                                               .                                                                  
>>> b=raw(a)
>>> b
b'l\xb1XaT\xaa\x02\x11\x11\x11\x11\x11\x08\x00E\x00\x00C\x00\x01\x00\x00@\x06-T\xc0\xa8\x00fh\x12$@\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00pQ\x00\x00GET /index.html HTTP/1.0 \n\n'
>>> c=Ether(b)
>>> c
<Ether  dst=6c:b1:58:61:54:aa src=02:11:11:11:11:11 type=IPv4 |<IP  version=4 ihl=5 tos=0x0 len=67 id=1 flags= frag=0 ttl=64 proto=tcp chksum=0x2d54 src=192.168.0.102 dst=104.18.36.64 |<TCP  sport=ftp_data dport=http seq=0 ack=0 dataofs=5 reserved=0 flags=S window=8192 chksum=0x7051 urgptr=0 |<Raw  load=b'GET /index.html HTTP/1.0 \n\n' |>>>>
2.4 读取pcap文件

scapy可以非常方便的读取和写入pcap文件,如下:

>>> a=rdpcap("/spare/captures/isakmp.cap")
>>> a
<isakmp.cap: UDP:721 TCP:0 ICMP:0 Other:0>
2.5 单个报文查看命令

scapy支持以下的命令,可以方便的查看报文情况:

CommandEffect
raw(pkt)assemble the packet
hexdump(pkt)have a hexadecimal dump
ls(pkt)have the list of fields values
pkt.summary()for a one-line summary
pkt.show()for a developed view of the packet
pkt.show2()same as show but on the assembled packet (checksum is calculated, for instance)
pkt.sprintf()fills a format string with fields values of the packet
pkt.decode_payload_as()changes the way the payload is decoded
pkt.psdump()draws a PostScript diagram with explained dissection
pkt.pdfdump()draws a PDF with explained dissection
pkt.command()return a Scapy command that can generate the packet
pkt.json()return a JSON string representing the packet
2.6 报文集合

scapy也可以使用范围表达式,快速构建具有指定规律的报文集合:

# 构建连续报文集合
>>> s = IP(ttl=(32,36))
>>> s
<IP  ttl=(32, 36) |>
>>> [p for p in s]
[<IP  ttl=32 |>,
 <IP  ttl=33 |>,
 <IP  ttl=34 |>,
 <IP  ttl=35 |>,
 <IP  ttl=36 |>]
#构建指定报文集合
>>> s = IP(ttl=[32,36])
>>> s
<IP  ttl=[32, 36] |>
>>> [p for p in s]
[<IP  ttl=32 |>,
 <IP  ttl=36 |>]
# 可以转换为报文列表
>>> p = PacketList(s)
>>> p
<PacketList: TCP:0 UDP:0 ICMP:0 Other:2>
>>> p.nsummary()
0000 127.0.0.1 > 127.0.0.1 ip
0001 127.0.0.1 > 127.0.0.1 ip

常见的报文列表有如下的操作方法:

CommandEffect
summary()displays a list of summaries of each packet
nsummary()same as previous, with the packet number
conversations()displays a graph of conversations
show()displays the preferred representation (usually nsummary())
filter()returns a packet list filtered with a lambda function
hexdump()returns a hexdump of all packets
hexraw()returns a hexdump of the Raw layer of all packets
padding()returns a hexdump of packets with padding
nzpadding()returns a hexdump of packets with non-zero padding
plot()plots a lambda function applied to the packet list
make_table()displays a table according to a lambda function
2.7 报文发送方法(lsc()查看)

通过lsc可以查看scapy常见的函数方法,如下:

>>> lsc()
IPID_count            : Identify IP id values classes in a list of packets
arp_mitm              : ARP MitM: poison 2 target's ARP cache
arpcachepoison        : Poison targets' ARP cache
arping                : Send ARP who-has requests to determine which hosts are up::
arpleak               : Exploit ARP leak flaws, like NetBSD-SA2017-002.
bind_layers           : Bind 2 layers on some specific fields' values.
...

下面是 Scapy 中几个常用的发包函数及其描述,这些函数可以根据不同的需求来选择使用,例如是否需要等待响应、是否在第二层发送报文等。

函数名描述
send(packet, [options])发送单个报文,不等待响应
sendp(packet, [options])发送单个报文,在第二层(数据链路层)发送,不等待响应
sr(packet, [options])发送单个报文,等待接收响应,返回一对 (发送报文, 接收报文)
sr1(packet, [options])发送单个报文,等待接收响应,仅返回接收到的第一个响应报文
srp(packet, [options])在第二层(数据链路层)发送单个报文,等待接收响应,返回一对 (发送报文, 接收报文)
srp1(packet, [options])在第二层(数据链路层)发送单个报文,等待接收响应,仅返回接收到的第一个响应报文
sendrcv(packet, [options])发送单个报文,等待接收响应,返回一对 (发送报文, 接收报文),与 sr() 类似
srloop(packet, [options])重复发送报文,等待接收响应,返回一对 (发送报文, 接收报文),直到达到指定的条件
srploop(packet, [options])在第二层(数据链路层)重复发送报文,等待接收响应,返回一对 (发送报文, 接收报文),直到达到指定的条件

Scapy 的 sr 函数族是发送和接收数据包的核心功能,其中最常用的是 srsr1srp 等函数。它们可以发送数据包并接收响应,返回一个由两个列表组成的元组:第一个列表包含成功收到响应的数据包对(发送的数据包和对应的响应),第二个列表包含未收到响应的数据包。

sr 函数用于发送第三层数据包(如 IP、ARP 等),并返回所有收到的响应。sr1 函数是 sr 的变体,只返回第一个收到的响应数据包。类似地,srp 函数用于发送第二层数据包(如 Ethernet、802.3 等)。如果在超时时间内没有收到响应,相应的响应数据包将被设置为 None

这些 “send’n’receive” 函数返回的两个列表被封装在一个对象中,以提供更好的表示和一些常用的方法。通过这个对象,可以方便地访问发送的数据包、收到的响应以及未响应的数据包。

在发送数据包时,可以通过设置 inter 参数来指定两个数据包之间的发送间隔(以秒为单位),以限制发送速率。如果出现数据包丢失或发送间隔不足的情况,可以通过设置 retry 参数来重新发送未响应的数据包。例如,retry=3 表示 Scapy 将尝试重新发送未响应数据包 3 次。如果设置 retry=-3,则表示 Scapy 将不断重新发送未响应数据包,直到连续 3 次没有收到同一组未响应数据包的响应为止。timeout 参数用于指定发送完最后一个数据包后等待响应的时间。

下面是一个使用 srp 函数发送 ARP 请求的示例:

from scapy.all import *

# 构造 ARP 请求数据包
arp_request = Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.1.0/24")

# 发送 ARP 请求并接收响应
ans, unans = srp(arp_request, timeout=2, retry=2)

# 处理响应结果
for sent, received in ans:
    print(f"收到 {received.psrc} 的 ARP 响应")

print(f"未收到响应的 IP 地址:{unans.summary()}")

在这个例子中,构造了一个 ARP 请求数据包,目标地址为 “192.168.1.0/24” 网段的所有主机。然后,使用 srp 函数发送 ARP 请求并接收响应,设置超时时间为 2 秒,重试次数为 2 次。

通过遍历 ans 列表,可以获取每个收到响应的 IP 地址。同时,通过访问 unans 列表,可以获取未收到响应的 IP 地址。

2.8 模糊字段报文

Scapy 的 fuzz() 函数是一个用于对数据包进行模糊测试的强大工具。它可以自动将指定层中的默认字段值替换为随机生成的值,同时保持字段的类型和约束条件。这使得我们能够方便地构造出大量的随机测试数据包,并将其发送到目标系统,以测试其鲁棒性和安全性。

>>> a=fuzz(IP())
>>> a
<IP  |>
>>> a.show()
###[ IP ]###
  version   = <RandNum>           
  ihl       = None
  tos       = <RandByte>
  len       = None
  id        = <RandShort>
  flags     = 2
  frag      = <RandNum>
  ttl       = <RandByte>                 
  proto     = <RandByte>                 
  chksum    = None                 
  src       = 127.0.0.1
  dst       = 127.0.0.1
  \options   \

>>> a.show2()
###[ IP ]###
  version   = 4                
  ihl       = 5                
  tos       = 0x55                 
  len       = 20                 
  id        = 51216                
  flags     =
  frag      = 2557
  ttl       = 248
  proto     = 122
  chksum    = 0xf20a
  src       = 127.0.0.1
  dst       = 127.0.0.1
  \options   \

>>> a.show2()
###[ IP ]###
  version   = 4
  ihl       = 5
  tos       = 0x4f
  len       = 20
  id        = 16737
  flags     = evil
  frag      = 1849
  ttl       = 122                
  proto     = 168                
  chksum    = 0x7956
  src       = 127.0.0.1
  dst       = 127.0.0.1
  \options   \

fuzz() 函数的主要特点包括:

  1. 自动随机化指定层中的默认字段值,同时保持字段的类型和约束条件。
  2. 智能处理特殊字段,如校验和字段,确保生成的测试数据包在语法和格式上正确。
  3. 可以对数据包的特定层或字段进行部分模糊处理,灵活控制随机化的范围。
  4. 在 IP 层使用 fuzz() 函数时,源地址和目标地址字段默认不会被随机化,可以使用 RandIP() 函数来生成随机的 IP 地址。

通过合理使用 fuzz() 函数,可以快速构建大量的随机测试数据包,并全面评估目标系统的可靠性和安全性,发现潜在的漏洞和问题。

2.9 注入原始字节序列

Scapy 提供了一个名为 RawVal 的特性,用于在数据包中注入任意字节序列,而无需考虑字段的类型限制。这在开发概念验证(PoC)或测试非标准行为时非常有用。

通常,数据包中的每个字段都有特定的类型,例如 IP 数据包的长度字段 len 期望接收一个整数值。然而,在某些情况下,可能需要注入一些不符合该类型的值。这时,就可以使用 RawVal 来实现。

RawVal 允许将任意的字节序列作为字段的值,绕过 Scapy 的类型检查和自动转换机制。这样就可以灵活地构造出包含特定字节序列的数据包,用于测试目标系统对非标准或异常输入的处理能力。

使用 RawVal 非常简单,只需将目标字节序列作为参数传递给 RawVal 函数,然后将返回的对象赋值给相应的字段即可。Scapy 会将该字节序列原样插入到数据包中,不做任何类型转换或检查。

>>> pkt = IP(len=RawVal(b"NotAnInteger"), src="127.0.0.1")
>>> bytes(pkt)
b'H\x00NotAnInt\x0f\xb3er\x00\x01\x00\x00@\x00\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00'
2.10 路由表配置

scapy有自己的路由表,可以自行配置路由,从将报文发送给目标接口和主机:

# 查看当前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
3. 具体使用实例
3.1 SYN扫描

通过TCP扫描80端口:

>>> sr1(IP(dst="72.14.207.99")/TCP(dport=80,flags="S"))

通过TCP扫描440~443之间的TCP端口:

>>> sr(IP(dst="192.168.1.1")/TCP(sport=666,dport=(440,443),flags="S"))

显示时,可以使用lambda表达式自定义打印,如下:

>>> ans.summary( lambda s,r: r.sprintf("%TCP.sport% \t %TCP.flags%") )
440      RA
441      RA
442      RA
https    SA

还可以制作表格打印:

>>> ans.make_table(
   lambda s,r: (s.dst, s.dport,
   r.sprintf("{TCP:%TCP.flags%}{ICMP:%IP.src% - %ICMP.type%}")))
    66.35.250.150                192.168.1.1 216.109.112.135
22  66.35.250.150 - dest-unreach RA          -
80  SA                           RA          SA
443 SA                           SA          SA

也可以使用过滤函数从大量数据中挑选关键数据:

>>> ans.filter(lambda s,r: TCP in r and r[TCP].flags&2).make_table(lambda s,r:
            (s.dst, s.dport, "X"))
    66.35.250.150 192.168.1.1 216.109.112.135
80  X             -           X
443 X             X           X
3.2 TCP traceroute路由追踪

下面是一个典型的TCP路由追踪操作:

>>> ans, unans = sr(IP(dst="baidu.com", ttl=(1,20),id=RandShort())/TCP(flags=0x2))
Begin emission:
Finished sending 20 packets.
...*...*.....*...........*...........................
Received 53 packets, got 4 answers, remaining 16 packets
>>> for snd,rcv in ans:
...:     print(snd.ttl, rcv.src, isinstance(rcv.payload, TCP))
...: 
1 192.168.0.1 False
2 192.168.1.1 False
3 100.64.0.1 False
4 39.156.27.1 False
3.3 sniff嗅探

scapy可以非常简单的去抓取报文,就像tcpdump和wireshark一样:

>>> a = sniff(filter="icmp", count=2)
>>> a
<Sniffed: TCP:0 UDP:0 ICMP:2 Other:0>
>>> a.nsummary()
0000 Ether / IP / ICMP 192.168.0.102 > 47.112.110.79 echo-request 0 / Raw
0001 Ether / IP / ICMP 47.112.110.79 > 192.168.0.102 echo-reply 0 / Raw
3.4 ACK扫描

TCP ACK扫描的原理是向目标主机的端口发送带有ACK标志的TCP数据包,通过分析目标主机的响应,可以判断端口的状态:

  • 如果收到RST响应,说明端口是关闭的。
  • 如果没有收到任何响应或收到ICMP不可达错误,说明端口可能被防火墙过滤。
  • 如果收到其他响应(如SYN/ACK),则表明端口可能处于打开状态。

使用Scapy进行TCP ACK扫描的基本步骤如下:

  • 创建一个IP数据包,目标地址为要扫描的主机。
  • 在IP数据包上叠加一个TCP数据包,设置ACK标志位,目标端口为要测试的端口。
  • 发送构造的数据包,并捕获响应。
  • 根据收到的响应判断端口状态。
from scapy.all import *

def ack_scan(host, port):
    ack_pkt = IP(dst=host)/TCP(dport=port, flags='A')
    resp = sr1(ack_pkt, timeout=1, verbose=0)
    
    if resp is None:
        print(f"{host}:{port} is filtered or silently dropped.")
    elif resp.haslayer(TCP) and resp.getlayer(TCP).flags == 0x4: 
        print(f"{host}:{port} is closed.")
    else:
        print(f"{host}:{port} is open or unfiltered.")

# 扫描192.168.1.1的80端口
ack_scan('192.168.1.1', 80)
3.5 wireshark和scapy联动

在安装了wireshark的设备上,可以直接将scapy捕捉的报文在wireshark上展示,如下:

# First, generate some packets...
>>> packets = IP(src="192.0.2.9", dst=Net("192.0.2.10/30"))/ICMP()

# Show them with Wireshark
>>> wireshark(packets)






Alt

Once Day

也信美人终作土,不堪幽梦太匆匆......

如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!

(。◕‿◕。)感谢您的阅读与支持~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1843508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CDGA认证一年考几次?重点考哪些内容?考试费用贵吗?

CDGA认证一年考四次。具体的考试日期通常安排在3月、6月、9月和12月的周末&#xff0c;但具体日期可通过联系DAMA中国或授权培训机构进行确认。 CDGA重点考试内容 关于考试的重点内容&#xff0c;CDGA认证主要考察考生对数据治理的相关知识和技能&#xff0c;考试内容主要涉及…

医学图像预处理之z分数归一化

在医学图像处理中&#xff0c;Z分数标准化&#xff08;Z-score normalization&#xff09;是一种常用的数据标准化方法&#xff0c;其目的是将数据集中的每个图像像素值转换为具有均值为0和标准差为1的标准化值。这种标准化方法有助于改善图像的质量&#xff0c;便于后续图像处…

【有趣分享】火柴人VS数学

今天看到一个很有趣的视频&#xff0c;是火柴人VS数学&#xff0c;大家感兴趣的可以看一下&#xff1a; 火柴人 VS 数学(Math)https://www.bilibili.com/festival/jzj2023?bvidBV1ph4y1g75E&spm_id_from333.337.search-card.all.click

易基因:MeRIP-seq等揭示RNA m6A去甲基化酶调控植物雄性不育的分子机制 | 科研速递

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 水稻是全球重要的农作物&#xff0c;也是单子叶植物模型。在水稻中&#xff0c;N6-甲基腺苷&#xff08;m6A&#xff09;mRNA修饰对植物的发育和胁迫响应至关重要。OsFIP37作为m6A甲基化…

Hive笔记-2

第 3 章 DDL (Data Definition Language) 数据定义 DDL数据定义语言 DML数据操作语言 3.1 数据库 (database) 3.1.1 创建数据库 1) 语法 CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_…

【数学建模】——【新手小白到国奖选手】——【学习路线】

专栏&#xff1a;数学建模学习笔记 目录 ​编辑 第一阶段&#xff1a;基础知识和工具 1.Python基础 1.学习内容 1.基本语法 2.函数和模块 3.面向对象编程 4.文件操作 2.推荐资源 书籍&#xff1a; 在线课程&#xff1a; 在线教程&#xff1a; 2.数学基础 1.学习内…

Transformer学习理解

1.前言 本文介绍当下人工智能领域的基石与核心结构模型——Transformer&#xff0c;为什么说它是基石&#xff0c;因为以ChatGPT为代表的聊 天机器人以及各种有望通向AGI&#xff08;通用人工智能&#xff09;的道路上均在采用的Transformer。 Transformer也是当下NLP任…

API接口测试要注意什么?API接口如何开发?

API接口怎么保证数据安全&#xff1f;如何安全调用邮件API接口&#xff1f; API接口不仅能够确保系统的稳定性和可靠性&#xff0c;还能提高开发效率和用户满意度。然而&#xff0c;要进行有效的API接口测试&#xff0c;需要注意多个方面。AokSend将介绍一些关键点&#xff0c…

【云原生】Kubernetes----Metrics-Server组件与HPA资源

目录 引言 一、概述 &#xff08;一&#xff09;Metrics-Server简介 &#xff08;二&#xff09;Metrics-Server的工作原理 &#xff08;三&#xff09;HPA与Metrics-Server的作用 &#xff08;四&#xff09;HPA与Metrics-Server的关系 &#xff08;五&#xff09;HPA与…

百万级 QPS 接入层网关架构方案演进

文章目录 前言1、单机架构2、DNS 轮询3、Nginx 单机4、Nginx 主备 Keepalived5、LVS 主备 Keepalived Nginx 集群6、LVS 主备 Keepalived Nginx 集群 DNS 轮询 前言 随着PC、移动互联网的快速发展&#xff0c;越来越多的人通过手机、电脑、平板等设备访问各种各样APP、网…

pdf只要前几页,pdf怎么只要前几页

在现代办公和学习环境中&#xff0c;PDF文件已成为我们日常处理信息的重要工具。然而&#xff0c;有时我们并不需要整个PDF文件的内容&#xff0c;而只是其中的几页。那么&#xff0c;如何高效地提取PDF文件中的特定页面呢&#xff1f;本文将为您介绍几种实用的方法。 打开 “ …

阿里CEO个人投资的智驾公司,走了不一样的路

佑驾创新在去年8月和11月完成两轮融资&#xff0c;在今年5月底递表港交所&#xff0c;目前拿到了29家车企88款车型的量产订单。自动驾驶赛道不缺明星&#xff0c;这些因素本不足以凸显它的差异化。但是在招股书中&#xff0c;一条特殊的发展路线&#xff0c;却让佑驾创新显得不…

搭建开发模式下的以太坊私有链【Geth:1.14.5】

一、为什么用到私有链&#xff1f; 在以太坊的公有链上部署智能合约、发起交易需要花费以太币。而通过修改配置&#xff0c;可以在本机搭建一套以太坊私有链&#xff0c;因为与公有链没关系&#xff0c;既不用同步公有链庞大的数据&#xff0c;也不用花钱购买以太币&#xff0…

2024GLEE生活暨教育(上海)博览会,8月20-22日,国家会展中心(上海)

2024GLEE生活暨教育(上海)博览会将于8月20-22日在中国国家会展中心&#xff08;上海&#xff09;举行&#xff0c;博览会总面积近万平方米&#xff0c;设有美好生活和教育产品两大主力展区&#xff0c;全面覆盖婴幼儿、学龄前、小学、初中、高中、大学、中年、老年各个年龄段的…

2024年了,上大学可以不需要用到电脑吗?

前言 在2024年的今天&#xff0c;电脑已经成为了人们工作生活的一大部分。Oh, no&#xff01;好像手机才是。 好像每个人都是这样的&#xff1a;可以没有电脑&#xff0c;但不能没有手机…… 所以2024年的今天&#xff0c;上大学的小伙伴们可以不需要用到电脑吗&#xff1f;…

DDMA信号处理以及数据处理的流程---cfar检测

Hello,大家好,我是Xiaojie,好久不见,欢迎大家能够和Xiaojie一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程,本系列文章将从目标生成、信号仿真、测距、测速、cfar检测、测角、目标聚类、目标跟踪这几个模块逐步介绍,这个系列的…

SpringBoot 实现全局异常处理

为什么要使用全局异常处理&#xff1f; 减少冗余代码&#xff1a; 在不使用全局异常处理器的情况下&#xff0c;项目中各层可能会出现大量的try {…} catch {…} finally {…}代码块&#xff0c;这些代码块不仅冗余&#xff0c;还影响代码的可读性。全局异常处理器允许我们在一…

第二十五篇——信息加密:韦小宝说谎的秘诀

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 加密这件事&#xff0c;对于这个时代的我们来说非常重要&#xff0c;那么…

数据分析中的数学:从基础到应用20240617

数据分析中的数学&#xff1a;从基础到应用 数据分析离不开数学的支持&#xff0c;统计学和概率论是其重要组成部分。本文将通过几个具体的实例&#xff0c;详细讲解数据分析中常用的数学知识&#xff0c;并通过Python代码演示如何应用这些知识。 1. 描述性统计 基本概念和用…

java学习--集合(大写二.2)

看尚硅谷视频做的笔记 2.collection接口及方法 jdk8里有一些默认的方法&#xff0c;更多的是体现的是一种规范&#xff0c;规范更多关注的是一些抽象方法。 看接口里面的抽象方法&#xff0c;选一个具体的实现类。 测试collection的方法&#xff0c;存储一个一个数据都有哪些…