Nmap (网络映射器)是由 Gordon Lyon设计,用来探测计算机网络上的主机和服务的一种安全扫描器。为了绘制网络拓扑图,Nmap的发送特制的数据包到目标主机,然后对返回数据包进行分析。Nmap是一款枚举和测试网络的强大工具。
Nmap的作用:
- 主机探测:探测网络上的主机,例如列出响应TCP和ICMP请求、icmp请求、开放特别端口的主机。
- 端口扫描:探测目标主机所开放的端口。
- 版本检测:探测目标主机的网络服务,判断其服务名称及版本号。
- 系统检测:探测目标主机的操作系统及网络设备的硬件特性。
- 防火墙检测: 探测目标主机使用什么类型的报文过滤器/防火墙
- 支持探测脚本的编写:使用Nmap的脚本引擎(NSE)和Lua编程语言。
常用参数
目标说明
-iL <inputfilename>
从列表中输入-iR <num hosts>
随机选取n个主机,0表示无限--exclude <host1[,host2][,host3],...>
排除这些主机--excludefile <exclude_file>
排除文件中的这些主机
主机发现
由于不同的用户对感兴趣的主机服务不一样,Nmap
提供了多种不同的方式。
-sL
列表扫描,打印主机列表-sP
仅仅使用ping
进行主机发现,默认情况下会发送一个ICMP
回声请求和一个TCP报文到80端口-P0
无视主机发现,均认为是活跃的。-PS
TCP SYN Ping
尝试发送SYN包,如果收到SYN/ACK
即认为正在运行-PA
TCP ACK Ping
尝试发送ACK包,回应RST报文即为运行-PU
发送一个空的UDP包,如果收到无法到达说明机器正在运行
PS PA PU
如果不指定端口,默认为31338
端口,使用这个端口的原因是选择一个不常用的端口进行主机活跃性探测。
扫描方式
Nmap所识别的6个端口状态
端口状态 | 说明 |
---|---|
open |
应用程序正在该端口接收TCP 连接或者UDP报文 |
close |
关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并作出响应), 但没有应用程序在其上监听。 |
filtered |
由于包过滤阻止探测报文到达端口, Nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由器规则 或者主机上的软件防火墙。 |
unfiltered |
未被过滤状态意味着端口可访问,但Nmap不能确定它是开放还是关闭。 只有用于映射防火墙规则集的ACK扫描才会把端口分类到这种状态。 |
open or filtered |
当无法确定端口是开放还是被过滤的,Nmap就把该端口划分成 这种状态。开放的端口不响应就是一个例子。 |
closed or filtered |
该状态用于Nmap不能确定端口是关闭的还是被过滤的。 它只可能出现在IPID Idle扫描中 |
常见的扫描方式:
-sS
TCP SYN
扫描默认方式,只发送SYN包,不建立连接。
-ST
TCP connect()
扫描用户没有权限发送原始报文时,采用这种方式
-sU
UDP
扫描-sN;-sF;-sX
TCP null
、FIN
、Xmas
扫描1234567891011121314151617这三种扫描类型 (甚至用下一节描述的 --scanflags 选项的更多类型) 在TCP RFC 中发掘了一个微妙的方法来区分open(开放的)和 closed(关闭的)端口。如果 [目标]端口状态是关闭的: 请求的的不含RST的报文导致一个RST响应。如果不设置SYN,RST,或者ACK位的报文发送到开放端口,理论上,这不应该发生,如果您确实收到了,丢弃该报文,返回。那么有以下规则:如果扫描系统遵循该RFC,当端口关闭时,任何不包含SYN,RST,或者ACK位的报文会导致 一个RST返回,而当端口开放时,应该没有任何响应。只要不包含SYN,RST,或者ACK, 任何其它三种(FIN,PSH,and URG)的组合都行。Nmap有三种扫描类型利用这一点:Null扫描 (-sN)不设置任何标志位(tcp标志头是0)FIN扫描 (-sF)只设置TCP FIN标志位。Xmas扫描 (-sX)设置FIN,PSH,和URG标志位,就像点亮圣诞树上所有的灯一样。除了探测报文的标志位不同,这三种扫描在行为上完全一致。 如果收到一个
RST
报文,该端口被认为是closed
(关闭的),而没有响应则意味着 端口是open|filtered
(开放或者被过滤的)。 如果收到ICMP不可到达错误(类型 3,代号 1,2,3,9,10,或者13),该端口就被标记为filtered
被过滤的。-sA
TCP ACK
扫描它不能确定
open
(开放的)或者open|filtered
(开放或者过滤的))端口。 它用于发现防火墙规则,确定它们是有状态的还是无状态的,哪些端口是被过滤的. 无论此端口是否开放,均会返回RST
报文。--scanflags
定制TCP扫描
指定任意标志位,可以是数字或URG, ACK,PSH, RST,SYN,and FIN
端口说明
-p
指定端口范围1U:53,111,137,T:21-25,80,139,8080-F
快速扫描有限端口在
nmap-services
文件中-r
不要按随机顺序扫描端口,默认是随机顺序
服务版本检测
-sV
版本探测--allports
不为版本探测排除任何端口--version-intensity <intensity>
版本扫描强度
操作系统探测
-O
启动操作系统检测--osscan-limit
针对指定目标进行检测--osscan-guess
无法确定时,进行推测
时间与性能
-T
设置时间模板,最为常用的选项。数值为0-5
防火墙规避
Nmap
提供了一些方式来绕过IDS的检测。
具体的看手册。
|
|
需要实践才能比较好的理解。
输出方式
-oN <filespec>
标准输出写入文件-oX <filespec>
XML输出-v
提高输出信息详细度--packet-trace
跟踪发送和接受的报文
使用技巧 from DEFCON
源视频地址 - DEFCON 16 Nmap techniques
生成随机ip地址
|
|
-iR
为随机生成ip地址,-sL
为列表模式不进行扫描,-n
为不进行DNS查找,awk ..
输出第5个字段(IP地址字段),sort | uniq
用于排序和去重,并将其前12000个写入文件
优化主机发现
基于TCP主机发现
-PS
: TCP SYN packet-PA
: TCP ACK packet
常见的防火墙有两种:
- 基于状态的(一般会允许
SYN packet
通过,而ACK packet
由于没有对应的连接而被丢弃) - 无状态的(另一种会阻值
SYN packet
到特定端口,而这种无状态的不知道是否有连接从而让ACK packet
通过)
由此可以探查服务器防火墙是什么类型的:
|
|
基于UDP主机发现
-PU
: UDP packet
对于UDP端口,open
的UDP端口一般是不会回复UDP探针的,而只有close
的UDP端口会返回port unreachable packet
基于ICMP的主机发现
-PE
: ICMP echo request 回显请求-PP
: ICMP timestap request 用于同步时间-PM
: ICMP netmask request 用于无盘系统获取子网掩码
有些管理员只关闭了echo request
可以使用其他的两种,或者混合使用
一些技巧
|
|
这是展示的一个扫描技巧的例子,混合使用了多种request
–source-port 53
该端口是DNS查询端口,一般的防火墙都允许来自此端口的数据包
--version-intensity 0
轻量的版本检测会提升很大的速度
--top-ports <number>
使用最常用的number个端口进行扫描
--top-ports 1000
能覆盖93%
的端口
--top-ports 3674
能覆盖100%
的端口
最可能开放的TCP端口:
|
|
最可能开放的UDP端口:
|
|
一个完整的扫描命令:
|
|
其中-S [srcip]
为伪造源IP地址,-d
为输出日志信息,–max-scan-delay
为最大扫描时延,防止有些等待太久,oAlogs/tcp-allports-%T-%D
用于以xml格式输出%T表示扫描时间,%D表示扫描日期
,–randomize-hosts
,因为文件中的IP已经排序,这里将之打乱,避免被防火墙检查出.
|
|
一个扫描web站点的命令