链接地址: https://github.com/dhgdhg/Scapy-Note

十.传输层

10.1.TCP:scapy.layers.inet.TCP

Transmission Control Protocol

<details>
  • sport
    • Source port (16 bits)
    • 识别发送连接端口, 0-65535, 0-2^16-1
  • dport
    • Destination port (16 bits)
    • 识别接收连接端口, 0-65535, 0-2^16-1
    • 常见目的端口: FTP(20, 21), SSH(22), TELNET(23), SMTP(25), HTTP over SSL/TLS(443), HTTP(80)
  • seq
    • Sequence number (32 bits)
    • 如果SYN标志设置为1, 则这是初始序列号
    • 如果SYN标志设置为0, 则这是当前会话该段的第一个数据字节的累计序列号
  • ack
    • Acknowledgment number (32 bits)
    • 如果设置了ACK标志, 那么这个字段的值就是ACK发送者期望的下一个序列号
  • dataofs
    • Data offset (4 bits)
    • 从TCP段开始到实际数据的偏移量
  • reserved
    • Reserved (3 bits)
    • 供将来使用, 并应设为零.
  • flags
    • Flags (9 bits)
    • F: FIN, S: SYN, R: RST, P: PSH, A: ACK, U: URG, E: ECE, C: CWR
    • NS(1 bit):ECN-nonce -隐藏保护
    • CWR(1 bit):拥塞窗口减少(CWR)标志由发送主机设置, 表示它收到了设置了ECE标志的TCP段并在拥塞控制机制中作出了响应.
    • ECE(1 bit):ECN-Echo有双重作用, 取决于SYN标志的值. 这表明:
      • 如果SYN标志为1, 则TCP对等点是支持ECN的.
      • 如果SYN标志为0, 则表示在正常传输期间, IP报头中收到了一个设置了拥塞经历标志(ECN=11)的包
    • URG(1 bit): 表示紧急指针字段是有意义的
    • ACK(1 bit): 表示确认字段是有效的. 客户端发送的初始SYN包之后的所有包都应该设置此标志.
    • PSH(1 bit): Push函数. 请求将缓冲数据推送到接收应用程序.
    • RST(1 bit): 重置连接
    • SYN(1 bit): 同步序列号. 只有从每一端发送的第一个数据包才应该设置这个标志. 其他一些标志和字段会根据这个标志改变含义, 有些只有在设置时才有效, 有些在明确时才有效.
    • FIN(1 bit): 最后一个来自发送方的数据包
  • window
    • Window size (16 bits)
    • 接收窗口的大小, 它指定此段的发送方当前愿意接收的窗口大小单元的数量(默认情况下为字节)
  • chksum
    • Checksum (16 bits)
  • urgptr
    • Urgent pointer (16 bits)
    • 如果设置了URG标志, 那么这个16位字段就是表示最后一个紧急数据字节的序列号的偏移量
</details>

10.2.UDP:scapy.layers.inet.UDP

User Datagram Protocol

<details>
  • sport
    • Source port number(16 bits)
  • dport
    • Destination port number(16 bits)
  • len
    • Length(16 bits)
  • chksum
    • Checksum(16 bits)
</details>

10.3.ICMP:scapy.layers.inet.ICMP

Internet Control Message Protocol

