Nmap使用详解

Nmap使用详解

Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具。软件名字Nmap是Network Mapper的简称。Nmap最初是由Fyodor在1997年开始创建的。随后在开源社区众多的志愿者参与下,该工具逐渐成为了最为流行的安全必备工具之一。

一般情况下,Nmap用于列举网络主机清单、管理服务升级调度、监控主机或服务运行状况。Nmap可以检测目标主机是否在线、端口开放情况、侦测运行的服务类型以及版本信息、侦测操作系统与设备类型等信息。

Nmap的优点:

  • 灵活。支持数十种不同的扫描方式,支持多种目标对象的扫描。
  • 强大。Nmap可以用于扫描互联网上大规模的计算机
  • 可移植。支持主流操作系统:Windows/Linux/Unix/MacOS等等;源码开放,方便移植
  • 简单。提供默认的操作能覆盖大部分功能,基本端口扫描nmap targetip,全面的扫描nmap -A targetip
  • 自由。Nmap作为开源软件,在GPL License的范围内可以自由的使用
  • 文档丰富。Nmap官网提供了详细的文档描述。Nmap作者及其它安全专家编写了多部Nmap参考书籍。
  • 社区支持。Nmap背后有强大的社区团队支持。

Nmap包含四项基本功能

  • 主机发现(Host Discovery)
  • 端口扫描(Port Scanning)
  • 版本侦测(Version Detection)
  • 操作系统侦测(Operating System Detection)
nmap –iflist : 查看本地主机的接口信息和路由信息
-A :选项用于使用进攻性方式扫描
-T4: 指定扫描过程使用的时序,总有6个级别(0-5),级别越高,扫描速度越快,但也容易被防火墙或IDS检测并屏蔽掉,在网络通讯状况较好的情况下推荐使用T4
-oX test.xml: 将扫描结果生成 test.xml 文件,如果中断,则结果打不开
-oA test.xml:  将扫描结果生成 test.xml 文件,中断后,结果也可保存
-oG test.txt:  将扫描结果生成 test.txt 文件
-sn : 只进行主机发现,不进行端口扫描
-O : 指定Nmap进行系统版本扫描
-sV: 指定让Nmap进行服务版本扫描
-p <port ranges>: 扫描指定的端口
-sS/sT/sA/sW/sM:指定使用 TCP SYN/Connect()/ACK/Window/Maimon scans的方式来对目标主机进行扫描
-sU: 指定使用UDP扫描方式确定目标主机的UDP端口状况
-script <script name> : 指定扫描脚本
-Pn : 不进行ping扫描
-sP :  用ping扫描判断主机是否存活,只有主机存活,nmap才会继续扫描,一般最好不加,因为有的主机会禁止ping
-PI :  设置这个选项,让nmap使用真正的ping(ICMP echo请求)来扫描目标主机是否正在运行。
-iL 1.txt : 批量扫描1.txt中的目标地址
 
