Nmap又叫做NetworkMapper(网络映射器),是一个网络连接端口扫描软件,用来扫描网上电脑开放的网络连接端口。确定哪些服务运行在哪些连接端口,并且推断计算机运行哪个操作系统(这是亦称fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。Nmap是黑客必备的一款工具之一。它可以适用于winodws,linux,mac等操作系统。可用于:
检测活在网络上的主机(主机发现)
检测主机上开放的端口(端口发现或枚举)
检测到相应的端口(服务发现)的软件和版本
检测操作系统,硬件地址,以及软件版本
检测脆弱性的漏洞(Nmap的脚本)
Nmap是一个非常普遍的工具,它有命令行界面和图形用户界面。
基础用法
命令参数如下:
Usage:nmap[ScanType(s)][Options]{targetspecification}
TARGETSPECIFICATION:
Canpasshostnames,IPaddresses,networks,etc.
Ex:scanme.nmap.org,microsoft.com/24,192.168.0.1;10.0-255.0-255.1-254
-iL
-iR
--exclude
--excludefile
HOSTDISCOVERY:
-sL:ListScan-simplylisttargetstoscan
-sP:PingScan-gonofurtherthandeterminingifhostisonline
-P0:Treatallhostsasonline--skiphostdiscovery
-PS/PA/PU[portlist]:TCPSYN/ACKorUDPdiscoveryprobestogivenports
-PE/PP/PM:ICMPecho,timestamp,andnetmaskrequestdiscoveryprobes
-n/-R:NeverdoDNSresolution/Alwaysresolve[default:sometimesresolve]
SCANTECHNIQUES:
-sS/sT/sA/sW/sM:TCPSYN/Connect()/ACK/Window/Maimonscans
-sN/sF/sX:TCPNull,FIN,andXmasscans
--scanflags
-sI
-sO:IPprotocolscan
-b
PORTSPECIFICATIONANDSCANORDER:
-p
Ex:-p22;-p1-65535;-pU:53,111,137,T:21-25,80,139,8080
-F:Fast-Scanonlytheportslistedinthenmap-servicesfile)
-r:Scanportsconsecutively-don'trandomize
SERVICE/VERSIONDETECTION:
-sV:Probeopenportstodetermineservice/versioninfo
--version-light:Limittomostlikelyprobesforfasteridentification
--version-all:Tryeverysingleprobeforversiondetection
--version-trace:Showdetailedversionscanactivity(fordebugging)
OSDETECTION:
-O:EnableOSdetection
--osscan-limit:LimitOSdetectiontopromisingtargets
--osscan-guess:GuessOSmoreaggressively
TIMINGANDPERFORMANCE:
-T[0-6]:Settimingtemplate(higherisfaster)
--min-hostgroup/max-hostgroup
--min-parallelism/max-parallelism
--min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout
proberoundtriptime.
--host-timeout
--scan-delay/--max-scan-delay
FIREWALL/IDSEVASIONANDSPOOFING:
-f;--mtu
-D
-S
-e
-g/--source-port
--data-length
--ttl
--spoof-mac
OUTPUT:
-oN/-oX/-oS/-oG andGrepableformat,respectively,tothegivenfilename. -oA -v:Increaseverbositylevel(usetwiceformoreeffect) -d[level]:Setorincreasedebugginglevel(Upto9ismeaningful) --packet-trace:Showallpacketssentandreceived --iflist:Printhostinterfacesandroutes(fordebugging) --append-output:Appendtoratherthanclobberspecifiedoutputfiles --resume --stylesheet --no-stylesheet:PreventNmapfromassociatingXSLstylesheetw/xmloutput MISC: -6:EnableIPv6scanning -A:EnablesOSdetectionandVersiondetection --datadir --send-eth/--send-ip:SendpacketsusingrawethernetframesorIPpackets --privileged:Assumethattheuserisfullyprivileged -V:Printversionnumber -h:Printthishelpsummarypage. EXAMPLES: nmap-v-Ascanme.nmap.org nmap-v-sP192.168.0.0/1610.0.0.0/8 nmap-v-iR10000-P0-p80 除了上述选项,所有出现在Nmap命令行上的都被视为对目标主机的说明。最简单的情况是指定一个目标IP地址或主机名。 有时候您希望扫描整个网络的相邻主机。为此,Nmap支持CIDR风格的地址。您可以附加一个/ CIDR标志位很简洁但有时候不够灵活。例如,您也许想要扫描192.168.0.0/16,但略过任何以.0或者.255结束的IP地址,因为它们通常是广播地址。Nmap通过八位字节地址范围支持这样的扫描您可以用逗号分开的数字或范围列表为IP地址的每个八位字节指定它的范围。例如,192.168.0-255.1-254将略过在该范围内以.0和.255结束的地址。范围不必限于最后的8位:0-255.0-255.13.37将在整个互联网范围内扫描所有以13.37结束的地址。这种大范围的扫描对互联网调查研究也许有用。 IPv6地址只能用规范的IPv6地址或主机名指定。CIDR和八位字节范围不支持IPv6,因为它们对于IPv6几乎没什么用。 Nmap命令行接受多个主机说明,它们不必是相同类型。命令nmapscanme.nmap.org192.168.0.0/810.0.0,1,3-7.0-255将和您预期的一样执行。 虽然目标通常在命令行指定,下列选项也可用来控制目标的选择: -iL -iR --exclude 如果在您指定的扫描范围有一些主机或网络不是您的目标,那就用该选项加上以逗号分隔的列表排除它们。该列表用正常的Nmap语法,因此它可以包括主机名,CIDR,八位字节范围等等。当您希望扫描的网络包含执行关键任务的服务器,已知的对端口扫描反应强烈的系统或者被其它人看管的子网时,这也许有用。 --excludefile 这和--exclude选项的功能一样,只是所排除的目标是用以换行符,空格,或者制表符分隔的 -sL(列表扫描) 列表扫描是主机发现的退化形式,它仅仅列出指定网络上的每台主机,不发送任何报文到目标主机。默认情况下,Nmap仍然对主机进行反向域名解析以获取它们的名字。简单的主机名能给出的有用信息常常令人惊讶。例如,fw.chi.playboy.com是花花公子芝加哥办公室的防火墙。Nmap最后还会报告IP地址的总数。列表扫描可以很好的确保您拥有正确的目标IP。如果主机的域名出乎您的意料,那么就值得进一步检查以防错误地扫描其它组织的网络。 既然只是打印目标主机的列表,像其它一些高级功能如端口扫描,操作系统探测或者Ping扫描的选项就没有了。如果您希望关闭ping扫描而仍然执行这样的高级功能,请继续阅读关于-P0选项的介绍。 -sP(Ping扫描) 该选项告诉Nmap仅仅进行ping扫描(主机发现),然后打印出对扫描做出响应的那些主机。没有进一步的测试(如端口扫描或者操作系统探测)。这比列表扫描更积极,常常用于和列表扫描相同的目的。它可以得到些许目标网络的信息而不被特别注意到。对于攻击者来说,了解多少主机正在运行比列表扫描提供的一列IP和主机名往往更有价值。 系统管理员往往也很喜欢这个选项。它可以很方便地得出网络上有多少机器正在运行或者监视服务器是否正常运行。常常有人称它为地毯式ping,它比ping广播地址更可靠,因为许多主机对广播请求不响应。 -sP选项在默认情况下,发送一个ICMP回声请求和一个TCP报文到80端口。如果非特权用户执行,就发送一个SYN报文(用connect()系统调用)到目标机的80端口。当特权用户扫描局域网上的目标机时,会发送ARP请求(-PR),,除非使用了--send-ip选项。-sP选项可以和除-P0)之外的任何发现探测类型-P*选项结合使用以达到更大的灵活性。一旦使用了任何探测类型和端口选项,默认的探测(ACK和回应请求)就被覆盖了。当防守严密的防火墙位于运行Nmap的源主机和目标网络之间时,推荐使用那些高级选项。否则,当防火墙捕获并丢弃探测包或者响应包时,一些主机就不能被探测到。 以下是NMAP命令行参数的详细说明。 -P0(无ping) 该选项完全跳过Nmap发现阶段。通常Nmap在进行高强度的扫描时用它确定正在运行的机器。默认情况下,Nmap只对正在运行的主机进行高强度的探测如端口扫描,版本探测,或者操作系统探测。用-P0禁止主机发现会使Nmap对每一个指定的目标IP地址进行所要求的扫描。所以如果在命令行指定一个B类目标地址空间(/16),所有65,536个IP地址都会被扫描。-P0的第二个字符是数字0而不是字母O。和列表扫描一样,跳过正常的主机发现,但不是打印一个目标列表,而是继续执行所要求的功能,就好像每个IP都是活动的。 -PS[portlist](TCPSYNPing) 该选项发送一个设置了SYN标志位的空TCP报文。默认目的端口为80(可以通过改变nmap.h)文件中的DEFAULT-TCP-PROBE-PORT值进行配置,但不同的端口也可以作为选项指定。甚至可以指定一个以逗号分隔的端口列表(如-PS22,23,25,80,113,1050,35000),在这种情况下,每个端口会被并发地扫描。 SYN标志位告诉对方您正试图建立一个连接。通常目标端口是关闭的,一个RST(复位)包会发回来。如果碰巧端口是开放的,目标会进行TCP三步握手的第二步,回应一个SYN/ACKTCP报文。然后运行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](TCPACKPing) TCPACKping和刚才讨论的SYNping相当类似。也许您已经猜到了,区别就是设置TCP的ACK标志位而不是SYN标志位。ACK报文表示确认一个建立连接的尝试,但该连接尚未完全建立。所以远程主机应该总是回应一个RST报文,因为它们并没有发出过连接请求到运行Nmap的机器,如果它们正在运行的话。 -PA选项使用和SYN探测相同的默认端口(80),也可以用相同的格式指定目标端口列表。如果非特权用户尝试该功能,或者指定的是IPv6目标,前面说过的connect()方法将被使用。这个方法并不完美,因为它实际上发送的是SYN报文,而不是ACK报文。 提供SYN和ACK两种ping探测的原因是使通过防火墙的机会尽可能大。许多管理员会配置他们的路由器或者其它简单的防火墙来封锁SYN报文,除非连接目标是那些公开的服务器像公司网站或者邮件服务器。这可以阻止其它进入组织的连接,同时也允许用户访问互联网。这种无状态的方法几乎不占用防火墙/路由器的资源,因而被硬件和软件过滤器广泛支持。LinuxNetfilter/iptables防火墙软件提供方便的--syn选项来实现这种无状态的方法。当这样的无状态防火墙规则存在时,发送到关闭目标端口的SYNping探测(-PS)很可能被封锁。这种情况下,ACK探测格外有闪光点,因为它正好利用了这样的规则。 另外一种常用的防火墙用有状态的规则来封锁非预期的报文。这一特性已开始只存在于高端防火墙,但是这些年类它越来越普遍了。LinuxNetfilter/iptables通过--state选项支持这一特性,它根据连接状态把报文进行分类。SYN探测更有可能用于这样的系统,由于没头没脑的ACK报文通常会被识别成伪造的而丢弃。解决这个两难的方法是通过即指定-PS又指定-PA来即发送SYN又发送ACK。 -PU[portlist](UDPPing) 还有一个主机发现的选项是UDPping,它发送一个空的(除非指定了--data-lengthUDP报文到给定的端口。端口列表的格式和前面讨论过的-PS和-PA选项还是一样。如果不指定端口,默认是31338。该默认值可以通过在编译时改变nmap.h文件中的DEFAULT-UDP-PROBE-PORT值进行配置。默认使用这样一个奇怪的端口是因为对开放端口进行这种扫描一般都不受欢迎。 如果目标机器的端口是关闭的,UDP探测应该马上得到一个ICMP端口无法到达的回应报文。这对于Nmap意味着该机器正在运行。许多其它类型的ICMP错误,像主机/网络无法到达或者TTL超时则表示down掉的或者不可到达的主机。没有回应也被这样解释。如果到达一个开放的端口,大部分服务仅仅忽略这个空报文而不做任何回应。这就是为什么默认探测端口是31338这样一个极不可能被使用的端口。少数服务如chargen会响应一个空的UDP报文,从而向Nmap表明该机器正在运行。 该扫描类型的主要优势是它可以穿越只过滤TCP的防火墙和过滤器。例如。我曾经有过一个LinksysBEFW11S4无线宽带路由器。默认情况下,该设备对外的网卡过滤所有TCP端口,但UDP探测仍然会引发一个端口不可到达的消息,从而暴露了它自己。 -PE;-PP;-PM(ICMPPingTypes) 除了前面讨论的这些不常见的TCP和UDP主机发现类型,Nmap也能发送世人皆知的ping程序所发送的报文。Nmap发送一个ICMPtype8(回声请求)报文到目标IP地址,期待从运行的主机得到一个type0(回声响应)报文。对于网络探索者而言,不幸的是,许多主机和防火墙现在封锁这些报文,而不是按期望的那样响应,参见RFC1122。因此,仅仅ICMP扫描对于互联网上的目标通常是不够的。但对于系统管理员监视一个内部网络,它们可能是实际有效的途径。使用-PE选项打开该回声请求功能。 -PR(ARPPing) 当进行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扫描。 大部分扫描类型只对特权用户可用。这是因为他们发送接收原始报文,这在Unix系统需要root权限。在Windows上推荐使用administrator账户,但是当WinPcap已经被加载到操作系统时,非特权用户也可以正常使用Nmap。当Nmap在1997年发布时,需要root权限是一个严重的局限,因为很多用户只有共享的shell账户。现在,世界变了,计算机便宜了,更多人拥有互联网连接,桌面UNIX系统(包括Linux和MACOSX)很普遍了。Windows版本的Nmap现在也有了,这使它可以运行在更多的桌面上。由于所有这些原因,用户不再需要用有限的共享shell账户运行Nmap。这是很幸运的,因为特权选项让Nmap强大得多也灵活得多。 -sS(TCPSYN扫描) 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(TCPconnect()扫描) 当SYN扫描不能用时,CPConnect()扫描就是默认的TCP扫描。当用户没有权限发送原始报文或者扫描IPv6网络时,就是这种情况。Insteadofwritingrawpacketsasmostotherscantypesdo,Nmap通过创建connect()系统调用要求操作系统和目标机以及端口建立连接,而不像其它扫描类型直接发送原始报文。这是和Web浏览器,P2P客户端以及大多数其它网络应用程序用以建立连接一样的高层系统调用。它是叫做BerkeleySocketsAPI编程接口的一部分。Nmap用该API获得每个连接尝试的状态信息,而不是读取响应的原始报文。 -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对此特别严格。例如,Linux2.4.20内核限制一秒钟只发送一条目标不可到达消息(见net/ipv4/icmp。c)。 Nmap探测速率限制并相应地减慢来避免用那些目标机会丢弃的无用报文来阻塞网络。不幸的是,Linux式的一秒钟一个报文的限制使65,536个端口的扫描要花18小时以上。加速UDP扫描的方法包括并发扫描更多的主机,先只对主要端口进行快速扫描,从防火墙后面扫描,使用--host-timeout跳过慢速的主机。 -sN;-sF;-sX(TCPNull,FIN,andXmas扫描) 这三种扫描类型(甚至用下一节描述的--scanflags选项的更多类型)在TCPRFC中发掘了一个微妙的方法来区分open(开放的)和closed(关闭的)端口。第65页说“如果[目标]端口状态是关闭的....进入的不含RST的报文导致一个RST响应。”接下来的一页讨论不设置SYN,RST,或者ACK位的报文发送到开放端口:“理论上,这不应该发生,如果您确实收到了,丢弃该报文,返回。” 如果扫描系统遵循该RFC,当端口关闭时,任何不包含SYN,RST,或者ACK位的报文会导致一个RST返回,而当端口开放时,应该没有任何响应。只要不包含SYN,RST,或者ACK,任何其它三种(FIN,PSH,andURG)的组合都行。Nmap有三种扫描类型利用这一点: Null扫描(-sN) 不设置任何标志位(tcp标志头是0) FIN扫描(-sF) 只设置TCPFIN标志位。 Xmas扫描(-sX) 设置FIN,PSH,和URG标志位,就像点亮圣诞树上所有的灯一样。 除了探测报文的标志位不同,这三种扫描在行为上完全一致。如果收到一个RST报文,该端口被认为是closed(关闭的),而没有响应则意味着端口是open|filtered(开放或者被过滤的)。如果收到ICMP不可到达错误(类型3,代号1,2,3,9,10,或者13),该端口就被标记为被过滤的。 这些扫描的关键优势是它们能躲过一些无状态防火墙和报文过滤路由器。另一个优势是这些扫描类型甚至比SYN扫描还要隐秘一些。但是别依赖它--多数现代的IDS产品可以发现它们。一个很大的不足是并非所有系统都严格遵循RFC793。许多系统不管端口开放还是关闭,都响应RST。这导致所有端口都标记为closed(关闭的)。这样的操作系统主要有MicrosoftWindows,许多Cisco设备,BSDI,以及IBMOS/400。但是这种扫描对多数UNIX系统都能工作。这些扫描的另一个不足是它们不能辨别open(开放的)端口和一些特定的filtered(被过滤的)端口,从而返回open|filtered(开放或者被过滤的)。 -sA(TCPACK扫描) 这种扫描与目前为止讨论的其它扫描的不同之处在于它不能确定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(TCPMaimon扫描) Maimon扫描是用它的发现者UrielMaimon命名的。他在PhrackMagazineissue#49(November1996)中描述了这一技术。Nmap在两期后加入了这一技术。这项技术和Null,FIN,以及Xmas扫描完全一样,除了探测报文是FIN/ACK。根据RFC793(TCP),无论端口开放或者关闭,都应该对这样的探测响应RST报文。然而,Uriel注意到如果端口开放,许多基于BSD的系统只是丢弃该探测报文。 --scanflags(定制的TCP扫描) 真正的Nmap高级用户不需要被这些现成的扫描类型束缚。--scanflags选项允许您通过指定任意TCP标志位来设计您自己的扫描。让您的创造力流动,躲开那些仅靠本手册添加规则的入侵检测系统! --scanflags选项可以是一个数字标记值如9(PSH和FIN),但使用字符名更容易些。只要是URG,ACK,PSH,RST,SYN,andFIN的任何组合就行。例如,--scanflagsURGACKPSHRSTSYNFIN设置了所有标志位,但是这对扫描没有太大用处。标志位的顺序不重要。 除了设置需要的标志位,您也可以设置TCP扫描类型(如-sA或者-sF)。那个基本类型告诉Nmap怎样解释响应。例如,SYN扫描认为没有响应意味着filtered端口,而FIN扫描则认为是open|filtered。除了使用您指定的TCP标记位,Nmap会和基本扫描类型一样工作。如果您不指定基本类型,就使用SYN扫描。 -sI 除了极端隐蔽(由于它不从真实IP地址发送任何报文),该扫描类型可以建立机器间的基于IP的信任关系。端口列表从zombie主机的角度。显示开放的端口。因此您可以尝试用您认为(通过路由器/包过滤规则)可能被信任的zombies扫描目标。 如果您由于IPID改变希望探测zombie上的特定端口,您可以在zombie主机后加上一个冒号和端口号。否则Nmap会使用默认端口(80)。 -sO(IP协议扫描) IP协议扫描可以让您确定目标机支持哪些IP协议(TCP,ICMP,IGMP,等等)。从技术上说,这不是端口扫描,既然它遍历的是IP协议号而不是TCP或者UDP端口号。但是它仍使用-p选项选择要扫描的协议号,用正常的端口表格式报告结果,甚至用和真正的端口扫描一样的扫描引擎。因此它和端口扫描非常接近,也被放在这里讨论。 除了本身很有用,协议扫描还显示了开源软件的力量。尽管基本想法非常简单,我过去从没想过增加这一功能也没收到任何对它的请求。在2000年夏天,GerhardRieger孕育了这个想法,写了一个很棒的补丁程序,发送到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协议的一个有趣特征(RFC959)是支持所谓代理ftp连接。它允许用户连接到一台FTP服务器,然后要求文件送到一台第三方服务器。这个特性在很多层次上被滥用,所以许多服务器已经停止支持它了。其中一种就是导致FTP服务器对其它主机端口扫描。只要请求FTP服务器轮流发送一个文件到目标主机上的所感兴趣的端口。错误消息会描述端口是开放还是关闭的。这是绕过防火墙的好方法,因为FTP服务器常常被置于可以访问比Web主机更多其它内部主机的位置。Nmap用-b选项支持ftp弹跳扫描。参数格式是 当Nmap1997年发布时,这个弱点被广泛利用,但现在大部分已经被fix了。脆弱的服务器仍然存在,所以如果其它都失败了,这也值得一试。如果您的目标是绕过防火墙,扫描目标网络上的开放的21端口(或者甚至任何ftp服务,如果您用版本探测扫描所有端口),然后对每个尝试弹跳扫描。Nmap会告诉您该主机脆弱与否。如果您只是试着玩Nmap,您不必(事实上,不应该)限制您自己。在您随机地在互联网上寻找脆弱的FTP服务器时,考虑一下系统管理员不太喜欢您这样滥用他们的服务器。 除了所有前面讨论的扫描方法,Nmap提供选项说明那些端口被扫描以及扫描是随机还是顺序进行。默认情况下,Nmap用指定的协议对端口1到1024以及nmap-services文件中列出的更高的端口在扫描。 -p 该选项指明您想扫描的端口,覆盖默认值。单个端口和用连字符表示的端口范围(如1-1023)都可以。范围的开始以及/或者结束值可以被省略,分别导致Nmap使用1和65535。所以您可以指定-p-从端口1扫描到65535。如果您特别指定,也可以扫描端口0。对于IP协议扫描(-sO),该选项指定您希望扫描的协议号(0-255)。 当既扫描TCP端口又扫描UDP端口时,您可以通过在端口号前加上T:或者U:指定协议。协议限定符一直有效您直到指定另一个。例如,参数-pU: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来顺序端口扫描。 把Nmap指向一个远程机器,它可能告诉您端口25/tcp,80/tcp,和53/udp是开放的。使用包含大约2,200个著名的服务的nmap-services数据库,Nmap可以报告那些端口可能分别对应于一个邮件服务器(SMTP),web服务器(HTTP),和域名服务器(DNS)。这种查询通常是正确的--事实上,绝大多数在TCP端口25监听的守护进程是邮件服务器。然而,您不应该把赌注押在这上面!人们完全可以在一些奇怪的端口上运行服务。 即使Nmap是对的,假设运行服务的确实是SMTP,HTTP和DNS,那也不是特别多的信息。当为您的公司或者客户作安全评估(或者甚至简单的网络明细清单)时,您确实想知道正在运行什么邮件和域名服务器以及它们的版本。有一个精确的版本号对了解服务器有什么漏洞有巨大帮助。版本探测可以帮您获得该信息。 用下列的选项打开和控制版本探测。 -sV(版本探测) 打开版本探测。您也可以用-A同时打开操作系统探测和版本探测。 --allports(不为版本探测排除任何端口) 默认情况下,Nmap版本探测会跳过9100TCP端口,因为一些打印机简单地打印送到该端口的任何数据,这回导致数十页HTTPget请求,二进制SSL会话请求等等被打印出来。这一行为可以通过修改或删除nmap-service-probes中的Exclude指示符改变,您也可以不理会任何Exclude指示符,指定--allports扫描所有端口 --version-intensity --version-light(打开轻量级模式) 这是--version-intensity2的方便的别名。轻量级模式使版本扫描快许多,但它识别服务的可能性也略微小一点。 --version-all(尝试每个探测) --version-intensity9的别名,保证对每个端口尝试每个探测报文。 --version-trace(跟踪版本扫描活动) 这导致Nmap打印出详细的关于正在进行的扫描的调试信息。它是您用--packet-trace所得到的信息的子集。 -sR(RPC扫描) 这种方法和许多端口扫描方法联合使用。它对所有被发现开放的TCP/UDP端口执行SunRPC程序NULL命令,来试图确定它们是否RPC端口,如果是,是什么程序和版本号。因此您可以有效地获得和rpcinfo-p一样的信息,即使目标的端口映射在防火墙后面(或者被TCP包装器保护)。Decoys目前不能和RPCscan一起工作。这作为版本扫描(-sV)的一部分自动打开。由于版本探测包括它并且全面得多,-sR很少被需要。 Nmap最著名的功能之一是用TCP/IP协议栈fingerprinting进行远程操作系统探测。Nmap发送一系列TCP和UDP报文到远程主机,检查响应中的每一个比特。在进行一打测试如TCPISN采样,TCP选项支持和排序,IPID采样,和初始窗口大小检查之后,Nmap把结果和数据库nmap-os-fingerprints中超过1500个已知的操作系统的fingerprints进行比较,如果有匹配,就打印出操作系统的详细信息。每个fingerprint包括一个自由格式的关于OS的描述文本,和一个分类信息,它提供供应商名称(如Sun),下面的操作系统(如Solaris),OS版本(如10),和设备类型(通用设备,路由器,switch,游戏控制台,等)。 如果Nmap不能猜出操作系统,并且有些好的已知条件(如至少发现了一个开放端口和一个关闭端口),Nmap会提供一个URL,如果您确知运行的操作系统,您可以把fingerprint提交到那个URL。这样您就扩大了Nmap的操作系统知识库,从而让每个Nmap用户都受益。 采用下列选项启用和控制操作系统检测: -O(启用操作系统检测) 也可以使用-A来同时启用操作系统检测和版本检测。 --osscan-limit(针对指定的目标进行操作系统检测) --osscan-guess;--fuzzy(推测操作系统检测结果) 当Nmap无法确定所检测的操作系统时,会尽可能地提供最相近的匹配,Nmap默认进行这种匹配,使用上述任一个选项使得Nmap的推测更加有效。 --min-hostgroup 默认方式下,Nmap采取折衷的方法。开始扫描时的组较小,最小为5,这样便于尽快产生结果;随后增长组的大小,最大为1024。确切的大小依赖于所给定的选项。为保证效率,针对UDP或少量端口的TCP扫描,Nmap使用大的组。 --max-hostgroup选项用于说明使用最大的组,Nmap不会超出这个大小。--min-hostgroup选项说明最小的组,Nmap会保持组大于这个值。如果在指定的接口上没有足够的目标主机来满足所指定的最小值,Nmap可能会采用比所指定的值小的组。这两个参数虽然很少使用,但都用于保持组的大小在一个指定的范围之内。 这些选项的主要用途是说明一个最小组的大小,使得整个扫描更加快速。通常选择256来扫描C类网段。对于端口数较多的扫描,超出该值没有意义。对于端口数较少的扫描,2048或更大的组大小是有帮助的。 --min-parallelism 这些选项控制用于主机组的探测报文数量,可用于端口扫描和主机发现。默认状态下,Nmap基于网络性能计算一个理想的并行度,这个值经常改变。如果报文被丢弃,Nmap降低速度,探测报文数量减少。随着网络性能的改善,理想的探测报文数量会缓慢增加。这些选项确定这个变量的大小范围。默认状态下,当网络不可靠时,理想的并行度值可能为1,在好的条件下,可能会增长至几百。 最常见的应用是--min-parallelism值大于1,以加快性能不佳的主机或网络的扫描。这个选项具有风险,如果过高则影响准确度,同时也会降低Nmap基于网络条件动态控制并行度的能力。这个值设为10较为合适,这个值的调整往往作为最后的手段。 --min-rtt-timeout --host-timeout --scan-delay的另一个用途是躲闭基于阈值的入侵检测和预防系统(IDS/IPS)。 -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 为使诱饵扫描起作用,需要使远程主机认为是诱饵在扫描目标网络。IDS可能会报个某个IP的5-10个端口扫描,但并不知道哪个IP在扫描以及哪些不是诱饵。但这种方式可以通过路由跟踪、响应丢弃以及其它主动机制在解决。这是一种常用的隐藏自身IP地址的有效技术。 使用逗号分隔每个诱饵主机,也可用自己的真实IP作为诱饵,这时可使用ME选项说明。如果在第6个位置或更后的位置使用ME选项,一些常用端口扫描检测器(如SolarDesigner'sexcellentscanlogd)就不会报告这个真实IP。如果不使用ME选项,Nmap将真实IP放在一个随机的位置 注意,作为诱饵的主机须在工作状态,否则会导致目标主机的SYN洪水攻击。如果在网络中只有一个主机在工作,那就很容易确定哪个主机在扫描。也可使用IP地址代替主机名(被诱骗的网络就不可能在名字服务器日志中发现)。 诱饵可用在初始的ping扫描(ICMP、SYN、ACK等)阶段或真正的端口扫描阶段。诱饵也可以用于远程操作系统检测(-O)。在进行版本检测或TCP连接扫描时,诱饵无效。 使用过多的诱饵没有任何价值,反而导致扫描变慢并且结果不准确。此外,一些ISP会过滤哄骗的报文,但很多对欺骗IP包没有任何限制。 -S 在某些情况下,Nmap可能无法确定你的源地址(如果这样,Nmap会给出提示)。此时,使用-S选项并说明所需发送包的接口IP地址。 这个标志的另一个用处是哄骗性的扫描,使得目标认为是另一个地址在进行扫描。可以想象某一个竞争对手在不断扫描某个公司!-e选项常在这种情况下使用,也可采用-P0选项。 -e 告诉Nmap使用哪个接口发送和接收报文,Nmap可以进行自动检测,如果检测不出会给出提示。 --source-port 仅依赖于源端口号就信任数据流是一种常见的错误配置,这个问题非常好理解。例如一个管理员部署了一个新的防火墙,但招来了很多用户的不满,因为他们的应用停止工作了。可能是由于外部的UDPDNS服务器响应无法进入网络,而导致DNS的崩溃。FTP是另一个常见的例子,在FTP传输时,远程服务器尝试和内部用建立连接以传输数据。 对这些问题有安全解决方案,通常是应用级代理或协议分析防火墙模块。但也存在一些不安全的方案。注意到DNS响应来自于53端口,FTP连接来自于20端口,很多管理员会掉入一个陷阱,即允许来自于这些端口的数据进入网络。他们认为这些端口里不会有值得注意的攻击和漏洞利用。此外,管理员或许认为这是一个短期的措施,直至他们采取更安全的方案。但他们忽视了安全的升级。 不仅仅是工作量过多的网络管理员掉入这种陷阱,很多产品本身也会有这类不安全的隐患,甚至是微软的产品。Windows2000和WindowsXP中包含的IPsec过滤器也包含了一些隐含规则,允许所有来自88端口(Kerberos)的TCP和UDP数据流。另一个常见的例子是ZoneAlarm个人防火墙到2.1.25版本仍然允许源端口53(DNS)或67(DHCP)的UDP包进入。 Nmap提供了-g和--source-port选项(它们是等价的),用于利用上述弱点。只需要提供一个端口号,Nmap就可以从这些端口发送数据。为使特定的操作系统正常工作,Nmap必须使用不同的端口号。DNS请求会忽略--source-port选项,这是因为Nmap依靠系统库来处理。大部分TCP扫描,包括SYN扫描,可以完全支持这些选项,UDP扫描同样如此。 --data-length 正常情况下,Nmap发送最少的报文,只含一个包头。因此TCP包通常是40字节,ICMPECHO请求只有28字节。这个选项告诉Nmap在发送的报文上附加指定数量的随机字节。操作系统检测(-O)包不受影响,但大部分ping和端口扫描包受影响,这会使处理变慢,但对扫描的影响较小。 --ttl 设置IPv4报文的time-to-live域为指定的值。 --randomize-hosts(对目标主机的顺序随机排列) --spoof-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输出格式 -oN 要求将标准输出直接写入指定的文件。如上所述,这个格式与交互式输出略有不同。 -oX xml提供了可供软件解析的稳定格式输出,主要的计算机语言都提供了免费的xml解析器,如C/C++,Perl,Python和Java。针对这些语言有一些捆绑代码用于处理Nmap的输出和特定的执行程序。例如perlCPAN中的Nmap::Scanner和Nmap::Parser。对几乎所有与Nmap有接口的主要应用来说,xml是首选的格式。 xml输出引用了一个XSL样式表,用于格式化输出结果,类似于HTML。最方便的方法是将xml输出加载到一个Web浏览器,如Firefox或IE。由于nmap.xsl文件的绝对路径,因此通常只能在运行了Nmap的机器上工作(或类似配置的机器)。类似于任何支持Web机器的HTML文件,--stylesheet选项可用于建立可移植的xml文件。 -oS 脚本小子输出类似于交互工具输出,这是一个事后处理,适合于'l33tHaXXorZ,由于原来全都是大写的Nmap输出。这个选项和脚本小子开了玩笑,看上去似乎是为了“帮助他们”。 -oG 这种方式最后介绍,因为不建议使用。xml输格式很强大,便于有经验的用户使用。xml是一种标准,由许多解析器构成,而Grep输届更简化。xml是可扩展的,以支持新发布的Nmap特点。使用Grep输出的目的是忽略这些特点,因为没有足够的空间。 然面,Grep输出仍然很常使用。它是一种简单格式,每行一个主机,可以通过UNIX工具(如grep、awk、cut、sed、diff)和Perl方便地查找和分解。常可用于在命令行上进行一次性测式。查找ssh端口打开或运行Sloaris的主机,只需要一个简单的grep主机说明,使用通道并通过awk或cut命令打印所需的域。 Grep输出可以包含注释(每行由#号开始)。每行由6个标记的域组成,由制表符及冒号分隔。这些域有主机,端口,协议,忽略状态,操作系统,序列号,IPID和状态。 -oA 为使用方便,利用-oA 细节和调试选项 -v(提高输出信息的详细度) 大部分的变化仅影响交互式输出,也有一些影响标准和脚本小子输出。其它输出类型由机器处理,此时Nmap默认提供详细的信息,不需要人工干预。然而,其它模式也会有一些变化,省略一些细节可以减小输出大小。例如,Grep输出中的注释行提供所有扫描端口列表,但由于这些信息过长,因此只能在细节模式中输出。 -d[level](提高或设置调试级别) 当详细模式也不能为用户提供足够的数据时,使用调试可以得到更多的信息。使用细节选项(-v)时,可启用命令行参数(-d),多次使用可提高调试级别。也可在-d后面使用参数设置调试级别。例如,-d9设定级别9。这是最高的级别,将会产生上千行的输出,除非只对很少的端口和目标进行简单扫描。 如果Nmap因为Bug而挂起或者对Nmap的工作及原理有疑问,调试输出非常有效。主要是开发人员用这个选项,调试行不具备自我解释的特点。例如,Timeoutvals:srtt:-1rttvar:-1to:1000000delta14987==>srtt:14987rttvar:14987to:100000。如果对某行输出不明白,可以忽略、查看源代码或向开发列表(nmap-dev)求助。有些输出行会有自我解释的特点,但随着调试级别的升高,会越来越含糊。 --packet-trace(跟踪发送和接收的报文) 要求Nmap打印发送和接收的每个报文的摘要,通常用于调试,有助于新用户更好地理解Nmap的真正工作。为避免输出过多的行,可以限制扫描的端口数,如-p20-30。如果只需进行版本检测,使用--version-trace。 --iflist(列举接口和路由) 输出Nmap检测到的接口列表和系统路由,用于调试路由问题或设备描述失误(如Nmap把PPP连接当作以太网对待)。 其它输出选项 --append-output(在输出文件中添加) 当使用文件作为输出格式,如-oX或-oN,默认该文件被覆盖。如果希望文件保留现有内容,将结果添加在现有文件后面,使用--append-output选项。所有指定的输出文件都被添加。但对于xml(-oX)扫描输出文件无效,无法正常解析,需要手工修改。 --resume --stylesheet 使用该选项禁止Nmap的xml输出关联任何XSL样式表。xml-stylesheet指示被忽略。 本节描述一些重要的(和并不重要)的选项,这些选项不适合其它任何地方。 -6(启用IPv6扫描) -A(激烈扫描模式选项) --datadir 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选项。 --interactive(在交互模式中启动) 在交互模式中启动Nmap,提供交互式的Nmap提示,便于进行多个扫描(同步或后台方式)。对于从多用户系统中扫描的用户非常有效,这些用户常需要测试他们的安全性,但不希望系统中的其它用户知道他们扫描哪些系统。使用--interactive激活这种方式,然后输入h可获得帮助信息。由于需要对正确的shell程序和整个功能非常熟悉,这个选项很少使用。这个选项包含了一个!操作符,用于执行shell命令,这是不安装Nmapsetuidroot的多个原因之一。 -V;--version(打印版本信息) 打印Nmap版本号并退出。 -h;--help(打印帮助摘要面) 打印一个短的帮助屏幕,列出大部分常用的命令选项,这个功能与不带参数运行Nmap是相同的。 引用 以上为白帽汇安全研究员整理,如有侵权,请联系管理员service@baimaohui.net。