TCPconnect扫描: tcp全连接扫描。使用系统提供的connect()
函数来连接目标端口,如果目标端口正在监听这个端口,那么connect()
函数将会被成功返回,否则,说明改端口不可访问。通过完整的tcp三次握手(也即一次tcp连接),来判断目标端口的状态
TCPSYN扫描: 半打开扫描。首先客户端向要扫描的端口发送一个SYN
分组(tcp连接的第一次握手),然后等待服务器返回的SYN/ACK
应答(tcp连接的第二次握手),如果收到SYN/ACK
应答,那么表示这个端口处于监听状态;如果收到RST/ACK
(重置连接)则认为这个端口不在监听状态或者被防火墙拒绝了;如果什么都收不到那么表示被防火墙直接丢弃了。而客户端无论收到什么分组,都会向该端口发送一个RST/ACK
分组,这样就没有建立一个完整的TCP连接,但是客户端却知道了这个端口是否开放,并且这种扫描并不会在目标系统上产生连接日志
TCPFIN扫描: 客户端首先向目标端口发送一个FIN
分组(结束连接),按照RFC793
的规定,目标端口如果是一个关闭的端口,那么将会返回一个RST
分组;如果是一个打开的端口将会忽略这个请求。
PS:只对给予UNIX的TCP/IP协议栈有效
TCPACK扫描:该扫描方式,无法判断目标端口是否开放。首先客户端直接发送一个ACK
分组给服务端,而目标端口无论是否开放都会返回一个RST分组,所以无法判断端口是否开放。但是可以通过这种方法判断防火墙配置和规则的设计,测试安全策略的有效性。
TCPWindows扫描: 基于tcp窗口大小的报告方式不规则,可检测AIX和FreeBSD系统上打开的以及被过滤/不被过滤的端口
TCPXmas树扫描: 客户端向目标端口同时发送URG
(指示数据时紧急数据,应立即处理),PUSH
(强制将数据压入缓冲区),FIN
(在结束TCP会话时使用)标志位,由于这三个标志位不能被同时设置,所以可以用来判断端口开放,如果目标端口开放,则这个数据包将被丢弃,什么都不返回;如果目标端口开放,则将会返回一个RST
分组
PS:同样是利用了RFC793
规定,只对基于UNIX
的系统有效
TCPNULL扫描: 客户端发送一个不带任何标志位的tcp数据包给目标主机,如果目标端口关闭,那么就会返回一个RST
分组;如果目标端口开放则什么都不返回,直接丢弃这个数据包
PS:同样只对遵守RFC793
规定的基于UNIX
的主机有效,windows主机无论关闭与否都会返回RST
标志位,可用来判断目标操作系统
TCPRPC扫描: 主要用于识别定位远程过程调用(rpc
)端口及相关程序和版本号
UDP扫描: 向目标端口发送一个UDP数据包,如果目标端口返回一个ICMP端口不可达
的icmp
响应,那么此端口是关闭的;如果没有任何响应(被直接丢弃了)则认为是开放的
PS: 由于UDP的无连接不可靠性,扫描准确性受外界干扰。另外由于RFC1812
对生成ICMP错误报文的速度做出了限制,扫描速度会很慢