-sL: List Scan 列表扫描,仅将指定的目标的IP列举出来,不进行主机发现
-sY/sZ: 使用SCTP INIT/COOKIE-ECHO来扫描SCTP协议端口的开放的情况
-sO: 使用IP protocol 扫描确定目标机支持的协议类型
-PO : 使用IP协议包探测对方主机是否开启 
-PE/PP/PM : 使用ICMP echo、 ICMP timestamp、ICMP netmask 请求包发现主机
-PS/PA/PU/PY : 使用TCP SYN/TCP ACK或SCTP INIT/ECHO方式进行发现
-sN/sF/sX: 指定使用TCP Null, FIN, and Xmas scans秘密扫描方式来协助探测对方的TCP端口状态
-e eth0:指定使用eth0网卡进行探测
-f : --mtu <val>: 指定使用分片、指定数据包的 MTU.
-b <FTP relay host>: 使用FTP bounce scan扫描方式
-g: 指定发送的端口号
-r: 不进行端口随机打乱的操作(如无该参数,nmap会将要扫描的端口以随机顺序方式扫描,以让nmap的扫描不易被对方防火墙检测到)
-v 表示显示冗余信息,在扫描过程中显示扫描的细节,从而让用户了解当前的扫描状态
-n : 表示不进行DNS解析;
-D  <decoy1,decoy2[,ME],...>: 用一组 IP 地址掩盖真实地址,其中 ME 填入自己的 IP 地址
-R :表示总是进行DNS解析。 
-F : 快速模式,仅扫描TOP 100的端口 
-S <IP_Address>: 伪装成其他 IP 地址
--ttl <val>: 设置 time-to-live 时间
--badsum: 使用错误的 checksum 来发送数据包(正常情况下,该类数据包被抛弃,如果收到回复,说明回复来自防火墙或 IDS/IPS)
--dns-servers  : 指定DNS服务器
--system-dns : 指定使用系统的DNS服务器   
--traceroute : 追踪每个路由节点 
--scanflags <flags>: 定制TCP包的flags
--top-ports <number> :扫描开放概率最高的number个端口
--port-ratio <ratio>: 扫描指定频率以上的端口。与上述--top-ports类似,这里以概率作为参数
--version-trace: 显示出详细的版本侦测过程信息
--osscan-limit: 限制Nmap只对确定的主机的进行OS探测(至少需确知该主机分别有一个open和closed的端口)
--osscan-guess: 大胆猜测对方的主机的系统类型。由此准确性会下降不少,但会尽可能多为用户提供潜在的操作系统
--data-length <num>: 填充随机数据让数据包长度达到 Num
--ip-options <options>: 使用指定的 IP 选项来发送数据包
--spoof-mac <mac address/prefix/vendor name> : 伪装 MAC 地址
--version-intensity <level>: 指定版本侦测强度(0-9),默认为7。数值越高,探测出的服务越准确,但是运行时间会比较长。
--version-light: 指定使用轻量侦测方式 (intensity 2)
--version-all: 尝试使用所有的probes进行侦测 (intensity 9)
--version-trace: 显示出详细的版本侦测过程信息
nmap 192.168.1.0/24 -exclude 192.168.1.10  #扫描除192.168.1.0外的该网段的其他地址
nmap 192.168.1.0/24 -excludefile f:/1.txt  #扫描除给定文件中的地址以外的其他地址
nmap -sF -T4 192.168.1.0 #探测防火墙状态

一:探测目标是否在线

主机发现的原理与Ping命令类似,发送探测包到目标主机,如果收到回复,那么说明目标主机是开启的。Nmap支持十多种不同的主机探测方式,用户可以在不同的条件下灵活选用不同的方式来探测目标主机。主机发现常用参数如下

-sn: Ping Scan 只进行主机发现,不进行端口扫描。
-PE/PP/PM: 使用ICMP echo、 ICMP timestamp、ICMP netmask 请求包发现主机。
-PS/PA/PU/PY[portlist]: 使用TCP SYN/TCP ACK或SCTP INIT/ECHO方式进行发现。 
 
-sL: List Scan 列表扫描,仅将指定的目标的IP列举出来,不进行主机发现。 
-Pn: 将所有指定的主机视作开启的,跳过主机发现的过程。
-PO[protocollist]: 使用IP协议包探测对方主机是否开启。  
-n/-R: -n表示不进行DNS解析;-R表示总是进行DNS解析。  
--dns-servers <serv1[,serv2],...>: 指定DNS服务器。   
--system-dns: 指定使用系统的DNS服务器   
--traceroute: 追踪每个路由节点 

当探测公网ip时

Nmap会发送四种不同类型的数据包来探测主机是否在线。

  1. ICMP echo request
  2. a TCP SYN packet to port 443(https)
  3. a TCP ACK packet to port 80(http)
  4. an ICMP timestamp request
 例:  nmap  -sn   110.120.118

以次发送四个报文探测目标主机是否开启。只要收到其中一个包的回复,那就证明目标主机开启。使用不同类型的数据包可以避免因防火墙或丢包造成的判断错误。

通常主机发现并不单独使用,而只是作为端口扫描、版本探测、OS侦测先行步骤。而在某些特殊应用(例如大型局域网内活动的主机数量),可能会单独专门使用主机发现功能来完成。

