nmap数据流
扫描者:1.1.1.1
被扫描者:2.2.2.2
0x00 介绍
在日常工作对目标信息收集时,我们经常用到nmap这款网络探测工具和安全/端口扫描器,虽然我们关注的是结果(如目标开启了哪些危险端口,什么操作系统等等),现在,跟我来看一个简单的例子,看看nmap扫描时到底做了什么?和我们看到的结果有什么不同?
0x01 命令选项
首先,我们来介绍下nmap -sS和 -p 选项:
-sS (TCP SYN扫描)
SYN扫描作为默认的也是最受欢迎的扫描选项,是有充分理由的。 它执行得
很快,在一个没有入侵防火墙的快速网络上,每秒钟可以扫描数千个 端口。
SYN扫描相对来说不张扬,不易被注意到,因为它从来不完成TCP连接。 它也
不像Fin/Null/Xmas,Maimon和Idle扫描依赖于特定平台,而可以应对任何兼
容的 TCP协议栈。 它还可以明确可靠地区分open(开放的), closed(关闭
的),和filtered(被过滤的) 状态
它常常被称为半开放扫描, 因为它不打开一个完全的TCP连接。它发送一
个SYN报文, 就像您真的要打开一个连接,然后等待响应。 SYN/ACK表示端
口在监听 (开放),而 RST (复位)表示没有监听者。如果数次重发后仍没响
应, 该端口就被标记为被过滤。如果收到ICMP不可到达错误 (类型3,代码1
,2,3,9,10,或者13),该端口也被标记为被过滤。
-p <port ranges> (只扫描指定的端口)
该选项指明您想扫描的端口,覆盖默认值。 单个端口和用连字符表示的端口
范围(如 1-1023)都可以。 范围的开始以及/或者结束值可以被省略, 分别
导致Nmap使用1和65535。所以您可以指定 -p-从端口1扫描到65535。 如果您
特别指定,也可以扫描端口0。 对于IP协议扫描(-sO),该选项指定您希望扫
描的协议号 (0-255)。
当既扫描TCP端口又扫描UDP端口时,您可以通过在端口号前加上T: 或者U:指
定协议。 协议限定符一直有效您直到指定另一个。 例如,参数 -p U:53
,111,137,T:21-25,80,139,8080 将扫描UDP 端口53,111,和137,同
时扫描列出的TCP端口。注意,要既扫描 UDP又扫描TCP,您必须指定 -sU ,
以及至少一个TCP扫描类型(如 -sS,-sF,或者 -sT)。如果没有给定协议限
定符, 端口号会被加到所有协议列表。
0x02 被扫描者先运行开始抓包
[root@2.2.2.2_Server ~]# tcpdump -tnn -i eth1 ip host 1.1.1.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
IP 1.1.1.1 > 2.2.2.2: ICMP echo request, id 59748, seq 0, length 8
IP 2.2.2.2 > 1.1.1.1: ICMP echo reply, id 59748, seq 0, length 8
IP 1.1.1.1 > 2.2.2.2: ICMP time stamp query id 35654 seq 0, length 20
IP 2.2.2.2 > 1.1.1.1: ICMP time stamp reply id 35654 seq 0: org 00:00:00.000, recv 16:57:19.208, xmit 16:57:19.208, length 20
IP 1.1.1.1.43085 > 2.2.2.2.80: Flags [.], ack 1250535980, win 1024, length 0
IP 2.2.2.2.80 > 1.1.1.1.43085: Flags [R], seq 1250535980, win 0, length 0
IP 1.1.1.1.43085 > 2.2.2.2.443: Flags [S], seq 1250535980, win 1024, options [mss 1436], length 0
IP 2.2.2.2.443 > 1.1.1.1.43085: Flags [S.], seq 2628103251, ack 1250535981, win 14600, options [mss 1460], length 0
IP 1.1.1.1.43085 > 2.2.2.2.443: Flags [R], seq 1250535981, win 0, length 0
IP 1.1.1.1.43341 > 2.2.2.2.2121: Flags [S], seq 1693928585, win 1024, options [mss 1436], length 0
IP 2.2.2.2.2121 > 1.1.1.1.43341: Flags [S.], seq 3143359954, ack 1693928586, win 14600, options [mss 1460], length 0
IP 1.1.1.1.43341 > 2.2.2.2.2121: Flags [R], seq 1693928586, win 0, length 0
0x03 扫描者开始扫描
[root@1.1.1.1_Server ~]# nmap -sS -p 2121 2.2.2.2
Starting Nmap 6.47 ( http://nmap.org ) at 2017-03-24 00:56 CST
Nmap scan report for 2.2.2.2
Host is up (0.14s latency).
PORT STATE SERVICE
2121/tcp open ccproxy-ftp
Nmap done: 1 IP address (1 host up) scanned in 0.62 seconds
0x04 数据包分析
首先,我们可以把抓到的包分为4部分:
0x041
IP 1.1.1.1 > 2.2.2.2: ICMP echo request, id 59748, seq 0, length 8
IP 2.2.2.2 > 1.1.1.1: ICMP echo reply, id 59748, seq 0, length 8
第一个数据包是扫描者向被扫描者发出ICMP请求回显(类型为8即ping)
第二个数据包是被扫描者发给扫描者的ICMP回显应答(类型为0)
可以看出nmap第一个扫描项是先用ping来检测主机是否存活,接下来,我们看第二部分:
0x042
IP 1.1.1.1 > 2.2.2.2: ICMP time stamp query id 35654 seq 0, length 20
IP 2.2.2.2 > 1.1.1.1: ICMP time stamp reply id 35654 seq 0: org 00:00:00.000, recv 16:57:19.208, xmit 16:57:19.208, length 20
第三个数据包是扫描者向被扫描者发出ICMP时间戳查询
第四个数据包是被扫描者发给扫描者的ICMP时间戳应答
简单介绍下时间戳:ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间(Coordinated Universal Time ,UTC)(早起的参考手册认为UTC是格林尼治时间)。
这里不过多介绍,有兴趣的朋友可以看一下《TCP/IP详解 卷1:协议》一书的53-56页,其中详细讲解了ICMP时间戳请求与应答。
0x043
IP 1.1.1.1.43085 > 2.2.2.2.80: Flags [.], ack 1250535980, win 1024, length 0
IP 2.2.2.2.80 > 1.1.1.1.43085: Flags [R], seq 1250535980, win 0, length 0
第五个数据包是扫描者使用本地43085端口发往被扫描者80端口的数据包,并明确说明我希望收到你回复的1250535980号seq包,我能接受的window size是1024个缓存窗口大小,长度为0
第六个数据包是被扫描者回应给扫描者的RST(复位)数据包,前面0x01部分红色字明确标明客户端回应了SYN/ACK表示端口在监听 (开放),而 RST (复位)表示没有监听者。如果数次重发后仍没响应,该端口就被标记为被过滤。所以可以判断被扫描者2.2.2.2 80端口除于关闭状态,但博主认为此处存在误报,比如,如果我不想访客使用IP地址的方式来访问我的博客,那我就可以在nginx配置文件中这样配置:
# vim /etc/nginx/conf.d/default.conf
server {
listen 80 default_server;
server_name _;
return 444;
}
#return后续的配置无效,非标准的444代码可以强制关闭服务器与客户端的连接而不返回任何响应信息给客户端
如上,这样明明我开启了80端口,但数据包中却显示我没有监听80端口,但如果你用nmap –Ss –p 80 2.2.2.2 直接扫描80端口你会发现,即使是RST(复位)flag,也显示80端口是开放的,这就是nmap神奇的地方。
flag是tcp包中的标志信息,[S]是SYN标志,F(FIN),P(PUSH),R(RST),"."(没有标记)
0x044
IP 1.1.1.1.43085 > 2.2.2.2.443: Flags [S], seq 1250535980, win 1024, options [mss 1436], length 0
IP 2.2.2.2.443 > 1.1.1.1.43085: Flags [S.], seq 2628103251, ack 1250535981, win 14600, options [mss 1460], length 0
IP 1.1.1.1.43085 > 2.2.2.2.443: Flags [R], seq 1250535981, win 0, length 0
回过头来我们简单看下第七个数据包:连接被扫描者443端口….略
第八个数据包中被扫描者回应了扫描者SYN建立连接的请求,并标明我收到了你的1250535980序列号的包,并且我希望下一个数据包收到你的1250535981号包,我的窗口大小是14600,我能接受的每个TCP包所能携带的最大数据量是1460个字节大小
第九个数据包扫描者直接发给被扫描者一个序列号为1250535981的包,但长度为0,windos size为0表示RST(复位),主动断开连接
0x045
IP 1.1.1.1.43341 > 2.2.2.2.2121: Flags [S], seq 1693928585, win 1024, options [mss 1436], length 0
IP 2.2.2.2.2121 > 1.1.1.1.43341: Flags [S.], seq 3143359954, ack 1693928586, win 14600, options [mss 1460], length 0
IP 1.1.1.1.43341 > 2.2.2.2.2121: Flags [R], seq 1693928586, win 0, length 0
第十个数据包也是一样,扫描者向被扫描者发送SYN请求连接2121端口
第十一个数据包被扫描者回应说,我收到你的请求,你连把,我希望下一个收到你的1693928586号包
第十二个数据包扫描者回复说,给你1693928586号包,但我要RST(复位)主动断开连接。
好吧,感谢你能够耐心看到结尾,如果有喜欢网络分析的朋友,推荐给你们三本书:《TCP/IP 详解 卷1:协议》,《Wireshark网络分析就这么简单》(林沛满2014年出版)和《Wireshark网络分析的艺术》(林沛满2016年出版)