nmap使用总结-详细版


nmap使用简介

本文内容总结自nmap官方文档,在下直接给在座的诸位来一份双语的可好?不好!

nmap (“Network Mapper(网络映射器)”) 是一款开放源代码的网络探测和安全审核的工具。它的设计目标是快速地扫描大型网络,当然用它扫描单个主机也没有问题。nmap 以新颖的方式使用原始 IP 报文来发现网络上有哪些主机,那些主机提供什么服务( 应用程序名和版本 ),那些服务运行在什么操作系统( 包括版本信息 ),它们使用什么类型的报文过滤器/防火墙,以及一堆其它功能。
nmap 输出的是扫描目标的列表,以及每个目标的补充信息。其中最关键的是它所输出的“感兴趣端口的表格”,这张表格列出端口号、协议号、服务名称和状态。其中状态有以下几种可能:

  1. open (开放的):开放的意味这个目标机器上的应用程序正在使用端口监听连接/报文。
  2. filtered (被过滤的):这意味着防火墙、过滤器或其他网络障碍阻止了该端口被访问。nmap 无法得知它是 open (开放的) 还是 closed (关闭的)。
  3. closed (关闭的):端口没有应用程序在它上面监听。
  4. unfiltered (未被过滤的)未被过滤状态意味着端口可访问,但 nmap 不能确定它是开放还是关闭。
  5. open|filtered (开放或者被过滤的)当无法确定端口是开放还是被过滤的,nmap 就把该端口划分成这种状态。
  6. closed|filtered (关闭或者被过滤的)该状态用于 nmap 不能确定端口是关闭的还是被过滤的。

一个典型的nmap扫描

# nmap -A -T4 scanme.nmap.org playground