Nmap -PE/-PP/-PM

  • -PE的ICMP Echo扫描简单来说是通过向目标发送ICMP Echo数据包来探测目标主机是否存活,但由于许多主机的防火墙会禁止这些报文,所以仅仅ICMP扫描通常是不够的。
  • -PP的ICMP time stamp时间戳扫描在大多数防火墙配置不当时可能会得到回复,可以以此方式来判断目标是否存活。倘若主机在线,该命令还会探测其开放的端口以及运行的服务。
  • -PM 的icmp address maskPing地址掩码扫描会试图用备选的ICMP等级Ping指定主机,通常有不错的穿透防火墙效果
  • -PS 是TCP SYN扫描

当探测内网ip时

nmap -sn

使用nmap -sn 内网ip 这个命令会发送arp请求包探测目标ip是否在线,如果有arp回复包,则说明在线。此命令可以探测目标主机是否在线,如果在线还可以得到其mac地址。但是不会探测其开放的端口号。

nmap -PE/-PP/-PM

使用nmap -PE/PP/PM 内网ip 探测主机的开启情况,使用的是ARP请求报文,如果有ARP回复报文,说明主机在线。-PE/PP/PM探测到主机在线后,还会探测主机的端口的开启状态以及运行的服务。

探测该主机所在网段内所有主机的在线情况,使用的是nmap -sn 网段/子网掩码

namp -sn 192.168.2.1/24 或 nmap -sn 192.168.2.1-200

二:端口扫描及其原理

端口扫描是Nmap最基本最核心的功能,用于确认目标主机的TCP/UDP端口的开放情况。

默认情况下,Nmap会扫描1000个最有可能开放的TCP端口

Nmap通过探测将端口划分为6个状态

  1. open:端口是开放的
  2. closed:端口是关闭的
  3. Filtered:端口被防火墙IDS/IPS屏蔽,无法确定其状态
  4. Unfiltered:端口没有被屏蔽,但是否开放需要进一步确定。
  5. open|filtered:端口是开放的或被屏蔽的,Nmap不能识别。
  6. closed|filtered:端口是关闭的或被屏蔽的,Nmap不能识别。

TCP SYN扫描(-sS)

这是Nmap默认的扫描方式,通常被称为半开放扫描。该方式发送SYN到目标端口,如果收到SYN/ACK回复,那么可以判断端口是开放的;如果收到RST包,说明该端口是关闭的。如果没有收到回复,那么可以判断该端口被屏蔽了。因为该方式仅发送SYN包对目标主机的特定端口,但不建立完整的TCP连接,所以相对比较隐蔽,而且效率比较高,适用范围广。

TCP connect扫描(-sT)

TCP connect方式使用系统网络API connect向目标主机的端口发起连接,如果无法连接,说明该端口关闭。

该方式扫描速度比较慢,而且由于建立完整的TCP连接会在目标主机上留下记录信息,不够隐蔽。所以,tcp connect 是TCP SYN无法使用才考虑使用的方式。

TCP ACK扫描(-sA)

向目标主机的端口发送ACK包,如果收到RST包,说明该端口没有被防火墙屏蔽;没有收到RST包,说明被屏蔽。该方式只能用于确定防火墙是否屏蔽某个端口,可以辅助TCP SYN的方式来判断目标防火墙的状况

TCP FIN/Xmas/NULL扫描(-sN/-sF/-sX)

这三种扫描方式被称为秘密扫描,因为相对隐蔽。FIN扫描向目标主机的端口发送的TCP FIN包或Xmas tree包或Null包,如果收到对方的RST回复包,那么说明该端口是关闭的;没有收到RST包说明该端口可能是开放的或者被屏蔽了。其中Xmas tree包是指flags中FIN URG PUSH被设置为1的TCP包;NULL包是指所有的flags都为0的TCP包。

UDP扫描(-sU)

UDP扫描用于判断UDP端口的情况,向目标主机的UDP端口发送探测包,如果收到回复ICMP port unreachable就说明该端口是关闭的;如果没有收到回复,那说明该UDP端口可能是开放的或者屏蔽的。

其他方式(-sY/-sZ)

除了以上几种常用的方式外,Nmap还支持多种其他的探测方法。例如使用SCTP INIT/Cookie-Echo方式是来探测SCTP和端口开放情况;使用IP protocol方式来探测目标主机支持的协议类型(tcp/udp/icmp/sctp等等);使用idle scan方式借助僵尸主机来扫描目标主机,以达到隐蔽自己的目的;或者使用FTP bounce scan,借助FTP允许的代理服务扫描其他的主机,同样达到隐蔽自己的目的。

