初探nmap

在总结初探MSF自动攻击这篇文章的时候,涉及到nmap,大致搜了些许

nmap是一款端口扫描器

太屌了,故专门出一篇博文来总结nmap

===================================


1. nmap规定的六种端口状态


open 探测报文到达了端口,端口有响应:我有应用程序监听- SYN/ACK
closed 探测报文到达了端口,端口有响应:我没应用程序监听 - RST (复位)
filtered 探测报文到不了端口,石沉大海
unfiltered 探测报文到达了端口,没响应了
open | filtered 有可能报文过滤器丢弃了探测报文(filtered),或丢弃了端口的响应报文(open)
(原理请往下看 -sN,-sF,-sX)
UDP,IP协议, FIN,Null,和Xmas扫描可能把端口归入此类
closed | unfiltered IPID+1,但是closed和unfiltered都可能导致只+1,所以就不确定了
只可能出现在IP ID Idle 扫描中(看下 端口TCP空闲扫描的原理就知道为什么了)



2. nmap提供的扫描技术


-sS  
TCP SYN扫描
TCP三次握手的第一次握手。根据目标响应的事SYN/ACK或RST来判断端口是open还是closed。如果重发数次无响应或收到ICMP不可达报文,则是filtered。
是属于不易察觉的半开放扫描。这里的不易察觉是相对于TCP扫描来说的。其实还是挺容易察觉的,比如说,cmd下运行netstat -ano,一看到大量的随机IP在SYN_RECV状态就能知道中了SYN攻击了。
科普下三次握手:
1、客户端发送syn包,syn=j,到服务器,并进入SYN_SEND状态,等待服务器确认
2、服务器收到syn包,必须确认客户的SYN,ack=j+1(告诉客户端要j之后的内容),同时自己也发送一个SYN包,syn=k,即SYN+ACK包,此时服务器进入SYN_RECV状态
3、客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,ack=k+1(告诉服务端要k之后的内容),此包发送完毕,客户端和服务器进入ESTABLISHED状态,三次握手完成
-sT
TCP connect() 扫描
SYN扫描不可使的情况下用它。
Nmap通过创建connect() 系统调用(所以才要sudo权限)要求操作系统和目标机以及端口建立连接(类似于浏览器一样的高层系统调用),不直接发送和接收报文,都是通过API来处理。
缺点1是会在目标机器的syslog留下记录。缺点2是比SYN慢得多。
-sU  
UDP扫描
(可与TCP扫描同时用)
目标主机上可能有端口运行UDP服务:DNS,SNMP,和DHCP (注册的端口是53,161/162,和67/68)是最常见的三个。 


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扫描)
这三种技术要涉及到一个协议:RFC-793协议!我们从第65页中总结了这3个技术的可行性。
我们假设所有的操作系统都严格遵守这个RFC 793协议。
协议中说到:
“如果 [目标]端口状态是关闭的.... 进入的不含RST的报文导致一个RST响应。”
“理论上,这不应该发生,如果您确实收到了,丢弃该报文,返回。”
我们总结下就是:
如果,端口关闭,那么任何不包含SYN,RST,或者ACK位的报文会导致一个RST返回。
如果,端口开放,那么没有任何响应(open | filtered)。
如果,收到ICMP不可达错误,filtered。


Null扫描 (-sN)
不设置任何标志位(tcp标志头是0)


FIN扫描 (-sF)
只设置TCP FIN标志位。


Xmas扫描 (-sX)
设置FIN,PSH,和URG标志位。