Starting nmap ( https://nmap.org/ )
Interesting ports on scanme.nmap.org (205.217.153.62):
(The 1663 ports scanned but not shown below are in state: filtered)
port    STATE  SERVICE VERSION
22/tcp  open   ssh     OpenSSH 3.9p1 (protocol 1.99)
53/tcp  open   domain
70/tcp  closed gopher
80/tcp  open   http    Apache httpd 2.0.52 ((Fedora))
113/tcp closed auth
Device type: general purpose
Running: Linux 2.4.X|2.5.X|2.6.X
OS details: Linux 2.4.7 - 2.6.11,Linux 2.6.0 - 2.6.11
Uptime 33。908 days (since Thu Jul 21 03:38:03 2005)

Interesting ports on playground。nmap。或者g (192.168.0.40):
(The 1659 ports scanned but not shown below are in state: closed)
port     STATE SERVICE       VERSION
135/tcp  open  msrpc         Microsoft Windows RPC
139/tcp  open  netbios-ssn
389/tcp  open  ldap?
445/tcp  open  microsoft-ds  Microsoft Windows XP microsoft-ds
1002/tcp open  windows-icfw?
1025/tcp open  msrpc         Microsoft Windows RPC
1720/tcp open  H.323/Q.931   CompTek AquaGateKeeper
5800/tcp open  vnc-http      RealVNC 4.0 (Resolution 400x250; VNC TCP port: 5900)
5900/tcp open  vnc           VNC (protocol 3.8)
MAC Address: 00:A0:CC:63:85:4B (Lite-on Communications)
Device type: general purpose
Running: Microsoft Windows NT/2K/XP
OS details: Microsoft Windows XP Pro RC1+ through final release
Service Info: OSs: Windows,Windows XP

Nmap finished: 2 IP addresses (2 hosts up) scanned in 88.392 seconds

nmap的参数及使用说明

nmap的扫描目标

使用nmap需要指定扫描的目标,最简单的情况就是直接给一个IP地址或者是一个主机名就可以就行扫描了。

nmap支持CIDR形式的地址,例如输入的目标为192.168.17.0/24,nmap就会扫描当前网段192.168.17.0-192.168.17.255总共256个地址所对应的主机。

nmap支持用逗号分开的数字或者范围列表为IP地址的的每八位指定范围,例如192.168.0-255.1-254表示略过在该范围内以.0和.255结束的地址。此外,nmap也支持输入不同类型的目标地址参数。

IPV6地址只能用规范的IPV6地址或者主机名。

可以使用一些参数来控制目标选择

  • -iL <inputfilename> 从文件中读取IP地址列表扫描
  • -iR <hostnum> 随机选择目标,hostnum 为目标数
  • --exclude <host[, host2] [, host3], ...> 排除主机或网络
  • --excludefile <excludefile> 排除文件中的列表

主机发现

nmap提供了强大的主机发现功能,用于探寻所给的地址中活动的主机。可以用以下参数来控制主机发现的行为

  • -sL(列表扫描)列表扫描是主机发现的退化形式,它仅仅列出指定网络上的每台主机, 不发送任何报文到目标主机
  • -sP(Ping扫描)该选项告诉nmap仅仅进行ping扫描 (主机发现),然后打印出对扫描做出响应的那些主机
  • -P0(不使用ping)该选项完全跳过nmap发现阶段。 通常nmap在进行高强度的扫描时用它确定正在运行的机器。 默认情况下,nmap只对正在运行的主机进行高强度的探测如端口扫描,版本探测,或者操作系统探测。用-P0禁止主机发现会nmap对每一个指定的目标IP地址进行所要求的扫描
  • -PS [protlist](TCP SYN Ping)该选项发送一个设置了SYN标志位的空TCP报文。 默认目的端口为80 (可以通过改变nmap.h) 文件中的DEFAULT-TCP-PROBE-PORT值进行配置,但不同的端口也可以作为选项指定。 甚至可以指定一个以逗号分隔的端口列表(如-PS22,23,25,80,113,1050,35000), 在这种情况下,每个端口会被并发地扫描。
  • -PA [portlist] (TCP ACK Ping)TCP ACK ping和刚才讨论的SYN ping相当类似,区别就是设置TCP的ACK标志位而不是SYN标志位。
  • -PU [portlist] (UDP Ping)还有一个主机发现的选项是UDP ping,它发送一个空的(除非指定了--data-length)UDP报文到给定的端口。端口列表的格式和前面讨论过的-PS-PA选项一样。
  • -PE;-PP;-PM (ICMP Ping Types)功能类似于一般的ping程序,nmap会发送一个ICMP回声请求报文。
  • -PR (ARP Ping)使用nmap进行arp扫描
  • -n (不用域名解析)告诉nmap永不对它发现的活动IP地址进行反向域名解析
  • -R (为所有目标解析域名)告诉nmap永远对目标IP地址作反向域名解析。一般只有当发现机器正在运行时才进行这项操作
  • --system-dns (使用系统域名解析器)为了提高性能,许多请求 (一般几十个 ) 并发执行。如果希望使用系统自带的解析器,就指定该选项。

端口扫描

端口扫描是nmap的一个非常强大的核心功能,可以通过nmap的端口扫描功能来确定目标主机的端口的状态,nmap的扫描提供了详细了端口信息,并且将端口的状态划分为前文所提到的六类。

可以通过下面列出的几种选项指定特定的端口扫描行为, 一般一次只用一种方法, 除了UDP扫描(-sU)可能和任何一种TCP扫描类型结合使用。

  • -sS (TCP SYN扫描)SYN扫描是默认的也是最常用的扫描选项, 它的扫描速度快,同时SYN扫描相对来说不张扬,不易被注意到,因为它从来不完成TCP连接,也正因为这个原因,它常常被称为半开放扫描。
  • -sT (TCP connect()扫描)当SYN扫描不能用时,TCP Connect()扫描就是默认的TCP扫描。 当用户没有权限发送原始报文或者扫描IPv6网络时,就是这种情况。
  • -sU (UDP扫描)UDP扫描可以和TCP扫描如SYN扫描 (-sS)结合使用来同时检查两种协议,UDP扫描发送空的(没有数据)UDP报头到每个目标端口,通过返回的报文或者错误信息来确定端口的状态。
  • -sN;-sF;-sX (TCP Null,FIN,and Xmas扫描)这三种扫描通过TCP RFC中的某些协议来区分端口是开放的还是关闭的(当然,并非所有系统都严格遵循RFC 793),即当端口关闭时,任何不包含SYN,RST,或者ACK位的报文会导致 一个RST返回,而当端口开放时,应该没有任何响应。其中Null扫描不设置任何标志位(tcp标志头是0),FIN扫描只设置TCP FIN标志位,Xmas扫描设置FIN,PSH,和URG标志位。除了探测报文的标志位不同,这三种扫描在行为上完全一致。 如果收到一个RST报文,该端口被认为是关闭的,而没有响应则意味着端口是开放或者被过滤的。如果收到ICMP不可到达错误(类型 3,代号 1,2,3,9,10,或者13),该端口就被标记为被过滤的。
  • -sA (TCP ACK扫描)ACK扫描探测报文只设置ACK标志位(除非使用--scanflags),它不能确定open(开放的)或者open|filtered(开放或者过滤的)端口。 它用于发现防火墙规则,确定它们是有状态的还是无状态的,哪些端口是被过滤的。
  • -sW (TCP窗口扫描)除了利用特定系统的实现细节来区分开放端口和关闭端口,当收到RST时不总是打印unfiltered, 窗口扫描和ACK扫描完全一样。
  • -sM (TCP Maimon扫描)这项技术和Null,FIN,以及Xmas扫描完全一样,除了探测报文是FIN/ACK。
  • --scanflags (定制的TCP扫描)该选项允许通过指定任意TCP标志位来设计自己的扫描,该选项可以是数字标记值,也可以是字符名,通常是URGACKPSHRSTSYN,和FIN的任何组合。
  • -sI <zombie host[:probeport]> (Idlescan)这种高级的扫描方法允许对目标进行真正的TCP端口盲扫描 (意味着没有报文从真实IP地址发送到目标)。
  • -sO (IP协议扫描)这种扫描可以确定目标机支持哪些IP协议 (TCP,ICMP,IGMP,等等),使用使用-p选项选择要扫描的协议号,nmap会以正常的端口表格式报告结果。
  • -b <ftp relay host> (FTP弹跳扫描)FTP协议支持所谓代理FTP连接,它允许用户连接到一台FTP服务器,然后要求文件送到一台第三方服务器(现在许多服务器已经停止支持)。nmap利用这一点,只要请求FTP服务器轮流发送一个文件到目标主机上的所感兴趣的端口,错误消息会描述端口是开放还是关闭的,这是绕过防火墙的好方法。

除了上面讨论的扫描方法,nmap提供下面这些选项指定哪些端口被扫描以及扫描是随机还是顺序进行( 默认情况下,nmap用指定的协议对端口1到1024以及 nmap-services 文件中列出的更高的端口进行扫描)

  • -p <port ranges> (只扫描指定的端口)该选项可以指定想要扫描的端口来覆盖默认值,可以使用单个端口或用连字符表示的端口范围。
  • -F (快速 (有限的端口) 扫描)
  • -r (不要按随机顺序扫描端口)默认情况下,nmap按随机顺序扫描端口 (除了出于效率的考虑,常用的端口前移)。这种随机扫描方式是比较常用的, 但也可以指定-r来顺序端口扫描。

服务与版本检测

nmap在使用其他类型的扫描方法发现TCP或UDP端口后,可以通过版本探测功能询问这些端口,确定到底什么服务正在运行。nmap-service-probes 数据库包含查询不同服务的探测报文和解析识别响应的匹配表达式。试图确定服务协议 (如 ftp,ssh,telnet,http),应用程序名(如ISC Bind,Apache httpd,Solaris telnetd),版本号,主机名,设备类型(如打印机,路由器),操作系统家族(如Windows,Linux)以及其它的细节,当nmap从某个服务收到响应,但不能在数据库中找到匹配时, 它就打印一个特殊的fingerprint和一个URL供使用者提交。可以使用下面的选项打开和控制版本探测

  • -sV (版本探测)打开版本探测
  • --allports (不为版本探测排除任何端口)
  • --version-intensity <intensity> (设置版本扫描强度)当进行版本扫描(-sV)时,nmap发送一系列探测报文 ,每个报文都被赋予一个1到9之间的值。 被赋予较低值的探测报文对大范围的常见服务有效,而被赋予较高值的报文一般没什么用。强度水平说明了应该使用哪些探测报文。数值越高, 服务越有可能被正确识别。
  • --version-light (打开轻量级模式)可以通过这个选项使扫描快很多,但相应得识别服务的可能性也会变低。
  • --version-all (尝试每个探测)保证对每个端口尝试每个探测报文
  • --version-trace (跟踪版本扫描活动)这使得nmap打印出详细的关于正在进行的扫描的调试信息。
  • -sR (RPC扫描)这种方法和许多端口扫描方法联合使用,它对所有被发现开放的TCP/UDP端口执行SunRPC程序NULL命令,来试图确定它们是否RPC端口,如果是,则确定程序和版本号。

操作系统检测

nmap最著名的功能之一是用TCP/IP协议栈fingerprinting进行远程操作系统探测。 nmap发送一系列TCP和UDP报文到远程主机,检查响应中的每一个比特。 在进行一系列的测试,如TCP ISN采样,TCP选项支持和排序,IPID采样,和初始窗口大小检查, nmap把结果和数据库 nmap-os-fingerprints中超过 1500个已知的操作系统的fingerprints进行比较,如果有匹配,就打印出操作系统的详细信息。

  • -O (启用操作系统检测)也可以使用-A来同时启用操作系统检测和版本检测
  • --osscan-limit (针对指定的目标进行操作系统检测) 如果发现一个打开和关闭的TCP端口时,操作系统检测会更有效。采用这个选项,Nmap只对满足这个条件的主机进行操作系统检测,这样可以 节约时间
  • --osscan-guess;--fuzzy (推测操作系统检测结果)当 nmap 无法确定所检测的操作系统时,会尽可能地提供最相近的匹配,Nmap 默认进行这种匹配,使用上述任一个选项使得 Nmap 的推测更加有效

扫描性能

在实际情况中,使用nmap扫描一个非常大的网段是很常见的,其中会包含上万甚至数十万台主机,这种情况下扫描的速度就尤为重要。nmap使用了并行算法和许多先进的算法来加速扫描,用户可以根据实际情况控制一些选项来进一步改善性能

  • --min-hostgroup <milliseconds>;--max-hostgroup <milliseconds> (调整并行扫描组的大小)nmap具有并行扫描多主机端口或版本的能力,nmap将多个目标IP地址空间分成组,然后在同一时间对一个组进行扫描。通常分组越大效率越高,但缺点是需要等待一个组扫描完毕后才能看到nmap的扫描信息。nmap采取了一种折衷的方法。开始扫描时的组较小(最小为5),这样便于尽快产生结果。随后增长组的大小,最大为1024。确切的大小依赖于所给定的选项。(为保证效率,针对UDP或少量端口的TCP扫描,nmap 使用大的组)--max-hostgroup选项用于指定最大的组的容量,--min-hostgroup选项指定最小的组的容量
  • --min-parallelism <milliseconds>;--max-parallelism <milliseconds> (调整探测报文的并行度)这两个选项控制用于主机组的探测报文数量,默认状态下, nmap基于网络性能计算一个理想的并行度,这个值经常改变。如果报文被丢弃, nmap降低速度,探测报文数量减少。随着网络性能的改善,理想的探测报文数量会缓慢增加。 这些选项确定这个变量的大小范围。默认状态下,当网络不可靠时,理想的并行度值 可能为1,在好的条件下,可能会增长至几百。最常见的应用是--min-parallelism值大于1,以加快性能不佳的主机或网络的扫描,但设置过高会影响准确度,一般设置为10。--max-parallelism选项通常设为1,以防止nmap在同一时间向主机发送多个探测报文
  • --min-rtt-timeout <milliseconds>--max-rtt-timeout <milliseconds>--initial-rtt-timeout <milliseconds> (调整探测报文超时时间)nmap使用一个运行超时值来确定等待探测报文响应的时间,随后会放弃或重新发送探测报文。这三个选项以毫秒为单位,使用建议:1)采用小的--max-rtt-timeout值,使--initial-rtt-timeout值大于默认值可以明显减少扫描时间。2)如果所有的主机都在本地网络,对于--max-rtt-timeout值来 说,100毫秒比较合适。如果存在路由,首先使用ICMP ping工具ping主机,查看大约10个包的最大往返时间,然后将--initial-rtt-timeout设成这个时间的2倍,--max-rtt-timeout 可设成这个时间值的3倍或4倍。通常,不管ping的时间是多少,最大的rtt值不得小于100ms, 不能超过1000ms。3)--min-rtt-timeout这个选项很少使用,网络不可靠时,可以使用这个选项
  • --host-timeout <milliseconds> (放弃低速目标主机)利用这个选项设置一个等待的时间,忽略超时的主机。
  • --scan-delay <milliseconds>;--max-scan-delay <milliseconds> (调整探测报文的时间间隔)这个选项用于指定nmap针对一个主机发送探测报文的等待时间(毫秒)
  • -T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane> (设置时间模板)这个选项可以选择时间模板,使用时采用-T选项及数字(0 - 5) 或名称。模板名称有paranoid (0)、sneaky (1)、polite (2)、normal(3)、 aggressive (4)和insane (5),用户可以根据自己的需要选择不同的模板,由Nmap负责选择实际的时间值

