Nmap是一款网络扫描和主机检测的很是有用的工具。Nmap是不局限于仅仅收集信息和枚举,同时能够用来做为一个漏洞探测器或安全扫描器。它能够适用于winodws,linux,mac等操做系统linux
Nmap是一款很是强大的实用工具,可用于:检测活在网络上的主机(主机发现)检测主机上开放的端口(端口发现或枚举)检测到相应的端口(服务发现)的软件和版本检测操做系统,硬件地址,以及软件版本检测脆弱性的漏洞(Nmap的脚本)Nmap是一个很是广泛的工具,它有命令行界面和图形用户界面。本人包括如下方面的内容:介绍Nmap扫描中的重要参数操做系统检测Nmap使用教程Nmap使用不一样的技术来执行扫描,包括:TCP的connect()扫描,TCP反向的ident扫描,FTP反弹扫描等。全部这些扫描的类型有本身的优势和缺点,咱们接下来将讨论这些问题。 Nmap的使用取决于目标主机,由于有一个简单的(基本)扫描和预先扫描之间的差别。咱们须要使用一些先进的技术来绕过防火墙和入侵检测/防护系统,以得到正确的结果。下面是一些基本的命令和它们的用法的例子:扫描单一的一个主机,命令以下:git
代码以下:数据库
#nmap nxadmin.com#nmap 192.168.1.2windows
扫描整个子网,命令以下:安全
代码以下:服务器
#nmap 192.168.1.1/24网络
扫描多个目标,命令以下:tcp
代码以下:ide
#nmap 192.168.1.2 192.168.1.5工具
扫描一个范围内的目标,以下:
代码以下:
#nmap 192.168.1.1-100 (扫描IP地址为192.168.1.1-192.168.1.100内的全部主机)
若是你有一个ip地址列表,将这个保存为一个txt文件,和namp在同一目录下,扫描这个txt内的全部主机,命令以下:
代码以下:
#nmap -iL target.txt
若是你想看到你扫描的全部主机的列表,用如下命令:
代码以下:
#nmap -sL 192.168.1.1/24
扫描除过某一个ip外的全部子网主机,命令:
代码以下:
#nmap192.168.1.1/24-exclude192.168.1.1
扫描除过某一个文件中的ip外的子网主机命令
代码以下:
#nmap192.168.1.1/24-excludefilexxx.txt(xxx.txt中的文件将会从扫描的主机中排除)
扫描特定主机上的80,21,23端口,命令以下
代码以下:
#nmap-p80,21,23192.168.1.1
从上面咱们已经了解了Nmap的基础知识,下面咱们深刻的探讨一下Nmap的扫描技术
Tcp SYN Scan (sS) 这是一个基本的扫描方式,它被称为半开放扫描,由于这种技术使得Nmap不须要经过完整的握手,就能得到远程主机的信息。Nmap发送SYN包到远程主机,可是它不会产生任何会话.所以不会在目标主机上产生任何日志记录,由于没有造成会话。这个就是SYN扫描的优点.若是Nmap命令中没有指出扫描类型,默认的就是Tcp SYN.可是它须要root/administrator权限.
代码以下:
#nmap -sS 192.168.1.1
Tcp connect() scan(sT)若是不选择SYN扫描,TCP connect()扫描就是默认的扫描模式.不一样于Tcp SYN扫描,Tcp connect()扫描须要完成三次握手,而且要求调用系统的connect().Tcp connect()扫描技术只适用于找出TCP和UDP端口.
代码以下:
#nmap -sT 192.168.1.1
Udp scan(sU)顾名思义,这种扫描技术用来寻找目标主机打开的UDP端口.它不须要发送任何的SYN包,由于这种技术是针对UDP端口的。UDP扫描发送UDP数据包到目标主机,并等待响应,若是返回ICMP不可达的错误消息,说明端口是关闭的,若是获得正确的适当的回应,说明端口是开放的.
代码以下:
#nmap -sU 192.168.1.1
FINscan(sF)
有时候TcpSYN扫描不是最佳的扫描模式,由于有防火墙的存在.目标主机有时候可能有IDS和IPS系统的存在,防火墙会阻止掉SYN数据包。发送一个设置了FIN标志的数据包并不须要完成TCP的握手.
代码以下:
<a href="mailto:root@bt:~#nmap-sF192.168.1.8">root@bt:~#nmap-sF192.168.1.8</a></p> <p>StartingNmap5.51at2012-07-0819:21PKTNmapscanreportfor192.168.1.8Hostisup(0.000026slatency).Notshown:999closedportsPORTSTATESERVICE111/tcpopen|filteredrpcbind
FIN扫描也不会在目标主机上建立日志(FIN扫描的优点之一).个类型的扫描都是具备差别性的,FIN扫描发送的包只包含FIN标识,NULL扫描不发送数据包上的任何字节,XMAS扫描发送FIN、PSH和URG标识的数据包.
PINGScan(sP)
PING扫描不一样于其它的扫描方式,由于它只用于找出主机是不是存在在网络中的.它不是用来发现是否开放端口的.PING扫描须要ROOT权限,若是用户没有ROOT权限,PING扫描将会使用connect()调用.
代码以下:
#nmap-sP192.168.1.1
版本检测(sV)
版本检测是用来扫描目标主机和端口上运行的软件的版本.它不一样于其它的扫描技术,它不是用来扫描目标主机上开放的端口,不过它须要从开放的端口获取信息来判断软件的版本.使用版本检测扫描以前须要先用TCPSYN扫描开放了哪些端口.
代码以下:
#nmap-sV192.168.1.1
Idlescan(sL)
Idlescan是一种先进的扫描技术,它不是用你真实的主机Ip发送数据包,而是使用另一个目标网络的主机发送数据包.
代码以下:
#nmap-sL192.168.1.6192.168.1.1
Idlescan是一种理想的匿名扫描技术,经过目标网络中的192.168.1.6向主机192.168.1.1发送数据,来获取192.168.1.1开放的端口
有须要其它的扫描技术,如FTPbounce(FTP反弹),fragmentationscan(碎片扫描),IPprotocolscan(IP协议扫描),以上讨论的是几种最主要的扫描方式.
Nmap的OS检测(O)
Nmap最重要的特色之一是可以远程检测操做系统和软件,Nmap的OS检测技术在渗透测试中用来了解远程主机的操做系统和软件是很是有用的,经过获取的信息你能够知道已知的漏洞。Nmap有一个名为的nmap-OS-DB数据库,该数据库包含超过2600操做系统的信息。Nmap把TCP和UDP数据包发送到目标机器上,而后检查结果和数据库对照。
代码以下:
InitiatingSYNStealthScanat10:21Scanninglocalhost(127.0.0.1)[1000ports]Discoveredopenport111/tcpon127.0.0.1CompletedSYNStealthScanat10:21,0.08selapsed(1000totalports)InitiatingOSdetection(try#1)againstlocalhost(127.0.0.1)RetryingOSdetection(try#2)againstlocalhost(127.0.0.1)
上面的例子清楚地代表,Nmap的首次发现开放的端口,而后发送数据包发现远程操做系统。操做系统检测参数是O(大写O)
Nmap的操做系统指纹识别技术:
设备类型(路由器,工做组等)运行(运行的操做系统)操做系统的详细信息(操做系统的名称和版本)网络距离(目标和攻击者之间的距离跳)
若是远程主机有防火墙,IDS和IPS系统,你可使用-PN命令来确保不ping远程主机,由于有时候防火墙会组织掉ping请求.-PN命令告诉Nmap不用ping远程主机。
代码以下:
#nmap-O-PN192.168.1.1/24
以上命令告诉发信主机远程主机是存活在网络上的,因此没有必要发送ping请求,使用-PN参数能够绕过PING命令,可是不影响主机的系统的发现.
Nmap的操做系统检测的基础是有开放和关闭的端口,若是OSscan没法检测到至少一个开放或者关闭的端口,会返回如下错误:
代码以下:
Warning:OSScanresultsmaybeunreliablebecausewecouldnotfindatleast1openand1closedport
OSScan的结果是不可靠的,由于没有发现至少一个开放或者关闭的端口
这种状况是很是不理想的,应该是远程主机作了针对操做系统检测的防范。若是Nmap不能检测到远程操做系统类型,那么就没有必要使用-osscan_limit检测。
想好经过Nmap准确的检测到远程操做系统是比较困难的,须要使用到Nmap的猜想功能选项,–osscan-guess猜想认为最接近目标的匹配操做系统类型。
代码以下:
#nmap-O--osscan-guess192.168.1.1
下面是扫描类型说明
-sTTCPconnect()扫描:这是最基本的TCP扫描方式。connect()是一种系统调用,由操做系统提供,用来打开一个链接。若是目标端口有程序监听,connect()就会成功返回,不然这个端口是不可达的。这项技术最大的优势是,你勿需root权限。任何UNIX用户均可以自由使用这个系统调用。这种扫描很容易被检测到,在目标主机的日志中会记录大批的链接请求以及错误信息。
-sSTCP同步扫描(TCPSYN):由于没必要所有打开一个TCP链接,因此这项技术一般称为半开扫描(half-open)。你能够发出一个TCP同步包(SYN),而后等待回应。若是对方返回SYN|ACK(响应)包就表示目标端口正在监听;若是返回RST数据包,就表示目标端口没有监听程序;若是收到一个SYN|ACK包,源主机就会立刻发出一个RST(复位)数据包断开和目标主机的链接,这实际上有咱们的操做系统内核自动完成的。这项技术最大的好处是,不多有系统可以把这记入系统日志。不过,你须要root权限来定制SYN数据包。
-sF-sX-sN秘密FIN数据包扫描、圣诞树(XmasTree)、空(Null)扫描模式:即便SYN扫描都没法肯定的状况下使用。一些防火墙和包过滤软件可以对发送到被限制端口的SYN数据包进行监视,并且有些程序好比synlogger和courtney可以检测那些扫描。这些高级的扫描方式能够逃过这些干扰。些扫描方式的理论依据是:关闭的端口须要对你的探测包回应RST包,而打开的端口必需忽略有问题的包(参考RFC793第64页)。FIN扫描使用暴露的FIN数据包来探测,而圣诞树扫描打开数据包的FIN、URG和PUSH标志。不幸的是,微软决定彻底忽略这个标准,另起炉灶。因此这种扫描方式对Windows95/NT无效。不过,从另外的角度讲,可使用这种方式来分别两种不一样的平台。若是使用这种扫描方式能够发现打开的端口,你就能够肯定目标注意运行的不是Windows系统。若是使用-sF、-sX或者-sN扫描显示全部的端口都是关闭的,而使用SYN扫描显示有打开的端口,你能够肯定目标主机可能运行的是Windwos系统。如今这种方式没有什么太大的用处,由于nmap有内嵌的操做系统检测功能。还有其它几个系统使用和windows一样的处理方式,包括Cisco、BSDI、HP/UX、MYS、IRIX。在应该抛弃数据包时,以上这些系统都会从打开的端口发出复位数据包。
-sPping扫描:有时你只是想知道此时网络上哪些主机正在运行。经过向你指定的网络内的每一个IP地址发送ICMPecho请求数据包,nmap就能够完成这项任务。若是主机正在运行就会做出响应。不幸的是,一些站点例如:microsoft.com阻塞ICMPecho请求数据包。然而,在默认的状况下nmap也可以向80端口发送TCPack包,若是你收到一个RST包,就表示主机正在运行。nmap使用的第三种技术是:发送一个SYN包,而后等待一个RST或者SYN/ACK包。对于非root用户,nmap使用connect()方法。在默认的状况下(root用户),nmap并行使用ICMP和ACK技术。注意,nmap在任何状况下都会进行ping扫描,只有目标主机处于运行状态,才会进行后续的扫描。若是你只是想知道目标主机是否运行,而不想进行其它扫描,才会用到这个选项。
-sUUDP扫描:若是你想知道在某台主机上提供哪些UDP(用户数据报协议,RFC768)服务,可使用这种扫描方法。nmap首先向目标主机的每一个端口发出一个0字节的UDP包,若是咱们收到端口不可达的ICMP消息,端口就是关闭的,不然咱们就假设它是打开的。有些人可能会想UDP扫描是没有什么意思的。可是,我常常会想到最近出现的solarisrpcbind缺陷。rpcbind隐藏在一个未公开的UDP端口上,这个端口号大于32770。因此即便端口111(portmap的众所周知端口号)被防火墙阻塞有关系。可是你能发现大于30000的哪一个端口上有程序正在监听吗?使用UDP扫描就能!cDcBackOrifice的后门程序就隐藏在Windows主机的一个可配置的UDP端口中。不考虑一些一般的安全缺陷,一些服务例如:snmp、tftp、NFS使用UDP协议。不幸的是,UDP扫描有时很是缓慢,由于大多数主机限制ICMP错误信息的比例(在RFC1812中的建议)。例如,在Linux内核中(在net/ipv4/icmp.h文件中)限制每4秒钟只能出现80条目标豢纱锏腎CMP消息,若是超过这个比例,就会给1/4秒钟的处罚。solaris的限制更加严格,每秒钟只容许出现大约2条ICMP不可达消息,这样,使扫描更加缓慢。nmap会检测这个限制的比例,减缓发送速度,而不是发送大量的将被目标主机丢弃的无用数据包。不过Micro$oft忽略了RFC1812的这个建议,不对这个比例作任何的限制。因此咱们能够可以快速扫描运行Win95/NT的主机上的全部65K个端口。
-sAACK扫描:这项高级的扫描方法一般用来穿过防火墙的规则集。一般状况下,这有助于肯定一个防火墙是功能比较完善的或者是一个简单的包过滤程序,只是阻塞进入的SYN包。这种扫描是向特定的端口发送ACK包(使用随机的应答/序列号)。若是返回一个RST包,这个端口就标记为unfiltered状态。若是什么都没有返回,或者返回一个不可达ICMP消息,这个端口就纳入filtered类。注意,nmap一般不输出unfiltered的端口,因此在输出中一般不显示全部被探测的端口。显然,这种扫描方式不能找出处于打开状态的端口。
-sW对滑动窗口的扫描:这项高级扫描技术很是相似于ACK扫描,除了它有时能够检测处处于打开状态的端口,由于滑动窗口的大小是不规则的,有些操做系统能够报告其大小。这些系统至少包括:某些版本的AIX、Amiga、BeOS、BSDI、Cray、Tru64UNIX、DG/UX、OpenVMS、DigitalUNIX、OpenBSD、OpenStep、QNX、Rhapsody、SunOS4.x、Ultrix、VAX、VXWORKS。从nmap-hackers邮件3列表的文档中能够获得完整的列表。
-sRRPC扫描。这种方法和nmap的其它不一样的端口扫描方法结合使用。选择全部处于打开状态的端口向它们发出SunRPC程序的NULL命令,以肯定它们是不是RPC端口,若是是,就肯定是哪一种软件及其版本号。所以你可以得到防火墙的一些信息。诱饵扫描如今还不能和RPC扫描结合使用。
-bFTP反弹攻击(bounceattack):FTP协议(RFC959)有一个颇有意思的特征,它支持代理FTP链接。也就是说,我可以从evil.com链接到FTP服务器target.com,而且能够要求这台FTP服务器为本身发送Internet上任何地方的文件!1985年,RFC959完成时,这个特征就能很好地工做了。然而,在今天的Internet中,咱们不能让人们劫持FTP服务器,让它向Internet上的任意节点发送数据。如同Hobbit在1995年写的文章中所说的,这个协议"可以用来作投递虚拟的不可达邮件和新闻,进入各类站点的服务器,填满硬盘,跳过防火墙,以及其它的骚扰活动,并且很难进行追踪"。咱们可使用这个特征,在一台代理FTP服务器扫描TCP端口。所以,你须要链接到防火墙后面的一台FTP服务器,接着进行端口扫描。若是在这台FTP服务器中有可读写的目录,你还能够向目标端口任意发送数据(不过nmap不能为你作这些)。传递给-b功能选项的参数是你要做为代理的FTP服务器。语法格式为:-busername:password@server:port。除了server之外,其他都是可选的。若是你想知道什么服务器有这种缺陷,能够参考我在Phrack51发表的文章。还能够在nmap的站点获得这篇文章的最新版本。
通用选项这些内容不是必需的,可是颇有用。
-P0在扫描以前,没必要ping主机。有些网络的防火墙不容许ICMPecho请求穿过,使用这个选项能够对这些网络进行扫描。microsoft.com就是一个例子,所以在扫描这个站点时,你应该一直使用-P0或者-PT80选项。
-PT扫描以前,使用TCPping肯定哪些主机正在运行。nmap不是经过发送ICMPecho请求包而后等待响应来实现这种功能,而是向目标网络(或者单一主机)发出TCPACK包而后等待回应。若是主机正在运行就会返回RST包。只有在目标网络/主机阻塞了ping包,而仍旧容许你对其进行扫描时,这个选项才有效。对于非root用户,咱们使用connect()系统调用来实现这项功能。使用-PT来设定目标端口。默认的端口号是80,由于这个端口一般不会被过滤。
-PS对于root用户,这个选项让nmap使用SYN包而不是ACK包来对目标主机进行扫描。若是主机正在运行就返回一个RST包(或者一个SYN/ACK包)。
-PI设置这个选项,让nmap使用真正的ping(ICMPecho请求)来扫描目标主机是否正在运行。使用这个选项让nmap发现正在运行的主机的同时,nmap也会对你的直接子网广播地址进行观察。直接子网广播地址一些外部可达的IP地址,把外部的包转换为一个内向的IP广播包,向一个计算机子网发送。这些IP广播包应该删除,由于会形成拒绝服务攻击(例如smurf)。