三:端口扫描的用法

-sS/sT/sA/sW/sM:指定使用 TCP SYN/Connect()/ACK/Window/Maimon scans的方式来对目标主机进行扫描。
 
-sU: 指定使用UDP扫描方式确定目标主机的UDP端口状况。
 
-sN/sF/sX: 指定使用TCP Null, FIN, and Xmas scans秘密扫描方式来协助探测对方的TCP端口状态。
 
--scanflags <flags>: 定制TCP包的flags。
 
-sI <zombiehost[:probeport]>: 指定使用idle scan方式来扫描目标主机(前提需要找到合适的zombie host)
 
-sY/sZ: 使用SCTP INIT/COOKIE-ECHO来扫描SCTP协议端口的开放的情况。
 
-sO: 使用IP protocol 扫描确定目标机支持的协议类型。
 
-b <FTP relay host>: 使用FTP bounce scan扫描方式

端口参数与扫描顺序

-p <port ranges>: 扫描指定的端口
 
实例: -p 22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9(其中T代表TCP协议、U代表UDP协议、S代表SCTP协议)
 
-F: Fast mode – 快速模式,仅扫描TOP 100的端口
 
-r: 不进行端口随机打乱的操作(如无该参数,nmap会将要扫描的端口以随机顺序方式扫描,以让nmap的扫描不易被对方防火墙检测到)。
 
--top-ports <number>:扫描开放概率最高的number个端口(nmap的作者曾经做过大规模地互联网扫描,以此统计出网络上各种端口可能开放的概率。以此排列出最有可能开放端口的列表,具体可以参见文件:nmap-services。默认情况下,nmap会扫描最有可能的1000个TCP端口)
 
--port-ratio <ratio>: 扫描指定频率以上的端口。与上述--top-ports类似,这里以概率作为参数,让概率大于--port-ratio的端口才被扫描。显然参数必须在在0到1之间,具体范围概率情况可以查看nmap-services文件

四:版本探测

版本探测,用于确认目标主机开放端口上运行的具体的应用程序以及版本信息。

nmap -sV ip

五:OS探测

操作系统侦测用于检测目标主机运行的操作系统类型及设备类型等信息。

Nmap拥有丰富的系统数据库nmap-os-db,目前可以识别2600多种操作系统与设备类型。

nmap -O ip

六:Nmap高级用法

nmap -F -Pn -D 10.96.10.100,10.96.10.110,ME  -e eth0  -g 5555 202.207.236.3
 
-F参数表示快速扫描100个端口,-Pn不进行ping扫描,-D表示使用ip诱骗方式掩饰真实ip,使用的是10.96.10.100和10.96.10.110,ME表示自己真实的ip,这里是10.96.10.234,-e 参数指定eth0网卡发送数据包,-g参数指定发送的端口号

NSE脚本引擎

例如:
nmap -script   smb-vuln-ms17-010  192.168.10.34     #可以探测该主机是否存在ms17_010漏洞
nmap --max-parallelism 800 --script http-slowloris scanme.nmap.org  #可以探测该主机是否存在http拒绝服务攻击漏洞
nmap -script http-iis-short-name-brute 192.168.10.34  #探测是否存在IIS短文件名漏洞
nmap -script mysql-empty-password 192.168.10.34       #验证mysql匿名访问
nmap -p 443 -script ssl-ccs-injection 192.168.10.34   #验证是否存在openssl CCS注入漏洞
 
--script=http-waf-detect            #验证主机是否存在WAF
--script=http-waf-fingerprint       #验证主机是否存在WAF
 
nmap --script-brute 192.168.1.1     #nmap可对数据库、SMB、SNMP等进行简单密码的暴力破解
nmap --script-vuln  192.168.1.1     #扫描是否有常见漏洞
 
--script-updatedb         #更新脚本数据库
--script-help             #输入脚本对应的使用方法
当主机不在域环境,可通过以下命令爆破域内用户
nmap -p 88 --script krb5-enum-users --script-args krb5-enum-users.realx="xie.com",userdb="users.txt" 192.168.10.131
posted @ 2021-03-17 18:15  R1card  阅读(769)  评论(0编辑  收藏  举报