除了使用 scapy 的 tcp 包根据返回了 flags 来判断端口是否开放外,nmap 也可以去做端口扫描,隐蔽扫描主要用到的参数是 sS,如果不加 sS 参数,nmap 默认也会使用 tcp 去发 SYN 来根据返回的结果做判断。nmap 的 sS 文档说明如下:
格式是:nmap -sS 1.1.1.1 -p 端口,这个端口可以写成范围的形式,如下:
第二种格式是多个不同的端口,用逗号分隔,如下:
默认是不管 open 的还是 closed 的,都会显示,如果只想显示 open 的结果,可以通过 --open 参数来进行筛选,如下:
如果是全端口扫描,除了用 1-65535,也可以用 - 来表示:nmap -sS 1.1.1.1 -p- --open。
如果有多个 ip 需要进行端口扫描,可以把 ip 放到 txt 文件中,nmap 使用 iL 参数指定即可,如下,文件放了四个 ip,分别是 101、102、103、104,其中 103 是没在线的,只有 101 开了端口,结果如下:
以上 nmap 通过 sS 参数扫描过程 wireshark 抓包如下:
可以看到,发过去的是 tcp syn,红色是返回的信息,rst ack 则代表端口关闭的状态。
nmap 很强大,二层发现和三层发现都是 sn 参数,sn 参数只做发现不做端口探测,且是使用二层 arp 协议还是三层 icmp 取决于是否和目标在同一个网段。在四层发现时主要使用的是 PA、PU 参数,协议主要是 tcp 和 udp。
上次的 udp 端口扫描参数是 sU,这次的 tcp 端口扫描参数是 sS。四层的 PA、PU 容易和 sU、sS 搞混。四层使用 PA 和 PU 是做的主机发现,带了 sn 参数,也就是并没有做端口扫描,只是指定一个端口,然后根据端口返回的信息来判断主机是否在线。而端口发现的 sU 和 sS 没有 sn,也没有去扫一个端口,而是指定的自己需求的端口。
可以说四层发现是利用端口扫描来判断主机是否在线的,四层在利用了一个端口根据返回结果判断出了主机是否在线,当在线时,然后使用端口扫描参数再进行扫描。这块容易搞混,不要误解。