1、简介html
端口扫描是网络安全工做者的必备的利器,经过对端口的扫描,了解网站中出现的漏洞以及端口的开放状况,对网站安全方面有着不可或缺的贡献,Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具。nmap成为世界千万安全专家列为必备的工具之一。nmap具备如下的这一些优势:
一、多种多样的参数,丰富的脚本库,知足用户的我的定制需求,其中脚本库还提供了不少强大的功能任你选择
二、强大的可移植性,基本上能在全部的主流系统上运行,并且代码是开源的
三、详细的文档说明,和强大的社区团队进行支持,方面新人上手mysql
下载nmap,而后安装的步骤跟其余的软件同样,最后确认安装成功只须要在命令行中输入nmap回车,有相关的参数输出即为安装成功。Nmap扫描输出的XML文件能够直接使用文本编辑器打开,也能够在windows上使用Nmap的图形化界面打开,这样查看起来更方便。全面扫描某些主机时,可能会致使主机崩溃、停机或数据丢失等不良结果。因此,在扫描关键任务时要当心谨慎。linux
当目标主机上使用了防火墙、路由器、代理服务或其它安全设备时,使用Nmap扫描结果可能会存在一些误差。或者当扫描的远程目标主机不在本地网络内时,也有可能会出现误导信息。在使用Nmap实施扫描时,一些选项须要提高权限。在Unix和Linux系统中,必须使用root登陆或者使用sudo命令执行Nmap命令。ios
2、使用
Nmap可实现:主机发现,端口扫描,服务和版本探测,OS版本探测
Nmap工具默认扫描前1000个端口,即1-1000。若是用户想扫描1000以上端口的话,须要使用-p选项来指定。算法
端口扫描基础
许多传统的端口扫描器只列出全部端口是开放仍是关闭的, Nmap的信息粒度比它们要细得多。 它把端口分红六个状态: open(开放的), closed(关闭的),filtered(被过滤的), unfiltered(未被过滤的), open|filtered(开放或者被过滤的),或者 closed|filtered(关闭或者被过滤的)。
Nmap所识别的6个端口状态。sql
open(开放的)
应用程序正在该端口接收TCP 链接或者UDP报文。发现这一点经常是端口扫描 的主要目标。安全意识强的人们知道每一个开放的端口 都是攻击的入口。攻击者或者入侵测试者想要发现开放的端口。 而管理员则试图关闭它们或者用防火墙保护它们以避免妨碍了合法用户。 非安全扫描可能对开放的端口也感兴趣,由于它们显示了网络上那些服务可供使用。数据库
closed(关闭的)
关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并做出响应), 但没有应用程序在其上监听。 它们能够显示该IP地址上(主机发现,或者ping扫描)的主机正在运行up 也对部分操做系统探测有所帮助。 由于关闭的关口是可访问的,也许过会儿值得再扫描一下,可能一些又开放了。 系统管理员可能会考虑用防火墙封锁这样的端口。 那样他们就会被显示为被过滤的状态,下面讨论。编程
filtered(被过滤的)
因为包过滤阻止探测报文到达端口, Nmap没法肯定该端口是否开放。过滤可能来自专业的防火墙设备,路由器规则 或者主机上的软件防火墙。这样的端口让攻击者感受很挫折,由于它们几乎不提供 任何信息。有时候它们响应ICMP错误消息如类型3代码13 (没法到达目标: 通讯被管理员禁止),但更广泛的是过滤器只是丢弃探测帧, 不作任何响应。 这迫使Nmap重试若干次以访万一探测包是因为网络阻塞丢弃的。 这使得扫描速度明显变慢。windows
unfiltered(未被过滤的)
未被过滤状态意味着端口可访问,但Nmap不能肯定它是开放仍是关闭。 只有用于映射防火墙规则集的ACK扫描才会把端口分类到这种状态。 用其它类型的扫描如窗口扫描,SYN扫描,或者FIN扫描来扫描未被过滤的端口能够帮助肯定 端口是否开放。api
open|filtered(开放或者被过滤的)
当没法肯定端口是开放仍是被过滤的,Nmap就把该端口划分红 这种状态。开放的端口不响应就是一个例子。没有响应也可能意味着报文过滤器丢弃 了探测报文或者它引起的任何响应。所以Nmap没法肯定该端口是开放的仍是被过滤的。 UDP,IP协议, FIN,Null,和Xmas扫描可能把端口纳入此类。
closed|filtered(关闭或者被过滤的)
该状态用于Nmap不能肯定端口是关闭的仍是被过滤的。 它只可能出如今IPID Idle扫描中。
若是Nmap报告状态组合 open|filtered 和 closed|filtered时,那说明Nmap没法肯定该端口处于两个状态中的哪个状态。
目标说明
-iL <inputfilename>: 从列表中输入(列表中包含hosts/IP)
-iR <hostnum>: 随机选择目标,选项 0 意味着永无休止的扫描。
--exclude <host1[,host2][,host3],...>: 排除主机/网络
--excludefile <exclude_file>: 排除文件中的列表(文件中的列表用换行符,空格,或者制表符分隔)
主机发现:
(默认:ICMP,SYN,ACK,UDP Ping)
-sL: 列表扫描,列表扫描是主机发现的退化形式,它仅仅列出指定网络上的每台主机, 不发送任何报文到目标主机。
-sP: Ping扫描,该选项告诉Nmap仅仅 进行ping扫描 (主机发现),而后打印出对扫描作出响应的那些主机。它能够很方便地得出 网络上有多少机器正在运行或者监视服务器是否正常运行。经常有人称它为 地毯式ping
-P0 (无ping)
该选项彻底跳过Nmap发现阶段。 一般Nmap在进行高强度的扫描时用它肯定正在运行的机器。 默认状况下,Nmap只对正在运行的主机进行高强度的探测如 端口扫描,版本探测,或者操做系统探测。用-P0禁止 主机发现会使Nmap对每个指定的目标IP地址 进行所要求的扫描。因此若是在命令行指定一个B类目标地址空间(/16), 全部 65,536 个IP地址都会被扫描。 -P0的第二个字符是数字0而不是字母O。 和列表扫描同样,跳过正常的主机发现,但不是打印一个目标列表, 而是继续执行所要求的功能,就好像每一个IP都是活动的。
-PS [portlist] (TCP SYN Ping)
该选项发送一个设置了SYN标志位的空TCP报文。 默认目的端口为80 (能够经过改变nmap.h) 文件中的DEFAULT-TCP-PROBE-PORT值进行配置,但不一样的端口也能够做为选项指定。 甚至能够指定一个以逗号分隔的端口列表(如 -PS22,23,25,80,113,1050,35000), 在这种状况下,每一个端口会被并发地扫描。
SYN标志位告诉对方您正试图创建一个链接。 一般目标端口是关闭的,一个RST (复位) 包会发回来。 若是碰巧端口是开放的,目标会进行TCP三步握手的第二步,回应 一个SYN/ACK TCP报文。而后运行Nmap的机器则会扼杀这个正在创建的链接, 发送一个RST而非ACK报文,不然,一个彻底的链接将会创建。 RST报文是运行Nmap的机器而不是Nmap自己响应的,由于它对收到 的SYN/ACK感到很意外。
Nmap并不关心端口开放仍是关闭。 不管RST仍是SYN/ACK响应都告诉Nmap该主机正在运行。
在UNIX机器上,一般只有特权用户 root 可否发送和接收 原始的TCP报文。所以做为一个变通的方法,对于非特权用户, Nmap会为每一个目标主机进行系统调用connect(),它也会发送一个SYN 报文来尝试创建链接。若是connect()迅速返回成功或者一个ECONNREFUSED 失败,下面的TCP堆栈必定已经收到了一个SYN/ACK或者RST,该主机将被 标志位为在运行。 若是链接超时了,该主机就标志位为down掉了。这种方法也用于IPv6 链接,由于Nmap目前还不支持原始的IPv6报文。
-PA [portlist] (TCP ACK Ping)
TCP ACK ping和刚才讨论的SYN ping至关相似。 也许您已经猜到了,区别就是设置TCP的ACK标志位而不是SYN标志位。 ACK报文表示确认一个创建链接的尝试,但该链接还没有彻底创建。 因此远程主机应该老是回应一个RST报文, 由于它们并无发出过链接请求到运行Nmap的机器,若是它们正在运行的话。
-PA选项使用和SYN探测相同的默认端口(80),也能够 用相同的格式指定目标端口列表。若是非特权用户尝试该功能, 或者指定的是IPv6目标,前面说过的connect()方法将被使用。 这个方法并不完美,由于它实际上发送的是SYN报文,而不是ACK报文。
提供SYN和ACK两种ping探测的缘由是使经过防火墙的机会尽量大。 许多管理员会配置他们的路由器或者其它简单的防火墙来封锁SYN报文,除非 链接目标是那些公开的服务器像公司网站或者邮件服务器。 这能够阻止其它进入组织的链接,同时也容许用户访问互联网。 这种无状态的方法几乎不占用防火墙/路由器的资源,于是被硬件和软件过滤器 普遍支持。Linux Netfilter/iptables 防火墙软件提供方便的 --syn选项来实现这种无状态的方法。 当这样的无状态防火墙规则存在时,发送到关闭目标端口的SYN ping探测 (-PS) 极可能被封锁。这种状况下,ACK探测格外有闪光点,由于它正好利用了 这样的规则。
另一种经常使用的防火墙用有状态的规则来封锁非预期的报文。 这一特性已开始只存在于高端防火墙,可是这些年类它愈来愈广泛了。 Linux Netfilter/iptables 经过 --state选项支持这一特性,它根据链接状态把报文 进行分类。SYN探测更有可能用于这样的系统,因为没头没脑的ACK报文 一般会被识别成伪造的而丢弃。解决这个两难的方法是经过即指定 -PS又指定-PA来即发送SYN又发送ACK。
-PU [portlist] (UDP Ping)
还有一个主机发现的选项是UDP ping,它发送一个空的(除非指定了--data-length UDP报文到给定的端口。端口列表的格式和前面讨论过的-PS和-PA选项仍是同样。 若是不指定端口,默认是31338。该默认值能够经过在编译时改变nmap.h文件中的 DEFAULT-UDP-PROBE-PORT值进行配置。默认使用这样一个奇怪的端口是由于对开放端口 进行这种扫描通常都不受欢迎。
若是目标机器的端口是关闭的,UDP探测应该立刻获得一个ICMP端口没法到达的回应报文。 这对于Nmap意味着该机器正在运行。 许多其它类型的ICMP错误,像主机/网络没法到达或者TTL超时则表示down掉的或者不可到达的主机。 没有回应也被这样解释。若是到达一个开放的端口,大部分服务仅仅忽略这个 空报文而不作任何回应。这就是为何默认探测端口是31338这样一个 极不可能被使用的端口。少数服务如chargen会响应一个空的UDP报文, 从而向Nmap代表该机器正在运行。
该扫描类型的主要优点是它能够穿越只过滤TCP的防火墙和过滤器。 例如。我曾经有过一个Linksys BEFW11S4无线宽带路由器。默认状况下, 该设备对外的网卡过滤全部TCP端口,但UDP探测仍然会引起一个端口不可到达 的消息,从而暴露了它本身。
-PE; -PP; -PM (ICMP Ping Types)
除了前面讨论的这些不常见的TCP和UDP主机发现类型, Nmap也能发送世人皆知的ping 程序所发送的报文。Nmap发送一个ICMP type 8 (回声请求)报文到目标IP地址, 期待从运行的主机获得一个type 0 (回声响应)报文。 对于网络探索者而言,不幸的是,许多主机和 防火墙如今封锁这些报文,而不是定期望的那样响应, 参见RFC 1122。所以,仅仅ICMP扫描对于互联网上的目标一般是不够的。 但对于系统管理员监视一个内部网络,它们多是实际有效的途径。 使用-PE选项打开该回声请求功能。
虽然回声请求是标准的ICMP ping查询, Nmap并不止于此。ICMP标准 (RFC 792)还规范了时间戳请求,信息请求 request,和地址掩码请求,它们的代码分别是13,15和17。 虽然这些查询的表面目的是获取信息如地址掩码和当前时间, 它们也能够很容易地用于主机发现。 很简单,回应的系统就是在运行的系统。Nmap目前没有实现信息请求报文, 由于它们尚未被普遍支持。RFC 1122 坚持 “主机不该该实现这些消息”。 时间戳和地址掩码查询能够分别用-PP和-PM选项发送。 时间戳响应(ICMP代码14)或者地址掩码响应(代码18)表示主机在运行。 当管理员特别封锁了回声请求报文而忘了其它ICMP查询可能用于 相同目的时,这两个查询可能颇有价值。
-PR (ARP Ping)
最多见的Nmap使用场景之一是扫描一个以太局域网。 在大部分局域网上,特别是那些使用基于 RFC1918私有地址范围的网络,在一个给定的时间绝大部分 IP地址都是不使用的。 当Nmap试图发送一个原始IP报文如ICMP回声请求时, 操做系统必须肯定对应于目标IP的硬件 地址(ARP),这样它才能把以太帧送往正确的地址。 这通常比较慢并且会有些问题,由于操做系统设计者认为通常不会在短期内 对没有运行的机器做几百万次的ARP请求。
当进行ARP扫描时,Nmap用它优化的算法管理ARP请求。 当它收到响应时, Nmap甚至不须要担忧基于IP的ping报文,既然它已经知道该主机正在运行了。 这使得ARP扫描比基于IP的扫描更快更可靠。 因此默认状况下,若是Nmap发现目标主机就在它所在的局域网上,它会进行ARP扫描。 即便指定了不一样的ping类型(如 -PI或者 -PS) ,Nmap也会对任何相同局域网上的目标机使用ARP。 若是您真的不想要ARP扫描,指定 --send-ip。
-n (不用域名解析)
告诉Nmap 永不对它发现的活动IP地址进行反向域名解析。 既然DNS通常比较慢,这可让事情更快些。
-R (为全部目标解析域名)
告诉Nmap 永远 对目标IP地址做反向域名解析。 通常只有当发现机器正在运行时才进行这项操做。
--system-dns (使用系统域名解析器)
默认状况下,Nmap经过直接发送查询到您的主机上配置的域名服务器 来解析域名。为了提升性能,许多请求 (通常几十个 ) 并发执行。若是您但愿使用系统自带的解析器,就指定该选项 (经过getnameinfo()调用一次解析一个IP)。除非Nmap的DNS代码有bug--若是是这样,请联系咱们。 通常不使用该选项,由于它慢多了。系统解析器老是用于IPv6扫描。
端口说明和扫描顺序
Nmap提供选项说明那些端口被扫描以及扫描是随机仍是顺序进行。 默认状况下,Nmap用指定的协议对端口1到1024以及nmap-services 文件中列出的更高的端口在扫描。
-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)。若是没有给定协议限定符, 端口号会被加到全部协议列表。
-F (快速 (有限的端口) 扫描)
在nmap的nmap-services 文件中(对于-sO,是协议文件)指定您想要扫描的端口。 这比扫描全部65535个端口快得多。 由于该列表包含如此多的TCP端口(1200多),这和默认的TCP扫描 scan (大约1600个端口)速度差异不是很大。若是您用--datadir选项指定您本身的 小小的nmap-services文件 ,差异会很惊人。
-r (不要按随机顺序扫描端口)
默认状况下,Nmap按随机顺序扫描端口 (除了出于效率的考虑,经常使用的端口前移)。这种随机化一般都是受欢迎的, 但您也能够指定-r来顺序端口扫描。
端口扫描技术
-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),该端口也被标记为被过滤。
-sT (TCP connect()扫描)
当SYN扫描不能用时,CP Connect()扫描就是默认的TCP扫描。 当用户没有权限发送原始报文或者扫描IPv6网络时,就是这种状况。 Instead of writing raw packets as most other scan types do,Nmap经过建立connect() 系统调用要求操做系统和目标机以及端口创建链接,而不像其它扫描类型直接发送原始报文。 这是和Web浏览器,P2P客户端以及大多数其它网络应用程序用以创建链接同样的 高层系统调用。它是叫作Berkeley Sockets API编程接口的一部分。Nmap用 该API得到每一个链接尝试的状态信息,而不是读取响应的原始报文。
当SYN扫描可用时,它一般是更好的选择。由于Nmap对高层的 connect()调用比对原始报文控制更少, 因此前者效率较低。 该系统调用彻底链接到开放的目标端口而不是像SYN扫描进行 半开放的复位。这不只花更长时间,须要更多报文获得一样信息,目标机也更可能 记录下链接。IDS(入侵检测系统)能够捕获二者,但大部分机器没有这样的警报系统。 当Nmap链接,而后不发送数据又关闭链接, 许多普通UNIX系统上的服务会在syslog留下记录,有时候是一条加密的错误消息。 此时,有些真正可怜的服务会崩溃,虽然这不常发生。若是管理员在日志里看到来自同一系统的 一堆链接尝试,她应该知道她的系统被扫描了。
-sU (UDP扫描)
虽然互联网上不少流行的服务运行在TCP 协议上,UDP服务也很多。 DNS,SNMP,和DHCP (注册的端口是53,161/162,和67/68)是最多见的三个。 由于UDP扫描通常较慢,比TCP更困难,一些安全审核人员忽略这些端口。 这是一个错误,由于可探测的UDP服务至关广泛,攻击者固然不会忽略整个协议。 所幸,Nmap能够帮助记录并报告UDP端口。
UDP扫描用-sU选项激活。它能够和TCP扫描如 SYN扫描 (-sS)结合使用来同时检查两种协议。
UDP扫描发送空的(没有数据)UDP报头到每一个目标端口。 若是返回ICMP端口不可到达错误(类型3,代码3), 该端口是closed(关闭的)。 其它ICMP不可到达错误(类型3, 代码1,2,9,10,或者13)代表该端口是filtered(被过滤的)。 偶尔地,某服务会响应一个UDP报文,证实该端口是open(开放的)。 若是几回重试后尚未响应,该端口就被认为是 open|filtered(开放|被过滤的)。 这意味着该端口多是开放的,也可能包过滤器正在封锁通讯。 能够用版本扫描(-sV)帮助区分真正的开放端口和被过滤的端口。
UDP扫描的巨大挑战是怎样使它更快速。 开放的和被过滤的端口不多响应,让Nmap超时而后再探测,以防探测帧或者 响应丢失。关闭的端口经常是更大的问题。 它们通常发回一个ICMP端口没法到达错误。可是不像关闭的TCP端口响应SYN或者Connect 扫描所发送的RST报文,许多主机在默认状况下限制ICMP端口不可到达消息。 Linux和Solaris对此特别严格。例如, Linux 2.4.20内核限制一秒钟只发送一条目标不可到达消息 (见net/ipv4/icmp。c)。
Nmap探测速率限制并相应地减慢来避免用那些目标机会丢弃的无用报文来阻塞 网络。不幸的是,Linux式的一秒钟一个报文的限制使65,536个端口的扫描要花 18小时以上。加速UDP扫描的方法包括并发扫描更多的主机,先只对主要端口进行快速 扫描,从防火墙后面扫描,使用--host-timeout跳过慢速的 主机。
-sN; -sF; -sX (TCP Null,FIN,and Xmas扫描)
这三种扫描类型 (甚至用下一节描述的 --scanflags 选项的更多类型) 在TCP RFC 中发掘了一个微妙的方法来区分open(开放的)和 closed(关闭的)端口。第65页说“若是 [目标]端口状态是关闭的.... 进入的不含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),该端口就被标记为 被过滤的。
这些扫描的关键优点是它们能躲过一些无状态防火墙和报文过滤路由器。 另外一个优点是这些扫描类型甚至比SYN扫描还要隐秘一些。可是别依赖它 -- 多数 现代的IDS产品能够发现它们。一个很大的不足是并不是全部系统都严格遵循RFC 793。 许多系统无论端口开放仍是关闭,都响应RST。 这致使全部端口都标记为closed(关闭的)。 这样的操做系统主要有Microsoft Windows,许多Cisco设备,BSDI,以及IBM OS/400。 可是这种扫描对多数UNIX系统都能工做。这些扫描的另外一个不足是 它们不能辨别open(开放的)端口和一些特定的 filtered(被过滤的)端口,从而返回 open|filtered(开放或者被过滤的)。
-sA (TCP ACK扫描)
这种扫描与目前为止讨论的其它扫描的不一样之处在于 它不能肯定open(开放的)或者 open|filtered(开放或者过滤的))端口。 它用于发现防火墙规则,肯定它们是有状态的仍是无状态的,哪些端口是被过滤的。
ACK扫描探测报文只设置ACK标志位(除非您使用 --scanflags)。当扫描未被过滤的系统时, open(开放的)和closed(关闭的) 端口 都会返回RST报文。Nmap把它们标记为 unfiltered(未被过滤的),意思是 ACK报文不能到达,但至于它们是open(开放的)或者 closed(关闭的) 没法肯定。不响应的端口 或者发送特定的ICMP错误消息(类型3,代号1,2,3,9,10, 或者13)的端口,标记为 filtered(被过滤的)。
-sW (TCP窗口扫描)
除了利用特定系统的实现细节来区分开放端口和关闭端口,当收到RST时不老是打印unfiltered, 窗口扫描和ACK扫描彻底同样。 它经过检查返回的RST报文的TCP窗口域作到这一点。 在某些系统上,开放端口用正数表示窗口大小(甚至对于RST报文) 而关闭端口的窗口大小为0。所以,当收到RST时,窗口扫描不老是把端口标记为 unfiltered, 而是根据TCP窗口值是正数仍是0,分别把端口标记为open或者 closed
该扫描依赖于互联网上少数系统的实现细节, 所以您不能永远相信它。不支持它的系统会一般返回全部端口closed。 固然,一台机器没有开放端口也是有可能的。 若是大部分被扫描的端口是 closed,而一些常见的端口 (如 22, 25,53) 是 filtered,该系统就很是可疑了。 偶尔地,系统甚至会显示偏偏相反的行为。 若是您的扫描显示1000个开放的端口和3个关闭的或者被过滤的端口, 那么那3个极可能也是开放的端口。
-sM (TCP Maimon扫描)
Maimon扫描是用它的发现者Uriel Maimon命名的。他在 Phrack Magazine issue #49 (November 1996)中描述了这一技术。 Nmap在两期后加入了这一技术。 这项技术和Null,FIN,以及Xmas扫描彻底同样,除了探测报文是FIN/ACK。 根据RFC 793 (TCP),不管端口开放或者关闭,都应该对这样的探测响应RST报文。 然而,Uriel注意到若是端口开放,许多基于BSD的系统只是丢弃该探测报文。
--scanflags (定制的TCP扫描)
真正的Nmap高级用户不须要被这些现成的扫描类型束缚。 --scanflags选项容许您经过指定任意TCP标志位来设计您本身的扫描。 让您的创造力流动,躲开那些仅靠本手册添加规则的入侵检测系统!
--scanflags选项能够是一个数字标记值如9 (PSH和FIN), 但使用字符名更容易些。 只要是URG, ACK,PSH, RST,SYN,and FIN的任何组合就行。例如,--scanflags URGACKPSHRSTSYNFIN设置了全部标志位,可是这对扫描没有太大用处。 标志位的顺序不重要。
除了设置须要的标志位,您也能够设置 TCP扫描类型(如-sA或者-sF)。 那个基本类型告诉Nmap怎样解释响应。例如, SYN扫描认为没有响应意味着 filtered端口,而FIN扫描则认为是 open|filtered。 除了使用您指定的TCP标记位,Nmap会和基本扫描类型同样工做。 若是您不指定基本类型,就使用SYN扫描。
-sI <zombie host[:probeport]> (Idlescan)
这种高级的扫描方法容许对目标进行真正的TCP端口盲扫描 (意味着没有报文从您的真实IP地址发送到目标)。相反,side-channel攻击 利用zombie主机上已知的IP分段ID序列生成算法来窥探目标上开放端口的信息。 IDS系统将显示扫描来自您指定的zombie机(必须运行而且符合必定的标准)。 这种奇妙的扫描类型太复杂了,不能在此彻底描述,因此我写一篇非正式的论文, 发布在https://nmap.org/book/idlescan.html。
除了极端隐蔽(因为它不从真实IP地址发送任何报文), 该扫描类型能够创建机器间的基于IP的信任关系。 端口列表从zombie 主机的角度。显示开放的端口。 所以您能够尝试用您认为(经过路由器/包过滤规则)可能被信任的 zombies扫描目标。
若是您因为IPID改变但愿探测zombie上的特定端口, 您能够在zombie 主机后加上一个冒号和端口号。 不然Nmap会使用默认端口(80)。
-sO (IP协议扫描)
IP 协议扫描可让您肯定目标机支持哪些IP协议 (TCP,ICMP,IGMP,等等)。从技术上说,这不是端口扫描 ,既然它遍历的是IP协议号而不是TCP或者UDP端口号。 可是它仍使用 -p选项选择要扫描的协议号, 用正常的端口表格式报告结果,甚至用和真正的端口扫描同样 的扫描引擎。所以它和端口扫描很是接近,也被放在这里讨论。
除了自己颇有用,协议扫描还显示了开源软件的力量。 尽管基本想法很是简单,我过去从没想过增长这一功能也没收到任何对它的请求。 在2000年夏天,Gerhard Rieger孕育了这个想法,写了一个很棒的补丁程序,发送到nmap-hackers邮件列表。 我把那个补丁加入了Nmap,次日发布了新版本。 几乎没有商业软件会有用户有足够的热情设计并贡献他们的改进。
协议扫描以和UDP扫描相似的方式工做。它不是在UDP报文的端口域上循环, 而是在IP协议域的8位上循环,发送IP报文头。 报文头一般是空的,不包含数据,甚至不包含所申明的协议的正确报文头 TCP,UDP,和ICMP是三个例外。它们三个会使用正常的协议头,由于不然某些系 统拒绝发送,并且Nmap有函数建立它们。协议扫描不是注意ICMP端口不可到达消息, 而是ICMP 协议不可到达消息。若是Nmap从目标主机收到 任何协议的任何响应,Nmap就把那个协议标记为open。 ICMP协议不可到达 错误(类型 3,代号 2) 致使协议被标记为 closed。其它ICMP不可到达协议(类型 3,代号 1,3,9,10,或者13) 致使协议被标记为 filtered (虽然同时他们证实ICMP是 open )。若是重试以后仍没有收到响应, 该协议就被标记为open|filtered
-b <ftp relay host> (FTP弹跳扫描)
FTP协议的一个有趣特征(RFC 959) 是支持所谓代理ftp链接。它容许用户链接到一台FTP服务器,而后要求文件送到一台第三方服务器。 这个特性在不少层次上被滥用,因此许多服务器已经中止支持它了。其中一种就是致使FTP服务器对其它主机端口扫描。 只要请求FTP服务器轮流发送一个文件到目标主机上的所感兴趣的端口。 错误消息会描述端口是开放仍是关闭的。 这是绕过防火墙的好方法,由于FTP服务器经常被置于能够访问比Web主机更多其它内部主机的位置。 Nmap用-b选项支持ftp弹跳扫描。参数格式是 <username>:<password>@<server>:<port>。 <Server> 是某个脆弱的FTP服务器的名字或者IP地址。 您也许能够省略<username>:<password>, 若是服务器上开放了匿名用户(user:anonymous password:-wwwuser@)。 端口号(以及前面的冒号) 也能够省略,若是<server>使用默认的FTP端口(21)。
当Nmap1997年发布时,这个弱点被普遍利用,但如今大部分已经被fix了。 脆弱的服务器仍然存在,因此若是其它都失败了,这也值得一试。 若是您的目标是绕过防火墙,扫描目标网络上的开放的21端口(或者 甚至任何ftp服务,若是您用版本探测扫描全部端口), 而后对每一个尝试弹跳扫描。Nmap会告诉您该主机脆弱与否。 若是您只是试着玩Nmap,您没必要(事实上,不该该)限制您本身。 在您随机地在互联网上寻找脆弱的FTP服务器时,考虑一下系统管理员不太喜欢您这样滥用他们的服务器。
服务和版本探测
Nmap试图肯定服务协议 (如 ftp,ssh,telnet,http),应用程序名(如ISC Bind,Apache httpd,Solaris telnetd),版本号, 主机名,设备类型(如 打印机,路由器),操做系统家族 (如Windows,Linux)以及其它的细节,如 如是否能够链接X server,SSH协议版本 ,或者KaZaA用户名)。固然,并不是全部服务都提供全部这些信息。
-sV (版本探测)
打开版本探测。 您也能够用-A同时打开操做系统探测和版本探测。
--allports (不为版本探测排除任何端口)
默认状况下,Nmap版本探测会跳过9100 TCP端口,由于一些打印机简单地打印送到该端口的 任何数据,这回致使数十页HTTP get请求,二进制 SSL会话请求等等被打印出来。这一行为能够经过修改或删除nmap-service-probes 中的Exclude指示符改变, 您也能够不理会任何Exclude指示符,指定--allports扫描全部端口
--version-intensity <intensity> (设置 版本扫描强度)
当进行版本扫描(-sV)时,nmap发送一系列探测报文 ,每一个报文都被赋予一个1到9之间的值。 被赋予较低值的探测报文对大范围的常见服务有效,而被赋予较高值的报文 通常没什么用。强度水平说明了应该使用哪些探测报文。数值越高, 服务越有可能被正确识别。 然而,高强度扫描花更多时间。强度值必须在0和9之间。 默认是7。当探测报文经过nmap-service-probes ports指示符 注册到目标端口时,不管什么强度水平,探测报文都会被尝试。这保证了DNS 探测将永远在任何开放的53端口尝试, SSL探测将在443端口尝试,等等。
--version-light (打开轻量级模式)
这是 --version-intensity 2的方便的别名。轻量级模式使 版本扫描快许多,但它识别服务的可能性也略微小一点。
--version-all (尝试每一个探测)
--version-intensity 9的别名, 保证对每一个端口尝试每一个探测报文。
--version-trace (跟踪版本扫描活动)
这致使Nmap打印出详细的关于正在进行的扫描的调试信息。 它是您用--packet-trace所获得的信息的子集。
-sR (RPC扫描)
这种方法和许多端口扫描方法联合使用。 它对全部被发现开放的TCP/UDP端口执行SunRPC程序NULL命令,来试图 肯定它们是否RPC端口,若是是, 是什么程序和版本号。所以您能够有效地得到和rpcinfo -p同样的信息, 即便目标的端口映射在防火墙后面(或者被TCP包装器保护)。Decoys目前不能和RPC scan一块儿工做。 这做为版本扫描(-sV)的一部分自动打开。 因为版本探测包括它而且全面得多,-sR不多被须要。
操做系统探测
Nmap采用TCP/IP协议栈fingerprinting进行远程操做系统探测。 Nmap发送一系列TCP和UDP报文到远程主机,检查响应中的每个比特,把结果和数据库nmap-os-fingerprints中超过 1500个已知的操做系统的fingerprints进行比较,若是有匹配,就打印出操做系统的详细信息。 每一个fingerprint包括一个自由格式的关于OS的描述文本, 和一个分类信息,它提供供应商名称(如Sun),下面的操做系统(如Solaris),OS版本(如10), 和设备类型(通用设备,路由器,switch,游戏控制台, 等)
-O (启用操做系统检测)
也能够使用-A来同时启用操做系统检测和版本检测。
--osscan-limit (针对指定的目标进行操做系统检测)
若是发现一个打开和关闭的TCP端口时,操做系统检测会更有效。 采用这个选项,Nmap只对知足这个条件的主机进行操做系统检测,这样能够 节约时间,特别在使用-P0扫描多个主机时。这个选项仅在使用 -O或-A 进行操做系统检测时起做用。
--osscan-guess; --fuzzy (推测操做系统检测结果)
当Nmap没法肯定所检测的操做系统时,会尽量地提供最相近的匹配,Nmap默认 进行这种匹配,使用上述任一个选项使得Nmap的推测更加有效。
防火墙/IDS躲避和哄骗
-f (报文分段); --mtu (使用指定的MTU)
-f选项要求扫描时(包挺ping扫描)使用 小的IP包分段。其思路是将TCP头分段在几个包中,使得包过滤器、 IDS以及其它工具的检测更加困难。必须当心使用这个选项,有些系 统在处理这些小包时存在问题,例如旧的网络嗅探器Sniffit在接收 到第一个分段时会马上出现分段错误。该选项使用一次,Nmap在IP 头后将包分红8个字节或更小。所以,一个20字节的TCP头会被分红3个 包,其中2个包分别有TCP头的8个字节,另1个包有TCP头的剩下4个字 节。固然,每一个包都有一个IP头。再次使用-f可以使用 16字节的分段(减小分段数量)。使用--mtu选项可 以自定义偏移的大小,使用时不须要-f,偏移量必须 是8的倍数。包过滤器和防火墙对全部的IP分段排队,如Linux核心中的 CONFIG-IP-ALWAYS-DEFRAG配置项,分段包不会直接使用。一些网络没法 承受这样所带来的性能冲击,会将这个配置禁止。其它禁止的缘由有分段 包会经过不一样的路由进入网络。一些源系统在内核中对发送的报文进行 分段,使用iptables链接跟踪模块的Linux就是一个例子。当使用相似Ethereal 的嗅探器时,扫描必须保证发送的报文要分段。若是主机操做系统会产 生问题,尝试使用--send-eth选项以避开IP层而直接 发送原始的以太网帧。
-D <decoy1 [,decoy2][,ME],...> (使用诱饵隐蔽扫描)
为使诱饵扫描起做用,须要使远程主机认为是诱饵在扫描目标网络。 IDS可能会报个某个IP的5-10个端口扫描,但并不知道哪一个IP在扫描以及 哪些不是诱饵。但这种方式能够经过路由跟踪、响应丢弃以及其它主动 机制在解决。这是一种经常使用的隐藏自身IP地址的有效技术。
使用逗号分隔每一个诱饵主机,也可用本身的真实IP做为诱饵,这时可以使用 ME选项说明。若是在第6个位置或 更后的位置使用ME选项,一些经常使用 端口扫描检测器(如Solar Designer's excellent scanlogd)就不会报告 这个真实IP。若是不使用ME选项,Nmap 将真实IP放在一个随机的位置
注意,做为诱饵的主机须在工做状态,不然会致使目标主机的SYN洪水攻击。 若是在网络中只有一个主机在工做,那就很容易肯定哪一个主机在扫描。也可 使用IP地址代替主机名(被诱骗的网络就不可能在名字服务器日志中发现)。
诱饵可用在初始的ping扫描(ICMP、SYN、ACK等)阶段或真正的端口扫描 阶段。诱饵也能够用于远程操做系统检测(-O)。在进行版 本检测或TCP链接扫描时,诱饵无效。
使用过多的诱饵没有任何价值,反而致使扫描变慢而且结果不许确。 此外,一些ISP会过滤哄骗的报文,但不少对欺骗IP包没有任何限制。
-S <IP_Address> (源地址哄骗)
在某些状况下,Nmap可能没法肯定你的源地址(若是这样,Nmap会给出 提示)。此时,使用-S选项并说明所需发送包的接口IP地址。
这个标志的另外一个用处是哄骗性的扫描,使得目标认为是另 一个地址在进行扫描。能够想象某一个竞争对手在不断扫描某个公司! -e选项常在这种状况下使用,也可采用-P0选项。
-e <interface> (使用指定的接口)
告诉Nmap使用哪一个接口发送和接收报文,Nmap能够进行自动检测, 若是检测不出会给出提示。
--source-port <portnumber>; -g <portnumber> (源端口哄骗)
仅依赖于源端口号就信任数据流是一种常见的错误配置,这个问题很是 好理解。例如一个管理员部署了一个新的防火墙,但招来了不少用户的不满,由于 他们的应用中止工做了。多是因为外部的UDP DNS服务器响应没法进入网络,而致使 DNS的崩溃。FTP是另外一个常见的例子,在FTP传输时,远程服务器尝试和内部用 创建链接以传输数据。
对这些问题有安全解决方案,一般是应用级代理或协议分析防火墙模块。 但也存在一些不安全的方案。注意到DNS响应来自于53端口,FTP链接 来自于20端口,不少管理员会掉入一个陷阱,即容许来自于这些端口的数据进入 网络。他们认为这些端口里不会有值得注意的攻击和漏洞利用。此外,管理员 或许认为这是一个短时间的措施,直至他们采起更安全的方案。但他们忽视了安全的 升级。
不只仅是工做量过多的网络管理员掉入这种陷阱,不少产品自己也会有这类 不安全的隐患,甚至是微软的产品。Windows 2000和Windows XP中包含的IPsec过滤 器也包含了一些隐含规则,容许全部来自88端口(Kerberos)的TCP和UDP数据流。另 一个常见的例子是Zone Alarm我的防火墙到2.1.25版本仍然容许源端口53(DNS)或 67(DHCP)的UDP包进入。
Nmap提供了-g和--source-port选项(它们是 等价的),用于利用上述弱点。只须要提供一个端口号,Nmap就能够从这些 端口发送数据。为使特定的操做系统正常工做,Nmap必须使用不一样的端口号。 DNS请求会忽略--source-port选项,这是由于Nmap依靠系 统库来处理。大部分TCP扫描,包括SYN扫描,能够彻底支持这些选项,UDP扫 描一样如此。
--data-length <number> (发送报文时 附加随机数据)
正常状况下,Nmap发送最少的报文,只含一个包头。所以TCP包一般 是40字节,ICMP ECHO请求只有28字节。这个选项告诉Nmap在发送的报文上 附加指定数量的随机字节。操做系统检测(-O)包不受影响, 但大部分ping和端口扫描包受影响,这会使处理变慢,但对扫描的影响较小。
--ttl <value> (设置IP time-to-live域)
设置IPv4报文的time-to-live域为指定的值。
--randomize-hosts (对目标主机的顺序随机排列)
告诉Nmap在扫描主机前对每一个组中的主机随机排列,最多可达 8096个主机。这会使得扫描针对不一样的网络监控系统来讲变得不是很 明显,特别是配合值较小的时间选项时更有效。若是须要对一个较大 的组进行随机排列,须要增大nmap.h文件中 PING-GROUP-SZ的值,并从新编译。另外一种方法是使用列表扫描 (-sL -n -oN <filename>),产生目标IP的列表, 使用Perl脚本进行随机化,而后使用-iL提供给Nmap。
--spoof-mac <mac address,prefix,or vendor name> (MAC地址哄骗)
要求Nmap在发送原以太网帧时使用指定的MAC地址,这个选项隐含了 --send-eth选项,以保证Nmap真正发送以太网包。MAC地址有几 种格式。若是简单地使用字符串“0”,Nmap选择一个彻底随机的MAC 地址。若是给定的字符品是一个16进制偶数(使用:分隔),Nmap将使用这个MAC地址。 若是是小于12的16进制数字,Nmap会随机填充剩下的6个字节。若是参数不是0或16进 制字符串,Nmap将经过nmap-mac-prefixes查找 厂商的名称(大小写区分),若是找到匹配,Nmap将使用厂商的OUI(3字节前缀),而后 随机填充剩余的3个节字。正确的--spoof-mac参数有, Apple, 0,01:02:03:04:05:06, deadbeefcafe,0020F2, 和Cisco.
输出
Nmap提供5种不一样的输出格式,其中XML输出是最重要的输出类型,可被转换成HTML,对于程序处理很是方便, 如用于Nmap图形用户接口或导入数据库。除了提供输出格式外,Nmap还提供了选项来控制输出的细节以及调试信息。输出内容可发送给标准输出或命名文件,能够追加或覆盖。输出文件还可被用于继续中断的扫描。
-oN <filespec> (标准输出)
要求将标准输出直接写入指定 的文件。如上所述,这个格式与交互式输出 略有不一样。
-oX <filespec> (XML输出)
要求XML输出直接写入指定 的文件。Nmap包含了一个文档类型定义(DTD),使XML解析器有效地 进行XML输出。这主要是为了程序应用,同时也能够协助人工解释 Nmap的XML输出。DTD定义了合法的格式元素,列举可以使用的属性和 值。最新的版本可在 http://www.insecure.org/nmap/data/nmap.dtd获取。
XML提供了可供软件解析的稳定格式输出,主要的计算机 语言都提供了免费的XML解析器,如C/C++,Perl,Python和Java。 针对这些语言有一些捆绑代码用于处理Nmap的输出和特定的执行程序。 例如perl CPAN中的Nmap::Scanner 和Nmap::Parser。 对几乎全部与Nmap有接口的主要应用来讲,XML是首选的格式。
XML输出引用了一个XSL样式表,用于格式化输出结果,相似于 HTML。最方便的方法是将XML输出加载到一个Web浏览器,如Firefox 或IE。因为nmap.xsl文件的绝对 路径,所以一般只能在运行了Nmap的机器上工做(或相似配置的机器)。 相似于任何支持Web机器的HTML文件,--stylesheet 选项可用于创建可移植的XML文件。
-oS <filespec> (ScRipT KIdd|3 oUTpuT)
脚本小子输出相似于交互工具输出,这是一个过后处理,适合于 'l33t HaXXorZ, 因为原来全都是大写的Nmap输出。这个选项和脚本小子开了玩笑,看上去彷佛是为了 “帮助他们”。
-oG <filespec> (Grep输出)
这种方式最后介绍,由于不建议使用。XML输格式很强大,便于有经验 的用户使用。XML是一种标准,由许多解析器构成,而Grep输届更简化。XML 是可扩展的,以支持新发布的Nmap特色。使用Grep输出的目的是忽略这些 特色,由于没有足够的空间。
然面,Grep输出仍然很常使用。它是一种简单格式,每行一个主机,能够 经过UNIX工具(如grep、awk、cut、sed、diff)和Perl方便地查找和分解。常可 用于在命令行上进行一次性测式。查找ssh端口打开或运行Sloaris的主机,只需 要一个简单的grep主机说明,使用通道并经过awk或cut命令打印所需的域。
Grep输出能够包含注释(每行由#号开始)。每行由6个标记的域组成,由制表符及 冒号分隔。这些域有主机,端口, 协议,忽略状态, 操做系统,序列号, IPID和状态。
这些域中最重要的是Ports,它提供 了所关注的端口的细节,端口项由逗号分隔。每一个端口项表明一个所关注的端口, 每一个子域由/分隔。这些子域有:端口号, 状态,协议, 拥有者,服务, SunRPCinfo和版本信息。
对于XML输出,本手册没法列举全部的格式,有关Nmap Grep输出的更详细信息可 查阅http://www.unspecific.com/nmap-oG-output。
-oA <basename> (输出至全部格式)
为使用方便,利用-oA<basename>选项 可将扫描结果以标准格式、XML格式和Grep格式一次性输出。分别存放在 <basename>.nmap,<basename>.xml和 <basename>.gnmap文件中。也能够在文件名前 指定目录名,如在UNIX中,使用~/nmaplogs/foocorp/, 在Window中,使用c:\hacking\sco on Windows。
细节和调试选项
-v (提升输出信息的详细度)
经过提升详细度,Nmap能够输出扫描过程的更多信息。 输出发现的打开端口,若Nmap认为扫描须要更多时间会显示估计 的结束时间。这个选项使用两次,会提供更详细的信息。这个选 项使用两次以上不起做用。
大部分的变化仅影响交互式输出,也有一些影响标准和脚本 小子输出。其它输出类型由机器处理,此时Nmap默认提供详细的信 息,不须要人工干预。然而,其它模式也会有一些变化,省略一些 细节能够减少输出大小。例如,Grep输出中的注释行提供全部扫描 端口列表,但因为这些信息过长,所以只能在细节模式中输出。
-d [level] (提升或设置调试级别)
当详细模式也不能为用户提供足够的数据时,使用调试能够获得更 多的信息。使用细节选项(-v)时,可启用命令行参数 (-d),屡次使用可提升调试级别。也可在-d 后面使用参数设置调试级别。例如,-d9设定级别9。这是 最高的级别,将会产生上千行的输出,除非只对不多的端口和目标进行简单扫描。
若是Nmap由于Bug而挂起或者对Nmap的工做及原理有疑问,调试输出 很是有效。主要是开发人员用这个选项,调试行不具有自我解释的特色。 例如,Timeoutvals: srtt: -1 rttvar: -1 to: 1000000 delta 14987 ==> srtt: 14987 rttvar: 14987 to: 100000。若是对某行输出不明白, 能够忽略、查看源代码或向开发列表(nmap-dev)求助。有些输出行会有自 我解释的特色,但随着调试级别的升高,会愈来愈含糊。
--packet-trace (跟踪发送和接收的报文)
要求Nmap打印发送和接收的每一个报文的摘要,一般用于 调试,有助于新用户更好地理解Nmap的真正工做。为避免输出过 多的行,能够限制扫描的端口数,如-p20-30。 若是只需进行版本检测,使用--version-trace。
--iflist (列举接口和路由)
输出Nmap检测到的接口列表和系统路由,用于调试路由 问题或设备描述失误(如Nmap把PPP链接看成以太网对待)。
--append-output (在输出文件中添加)
当使用文件做为输出格式,如-oX或-oN, 默认该文件被覆盖。若是但愿文件保留现有内容,将结果添加在现 有文件后面,使用--append-output选项。全部指 定的输出文件都被添加。但对于XML(-oX)扫描输出 文件无效,没法正常解析,须要手工修改。
--resume <filename> (继续中断的扫描)
一些扩展的Nmap运行须要很长的时间 -- 以天计算,这类扫描 每每不会结束。能够进行一些限制,禁止Nmap在工做时间运行,致使 网络中断、运行Nmap的主机计划或非计划地重启、或者Nmap本身中断。 运行Nmap的管理员能够因其它缘由取消运行,按下ctrl-C 便可。从头开始启动扫描可能使人不快,幸运的是,若是标准扫描 (-oN)或Grep扫描(-oG)日志 被保留,用户能够要求Nmap恢复终止的扫描,只须要简单地使用选项 --resume并说明标准/Grep扫描输出文件,不容许 使用其它参数,Nmap会解析输出文件并使用原来的格式输出。使用方式 如nmap --resume <logfilename>。 Nmap将把新地结果添加到文件中,这种方式不支持XML输出格式,缘由是 将两次运行结果合并至一个XML文件比较困难。
--stylesheet <path or URL> (设置XSL样式表,转换XML输出)
Nmap提从了XSL样式表nmap.xsl,用于查看 或转换XML输出至HTML。XML输出包含了一个xml-stylesheet, 直接指向nmap.xml文件, 该文件由Nmap安装(或位于Windows当前工做目录)。在Web浏览器 中打开Nmap的XML输出时,将会在文件系统中寻找nmap.xsl文件, 并使用它输出结果。若是但愿使用不一样的样式表,将它做为 --stylesheet的参数,必段指明完整的路 径或URL,常见的调用方式是--stylesheet http://www.insecure.org/nmap/data/nmap.xsl。 这告诉浏览器从Insecire.Org中加载最新的样式表。这使得 没安装Nmap(和nmap.xsl) 的机器中能够方便地查看结果。所以,URL更方便使用,本地文件系统 的nmap.xsl用于默认方式。
--no-stylesheet (忽略XML声明的XSL样式表)
使用该选项禁止Nmap的XML输出关联任何XSL样式表。 xml-stylesheet指示被忽略。
其它选项
-6 (启用IPv6扫描)
从2002年起,Nmap提供对IPv6的一些主要特征的支持。ping扫描(TCP-only)、 链接扫描以及版本检测都支持IPv6。除增长-6选项外, 其它命令语法相同。固然,必须使用IPv6地址来替换主机名,如 3ffe:7501:4819:2000:210:f3ff:fe03:14d0。 除“所关注的端口”行的地址部分为IPv6地址。
IPv6目前未在全球普遍采用,目前在一些国家(亚洲)应用较多, 一些高级操做系统支持IPv6。使用Nmap的IPv6功能,扫描的源和目 的都须要配置IPv6。若是ISP(大部分)不分配IPv6地址,Nmap能够采用 免费的隧道代理。一种较好的选择是BT Exact,位于https://tb.ipv6.btexact.com/。 此外,还有Hurricane Electric,位于http://ipv6tb.he.net/。6to4隧道是 另外一种经常使用的免费方法。
-A (激烈扫描模式选项)
这个选项启用额外的高级和高强度选项,目前还未肯定表明 的内容。目前,这个选项启用了操做系统检测(-O) 和版本扫描(-sV),之后会增长更多的功能。 目的是启用一个全面的扫描选项集合,不须要用户记忆大量的 选项。这个选项仅仅启用功能,不包含用于可能所须要的 时间选项(如-T4)或细节选项(-v)。
--datadir <directoryname> (说明用户Nmap数据文件位置)
Nmap在运行时从文件中得到特殊的数据,这些文件有 nmap-service-probes, nmap-services, nmap-protocols, nmap-rpc, nmap-mac-prefixes和 nmap-os-fingerprints。Nmap首先 在--datadir选项说明的目录中查找这些文件。 未找到的文件,将在BMAPDIR环境变量说明的目录中查找。 接下来是用于真正和有效UID的~/.nmap 或Nmap可执行代码的位置(仅Win32);而后是是编译位置, 如/usr/local/share/nmap 或/usr/share/nmap。 Nmap查找的最后一个位置是当前目录。
--send-eth (使用原以太网帧发送)
要求Nmap在以太网(数据链路)层而不是IP(网络层)发送 报文。默认方式下,Nmap选择最适合其运行平台的方式,原套接 字(IP层)是UNIX主机最有效的方式,而以太网帧最适合Windows操做 系统,由于Microsoft禁用了原套接字支持。在UNIX中,若是没有其 它选择(如无以太网链接),无论是否有该选项,Nmap都使用原IP包。
--send-ip (在原IP层发送)
要求Nmap经过原IP套接字发送报文,而不是低层的以 太网帧。这是--send-eth选项的补充。
--privileged (假定用户具备所有权限)
告诉Nmap假定其具备足够的权限进行源套接字包发送、 报文捕获和相似UNIX系统中根用户操做的权限。默认状态下, 若是由getuid()请求的相似操做不为0,Nmap将退出。 --privileged在具备Linux内核性能的相似 系统中使用很是有效,这些系统配置容许非特权用户能够进行 原报文扫描。须要明确的是,在其它选项以前使用这些须要权 限的选项(SYN扫描、操做系统检测等)。Nmap-PRIVILEGED变量 设置等价于--privileged选项。
-V; --version (打印版本信息)
打印Nmap版本号并退出。
-h; --help (打印帮助摘要面)
打印一个短的帮助屏幕,列出大部分经常使用的 命令选项,这个功能与不带参数运行Nmap是相同的。
3、实例
一、Nmap扫描扫描单个目标
经过指定单个目标,使用Nmap工具能够实现一个基本的扫描。指定的目标能够是一个IP地址,也能够是主机名(Nmap会自动解析其主机名)。其中,语法格式以下所示:
nmap [目标]
# nmap 192.168.1.105
Starting Nmap 6.47 ( http://nmap.org ) at 2015-05-05 18:44 CST
Nmap scan report for localhost (192.168.1.105)
Host is up (0.00010s latency).
Not shown: 995 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
23/tcp open telnet
111/tcp open rpcbind
445/tcp open microsoft-ds
MAC Address: 00:0C:29:31:02:17 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.87 seconds
能够看到目标主机192.168.1.105上开启的端口有2一、2二、2三、1十一、445,及这些端口所对应的服务。并且,还能够看到该目标主机的MAC地址为00:0C:29:31:02:17。从最后一行信息,能够看出目标主机是活动的(up),而且扫描该目标主机共用了0.87秒。
使用Nmap扫描单个目标时,指定的IP地址能够是IPv4,也能够是IPv6。上例中指定扫描的目标是使用IPv4类地址。若是用户指定扫描目标地址是IPv6类地址时,须要使用-6选项。若是要使用IPv6类地址做为目标时,则扫描主机和目标主机都必须支持IPv6协议。不然没法实施扫描。例如,扫描IP地址为fe80::20c:29ff:fe31:217的目标主机,则执行命令以下所示:
# nmap -6 fe80::20c:29ff:fe31:217
二、Nmap扫描扫描多个目标
Nmap能够用来同时扫描多个主机。当用户须要扫描多个目标时,能够在命令行中同时指定多个目标,每一个目标之间使用空格分割。其中,语法格式以下所示:
nmap [目标1 目标2 ...]
# nmap 192.168.1.1 192.168.1.101 192.168.1.105
Starting Nmap 6.47 ( http://nmap.org ) at 2015-05-05 19:07 CST
Nmap scan report for localhost (192.168.1.1)
Host is up (0.00094s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
80/tcp open http
1900/tcp open upnp
49152/tcp open unknown
MAC Address: 14:E6:E4:84:23:7A (Tp-link Technologies CO.)
Nmap scan report for localhost (192.168.1.101)
Host is up (0.0060s latency).
All 1000 scanned ports on localhost (192.168.1.101) are closed
MAC Address: 14:F6:5A:CE:EE:2A (Xiaomi)
Nmap scan report for localhost (192.168.1.105)
Host is up (0.00038s latency).
Not shown: 995 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
23/tcp open telnet
111/tcp open rpcbind
445/tcp open microsoft-ds
MAC Address: 00:0C:29:31:02:17 (VMware)
Nmap done: 3 IP addresses (3 hosts up) scanned in 1.00 seconds
从以上输出信息,能够看到共扫描了三台主机,而且依次显示了每台主机的扫描结果。在以上信息中,将扫描的每台主机地址行已加粗,方便用户了解其扫描结果。下面分别介绍这三台主机的扫描结果,以下所示:
192.168.1.1:从输出信息中能够看到该主机开启了三个端口,MAC地址为14:E6:E4:84:23:7A。根据MAC地址后面括号中的信息,能够推断出该主机是一个Tp-link路由器。
192.168.1.101:从输出信息中,能够看到该主机上前1000个端口是关闭的。可是,能够看到该主机的MAC地址为14:F6:5A:CE:EE:2A,设备类型为Xiaomi。由此能够判断出,该主机是一个小米手机设备。
192.168.1.105:从输出信息中,能够看到该主机上995个端口是关闭的,五个端口是开启的。其中,MAC地址为00:0C:29:31:02:17,并且是一台VMware(虚拟机)操做系统。
三、Nmap扫描扫描一个目标列表
当用户有大量主机须要扫描时,能够将这些主机的IP地址(或主机名)写入到一个文本文件中。而后,使用Nmap工具进行扫描。这样避免在命令行中手工输入目标。其中,语法格式以下所示:
nmap -iL [IP地址列表文件]
iL选项,就是用来从IP地址列表文件中提取全部地址的。IP地址列表文件中包含了一列被扫描的主机IP地址。在IP地址列表文件中的每一个条目必须使用空格、Tab键或换行符分割。
(1)建立list.txt文本文件,并将扫描的主机IP地址写入到该文本文件中。以下所示:
# vi list.txt
192.168.1.1
192.168.1.100
192.168.1.101
192.168.1.102
192.168.1.103
192.168.1.104
192.168.1.105
(2)扫描list.txt文件中指定的全部主机。执行命令以下所示:
# nmap -iL list.txt
四、Nmap扫描扫描随机目标
Nmap工具提供了一个-iR选项,能够用来选择随机的互联网主机来扫描。Nmap工具将会随机的生成指定数量的目标进行扫描。其中,语法格式以下所示:
nmap -iR [主机数量]
# nmap -iR 2 #选择两个目标主机进行扫描
Starting Nmap 6.47 ( http://nmap.org ) at 2015-05-06 11:07 CST
Nmap scan report for suncokret.vguk.hr (161.53.173.3)
Host is up (0.43s latency).
Not shown: 984 closed ports
PORT STATE SERVICE
21/tcp open ftp
25/tcp open smtp
53/tcp open domain
80/tcp open http
81/tcp open hosts2-ns
110/tcp open pop3
135/tcp filtered msrpc
139/tcp filtered netbios-ssn
143/tcp open imap
443/tcp open https
444/tcp open snpp
445/tcp filtered microsoft-ds
593/tcp filtered http-rpc-epmap
2002/tcp open globe
3306/tcp open mysql
4444/tcp filtered krb524
Nmap done: 3 IP addresses (1 host up) scanned in 29.64 seconds
从输出信息中,能够看到Nmap工具随机生成了三个IP地址。可是,只有主机161.53.137.3是活动的,而且显示了对该主机的扫描结果。
提示:通常状况下,不建议用户实施随机扫描。除非你是在作一个研究项目。不然常常实施随机扫描可能会给本身的互联网服务提供商带来麻烦。
五、Nmap指定IP地址范围扫描
用户在指定扫描范围时,能够经过IP地址或子网的方式来实现。下面将介绍使用IP地址指定扫描范围的方法。其中,语法格式以下所示:
nmap [IP地址范围] # IP地址范围之间使用短连字符(-)
使用Nmap工具扫描192.168.1.1到100之间的全部主机。执行命令以下所示:
# nmap 192.168.1.1-100
Starting Nmap 6.47 ( http://nmap.org ) at 2015-05-05 19:40 CST
Nmap scan report for localhost (192.168.1.1)
Host is up (0.0014s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
80/tcp open http
1900/tcp open upnp
49152/tcp open unknown
MAC Address: 14:E6:E4:84:23:7A (Tp-link Technologies CO.)
Nmap scan report for localhost (192.168.1.100)
Host is up (0.00025s latency).
Not shown: 986 closed ports
PORT STATE SERVICE
135/tcp open msrpc
139/tcp open netbios-ssn
443/tcp open https
445/tcp open microsoft-ds
902/tcp open iss-realsecure
912/tcp open apex-mesh
1033/tcp open netinfo
1034/tcp open zincite-a
1035/tcp open multidropper
1037/tcp open ams
1039/tcp open sbl
1041/tcp open danf-ak2
2869/tcp open icslap
5357/tcp open wsdapi
MAC Address: 00:E0:1C:3C:18:79 (Cradlepoint)
Nmap done: 100 IP addresses (2 hosts up) scanned in 3.34 seconds
从以上输出信息中,能够看到192.168.1-100之间,只有192.168.1.1和192.168.1.100两台主机是活动的。
用户也能够指定扫描多个网络/子网范围的主机。例如,扫描C类IP网络192.168.1.*到192.168.100.*之间的全部主机。则执行命令以下所示:
nmap 192.168.1-100.* #星号(*)是一个通配符,表示0-255之间全部有效的主机。
六、Nmap扫描整个子网
Nmap也能够使用CIDR(无类别域间路由)格式来扫描整个子网。CIDR是由网络地址和子网掩码两部分组成,而且中间使用斜杠(/)分割。CIDR 地址中包含标准的32位IP地址和有关网络前缀位数的信息。以CIDR地址222.80.18.18/25为例,其中“/25”表示其前面地址中的前25位表明网络部分,其他位表明主机部分。语法格式以下所示:
nmap [CIDR格式的网络地址]
【示例2-9】使用Nmap扫描192.168.1.1/24整个子网中的全部主机。执行命令以下所示:
# nmap 192.168.1.1/24
Starting Nmap 6.47 ( http://nmap.org ) at 2015-05-05 19:41 CST
Nmap scan report for localhost (192.168.1.1)
Host is up (0.00064s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
80/tcp open http
1900/tcp open upnp
49152/tcp open unknown
MAC Address: 14:E6:E4:84:23:7A (Tp-link Technologies CO.)
Nmap scan report for localhost (192.168.1.100)
Host is up (0.00022s latency).
Not shown: 986 closed ports
PORT STATE SERVICE
135/tcp open msrpc
139/tcp open netbios-ssn
443/tcp open https
445/tcp open microsoft-ds
902/tcp open iss-realsecure
912/tcp open apex-mesh
1033/tcp open netinfo
2869/tcp open icslap
5357/tcp open wsdapi
MAC Address: 00:E0:1C:3C:18:79 (Cradlepoint)
Nmap scan report for localhost (192.168.1.101)
Host is up (0.0041s latency).
All 1000 scanned ports on localhost (192.168.1.101) are closed
MAC Address: 14:F6:5A:CE:EE:2A (Xiaomi)
Nmap scan report for localhost (192.168.1.103)
Host is up (0.00027s latency).
Not shown: 977 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
23/tcp open telnet
25/tcp open smtp
53/tcp open domain
80/tcp open http
111/tcp open rpcbind
139/tcp open netbios-ssn
445/tcp open microsoft-ds
512/tcp open exec
513/tcp open login
......
49157/tcp open unknown
MAC Address: 00:0C:29:DE:7E:04 (VMware)
Nmap scan report for localhost (192.168.1.102)
Host is up (0.0000040s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
80/tcp open http
9876/tcp open sd
Nmap done: 256 IP addresses (9 hosts up) scanned in 3.39 seconds
从输出信息中,能够看到共扫描了256个地址。其中,九台主机是活动的,而且共用时间为3.39秒。因为章节的缘由,以上只列举了五台主机的扫描结果。其中,中间部份内容,使用省略号(......)代替了。
七、Nmap排除扫描目标
当用户指定一个扫描范围时(如局域网),在该范围内可能会包括本身的主机,或者是本身搭建的一些服务等。可能不但愿扫描这些主机。此时就能够使用--exclude命令将这些主机排除。用户使用--exclude选项,能够指定排除单个主机、范围或者整个网络块(使用CIDR格式)。例如,扫描192.168.1.1/24网络内,除192.168.1.100-192.168.1.103以外的全部主机。则执行命令以下所示:
nmap [目标] --exclude [目标]
# nmap 192.168.1.1/24 --exclude 192.168.1.101 #扫描192.168.1.1/24网络内除192.168.1.101之外的全部主机。
# nmap 192.168.1.1/24 --exclude 192.168.1.100-103
八、Nmap扫描排除列表中的目标
当用户排除扫描的目标不少时,也能够将这些目标主机的IP地址写入到一个文本文件中。而后,使用--excludefile选项来指定排除扫描的目标。其中,排除扫描列表中目标的语法格式以下所示:
nmap [目标] --excludefile [目标列表]
使用Nmap扫描192.168.1.0/24网络内主机,可是排除list.txt文件列表中指定的目标。具体操做步骤以下所示:
(1)建立list.txt文件,并写入要排除扫描目标的IP地址。以下所示:
#vi list.txt
192.168.102
192.168.1.103
192.168.1.104
192.168.1.105
(2)实施扫描。执行命令以下所示:
# nmap 192.168.1.0/24 --excludefile list.txt
九、Nmap全面扫描
用户能够使用不一样的选项,单独扫描目标主机上的端口、应用程序版本或操做系统类型等。可是,选项-A能够对目标主机实施全面扫描,扫描结果中包括各类类型的信息。
nmap -A [目标]
使用Nmap工具对目标主机192.168.1.105实施全面扫描。则执行命令以下所示:
# nmap -A 192.168.1.105
Starting Nmap 6.47 ( http://nmap.org ) at 2015-05-06 15:20 CST
Nmap scan report for localhost (192.168.1.105)
Host is up (0.00028s latency).
Not shown: 995 closed ports
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 2.2.2 #FTP服务版本为2.2.2,供应商是Vsftpd
| ftp-anon: Anonymous FTP login allowed (FTP code 230) #容许匿名登陆
|_drwxr-xr-x 2 14 0 4096 Apr 03 06:10 pub #FTP服务的根目录为pub
22/tcp open ssh OpenSSH 5.3 (protocol 2.0) #SSH服务版本是5.3,供应商是OpenSSH
| ssh-hostkey: #SSH服务密钥
| 1024 83:9f:d0:8e:29:3c:7f:d9:11:da:a8:bb:b5:5a:4d:69 (DSA)
|_ 2048 2e:ea:ee:63:03:fd:9c:ae:39:9b:4c:e0:49:a9:8f:5d (RSA)
23/tcp open telnet Linux telnetd #Telnet服务
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo: #RPC详细信息
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100024 1 34525/tcp status
|_ 100024 1 51866/udp status
445/tcp open netbios-ssn Samba smbd 3.X (workgroup: MYGROUP)#Samba服务版本为3.X,供应商为smbd
MAC Address: 00:0C:29:31:02:17 (VMware) #目标主机的MAC地址
Device type: general purpose #设备类型
Running: Linux 2.6.X|3.X #正在运行的系统
OS CPE: cpe:/o:linux:linux_kernel:2.6 cpe:/o:linux:linux_kernel:3 #操做系统中央处理单元
OS details: Linux 2.6.32 - 3.10 #操做系统详细信息
Network Distance: 1 hop #网络距离
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel #服务信息
Host script results:
| smb-os-discovery: #SMB操做系统发现
| OS: Unix (Samba 3.6.9-151.el6) #操做系统为Unix,Samba版本为3.6.9
| Computer name: router #计算机名
| NetBIOS computer name: #NetBIOS计算机名
| Domain name: #域名
| FQDN: router #彻底合格域名(FQDN)
|_ System time: 2015-05-06T15:20:28+08:00 #系统时间
| smb-security-mode:
| Account that was used for smb scripts: <blank>
| User-level authentication
| SMB Security: Challenge/response passwords supported
|_ Message signing disabled (dangerous, but default)
|_smbv2-enabled: Server doesn't support SMBv2 protocol
TRACEROUTE
HOP RTT ADDRESS
1 0.28 ms localhost (192.168.1.105)
OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 13.51 seconds
能够明显看出比前面例子扫描结果更详细。能够看到目标主机上开启的端口、服务器、版本、操做系统版本、内核、系统类型等。根据分析输出的信息,可知目标主机上运行了FTP、SSH、Telnet等服务,而且能够看到各服务的版本及权限信息。并且,还能够知道目标主机的操做系统是Linux,内核版本为2.6.32等。
十、端口扫描
一、TCP全连接扫描(-sT)
这是一种最为普通的扫描方法,这种扫描方法的特色是:扫描的速度快,准确性高,对操做者没有权限上的要求,可是容易被防火墙和IDS(防入侵系统)发现
运行的原理:经过创建TCP的三次握手链接来进行信息的传递
① Client端发送SYN;
② Server端返回SYN/ACK,代表端口开放;
③ Client端返回ACK,代表链接已创建;
④ Client端主动断开链接。

二、SYN扫描(-sS)
这是一种秘密的扫描方式之一,由于在SYN扫描中Client端和Server端没有造成3次握手,因此没有创建一个正常的TCP链接,所以不被防火墙和日志所记录,通常不会再目标主机上留下任何的痕迹,可是这种扫描是须要root权限(对于windows用户来讲,是没有root权限这个概念的,root权限是linux的最高权限,对应windows的管理员权限)
运行的原理图以下:

三、NULL扫描
NULL扫描是一种反向的扫描方法,经过发送一个没有任何标志位的数据包给服务器,而后等待服务器的返回内容。这种扫描的方法比前面说起的扫描方法要隐蔽不少,可是这种方法的准确度也是较低的, 主要的用途是用来判断操做系统是否为windows,由于windows不遵照RFC 793标准,不论端口是开启仍是关闭的都返回RST包

可是虽然NULL具备这样的一些用处,可是本人却认为不宜使用NULL
一、NULL方法的精确度不高,端口的状态返回的不是很准确
二、要获取目标主机的运行系统,能够使用参数(-O),来获取对于一些操做系统没法准确判断的,能够加上参数(-osscan-guess)
三、NULL扫描易被过滤
四、FIN扫描
FIN扫描的原理与NULL扫描的原理基本上是同样的在这里就不重复了
五、ACK扫描
ACK扫描的原理是发送一个ACK包给目标主机,不论目标主机的端口是否开启,都会返回相应的RST包,经过判断RST包中的TTL来判断端口是否开启
运行原理图:

TTL值小于64端口开启,大于64端口关闭
大体上主要的扫描方法就是这些,除了咱们能够按照这样些参数去执行扫描外,还能够本身定义一个TCP扫描包
六、UDP扫描 sU(使用-sUV能增长扫描的准确性)
七、自定义TCP,参数为--scanflags
例如:定制一个包含ACK扫描和SYN扫描的安装包
命令:nmap --scanflags ACKSYN nmap.org

八、协议扫描 sO 获取服务器支持哪些协议

九、输出命令
-oN 文件名 输出普通文件
-oX 文件名 输出xml文件
十一、错误调试:
--log-errors 输出错误日志
--packet-trace 获取从当前主机到目标主机的全部节点
接着讲上节的内容,上节中提到了一个时间优化的问题是使用参数-n,经过不解析地址来进行优化时间的,可是优化时间的方法还有不少,好比说咱们能够经过时间优化(0-5),指定单位时间内的探针数,设置组的大小
十二、时间优化(0-5)时间优化的参数是(-T0~5),最快的扫描速度为-T5,最慢的扫描速度为-T0,实现的原理:经过设置各个端口的扫描周期,从而来控制整个扫描的时间,好比说T0各个端口的扫描周期大约为5分钟,而T5各个端口的扫描周期为5ms,可是过快的扫描也是有缺点的,扫描的周期过快,会很容易被防火墙和IDS发现并记录,由于防火墙大多数会将端口周期过段识别为扫描从而屏蔽掉,若是不对其进行设置的话,默认值为T4--min-hostgroup/--max-hostgroup size 设置组的大小--min-parallelism/--max-parellelism time指定时间内的探针数具体的使用方法就不作介绍了,有兴趣的话,能够试一试研究一下变知道怎样使用了在上节中还讲漏了一个知识点获取指定端口的参数(-p),这个参数的意义在于对于咱们有时候只想监控某个特定的端口的状态,这个参数是即为有用的,能够节约了很多的时间例如:监控nmap.org的80端口的状态命令:nmap -p 80 nmap.org