优点1是比SYN更加隐蔽,优点2是它们能躲过一些无状态防火墙和报文过滤路由器。
缺点1是系统得严格遵守RFC 793协议,缺点2是目前的IDS都能发现它,缺点3是无法分清open和filtered。
-sA
TCP ACK扫描
(探测防火墙规则)
只在探测报文中设置了ACK标记位
如果,未过滤的系统,open或closed都返回RST报文,标记为unfiltered
如果,系统不响应或ICMP不可达,标记为filtered
我们可以根据unfiltered和filtered来探测防火墙规则。
-sW
TCP 窗口扫描
(冷门的扫描)
原理是:通过检查返回的RST报文的TCP窗口域,某些系统,开放端口用正数表示窗口大小(甚至对于RST报文) 而关闭端口的窗口大小为0。
如果,TCP窗口域正数,表示open
如果,TCP窗口域0,表示closed
本人觉得,在1500多中OS中,这绝对是冷门的扫描,这依赖那少数的OS的实现细节。
-sM
TCP Maimon 扫描
发现者:Uriel Maimon
原理是:根据RFC 793 (TCP),无论端口开放或者关闭,都应该对这样的探测响应RST报文。 
然而,Uriel注意到如果端口开放,许多基于BSD(Unix的衍生系统)的系统只是丢弃该探测报文。
所以改为探测报文是FIN/ACK(其它和Null,FIN,以及Xmas扫描技术细节完全一样)。
--scanflags
定制的TCP扫描 
(高手专用)
高手不限于nmap制定的技术规则,自己可以设置报文中的flag。
比如:--scanflags URGACKPSHRSTSYNFIN 设置了URG,ACK,PSH,RST,SYN,FIN标记位,顺序无所谓
当然,设置了标记位后还是要-sS等来设置扫描的基本规则。
比如-sS的没响应是filtered,而-sF是open|filtered。
-sO
(IP协议扫描)
请注意,这不是端口扫描!
协议扫描和UDP扫描类似。
它不是在UDP报文的端口域上循环, 而是在IP协议域的8位上循环,发送IP报文头。 
报文头通常是空的,不包含数据,甚至不包含所申明的协议的正确报文头 TCP,UDP,和ICMP是三个例外(这3个不包含目标系统可能不接受)。
nmap关注点是:ICMP 协议不可到达消息,而不是ICMP 端口不可到达消息。
如果,Nmap从目标主机收到 任何协议的任何响应,Nmap就把那个协议标记为open。 
如果,ICMP协议不可到达 错误(类型 3,代号 2) 导致协议被标记为 closed。
如果,其它ICMP不可到达协议(类型 3,代号 1,3,9,10,或者13) 导致协议被标记为 filtered。
-b
 (FTP弹跳扫描)
请注意:这个依赖脆弱的FTP服务器,基本过时了。 97年那会比较流行貌似。
原理是:RFC 959协议。但是许多服务器已经停止支持它了。
只要请求FTP服务器轮流发送一个文件到目标主机上的所感兴趣的端口。 
错误消息会描述端口是开放还是关闭的。 
这是绕过防火墙的好方法,因为FTP服务器常常被置于可以访问比Web主机更多其它内部主机的位置。
参数格式:
<username>:<password>@<server>:<port> 其中的<server>是IP或主机名。
<server>:<port>  (如果FTP有匿名用户:user:anonymous password:-wwwuser@)
-sI
<zombie host[:probeport]> (Idlescan)
利用肉鸡来扫描。
高级隐蔽。讲不明白了,请看下面的链接吧,碉堡了。
http://lianxingfeng.com/nmap空闲扫描/


3. nmap的操作系统探测


-O(哦,不是零) 启用操作系统检测
-A 同时启用操作系统检测和版本检测
--osscan-limit 只对满足“具有打开和关闭的端口”条件的主机进行操作系统检测
--osscan-guess;
--fuzzy
大胆猜测。
默认进行这种匹配。
当Nmap无法确定所检测的操作系统时,会尽可能地提供最相近的匹配。


4. nmap的服务和版本探测


-sV 打开版本探测
-A  同时打开版本探测和操作系统探测
--allports 不为版本探测排除任何端口
--version-intensity <intensity>  设置 版本扫描强度
当进行版本扫描(-sV)时,nmap发送一系列探测报文 ,每个报文都被赋予一个1到9之间的值。
强度值必须在0和9之间。 默认是7。
高强度扫描花更多时间,当然也更加准确。
低强度更适合大范围的常见服务。
--version-light 打开轻量级模式
等于 --version-intensity 2
速度很快,准确率低一些(仅仅是一点)。
--version-all 尝试每个探测
等于 --version-intensity 9
保证对每个端口尝试每个探测报文。
(通常9100端口被跳过,因为打印机很烦,会导致数十页的HTTP get请求)
--version-trace 跟踪版本扫描活动
打印出详细的关于正在进行的扫描的调试信息。
-sR  RPC扫描
作为-sV的一部分,自动打开。
很少用。



5. nmap绕过防火墙/IDS


-f 
报文分段
要求扫描时(包挺ping扫描)使用 小的IP包分段。
其思路是将TCP头分段在几个包中,使得包过滤器、 IDS以及其它工具的检测更加困难。
--send-eth 避开IP层而直接 发送原始的以太网帧。
--mtu 
使用指定的MTU
Maximum Transmission Unit(最大传输单元),此值设定TCP/IP协议传输数据报时的最大传输单元。
以自定义偏移的大小,使用时不需要-f,偏移量必须是8的倍数。 
-D <decoy1 [,decoy2][,ME],...> 
(使用诱饵隐蔽扫描)
如果在第6个位置或 更后的位置使用ME选项,一些常用端口扫描检测器就不会报告这个真实IP。
如果不使用ME选项,Nmap 将真实IP放在一个随机的位置。
作为诱饵的主机须在工作状态,否则会导致目标主机的SYN洪水攻击。
-S <IP_Address> 
(源地址哄骗)
在某些情况下,Nmap可能无法确定你的源地址(如果这样,Nmap会给出 提示)。此时,使用-S选项并说明所需发送包的接口IP地址。

这个标志的另一个用处是哄骗性的扫描,使得目标认为是另一个地址在进行扫描。
可以想象某一个竞争对手在不断扫描某个公司! 
-e选项常在这种情况下使用,也可采用-P0选项。
(犯贱!)
-e <interface> 
(使用指定的接口)
告诉Nmap使用哪个接口发送和接收报文,Nmap可以进行自动检测, 如果检测不出会给出提示。
--source-port <portnumber>; 
-g <portnumber> 
(源端口哄骗)
有时候防火墙会影响APP的使用,管理员会开端口!
我们可以从这些端口进入!
比如说:
Windows 2000和Windows XP中包含的IPsec过滤 器也包含了一些隐含规则,
允许所有来自88端口(Kerberos)的TCP和UDP数据流。
那么我们就-g 88
一般可以-g 53(DNS用的端口)
--data-length <number> 
(发送报文时 附加随机数据)
正常情况下,Nmap发送最少的报文,只含一个包头。因此TCP包通常 是40字节,ICMP ECHO请求只有28字节。
这个选项告诉Nmap在发送的报文上 附加指定数量的随机字节。
操作系统检测(-O)包不受影响,但大部分ping和端口扫描包受影响,这会使处理变慢,但对扫描的影响较小。
--ttl <value> 
(设置IP time-to-live域)
设置报文的TTL域的值!
--randomize-hosts 
(对目标主机的顺序随机排列)
告诉Nmap在扫描主机前对每个组中的主机随机排列,最多可达 8096个主机。
这会使得扫描针对不同的网络监控系统来说变得不是很明显,特别是配合值较小的时间选项时更有效。
--spoof-mac <mac addr,prefix,or vendor name> 
(MAC地址哄骗)
要求Nmap在发送原以太网帧时使用指定的MAC地址,这个选项隐含了--send-eth选项,
以保证Nmap真正发送以太网包。
这一小节太重要了,现在没有防火墙和IDS的目标太少了。
默认就是有!



6. nmap的时间和性能


-T 
<Paranoid| Sneaky| Polite| Normal| Aggressive| Insane>
最常用的参数,应该是-T4,也就是Aggressive了!
设置时间模板。
可以用英文,可以用0-5这六个数字来代替。
-T3,默认的,适合谨慎的孩纸用。
-T2,更加礼貌和温柔,避免了主机崩溃(慢10倍!)。
-T4,通常网络好用T4,T5太凶残和强烈了。
--min-hostgroup size/
--max-hostgroup size
调整并行扫描组的大小!
Nmap具有并行扫描多主机端口或版本的能力,Nmap将多个目标IP地址 空间分成组,然后在同一时间对一个组进行扫描。
类似于多线程。
组大会快些,但是结果出来的慢,要等组内所有的IP都探测完毕。
--min-parallelism/
--max-parellelism time
调整探测报文的并行度
这些选项控制用于主机组的探测报文数量,可用于端口扫描和主机发现。 默认状态下, Nmap基于网络性能计算一个理想的并行度,这个值经常改变。如果报文被丢弃, Nmap降低速度,探测报文数量减少。 随着网络性能的改善,理想的探测报文数量会缓慢增加。 这些选项确定这个变量的大小范围。默认状态下,当网络不可靠时,理想的并行度值可能为1,在好的条件下,可能会增长至几百。
--host-timeout <msecds> 放弃低速目标主机,以我们给的值为阈值
--scan-delay <msecds>/
 --max-scan-delay <msecds> 
调整探测报文的时间间隔
--scan-delay 设为1000,使Nmap低速运行,可以完美的匹配Solaris主机,因为它在响应UDP扫描探测报文报文时每秒才允许发送一个ICMP消息。
总之,--scan-delay在躲闭基于阈值的入侵检测和预防系统(IDS/IPS)很有效。
--min-rtt-timeout <mseds>/
--max-rtt-timeout <mseds>/
 --initial-rtt-timeout <milliseconds>  
调整探测报文超时
如果想更多研究超时等参数,可以参考 官网文档。


个人感觉这个时间性能,在未来可能用的概率不高。因为,nmap已经会智能得调节了,仅仅是收集信息而已,本菜鸟还到不了那个苛刻的境界吧。
因为感觉不是很重要,就放到比较靠后的一节来介绍它。以后可能随着安全之旅越来越多怪兽,越来越需要精准,我会回来看看这一被我遗忘的“时间性能”小节吧。