防火墙/IDS绕过

nmap提供了一些防火墙和IDS绕过的手段,使用如下选项开启

  • -f (报文分段);--mtu (使用指定的MTU)-f选项要求扫描时(包挺ping扫描)使用小的IP包分段。其思路是将TCP头分段在几个包中,使得包过滤器、 IDS以及其它工具的检测更加困难,用--mtu选项可 以自定义偏移的大小,使用时不需要-f,偏移量必须是8的倍数
  • -D <decoy1 [,decoy2][,ME],...> (使用诱饵隐蔽扫描)使用该选项让远程主机认为是诱饵在扫描目标网络,使用逗号分隔每个诱饵主机,也可用自己的真实IP作为诱饵,这时可使用ME选项说明(作为诱饵的主机须在工作状态,否则会导致目标主机的SYN洪水攻击。
  • -S <IP_Address> (源地址哄骗)在某些情况下nmap可能无法确定源地址,这是可以通过这个选项指定,这个选项另一个作用是指定一个其他的IP地址,使得目标认为是另一个地址在进行扫描。
  • -e <interface> (使用指定的接口)
  • --source-port <portnumber>;-g <portnumber> (源端口哄骗)这个两个选项是等价的,可以通过这些选项指定发送的端口
  • --data-length <number> (发送报文时附加随机数据)这个选项告诉nmap在原发送报文的基础上添加指定数量的随机字节
  • --ttl <value> (设置IP time-to-live域)
  • --randomize-hosts (对目标主机的顺序随机排列)告诉nmap在扫描主机前对每个组中的主机随机排列,最多可达 8096个主机,这会使得扫描针对不同的网络监控系统来说变得不是很明显
  • --spoof-mac <mac address,prefix,or vendor name> (MAC地址哄骗)这个选项要求nmap在发送原以太网帧时使用指定的MAC地址

输出控制

nmap默认的输出方式是 interactive output, 即将扫描的报告信息发送给标准输出(stdout)。除此之外,nmap还支持将其输出到文件中(nmap仍会将结果发送至标准输出)。nmap提供了5种不同的输出格式,还提供了选项来控制输出的细节以及调试信息,具体如下

  • -oN <filespec> (标准输出)将标准输出直接写入到指定的文件
  • -oX <filespec> (XML输出)以XML格式输入到指定文件中,可以指定XML输出引用一个XSL样式表,用于格式化输出结果,类似于 HTML,可以使用浏览器打开查看。
  • -oS <filespec> (脚本小子输出)
  • -oG <filespec> (Grep输出)grep输出比起XML输出更为简化,每行一个主机,可以通过grep工具进行查看。Grep输出可以包含注释(每行由#号开始)。每行由6个标记的域组成,由制表符及 冒号分隔。这些域有主机端口协议忽略状态操作系统序列号IPID状态。其中最重要的是Ports,它提供了所有关注的端口的细节,端口项由逗号分隔。每个端口项代表一个所关注的端口,每个子域由/分隔。这些子域有:端口号状态协议拥有者服务SunRPCinfo版本信息
  • -oA <basename> (输出至所有格式)同时输出至所有格式

除了上面这些控制输出格式的选项,nmap还提供了一些选项来调整细节,如下

  • -v (提高输出信息的详细度)这个选项告诉nmap输出扫描过程中更多的信息,这个选项使用两次,会提供更详细的信息,两次以上则没有效果。
  • -d [level] (提高或设置调试级别)当详细模式也不能为用户提供足够的数据时,使用调试选项可以得到更多的信息。使用细节选项(-v)时,可启用命令行参数 (-d),多次使用可提高调试级别。也可在-d 后面使用参数设置调试级别,最高为9级
  • --packet-trace (跟踪发送和接收的报文)这个选项要求nmap打印发送和接收的每个报文的摘要,以帮助调试。
  • --iflist (列举接口和路由)输出nmap检测到的接口列表和系统路由,用于调试路由问题或设备描述失误
  • --append-output (在输出文件中添加)当使用文件作为输出格式,若文件已存在则默认原文件被覆盖。如果希望文件保留现有内容,可使用这个选项将结果添加在现有文件后面
  • --resume <filename> (继续中断的扫描)如果使用nmap的文件输出,当nmap的某次扫描因为各种原因中断时,可以使用该选项继续上次中断的扫描。只需要为该选项指定上一次扫描的文件名,nmap会自动解析输出文件继续扫描,并依旧按照原输出格式输出
  • --stylesheet <path or URL> (设置XSL样式表,转换XML输出)nmap提供了XSL样式表nmap.xsl,用于查看或转换XML输出至HTML。XML输出包含了一个xml-stylesheet,直接指向nmap.xml文件, 该文件由nmap安装。在浏览器中打开nmap的XML输出时,将会在文件系统中寻找nmap.xsl文件, 并使用它输出结果
  • --no-stylesheet (忽略XML声明的XSL样式表)该选项禁止nmap的XML输出关联任何XSL样式表

其他选项

除了前面所总结的几种类型的诸多选项外,nmap还包含了一些其他重要(或不重要)的选项,这里补充如下

  • -6 (启用IPv6扫描)
  • -A (激烈扫描模式选项)这个选项启用额外的高级和高强度选项
  • --datadir <directoryname> (说明用户nmap数据文件位置)nmap在运行时从文件中获得特殊的数据,这些文件有nmap-service-probesnmap-servicesnmap-protocolsnmap-rpcnmap-mac-prefixesnmap-os-fingerprints。nmap首先 在--datadir选项说明的目录中查找这些文件。 未找到的文件,将在BMAPDIR环境变量说明的目录中查找。
  • --send-eth (使用原以太网帧发送)nmap可以在数据链路层和网络层发送报文,默认情况下,nmap选择最适合其运行平台的数据帧方式。这个选项则显式地指定nmap从数据链路层发送报文
  • --send-ip (在原IP层发送)这个选项要求nmap通过原IP套接字发送报文,而非低层的以太网帧
  • --privileged (假定用户具有全部权限)告诉nmap假定其具有足够的权限进行源套接字包发送、 报文捕获和类似UNIX系统中root用户操作的权限
  • -V;--version (打印版本信息)打印nmap版本信息并退出
  • -h;--help (打印帮助摘要面)获得帮助信息

与nmap的交互

nmap运行时,会记录键盘的敲击,这样用户就可以在不终止程序的前提下与nmap进行交互,一些特定的键可以改变某些选项,其他键则会输出一个关于扫描的状态信息

  • v /V 增加/减少细节
  • d /D 提高/降低调试级别
  • p /P 打开/关闭报文追踪

使用示例

太多了。。。暂无。


文章作者: Justice
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Justice !
  目录