链接地址: https://github.com/dhgdhg/Scapy-Note
十.传输层
10.1.TCP:scapy.layers.inet.TCP
<details>Transmission Control Protocol
- 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位字段就是表示最后一个紧急数据字节的序列号的偏移量
10.2.UDP:scapy.layers.inet.UDP
<details>User Datagram Protocol
- sport
- Source port number(16 bits)
- dport
- Destination port number(16 bits)
- len
- Length(16 bits)
- chksum
- Checksum(16 bits)
10.3.ICMP:scapy.layers.inet.ICMP
<details>Internet Control Message Protocol
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)
- Originate 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在发送消息时最后一次触及消息的时间
- Originate timestamp(32 bits)
- 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
10.4.函数
<details>send()
: 发送数据- x: 发送的数据包
- return_packets: 是否返回发送的数据包
- count: 发送数量
- inter: 发包时间间隔(s)
- loop: True时循环发送, 不可与count同用
- verbose: False时不返回"Sent 1 packets."
- realtime: 在发送下一个包之前, 请检查当前是否已被发送
- socket: 要使用的套接字(默认为conf.L3socket(kargs))
- iface: 网络接口
- monitor: monitor模式下发送(linux下此参数不可用)
sr()
: 发送数据, 并接收
- 返回: 响应数据包(发送包, 接收包)列表, 未响应数据包列表
- 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: 在开始发送数据包之前预先构建它们. 当生成器作为包传递时自动启用
sr1()
: 发送数据, 并接收, 只返回一条数据包
- 返回: 响应数据包(发送包, 接收包)列表, 未响应数据包列表
- 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: 在开始发送数据包之前预先构建它们. 当生成器作为包传递时自动启用
srloop()
: 循环发送一个数据包, 并打印响应