tcp数据包格式:
TCP是传输层的协议,它的数据包格式如下:
TCP建立连接:
表现形式为三次握手,客户机发送SYN标志位的数据包,对方返回SYN,ACK标志位的字段,客户机收到包后返回ACK确认包,在这三次握手后就建立起tcp连接了:
3次握手实例:
SYN扫描:
SYN扫描又称半开扫描,发送一个‘标志位’为S的TCP数据包到目标服务器的某个端口,如果端口开放,就会返回一个标志位为SYN,ACK的TCP数据包,如果端口关闭就返回标志位为RST的数据包。
SYN扫描速度比较快,但容易被防火墙过滤,且丢包无法被发现
FIN扫描:
本机发送一个标志位为F的TCP数据包到目标服务器的某个端口,如果端口开放,就不会做出回应,如果端口关闭就返回标志位为RST的TCP数据包。
FIN扫描速度快,且不易被过滤,难以被发现,但是对windows系统无效,无论端口是否开放,windows都返回RST包。
NULL扫描:
与FIN扫描类似,本机发送一个标志位为空的TCP数据包到目标服务器的某个端口,如果端口开放,就不会做出回应,如果端口关闭就返回标志位为RST的TCP数据包。
NULL扫描速度快,且不易被过滤,难以被发现,但是对windows系统无效
XMAS扫描速度快,且不易被过滤,难以被发现,但是对windows系统无效。
脚本效果展示(以SYN扫描为例):
我ubuntu(192.168.1.113)的TCP对外只开了22端口(ssh服务)
现在我运行我的脚本(先扫描小范围端口,以便用wireshark抓包进行分析)
下面我以FIN扫描1-250端口来查看效果(FIN,NULL,XMAS扫描当没有数据包返回时都进行了再次两次重传进行验证)
脚本代码片段展示: