从今天开始,我会在这里陆续添加对Nmap这款优秀开源软件的学习心得,跟各位大牛交流:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

.基本参数:

1. 输入参数:

-iR   随机产生待扫描的主机,需指定随机数,如 –iR 10000

-iL  :从一个包含主机名或IP地址列表的文件中读取目标主机,这些主机名或IP地址使用空格、制表符或换行隔开。

--excludefile  : 从一个包含主机名或IP地址列表的文件中读取要排除扫描的主机。

-sL  :仅仅列出待扫描的主机清单(若为域名会先进行解析)

--randomize-hosts   (对目标主机的顺序随机排列)

告诉Nmap在扫描主机前对每个组中的主机随机排列,最多可达 8096个主机。这会使得扫描针对不同的网络监控系统来说变得不是很明显,特别是配合值较小的时间选项时更有效。如果需要对一个较大的组进行随机排列,需要增大nmap.h文件中 PING_GROUP_SZ的值,并重新编译。另一种方法是使用列表扫描 (-sL -n -oN <filename>),产生目标IP的列表,使用Perl脚本进行随机化,然后使用-iL提供给Nmap

 

2. 端口扫描参数:

-p  :指定需要扫描的端口,

Ex: -p22 -p1-65535 -p U:53,111,137,T:21-25,80,139,8080

-F  :快速模式,减少默认的端口扫描个数。

-r  :按顺序扫描端口。

--top-ports <number>  : Scan <number> most common ports

--port-ratio <ratio>  : Scan ports more common than <ratio>

以上参数在vista下测试不成功,错误输出:

Unable to use --top-ports or --port-ratio with an old style (no-ratio) services

file

QUITTING!

 

3. 网络配置参数:

-n   (不用域名解析) 告诉Nmap 永不对它发现的活动IP地址进行反向域名解析。既然DNS一般比较慢,这可以让事情更快些。

-R   (为所有目标解析域名) 告诉Nmap 永远 对目标IP地址作反向域名解析。一般只有当发现机器正在运行时才进行这项操作。

--system_dns  (使用系统域名解析器)一般不使用该选项。

 

4. 系统配置参数:

--send-eth  (使用原以太网帧发送) ,要求Nmap在以太网(数据链路)层而不是IP(网络层)发送 报文。默认方式下,Nmap选择最适合其运行平台的方式,原套接字(IP)UNIX主机最有效的方式,而以太网帧最适合Windows操作 系统,因为Microsoft禁用了原套接字支持。在UNIX中,如果没有其它选择(如无以太网连接),不管是否有该选项,Nmap都使用原IP包。

--send-ip  (在原IP层发送),要求Nmap通过原IP套接字发送报文,而不是低层的以太网帧。这是--send-eth选项的补充。

--privileged  (假定用户具有全部权限) 告诉Nmap假定其具有足够的权限进行源套接字包发送、 报文捕获和类似UNIX系统中根用户操作的权限。默认状态下, 如果由getuid()请求的类似操作不为0Nmap将退出。 --privileged在具有Linux内核性能的类似系统中使用非常有效,这些系统配置允许非特权用户可以进行原报文扫描。需要明确的是,在其它选项之前使用这些需要权限的选项(SYN扫描、操作系统检测等)Nmap_PRIVILEGED变量设置等价于--privileged选项。

 

5. 输出参数:

-oN   :按照人们阅读的格式记录屏幕上的输出,如果是在扫描多台机器,则该选项很有用。

-oX   :以xml格式向指定的文件记录信息

-oG   :以一种易于检索的格式记录信息,即每台主机都以单独的行来记录所有的端口和0s信息。

-oA   :使用为基本文件名,以普通格式(-oN)XML格式(-oX)和易于检索的格式(-oG

-v  (提高输出信息的详细度),通过提高详细度,Nmap可以输出扫描过程的更多信息。 输出发现的打开端口,若Nmap认为扫描需要更多时间会显示估计 的结束时间。这个选项使用两次,会提供更详细的信息。这个选 项使用两次以上不起作用。

--resume <filename>   (继续中断的扫描),一些扩展的Nmap运行需要很长的时间 -- 以天计算,这类扫描往往不会结束。可以进行一些限制,禁止Nmap在工作时间运行,导致网络中断、运行Nmap的主机计划或非计划地重启、或者Nmap自己中断。 运行Nmap的管理员可以因其它原因取消运行,按下ctrl-C 即可。从头开始启动扫描可能令人不快,幸运的是,如果标准扫描 (-oN)Grep扫描(-oG)日志被保留,用户可以要求Nmap恢复终止的扫描,只需要简单地使用选项 --resume并说明标准/Grep扫描输出文件,不允许使用其它参数,Nmap会解析输出文件并使用原来的格式输出。使用方式如nmap --resume <logfilename> Nmap将把新的结果添加到文件中,这种方式不支持XML输出格式,原因是将两次运行结果合并至一个XML文件比较困难。

 

.基础扫描功能:

1.Ping 扫描:

-PN -P0  :跳过主机发现环节,默认信任主机是在线的。

-sP  -sP 选项在默认情况下, 发送一个ICMP回声请求和一个TCP报文到80端口。如果非特权用户执行,就发送一个SYN报文 (connect()系统调用)到目标机的80端口。当特权用户扫描局域网上的目标机时,会发送ARP请求(-PR), ,除非使用了--send-ip选项。 -sP选项可以和除-P0)之外的任何发现探测类型-P* 选项结合使用以达到更大的灵活性。一旦使用了任何探测类型和端口选项,默认的探测(ACK和回应请求)就被覆盖了。当防守严密的防火墙位于运行Nmap的源主机和目标网络之间时, 推荐使用那些高级选项。否则,当防火墙捕获并丢弃探测包或者响应包时,一些主机就不能被探测到。

-PS  : 该选项发送一个设置了SYN标志位的空TCP报文。默认目的端口为80 (可以通过改变nmap.h) 文件中的DEFAULT_TCP_PROBE_PORT值进行配置,但不同的端口也可以作为选项指定。 甚至可以指定一个以逗号分隔的端口列表( -PS22232580113105035000), 在这种情况下,每个端口会被并发地扫描。

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 <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Ping)   :

TCP ACK ping 和刚才讨论的SYN ping相当类似。 也许您已经猜到了,区别就是设置TCPACK标志位而不是SYN标志位。 ACK报文表示确认一个建立连接的尝试,但该连接尚未完全建立。所以远程主机应该总是回应一个RST报文, 因为它们并没有发出过连接请求到运行Nmap的机器,如果它们正在运行的话。

-PA 选项使用和SYN探测相同的默认端口(80),也可以 用相同的格式指定目标端口列表。如果非特权用户尝试该功能,或者指定的是IPv6目标,前面说过的connect()方法将被使用。 这个方法并不完美,因为它实际上发送的是SYN报文,而不是ACK报文。

提供SYNACK两种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)  

除了前面讨论的这些不常见的TCPUDP主机发现类型, Nmap也能发送世人皆知的ping 程序所发送的报文。Nmap发送一个ICMP type 8 (回声请求)报文到目标IP地址,期待从运行的主机得到一个type 0 (回声响应)报文。对于网络探索者而言,不幸的是,许多主机和防火墙现在封锁这些报文,而不是按期望的那样响应, 参见RFC 1122。因此,仅仅ICMP扫描对于互联网上的目标通常是不够的。 但对于系统管理员监视一个内部网络,它们可能是实际有效的途径。 使用-PE选项打开该回声请求功能。

虽然回声请求是标准的ICMP ping查询, Nmap并不止于此。ICMP标准 (RFC 792)还规范了时间戳请求,信息请求 request,和地址掩码请求,它们的代码分别是131517。 虽然这些查询的表面目的是获取信息如地址掩码和当前时间, 它们也可以很容易地用于主机发现。 很简单,回应的系统就是在运行的系统。Nmap目前没有实现信息请求报文, 因为它们还没有被广泛支持。RFC 1122 坚持主机不应该实现这些消息。 时间戳和地址掩码查询可以分别用-PP-PM选项发送。 时间戳响应(ICMP代码14)或者地址掩码响应(代码18)表示主机在运行。当管理员特别封锁了回声请求报文而忘了其它ICMP查询可能用于 相同目的时,这两个查询可能很有价值。

-PR (ARP Ping)   :允许对局域网进行ARP扫描,比IP PING 扫描更可靠。

 

2.TCP 扫描

-sS  :同只发送SYN包,不进行ACK响应。可造成DDOS***。

-sT  TCP Connection 扫描,完成TCP三步握手后由源发RST/ACK包结束连接。

-sA  : ACK 标记探测扫描,发送ACK包通过分析ttl探测,依赖TCP/IP协议栈的漏洞,此方法仅适用于某些BSD类系统。

-sW  ACK标记探测扫描,发送ACK包通过分析ttl探测,依赖TCP/IP协议栈的漏洞,此方法仅适用于某些BSD类系统。

-sM  :发现FIN/ACK包探测。 Maimon 扫描是用它的发现者Uriel Maimon命名的。根据RFC 793 (TCP),无论端口开放或者关闭,都应该对这样的探测响应RST报文。然而,Uriel注意到如果端口开放,许多基于BSD的系统只是丢弃该探测报文。

-sU  :发送UDP包探测。

-sN/sF/sX  : TCP Null, FIN, and Xmas FIN/PSH/URGscans,指定TCP包的标记位

--scanflags <flags> : Customize TCP scan flags ,自定义TCP数据包