7. nmap的输出


-oN <filespec>
 (标准输出)
要求将标准输出直接写入指定的文件。
这个格式与交互式输出略有不同。
-oX <filespec>
(XML输出)
要求XML输出直接写入指定的文件。
Nmap包含了一个文档类型定义(DTD),使XML解析器有效地 进行XML输出。这主要是为了程序应用,同时也可以协助人工解释 Nmap的XML输出。DTD定义了合法的格式元素,列举可使用的属性和 值。
-oS <filespec>
(ScRipT KIdd|3 oUTpuT)
脚本小子输出类似于交互工具输出,这是一个事后处理,适合于 'l33t HaXXorZ, 由于原来全都是大写的Nmap输出。
(这个选项本人没用过!)
-oG <filespec>
 (Grep输出)
比XML更简化,因而没XML强大。
(这个选项本人没用过!)
-oA <basename>
(输出至所有格式)
为使用方便,利用-oA<basename>选项 可将扫描结果以标准格式、XML格式和Grep格式一次性输出。
分别存放在 <basename>.nmap,<basename>.xml和 <basename>.gnmap文件中。也可以在文件名前指定目录名,如在UNIX中,使用~/nmaplogs/foocorp/, 在Window中,使用c:\hacking\sco on Windows。

输出一般用-oN,最多用个-oX,就够了。



-v
 (提高输出信息的详细度)
通过提高详细度,Nmap可以输出扫描过程的更多信息。
输出发现的打开端口,若Nmap认为扫描需要更多时间会显示估计的结束时间。
这个选项使用两次,会提供更详细的信息。
这个选项使用两次以上不起作用。
(好有趣的设定,两次!)
-d [level]
(提高或设置调试级别)
当详细模式也不能为用户提供足够的数据时,使用调试可以得到更 多的信息。
使用细节选项(-v)时,可启用命令行参数 (-d),多次使用可提高调试级别。
也可在-d 后面使用参数设置调试级别。例如,-d9设定级别9。
这是最高的级别,将会产生上千行的输出,除非只对很少的端口和目标进行简单扫描。
(尽量别用,数据极其多!)
--packet-trace
(跟踪发送和接收的报文)
要求Nmap打印发送和接收的每个报文的摘要,通常用于调试。
(可以很好地帮助新手了解nmap的运作原理!)
--iflist
(列举接口和路由)
输出Nmap检测到的接口列表和系统路由。
用于调试路由问题或设备描述失误。
(如Nmap把PPP连接当作以太网对待)

目前本人只会用-v 来查看详细一点的信息。
-v,这就是够了。


--append-output
(在输出文件中添加)
当使用文件作为输出格式,如-oX或-oN, 默认该文件被覆盖。
用它就不会被覆盖!
--resume <filename>
 (继续中断的扫描)
这是大工程(以天算)中的利器参数啊!
--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指示被忽略。




8. nmap的其它参数


-6 启用IPv6扫描!
-A
(激烈扫描模式选项)
这个选项启用额外的高级和高强度选项,目前还未确定代表的内容。
目前,这个选项启用了操作系统检测(-O) 和版本扫描(-sV),以后会增加更多的功能。
目的是启用一个全面的扫描选项集合,不需要用户记忆大量的选项。
这个选项仅仅启用功能,不包含用于可能所需要的 时间选项(如-T4)或细节选项(-v)。
(目前就靠它来启用-O和-sV了。。)
--datadir <directoryname>
(说明用户Nmap数据文件位置)
加载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(网络层)发送报文。
IP层是UNIX主机最有效的方式,而以太网帧最适合Windows操作。
nmap会自动选择。 
在UNIX中,如果没有其 它选择(如无以太网连接),不管是否有该选项,Nmap都使用原IP包。
--send-ip
 (在原IP层发送)
要求Nmap通过原IP套接字发送报文,而不是低层的以太网帧。
--privileged
 (假定用户具有全部权限)
告诉Nmap假定其具有足够的权限进行源套接字包发送、 报文捕获和类似UNIX系统中根用户操作的权限。
默认状态下, 如果由getuid()请求的类似操作不为0,Nmap将退出。
但是某些系统不用特权模式也能搞,这个选项就是防止这种情况的发生。
--interactive
 (在交互模式中启动)
在交互模式中启动Nmap。
-V;--version 打印版本信息。
-h; --help 打印帮助摘要面。



参考文献: nmap官网文档


emaster,关注信息安全的胖子
欢迎转载,但转载请标明地址: http://blog.csdn.net/emaste_r/article/details/17840465

作者:xihuanqiqi 发表于2014-1-7 19:16:45 原文链接
阅读:66 评论:0 查看评论

你可能感兴趣的:(nmap)