<details>
  • type, code

    • ICMP type(8 bits)

    • ICMP subtype(8 bits)

    • Source quench

      如果路由器或主机没有足够的缓冲区空间来处理请求, 则可能生成此消息;如果路由器或主机缓冲区接近其极限, 则可能生成此消息.

      • type: 4
      • code: 0
      • 发送方使用IP报头和其他数据将应答与关联的请求匹配起来
    • Redirect

      重定向请求数据包, 告知主机最佳路线是通过另一个路由器

      • type: 5
      • code
        Code Description
        0 网络的重定向数据报
        1 主机的数据报重定向
        2 服务类型和网络的重定向数据报
        3 服务类型和主机的重定向数据报
    • Time exceeded

      通知丢弃的数据报的源, 因为ttl到零了. 如果主机未能在限定的时间内重新组装碎片数据报, 则也可以发送超时消息.

      • type: 11
      • code
        Code Description
        0 ttl传输超时
        1 超过碎片重新组装时间
    • Timestamp

      用于时间同步

      • type: 13
      • code: 0
      • 客户端可以使用id和seq来匹配时间戳应答和时间戳请求
      • ts_ori, ts_rx, ts_tx
        • Originate timestamp(32 bits)
          • 自午夜世界时(UT)开始的毫秒数, 如果UT引用不可用, 则可以将最有效位设置为非标准时间值
        • Receive timestamp(32 bits)
        • Transmit timestamp(32 bits)
      • id
        • Identifier(16 btis)
      • seq
        • Sequence number(16 btis)
    • Timestamp reply

      对时间戳(Timestamp)消息的回复

      • type: 14
      • code: 0
      • ts_ori, ts_rx, ts_tx
        • Originate timestamp(32 bits)
          • 发送方在发送消息之前最后接触消息的时间
        • Receive timestamp(32 bits)
          • echoer在接收时第一次触摸它的时间
        • Transmit timestamp(32 bits)
          • echoer在发送消息时最后一次触及消息的时间
      • id
        • Identifier(16 btis)
      • seq
        • Sequence number(16 btis)
    • Address mask request

      地址掩码请求通常由主机发送到路由器, 以获得适当的子网掩码. 收件人应使用地址掩码回复邮件来回复此邮件.

      • type: 17
      • code: 0
      • addr_mask: 可以设置为0
        • Address mask(32 bits)
      • id
        • Identifier(16 btis)
      • seq
        • Sequence number(16 btis)
      • ICMP地址掩码请求可以作为侦察攻击的一部分来收集目标网络上的信息, 因此ICMP地址掩码应答在Cisco IOS上是默认禁用的
    • Address mask reply

      地址掩码应答使用 适当的子网掩码 应答 地址掩码请求消息

      • type: 18
      • code: 0
      • addr_mask:
        • Address mask(32 bits)
        • 子网掩码
      • id
        • Identifier(16 btis)
      • seq
        • Sequence number(16 btis)
    • Destination unreachable

      通知客户端由于某种原因目的地不可到达

      • type: 3
      • code
        Code Description
        0 目标网络不可达
        1 目标主机不可达
        2 目标协议不可达
        3 目标端口不可达
        4 要求分段并设置DF flag标志
        5 源路由失败
        6 未知的目标网络
        7 未知的目标主机
        8 源主机隔离(作废不用)
        9 禁止访问的网络
        10 禁止访问的主机
        11 对特定的TOS 网络不可达
        12 对特定的TOS 主机不可达
        13 由于过滤 网络流量被禁止
        14 主机越权
        15 优先权终止生效
      • nexthopmtu
        • Next-hop MTU(16 bits)
        • 下一跳网络的MTU
        • MTU: 一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)
  • chksum

    • Checksum(16 bits)
  • gw

    • Gateway
  • ptr

  • reserved

  • length

  • unused

  • unused

</details>

10.4.函数

  • send(): 发送数据

    <details>
    • x: 发送的数据包
    • return_packets: 是否返回发送的数据包
    • count: 发送数量
    • inter: 发包时间间隔(s)
    • loop: True时循环发送, 不可与count同用
    • verbose: False时不返回"Sent 1 packets."
    • realtime: 在发送下一个包之前, 请检查当前是否已被发送
    • socket: 要使用的套接字(默认为conf.L3socket(kargs))
    • iface: 网络接口
    • monitor: monitor模式下发送(linux下此参数不可用)
    </details>
  • sr(): 发送数据, 并接收

    <details>
    • 返回: 响应数据包(发送包, 接收包)列表, 未响应数据包列表
    • pks: SuperSocket实例用于发送接收包
    • pkt: 用于发送的包
    • rcv_pks: 如果设置, 将代替pks来接收数据包. 数据包仍将通过pks发送
    • nofilter: 设为1以避免使用BPF过滤器
    • retry: 如果为正, 重新发送未应答的包retry次. 如果为负, 当再也没有包被应答时, retry次重新发送未应答的包.
    • timeout: 最后一个数据包发送后需要等待多长时间
    • verbose: 0, 1, 2 默认为2
    • multi: 接受同一请求的多个响应
    • store_unanswered: 是否存储未应答的数据包. 将其设置为False将加快速度, 并且将返回None作为unans列表
    • process: 如果指定, 则只存储process(pkt)的结果, 该函数应该遵循以下格式:lambda sent, received: (func(sent), func2(received))如果数据包没有得到回复, 则接收为空. 如果store_unanswered为False, 则不会对未应答的调用该函数.
    • prebuild: 在开始发送数据包之前预先构建它们. 当生成器作为包传递时自动启用
    </details>
  • sr1(): 发送数据, 并接收, 只返回一条数据包

    <details>
    • 返回: 响应数据包(发送包, 接收包)列表, 未响应数据包列表
    • pks: SuperSocket实例用于发送接收包
    • pkt: 用于发送的包
    • rcv_pks: 如果设置, 将代替pks来接收数据包. 数据包仍将通过pks发送
    • nofilter: 设为1以避免使用BPF过滤器
    • retry: 如果为正, 重新发送未应答的包retry次. 如果为负, 当再也没有包被应答时, retry次重新发送未应答的包.
    • timeout: 最后一个数据包发送后需要等待多长时间
    • verbose: 0, 1, 2 默认为2
    • multi: 接受同一请求的多个响应
    • store_unanswered: 是否存储未应答的数据包. 将其设置为False将加快速度, 并且将返回None作为unans列表
    • process: 如果指定, 则只存储process(pkt)的结果, 该函数应该遵循以下格式:lambda sent, received: (func(sent), func2(received))如果数据包没有得到回复, 则接收为空. 如果store_unanswered为False, 则不会对未应答的调用该函数.
    • prebuild: 在开始发送数据包之前预先构建它们. 当生成器作为包传递时自动启用
    </details>
  • srloop(): 循环发送一个数据包, 并打印响应