0x00:端口识别
在检测防火墙是否对一个端口过滤还是关闭,可通过发送两个类型的数据包来判断,第一个是 syn 包,第二个是 ack 包。分别根据这两个包的返回来进行确认。正常的请求过程是发 syn,回 syn/ack,发 ack,回 fin/ack。两个发两个回,所以可以通过两回来确认。这里分为四种情况。
第一种是最简单的,端口是开放状态,走的是正常的流程,所以 syn 应回 syn/ack,ack 应回 rst。因为 ack 是单独发的,所以回 rst。
第二种是关闭状态,syn 没有结果返回,ack 也没有结果返回。都没有结果返回时,则可证明端口是关闭的。
第三种是过滤状态,端口被过滤,有两种情况,第一个是 syn 正常返回,ack 不正常。第二个是 syn 不正常返回,ack 却正常。也就是两个包只有其中一个是正常的,另一个是不正常,则可判定为端口被过滤。先看第一种,syn 返回了 syn/ack,ack 却没有结果返回,则端口被过滤。
第四种是过滤状态,也就是上面说的另外一个,syn 没有返回结果,ack 却返回了 rst,则端口被过滤。
0x01:scapy 探测
了解了以上过程,可以通过 scapy 来分别发送 syn 和 ack,python 脚本如下