Nmap,扫描之王。不管是安全工作人员还是网络管理员必备的一个工具。正因为其功能的强大,参数化也非常的多,我在工作之余,花了时间对Nmap进行了整理。
Nmap简介
Nmap(网络映射器):
是由 Gordon Lyon设计,用来探测计算机网络上的主机和服务的一种安全扫描器。为了绘制网络拓扑图,Nmap的发送特制的数据包到目标主机,然后对返回数据包进行分析。Nmap是一款枚举和测试网络的强大工具。
nmap可以到http://nmap.org/download.html下载最新版本
Nmap 特点
主机探测:探测网络上的主机,例如列出响应TCP和ICMP请求、icmp请求、开放特别端口的主机。
端口扫描:探测目标主机所开放的端口。
版本检测:探测目标主机的网络服务,判断其服务名称及版本号。
系统检测:探测目标主机的操作系统及网络设备的硬件特性。
支持探测脚本的编写:使用Nmap的脚本引擎(NSE)和Lua编程语言。
Nmap 典型用途
通过对设备或者防火墙的探测来审计它的安全性。
探测目标主机所开放的端口。
网络存储,网络映射,维护和资产管理。
通过识别新的服务器审计网络的安全性。
探测网络上的主机。
1.版本侦测
(1.)侦测的原理
首先检查open与open|filtered状态额端口是否在排除端口列表内。如果在排除列表,将该端口剔除。如果是tcp端口,尝试建立tcp连接,尝试等待片刻(通常6秒或更多,具体时间可以查询文件nmap-services-probes中的Probe TCP NULL q ||对应的totalwaitms)通常在等待时间内,会接到目标机发送的"WelcmeBeanner"信息,namp将接收到的Banner与nmap-services-probes中的 NULL Probe 中的签名进行对比,查找对应应用程序的名字和版本信息。
(2.)版本侦测命令
-sV 指定让nmap进行版本侦测
-version-intensity < level >:指定版本侦测强度(0-9),默认为7,数值越高,探测出的服务越准确,但是运行 时间比较长。
-version-light:指定使用轻量侦测方式(intensity2)
-version-all:尝试使用所用的probes进行侦测(intensity 9)
-version-trace 显示出详细的版本侦测过程信息
(3.) NMAP提供的版本测试具有一下优点:
高速。并行的进行套接字操作,实现一组高效的探测匹配定义语法。尽可能的确定应用名字与版本名字。
支持TCP/UDP协议,支持文本格式与二进制格式。
支持多种平台服务的侦测,包括linux/Windows/Mac OS /FreeBSD等系统
如果检测到ssl,会调用openSSL继续侦测运行在SSL上的具体协议如(HTTPS/POP3S/IMAPS)
如果检测到SunRPC服务,那么会调用brute-force RPC grinder进一步确定RPC程序编号、名字、版本号。
支持完整的IPV6功能,包括TCP/UDP,基于TCP的SSL
广泛的应用程序数据库(namp-servises-probes),目前nmap可以识别几千种服务的签名,包含了180多种不同的协议。
(4.)常用命令截图:
nmap 192.168.11.128,用Nmap进行简单的扫描。Nmap 默认发送一个arp的ping数据包,来探测目标主机在1-10000范围内所开放的端口。
nmap -vv 192.168.11.128,用Nmap进行简单扫描,并对返回的结果详细描述输入。 -vv 参数设置对结果的详细输出。
nmap -sV 192.168.11.128指定让nmap进行版本侦测
2. 操作系统
(1.)侦测原理
nmap使用tcp/ip协议栈指纹来识别不同的操作系统和设备。在RFC规范中,有些地方对TCP/IP的实现并没有强制规定,由于不同的TCP/IP方案中可能都有自己的特定方案。namp主要是根据这些细节上的差异来判断操作系统的类型。
(2.)操作系统侦测命令
OS侦测的用法:
-O 指定nmap进行OS侦测
-osscan-limit:限制nmap只对确定的主机的进行 OS探测(至少需确知该主机分别有一个open和closed的端口)
-osscan-guess 大胆猜测对方的主机的系统类型,由此准确性会下降不少,但会尽可能多为用户提供给潜在的操作系统。
(3.)常用命令截图
nmap -O 192.168.11.128` ,nmap 通过目标开放的端口来探测主机所运行的操作系统类型。这是信息收集中很重要的一步,它可以帮助你找到特定操作系统上的含有漏洞的的服务。
3.主机发现
(1.)主机发现的原理
与ping命令类似,发送探测包到目标主机,如果收到回复,那么说明目标主机是开启的,nmap支持十多种不同的主机探测方式,比如发送ICMP ECHO/TIMESTAMP/NETASK报文、发送TCPSYS/ACK包、发送SCTP INIT/COOKIE-ECHO包,用户可以在不同的条件下灵活选用不不同的方式探测目标主机
(2.)默认情况下,nmap会发送四种不同类型的数据包来探测目标主机是否在线
ICMP echo request
a TCP SYN packet to port 443
a TCP ACK packet to port 80
an ICMP timestamp request
依次发送四个报文探测目标是否开启,只要收到其中一个包的回复,那就证明目标开启,使用四种不同类型的数据包可以避免因防火墙或丢包造成的错误判断
通常主机发现并不单独使用,而只是作为端口扫描,版本侦测,OS侦测先行步骤,而在某些特殊应用(例如确定大型局域网内活动主机的数量),可能会单独专门使用自己发现功能来完成。
(3.)参数说明
-sL :List Scan 列表扫描,仅将指定的目标的IP列举出来,不进行主机发现
-sn :Ping Scan 只进行主机发现,不进行端口扫描。
-Pn:将所有指定的主机视作开启,跳过主机发现的过程。
-PS/PA/PU/PY[postlist]:使用TCPSYS/ACK或SCTP INIT/ECHO方式进行发现
-PE/PP/PM:使用ICMP echo,timestamp,and netmask请求包发现主机,-PO:使用IP协议包探测对方主机是否开启。
-n/-R:-n表示不进行DNS解析,-R表示总进行DNS解析。
-dns-servers:指向DNS服务器。
-system-dns:指向使用系统的DNS服务器
-traceroute:追踪每个路由节点
其中比较常用的是-sn。表示只单独进行发现过程,-Pn表示直接跳过主机发现而进行端口扫描等高级操作(如果已经明确确定目标主机已经开启,可用该选项);-n:如果不想使用DNS或revesr DNS解析,那么可以使用该选项。
(4.)常用命令截图
nmap -sn 192.168.11.128,只进行主机发现,不进行端口扫描。
nmap -Pn -v 192.168.11.128`,将所有指定的主机视作开启,跳过主机发现的过程,并详细的显示所有结果。
nmap -sV -O - Pn -v 192.168.11.128,-sV,代表进行版本侦测,-O 代表进行OS侦测,-pn将所有指定的主机视作开启,跳过主机发现的过程 ,-v表示详细的显示所有结果。
4.端口扫描
端口扫描是nmap最基本最核心的功能,用于确定目标主机额TCP/UDP端口的开放情况。
(1.)端口扫描状态
namp通过探测将端口划分为6个状态:
open:端口是开放的。
closed:端口是关闭的。
filtered:端口被防火墙IDS/IPS屏蔽,无法确定状态。
undiltered:端口没有被屏蔽,但是否开放需要进一步确定。
open|filtered:端口是开放的或被屏蔽。
closed|filtered:端口是关闭的或被屏蔽。
(2.)端口扫描基本原理
Half-open scanning
这是nmap默认的扫描方式,通常被称作半开放扫描(Half-open scanning )。该方式发送SYN到目标端口,如果收到SYN/ACK回复,那么判断端口是开放的;如果收到RST包,说明该端口是关闭的,如果没有收到回复,那么判断端口是被屏蔽的(Filtered)。因为该方式仅发送SYN包对目标主机的特定端口,但不建立的完整的TCP连接,所以相对比较隐蔽,而且效率比较高,适用范围广。
tcp connect
使用系统网络API connect向目标主机的端口发起连接,如果无法连接,说明该端口关闭,该方式扫描速度比较慢,而且由于建立完整的TCP连接会在目标机上留下记录信息,不够隐藏,所以TCP connect是TCP SYN无法使用才考虑选择的方式。
tcp ACK scanning
向目标主机的端口发送ack包,如果收到RST包,说明该端口没有被防火墙屏蔽,没有收到RST包,说明被屏蔽,该方式只能用于确定防火墙是否屏蔽某个端口,可以辅助TCP SYN的方式来判断目标主机防火墙的状况。
tcp FIN /Xmas/NULL scanning
这三种扫描方式称为秘密扫描(Stsalthy Scan),因为相对比较隐藏,FIN扫描向目标主机的端口发送的TCP FIN包或Xmas tree包/Null包,如果收不到对方RST回复包,那么说明该端口是关闭的,没有收到RST包说明端口可能是开放的或被屏蔽的。
其中Xmas tree包是指fiags中FIN URG PUSI设置为1的tcp包,NULL包是指所有flags都为0的tcp包。
(3.) 扫描方式参数选项
-sS/sT/sA/sW/sW :指定使用TCP
SYN/CONNECT()/ACK/window/Maimon Scans的方式来对目标主机进行扫描
-sU :指定使用UDP扫描方式确定目标主机的UDP端口状态。
-sN/sF/sX:指定使用TCP Null。FIN and Xmas scans秘密扫描方式来协助探测对方的TCP端口状态。
-ssanflags< flags >:定制TCP包的flags。
-sI:指定使用idle scan方式来扫描目标主机(前提是需要找到合适的zombie host)
-sY/sZ:使用SCTP INIT/COOKIE-ECHO 来扫描SCTP协议端口的开放的情况。
-s0:使用IP protocol 扫描确定目标支持的歇息类型。
-b< FTP relay host>:使用FTP bounce scan扫描方式
-p < port ranges>:扫描指定端口
如-p22;-p1-65535;-p U:53,111,137,T:21-192.168.1.18080,S:9 ( T代表TCP,U 代 表UDP,S代表SCTP协议)
-F (Fast mode)快速模式,仅扫描TOP 100的端口
-r:不进行端口随记打乱的操作,(如无该参数,nmap会将要扫描的端口以随机顺序方式扫描,以让nmap的扫描不易被对方防火墙检测到)
-top-ports< number >:扫描开放概率最高的number个端口,默认情况下,nmap会扫描最有可能的1000个TCP端口
-port-ratio< ratio>:扫描指定频率以上的端口,
-sS表示使用TCP SYN方式扫描TCP端口,-sU表示扫描UDP端口,-T4表示时间级别配置4级,-top-ports 300表示扫描最有可能开放的300个端口(tcp和udp分别有300个端口)
(4.)常用命令截图
nmap -sS 192.168.11.128,使用SYN方式进行扫描。
nmap -F 192.168.11128,使用快速扫描方式,仅扫描TOP 100的端口
nmap -v -sS -A -T4 192.168.11.128, 使用SYN扫描,在insane(5)的时间模板下,探测操作系统的类型和版本
nmap -p1-100 192.168.11.128 nmap 默认扫描目标1-10000范围内的端口号。我们则可以通过参数-p 来设置我们将要扫描的端口号
nmap --traceroute 192.168.11.128,跟踪详细路由信息。
5.Nmap规避防火墙/IDS
(1.)防火墙/IDS规则
防火墙与IDS规避为用于绕开防火墙与IDS(入侵检测系统)的检测与屏蔽,以便能够更加详细的发现目标主机的状况,nmap提供了多种规避技巧,通常可以从两个方面考虑规避方式:
数据包的变换(Packet Change)与时序变换(Timing Change)
(2.)规避原理
分片(Fragmentation)将可疑的探测包进行分片处理(例如将TCP包拆分成多个IP包发送过去)某些简单的防火墙为了加快处理速度可能不会进行重组检查,以此避开其检查。
ip诱骗(IP decoys)
在进行扫描时,将真实的ip地址和其他主机的ip地址(其他主机需要在线,否则目标主机将uifu大量数据包到不存在的主机从而实质构成了拒绝服务攻击)混合使用。以此让目标主机的防火墙或IDS追踪检查大量的不同ip地址的数据包,降低其追查到自身的概率,注意,某些 高级的IDS系统通过统计分析仍然可以追踪出扫描者的真实IP地址。
ip伪装:(IP Spoofing)
把自己发送数据包的ip地址伪装成其他主机的地址,从而目标认为是其他主机在与之通信,需要注意如果希望接收到目标主机的回复包,那么伪装的ip需要位于通一局域网内,另外。如果即希望隐藏自己的ip地址,又希望收到目标主机的回复包,那么可以尝试使用idle scan或匿名代理如(TOR)等网络技术。
指定源端口:
某些目标只允许来自特定端口的数据包通过防火墙,例如FTP服务器配置为:允许源端口为21号的TCP包通过防火墙与FTP服务器通信,但是源端口为其他端口的数据包被屏蔽,所以,在此类情况下,可以指定你,nmap将发送的数据包的源端口都设置特定的端口。
扫描延时:
某些防火墙针对发送过于频繁的数据包会进行严格的侦查,而且某系系统限制错误报文产生的频率,(如Solars系统通常会限制每秒钟只能产生一个ICMP消息回复给UDP扫描),所以,定制该情况下发包的频率和发包延时可以降低目标主机的审查强度、节省网络带宽。
(3.)参数说明
-f -mtu<val>:指定使用分片。指定数据包的MTU.
-D<.D...【ME】,D...>:用一组ip地址掩盖真实地址。其中ME填写自己的ip地址
-S <ip_address>:伪装成其他的ip地址
-e<iface>:使用特定额网络接口。
-g/source-post<portnum>:使用指定源端口
-data-length<num>:填充随记数据让数据包长度达到NUM。
-ip-options<options>:使用指定的的ip选项来发送数据包。
-ttl<val>:设置timeto-live时间
-spoof-mac:伪装MAC地址
-badsum:使用错误的checksum来发送数据包(正常情况下,该类数据包被抛弃,如果收到回复, 说明回复来自防火墙或IDS/IPS)
(4.)常用命令截图
nmap -sV -v -sS -f -mtu500 192.168.11.128,其中-sV表示让nmap进行版本侦测,-v表示显示详细信息,-sS进行SYN扫描,-f表示设置mtu的最大传输单元为500.
nmap -D192.168.1.1,192.168.1.2ME -e eth9 192.168.11.128,用ip地址192.168.1.1和192.168.1.2来掩盖真实地址。其中ME为自己的ip地址,通过wirshak可以观察到我们指定的ip地址发送的数据包。
namp -S 192.168.1.1 -e eth9 192.168.11.128,-S将地址伪造成192.168.1.1,-e表示指定网卡。通过wirshak抓包,可以观察到我们伪造的ip。
namp -g 21 -e eth9 192.168.11.128,-g表示指定源端口,-e表示指定网卡,通过抓包可以观察到我们指定的端口。
nmap -v -F -Pn -D1192.168.1.1,192.168.1.2,ME-e ech9 -g 3355 192.168.11.128 其中-F 表示快速扫描100个端口,-pn表示不使用ping扫描,-D表示使用ip欺骗的方式掩盖自己真实的ip,-e eth9表示使用eth9网卡发送数据包,-g 3355表示自己源端口使用3355, 172.17.125.3是被扫描的目标ip地址。使用wirshak抓包可以观察到我们伪造的ip和指定的源端口信息。
6.NSE脚本引擎
(1.)
NSE脚本引擎(Nmap Scripting Engine)是Nmap最强大最灵活的功能之一,允许用户自己编写脚本来执行自动化的操作或者扩展Nmap功能。NSE使用Lua脚本语言,并且默认提供了丰富的脚本库,目前已经包含14个类别的30多个脚本。
(2.)设计初衷
NSE设计初衷主要考虑一下几个方面:
网络发现(Network Discovery)
更加复杂的版本侦测(例如skype软件)
漏洞侦测(Vulnerability Detestion)
后门侦测(Backdoor Detection)
漏洞利用(vulnerability Exploitation)
(3.)NSE组成部分
NSE的使用lua脚本,并且配置固定格式,以减轻用户编程负担。通常的一个脚本分为几下几个部分:
description字段:描述脚本功能的字符串,使用双层方括号表示。
comment字段:以-开头的行,描述脚本输出格式
author字段:描述脚本作者
lisense字段:描述脚本使用许可证,通常配置为Nmap相同的license
categories字段:描述脚本所属的类别,以对脚本的调用进行管理。
rule字段:描述脚本执行的规则,也就是确定触发脚本执行的条件,在nmap中有四种类型的规则,prerule用于在Nmap没有执行扫描之前触发脚本执行,这类脚本并不需要用到任何Nmap扫描结果;hostrule用在Nmap执行完毕主机发现后触发的脚本,根据主机发现的结果来触发该类脚本;portrule用于Nmap执行端口扫描或版本侦测时触发的脚本,例如检测到某个端口时触发某个脚本执行以完成更详细的侦查。
poetrule用于Nmap执行完毕所有的扫描后,通常用于扫描结果的数据提取和整理。
(4.)脚本类别
nmap脚本主要分为以下几类,在扫描时可根据需要设置--script=类别这种方式进行比较笼统的扫描:
auth: 负责处理鉴权证书(绕开鉴权)的脚本
broadcast: 在局域网内探查更多服务开启状况,如dhcp/dnslserver等服务
brute: 提供暴力破解方式,针对常见的应用如http/snmp等
default: 使用-sC或-A选项扫描时候默认的脚本,提供基本脚本扫描能力
discovery: 对网络进行更多的信息,如SMB枚举、SNMP查询等
dos: 用于进行拒绝服务攻击
exploit: 利用已知的漏洞入侵系统
external: 利用第三方的数据库或资源,例如进行whois解析
fuzzer: 模糊测试的脚本,发送异常的包到目标机,探测出潜在漏洞 intrusive: 入侵性的脚本,此类脚本可能引发对方的IDS/IPS的记录或屏蔽
malware: 探测目标机是否感染了病毒、开启了后门等信息
safe: 此类与intrusive相反,属于安全性脚本
version: 负责增强服务与版本扫描(Version Detection)功能的脚本
vuln: 负责检查目标机是否有常见的漏洞(Vulnerability),如是否有MS08_067
(5.)参数说明
-sC:等价与--script=default,使用默认类别的脚本进行扫描。
--script=<Lua scripts>:<Lua scripts>使用某个或某类脚本进行扫描,支持通配符描述
-script-args=<n1=v1,[n2=v2....]>:为脚本提供默认参数
-script-args-file=filename:使用文件来为脚本提供参数
-script-trace:显示脚本执行过程中发送与接收的数据
-script-updatedb:更新脚本数据库
-scroipt-help=<Lua scripts>:显示脚本的帮助信息,其中<Luascripts>部分可以逗号分割的文 件或脚本类别。
(6.)常用命令截图
nmap --script=vuln 192.168.11.128, 检查是否存在常见漏洞
nmap --script=auth 192.168.11.128 负责处理鉴权证书(绕开鉴权)的脚本,也可以作为检测部分应用弱口令
nmap --script=default 192.168.11.128 或者 nmap -sC 192.168.11.128,默认的脚本扫描,主要是搜集各种应用服务的信息,收集到后,可再针对具体服务进行攻击
nmap --script=broadcast-netbios-master-browser 192.168.11.128,使用脚本 发现网关
7.Nmap 输出
(1.)参数说明
-oN :将标准输出直接写入指定的文件
-oX :输出xml文件
-oS:将所有的输出都改为大写
-oG :输出便于通过bash或者perl处理的格式,非xml
-oA BASENAME:可将扫描结果以标准格式、XML格式和Grep格式一次性输出
-v:提高输出信息的详细度
-d level :设置debug级别,最高是9
--reason:显示端口处于带确认状态的原因
--open :只输出端口状态为open的端口
--packet-trace:显示所有发送或者接收到的数据包
--iflist :显示路由信息和接口,便于调试
--log-errors:把日志等级为errors/warings的日志输出
--append-output:追加到指定的文件
--resume FILENAME :恢复已停止的扫描
--stylesheet PATH/URL:设置XSL样式表,转换XML输出
--webxml:从namp.org得到XML的样式
--no-sytlesheet:忽略XML声明的XSL样式表
(2.)常用命令截图
nmap -sV -p139,445 -oG 1.txt 192.168.11.128,其中-sV代表让nmap进行版本侦测,-p代表指定端口,-oG代表输出为1.txt文件
8.其他nmap选项
(1.)参数说明
-6:开启IPv6
-A :OS识别,版本探测,脚本扫描和traceroute
--datedir DIRNAME:说明用户Nmap数据文件位置
--send-eth / --send-ip:使用原以太网帧发送/在原IP层发送
--privileged:假定用户具有全部权限
--unprovoleged:假定用户不具有全部权限,创建原始套接字需要root权限
-V :打印版本信息
-h:输出帮助
(2.)常用命令截图
nmap -vv 192.168.11.128,用Nmap进行简单扫描,并对返回的结果详细描述输入。 -vv 参数设置对结果的详细输出。
输入nmap -A 192.168.11.128 此选项设置包含了1-10000的端口ping扫描,操作系统扫描,脚本扫描,路由跟踪,服务探测。
因为技术有限,文中若有错误,敬请谅解!