数据包处理利器—Scapy高级使用(一)
番茄系统家园 · 2022-04-01 03:20:14

主机探测
TCP SYN Ping
- 发送仅设置了SYN的空TCP数据包。
- SYN/ACK或RST响应表示机器已启动并正在运行。
TCP ACK Ping
- 发送仅设置了ACK位的空TCP数据包。
- 未经请求的ACK数据包应通过RST进行响应,RST显示一台机器。
- SYN-ping和ACK-ping看起来可能是多余的,但是大多数无状态防火墙不会过滤未经请求的ACK数据包,所以最好同时使用这两种ping技术。
UDP Ping
- 将UDP数据包发送给给定的端口(无论是否带有有效载荷),协议特定的有效载荷会使扫描更加有效。
- 选择最有可能关闭的端口(开放的UDP端口可能会收到空数据包,但会忽略它们)。
- ICMP端口不可达表示机器是启动的。
ARP Ping
- 在同一网络/ LAN上探测存活主机时,可以使用ARP Ping。
- 更快,更可靠,因为它仅通过ARP在第2层上运行。
- ARP是任何第2层通信的骨干协议
由于在 IPv6 中没有 ARP协议,所以在 IPv6 上层定义了 NDP 协议实现 ARP的地址解析,冲突地址检测等功能以及IPV6的邻居发现功能。
ICMP Ping
- ICMP扫描涉及无处不在的_ping程序_发送的标准数据包。
- 向目标IP发送一个ICMP类型8(回显请求)数据包,收到一个ICMP类型0(回显应答)的包表示机器存活。
- 现在许多主机和防火墙阻止这些数据包,因此基本的ICMP扫描是不可靠的。
- ICMP还支持时间戳请求和地址掩码请求,可以显示计算机的可用性。
服务发现(端口扫描)
TCP连接扫描
找了个网图( 侵删)

这里展示一下tcpdump抓到的握手包
IP与端口号之间以'.'分隔,ACK用'.'表示,SYN用'S'表示,而[S.]则表示SYN+ACK
在Scapy中制作三次握手包
第1步-将客户端的SYN发送到侦听服务器
- 使用源IP地址和目标IP地址制作一个IP头。
- 制作一个TCP标头,在其中生成TCP源端口,设置服务器侦听的目标端口,设置TCP的flag SYN,并生成客户端的seq。
第2步-监听服务器的响应(SYN-ACK)
- 保存服务器的响应。
- 获取服务器的TCP序列号,并将该值加1。
第3步从客户端发送对服务器响应的确认(ACK)
- IP标头与初始SYN数据包具有相同的源和目标。
- TCP报头具有与syn数据包相同的TCP源端口和目标端口,仅设置ACK位,由于SYN数据包消耗一个序列号,因此将客户端的ISN递增1,将确认值设置为递增的服务器的序列号值。
完整代码如下
SYN扫描
SYN扫描也称为半开放扫描。可以使用这种策略来确定通信端口的状态而无需建立完整的连接。客户端首先向被测主机发送一个syn数据包,如果端口开放,那么服务端会响应一个syn+ack的数据包,之后客户端会发送rst数据包进行重置。否则服务端会直接响应一个rst包,表示端口没有开放。如果我们发了大量的syn包而不去确认,服务端会继续发送syn+ack的包,会不断的消耗服务器的CPU和内存,这也就是我们常说的syn泛洪攻击了。


接下来我们使用scapy来模拟syn扫描
在单个主机,单个端口上进行SYN扫描
- 使用sr1功能发送并响应数据包
- 使用sprintf方法在响应中打印字段。(“ SA”标志表示开放的端口,“ RA”标志表示关闭的端口)
在单个主机,多个端口上进行SYN扫描
对多个主机,多个端口进行SYN扫描
- make_table接受三个值,行,列和表数据。(在下面的示例中,目标IP位于x轴上,目标端口位于y轴上,响应中的TCP标志是表格数据)
60.205.177.169的20和22端口没有响应数据包,猜测中间可能有设备(防火墙)给拦下了。
Fin 扫描
客户端会发送带有fin标志(关闭连接)的数据包到服务端,当服务端没有响应时,表示端口是开放状态,否则会收到rst的包。

端口开放
端口关闭
NULL 扫描
null扫描会发送一个没有设置任何flag的TCP数据包,当收到rst的响应包则表示端口关闭,否则表示端口开放,如果收到类型为3且代码为1、2、3、9、10或13的ICMP错误表示该端口已被过滤,获取不到端口状态。


端口关闭
Xmas 扫描
XMAS扫描会发送带有URG,PUSH,FIN标志的TCP数据包,如果未接收到任何数据包,则认为该端口处于打开状态;如果接收到RST数据包,则将该端口视为已关闭。如果收到类型为3且代码为1、2、3、9、10或13的ICMP错误表示该端口已被过滤,获取不到端口状态。


端口关闭
UDP扫描
UDP扫描最常见于检测DNS,SNMP和DHCP服务。客户端会发送带有要连接的端口号的UDP数据包。如果服务器使用UDP数据包响应客户端,那么该端口在服务器上是开放的。如果返回ICMP端口不可达的类型为3和code为3错误数据包,表示该端口在服务器是关闭状态。

跟踪路由
跟踪路由技术基于IP协议的设计方式。IP标头中的TTL值被视为跳数限制。每当路由器收到要转发的数据包时,它将TTL减1并转发数据包。当TTL达到0时,路由器将向源计算机发送答复,表示数据包已被丢弃。
各种工具背后的技术是相同的,但是实现它们的方式略有不同。Unix系统使用UDP数据报文,而Windowstracert则发送ICMP请求,Linux的tcptraceroute使用TCP协议。
使用ICMP进行路由跟踪
使用tcp进行路由跟踪
Scapy包含一个内置的traceroute()函数可以实现与上面相同的功能
使用DNS跟踪路由
我们可以通过在traceroute()函数的l4参数中指定完整的数据包来执行DNS跟踪路由
本文转载自微信公众号「运维开发故事」,可以通过以下二维码关注。转载本文请联系运维开发故事公众号。


