我们分以下几种类型来分析扫描器原理:
- 端口扫描
- 服务检测
- 操作系统检测
端口扫描
一般我们使用以下协议进行端口扫描:
- TCP
- UDP
- ICMP
TCP 端口扫描
TCP connect
扫描TCP SYN
扫描TCP Xmas Tree
扫描TCP null
扫描TCP ACK
扫描
# TCP connect 扫描
与目标端口建立3次握手,如果成功建立则为open
,收到RST
则为close
# TCP SYN 扫描
也称为TCP半连接扫描,只发送三次握手的第一次SYN报文段,如果收到ACK+SYN
则为open
,收到RST
则为close
,这种好处是不必等待三次握手完全完成,速度快且不容易被防火墙记录进日志。
# TCP Xmas Tree 扫描
客户端向服务端发送带有 PSH
,FIN
,URG
标识的数据包(即不含有ACK SYN RST
),被称为TCP Xmas Tree扫描。其利用的是RFC
的规定:
|
|
那么有以下规则:
|
|
# TCP null 扫描
空扫描即flag位全0,如果没有回复则为open
,收到RST
则为close
# TCP ACK 扫描
这种扫描无法得知端口的开放状态,只能探知端口是否被过滤,因为无论端口开放与否都会返回RST
报文段。
UDP 扫描
UDP扫描比较简单,一般如果返回ICMP port unreachable
说明端口是关闭的,而如果没有回应或有回应(有些UDP服务是有回应的但不常见)则认为是open
,但由于UDP的不可靠性,无法判断报文段是丢了还是没有回应,所以一般扫描器会发送多次,然后根据结果再判断。这也是为什么UDP扫描这么慢的原因。
ICMP 扫描
- 类型字段:指明该数据包属于什么大分类
- 代码字段:指明数据包属于大类里面的哪个小类
- 校验和 : 指明该数据包的校验和
除了正常的ICMP echo
(发送回显Type=8
,返回Type=0
,或不可达Type=3
),高级ICMP扫描技术采用的是ICMP数据报错误处理。
根据网络协议,如果按照协议出现了错误,那么接收端将产生一个icmp的错误报文。这些错误报文并不是主动发送的,而是由于错误,根据协议自动产生。
所有Type类型如下:
|
|
常见错误利用如下:
服务版本检测
我们以nmap的版本检测为例,观察nmap-service-probes
文件内容:
|
|
我们可以看到,发送了一个NULL
探针,正则匹配相应的banner内容来确定服务
操作系统检测
查看nmap-os-db
,内容如下,截取了一段,好像….有点难读:
|
|
根据注释可以看到第一个是linux
以及一些分类信息,下面的就是特征数据.
每一行都是一项测试的结果,其中 XXX()
中的 XXX
是测试的名字(例如SEQ
、OPS
测试)。括号内以 %
分隔的各项是测试中的各种指标。每项指标的值都是key-value
形式.
所有的测试分成五组,
|
|