date | author | title | url | tags | series | categories | toc | draft | ||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
2022-04-03 10:25:32 +0800 |
Rustle Karl |
第3章_探索网络 |
posts/ctf/libraries/tripartite/nmap/第3章_探索网络 |
|
|
|
true |
false |
-T
时序选项-p
端口扫描顺序-sS
TCP SYN 扫描-ST
TCP 连接扫描-sN;-sF;-sX
隐蔽扫描-sW
TCP 窗口扫描-sM
TCP Maimon 扫描-scanflags
自定义 TCP 扫描-sl
空闲扫描-sO
IP 协议扫描-b
FTP Bounce 扫描
端口是指接口电路中的一些寄存器,这些寄存器分别用来存放数据信息、控制信息和状态信息,相应的端口分别称为数据端口、控制端口和状态端口。
电脑运行的系统程序,其实就像一个闭合的圆圈,但是电脑是为人服务的,它需要接受一些指令,并且按照指令调整系统功能来工作,于是系统程序设计者就把这个圆圈截成很多段,这些线段接口就叫端口(通俗讲是断口,就是中断)。系统运行到这些端口时,先判断端口是否打开或关闭,如果关闭,则是绳子接通了,系统往下运行;如果端口是打开的,系统就得到命令,有外部数据输入,接受外部数据并执行。
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层内另一个重要的传输协议。
UDP是ISO参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序。
端口如同是一座房间的门,那这间房子有多少个门呢?有65536个之多,也就是说端口的取值范围是0~65535。
在Internet上,各主机间通过TCP/IP协议发送和接收数据包,各个数据包根据其目的主机的IP地址来进行互联网络中的路由选择。可见,把数据包顺利地传送到目的主机是没有问题的。问题出在哪里呢?我们知道,大多数操作系统都支持多程序(进程)同时运行,那么目的主机应该把接收到的数据包传送给众多同时运行的进程中的哪一个呢?显然这个问题有待解决,端口机制便由此被引入进来。
本地操作系统会给那些有需求的进程分配协议端口(protocol port,即我们常说的端口),每个协议端口由一个正整数标识,如80、139、445等。当目的主机接收到数据包后,将根据报文首部的目的端口号,把数据发送到相应端口,而与此端口相对应的那个进程将会领取数据并等待下一组数据的到来。
端口其实就是队,操作系统为各个进程分配了不同的队,数据包按照目的端口被推入相应的队中,等待被进程取用,在极特殊的情况下,这个队也是有可能溢出的,不过操作系统允许各进程指定和调整自己队的大小。
不只接受数据包的进程需要开启它自己的端口,发送数据包的进程也需要开启端口。这样,数据包中将会标识有源端口,以便接受方能顺利地回传数据包到这个端口。
端口扫描是指人为发送一组端口扫描消息,试图以此了解某台计算机的弱点,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关)。端口扫描是计算机解密高手喜欢的一种方式。攻击者可以通过它了解到从哪里可探寻到攻击弱点。实质上,端口扫描包括向每个端口发送消息,一次只发送一个消息。接收到的回应类型表示是否在使用该端口并且可由此探寻弱点。
需要注意的是,Nmap 并不是每次结果都是准确的,所有的结果是根据目标或目标的防火墙反馈回来的报文,虽然 Nmap 一直在提高自己的准确度,但也不是可以完全避免的,所以我们可能需要通过多种方式扫描,最后才能确认准确的返回数据。
Nmap 支持的扫描技术有十几种,我们每次在进行扫描的时候一般只会采用其中的一种办法。有一个非常有趣的现象,在 Nmap 中的端口扫描方式中,所有的扫描选项都是以 -s<x>
形式出现的。若是 ACK 扫描则是 -sA,若是 UDP 扫描则是 -sU。
使用Nmap进行扫描的时候,Nmap会把扫描到的端口信息反馈回来,我们从反馈回来的信息就可以判断目标端口情况,甚至知道目标的安全情况如何。 Nmap提供了6个端口状态,帮助我们了解目标。
发现这一点是端口扫描工具的职责所在,每一个端口就可能会是一次被攻击成功的大门,管理员也不会将一个端口随便关闭,这会使合法用户产生不必要的麻烦。当我们使用Nmap进行端口扫描时,如果端口状态为Open,说明此端口对外为开放状态,确定为Open状态便于我们制定下一步的渗透计划。
当端口关闭的时候Nmap也可以轻而易举地将其检测出来,因为接受了Nmap的探测报文并作出了响应,当然,这也不能忽略是管理员的一个欺骗攻击者的把戏,如果发现没有开放的端口,可以等待一会再次扫描一下可能又呈现开放状态了。如果管理员掌握一定的安全技术,可能会使用防火墙对这些端口进行防护,不过,这并不会阻碍我们发现这个端口,如果被未知或已知的防火墙阻挡访问目标端口,Nmap也会提示“我遇到了一些情况,好像被防火墙挡住了。”
前面讲到掌握一定安全技术的管理员会布置一个防火墙设备或者是通过设置路由器的规则阻止Nmap的扫描,当Nmap遇到防火墙设备或是路由器规则的时候,Nmap的报文就会被过滤达到目标端口,这样就会使Nmap无法判断目标端口到底是否开放了。出现被过滤现象并不代表一定是被某些专业的设备过滤了,也许是因为网络堵塞造成的,建议遇到被过滤状态时分不同的时间段再次进行扫描。
未被过滤状态意味着端口可以访问,但是Nmap并不能判断目标端口处于开放状态还是关闭状态,这里需要重申的是目标端口是否可以访问与是否开放并无太大的联系,例如,关闭的端口也可以接受Nmap发出去的探测报文。需要注意的是,当我们使用ACK扫描时才会呈现出这种状态,这时我们可以换一种扫描方式去进行扫描,以便于进一步确认目标端口是否开放。
开放还是过滤的,如果Nmap发出去的探测报文并没有得到目标端口的相应,那可能会是受到了某些专业设备的阻挡,但这也不是完全一个被过滤的状态,这时Nmap就会呈现出目标端口是开放还是被过滤的。出现这种状态不妨换一种扫描方式进一步确认目标端口是开放还是被过滤的。
该状态用于Nmap不能确定端口是关闭的还是被过滤的。值得注意的是,它只可能出现在IPID Idle扫描中。
在Nmap中使用-T(0-5)可以启用时序选项,对于时序选项这里有0~5不同的选项。
-T0(偏执的):非常慢的扫描,用于IDS逃避。 -T1(鬼祟的):缓慢的扫描,用于IDS逃避。 -T2(文雅的):降低速度以降低对带宽的消耗,此选项一般不常用。 -T3(普通的):默认,根据目标的反应自动调整时间。 -T4(野蛮的):快速扫描,常用扫描方式,需要在很好的网络环境下进行扫描,请求可能会淹没目标。 -T5(疯狂的):极速扫描,这种扫描方式以牺牲准确度来提升扫描速度。
默认只扫描常用端口。
nmap -T0 192.168.0.106
nmap -T1 192.168.0.106
nmap -T2 192.168.0.106
nmap -T3 192.168.0.106
nmap -T4 -p- 192.168.0.106
nmap -T5 192.168.0.106
-T选项的单一使用并不会有很好的效果,配合-F选项则可以很大程度的提高扫描速度与效果,但切不可追求过快的扫描速度,这会使得到的数据得不到保证。
在默认情况下,Nmap对端口的扫描方式是按照从小到大进行的,或者是参照nmap-services中文件列出的端口进行扫描。
通过该选项可以指定一个您想要扫描的端口号,可以指定一个唯一的值也可以指定一个范围,如80~998。
nmap -p 445 192.168.0.106
如果既想扫描TCP端口又想扫描UDP端口,可以在端口号前加上“T:”或“U:”,分别代表TCP协议与UDP协议。注意,要既扫描UDP又扫描TCP,必须指定-sU以及至少一个TCP扫描类型(如-sS,-sF,或者–sT)。如果没有给定协议限定符,端口号会被加到所有协议列表。
nmap -sS -p 'T:111,U:445' 192.168.0.106
使用该选项可以快速地扫描端口,但并不是所有的端口都会扫描,只会扫描有限的端口,在Nmap中nmap-services包含了默认扫描的端口,也可以用--datadir选项指定自己的nmap-services文件。
nmap -F 192.168.0.106
使用该选项不会对端口进行随机顺序扫描,默认情况下,Nmap是随机顺序扫描端口的,一般我们也会选择Nmap进行随机扫描,但也可以使用这个选项来进行排序。
Nmap对端口开放概率的调查结果保存在nmap-services中,在这之中罗列的是开发概率最高的1000个TCP端口,这个功能便于我们发现具体而又有用的端口。
通过Nmap官方调查的端口开放概率,使用该选项会扫描指定一定概率以上的端口,它跟--top-porst选项较为相似,只是这里的参数作为频率来使用,具体范围在nmap-services文件中已有详细说明。
p选项后面可以直接跟端口号,不需要空格,例如-p80的形式。但大多数情况下,为了Nmap语句的严谨性或便于调试,建议使用空格进行分割。
-sS扫描方式是比较常用的一种扫描方式,这得益于它的扫描速度,平均一秒可以扫描上千个端口。SYN的扫描方式是相对来说比较隐蔽的扫描方式,很难被防火墙或管理员发现,因为它并不会进行TCP的链接,在前面讲到端口开放状态时,如果发现目标端口出现被开放或过滤的情况,可以考虑使用SYN扫描的方式进行扫描,SYN扫描可以很明确地区分出端口的开放状态,这是一种高效而且非常有用的扫描方式。
它常常被称为半开放扫描,因为它不打开一个完全的TCP连接即3次握手。TCP连接扫描会调用打开目标上相关端口的连接并完成3次握手,这样做有可能被目标主机察觉,如果使用TCP SYN扫描的话,则不会轻易被目标主机发现。
目标主机端口是关闭的情况下,Nmap的工作流程为向目标主机发送一个SYN包请求连接,如果收到RST包则表明无法连接目标主机,即目标主机端口关闭。如果目标主机端口是开放的,Nmap的工作流程为向目标主机发送一个SYN包,请求连接,目标主机接收到请求后会响应一个SYN/ACK包,当Nmap收到目标主机的响应后,则向目标发送一个RST替代ACK包,连接结束,则此时3次握手并没有完成。
nmap -sS 192.168.0.106
在SYN扫描不能用时,TCP连接扫描会使用默认的TCP扫描。
-sT选项是用于SYN扫描不能使用的时候,它是TCP连接扫描,因为Nmap会在每个端口上完成3次握手,基本不会对目标主机进行泛洪攻击或导致目标主机崩溃,所以TCP连接扫描是端口扫描中最基础、最稳定的扫描方式。
当SYN扫描可用时,它通常是更好的选择。因为Nmap对高层的connect()调用比对原始报文控制更少,所以前者效率较低。TCP扫描不仅花更长时间,需要更多报文得到同样信息,目标机也更可能记录下连接。IDS(入侵检测系统)可以捕获两者,但大部分机器没有这样的警报系统。许多普通UNIX系统上的服务会在syslog留下记录,有时候是一条加密的错误消息。如果管理员在日志里看到来自同一系统的一堆连接尝试,他应该意识到他的系统被扫描了。
Nmap发送一个是SYN包请求,如果收到RST包则表示目标端口是关闭的,如果目标主机接收到请求后响应了一个SYN+ACK包,Nmap向目标主机发送一个ACK包,确认连接,则表示目标端口是开放的。
nmap -sT 192.168.0.106
使用-sU选项可以进行UDP扫描。UDP扫描是非常慢的,很多的安全审核人员忽略了这些端口,这显然是一个错误的做法。
UDP扫描显然也是一种“投机取巧”的办法,很多管理员会忽略这些端口,这是不争的事实,UDP扫描或许可以发现更多可以被黑客利用的端口。UDP扫描发送空的UDP报文到目标端口,这里需要注意的是,UDP头是没有任何数据的,这就使Nmap可以轻松辨别目标端口的开放状态,如果返回ICMP端口不可到达错误就可以认定该端口是关闭的,其他的就可以被认定是被过滤的,如果被响应了则判断目标端口是开放状态。
UDP端口扫描通过发送UDP数据包到目标主机并等待相应,它将判断目标端口是否是开放状态,如果目标返回ICMP不可达的错误,说明端口是关闭的,如果得到正确的适当的响应,则说明端口是开放的。
nmap -sU -p 80-500 192.168.0.106
由于UDP扫描是相当慢的,所以在这里使用-p选项指定了需要扫描的端口,如果从第一个端口开始扫描是需要花费大量时间的。
-p选项指定多个端口的时候可以使用逗号进行端口与端口之间的分割而不是用空格进行分割。
隐蔽扫描有3个选项,分别是-sN、-sF、-sX。
-sN是Null扫描,是通过发送非常规的TCP通信数据包对计算机进行探测,很多情况下Null扫描与Xmas扫描恰好相反,因为Null扫描不会标记任何数据包,若目标主机的相应端口是关闭的,会响应一个RST数据包,若目标端口是开放的则不会响应任何信息。
-sF是FIN扫描,当我们使用TCP SYN扫描时可能会被目标主机的防火墙发现,会阻止SYN数据包,这时我们使用TCP FIN扫描方式会有很好的穿透效果,因为TCP FIN扫描并不需要完成TCP握手。TCP FIN扫描就是向目标端口发送一个FIN包,如果收到目标响应的RST包,则说明目标端口是开放的,如果没有收到RST包则说明目标端口是关闭的。
-sX是Xmas扫描,数据包的FIN、PSH和URG标记位置打开,即标志为1,根据RFC 793规定如果目标主机端口是开放的则会响应一个RST标志包。 这些扫描方式会躲过一些无状态防火墙的过滤,这比前面章节说到的SYN扫描、UDP扫描会有更好的效果,因为这种方式要比SYN扫描方式还要隐蔽,如果扫描不出结果或出现被过滤的情况,可以使用该扫描方式进行扫描。
如果系统不遵循RFC 793,不管端口是否是开放还是关闭的,都会响应RST。
nmap -sN 192.168.0.106
nmap -sX 192.168.0.106
nmap -sF 192.168.0.106
使用-sA选项启用TCP ACK扫描,TCP ACK扫描有一个非常致命的缺点,它不能确定端口是否是开放的还是被过滤的。
ACK扫描探测报文只设置ACK标志位(除非使用–scanflags)。当扫描未被过滤的系统时, open(开放的)和closed(关闭的)端口都会返回RST报文。当Nmap把它们标记为unfiltered(未被过滤的),意思是ACK报文不能到达,但至于它们是open(开放的)或者是closed(关闭的)无法确定。不响应的端口或者发送特定的ICMP错误消息的端口都会被标记为filtered(被过滤的)。
TCP ACK扫描和TCP SYN扫描类似,这种扫描方法是向目标主机一个端口发送一个只有ACK标志的TCP数据,如果目标主机响应的端口是开启状态,则会返回一个TCP RST数据包。
nmap -sA -v 192.168.0.106
在扫描结果中我们得知1000个端口都没有被过滤(unfiltered),这说明Nmap无法确定这些端口是开放的还是关闭的,若需要确定目标端口是否是开放状态则需要用其他扫描方式进行确认。
使用-sW选项可以启用窗口扫描,即Windows扫描,这里的Windows并不是指Windows系统,而是扫描方式的一种,窗口扫描方式与ACK扫描方式的原理几乎是一样的,它通过检查返回的RST报文的TCP窗口域判断目标端口是否是开放的。
有时,开放端口用正数表示窗口大小,关闭端口的窗口大小为0,所以,当收到RST包时,根据TCP窗口的值是正数还是0来判断目标端口是开放还是关闭的。
nmap -sW -v -F 192.168.0.106
从输出的结果来看是不准确的,如果扫描的端口都是开放状态或者只有少数几个是关闭状态的那就非常可疑了,若100个端口里面只有2个端口是关闭的,则这2个端口也有可能是开放的,这种扫描方式获得的结果可能是不准确的。
使用-sM选项就可以启用TCP Maimon扫描。Maimon扫描是用它的发现者Uriel Maimon命名的。他在Phrack Magazine issue #49 (November 1996)中描述了这一技术。Nmap在两期后加入了这一技术。这项技术和Null、FIN及Xmas扫描完全一样,除了探测报文是FIN/ACK。根据RFC 793 (TCP),无论端口开放或者关闭,都应该对这样的探测响应RST报文。然而,Uriel注意到如果端口开放,许多基于BSD的系统只是丢弃该探测报文。
nmap -sM -T4 192.168.0.106
使用--scanflags选项可以启用自定义TCP扫描,这属于Nmap高级用法的一种,Nmap还有很多高级用法本书都会一一介绍,该选项可以通过指定任意的TCP标志位来进行扫描,这会让读者有意外的收获。
--scanflags选项可以是一个数字标记值,如9(PSH和FIN),但使用字符名更容易些。只要是URG、ACK、PSH、RST、SYN、FIN的任何组合就可以。例如,--scanflags URGACKPSH RSTSYNFIN设置了所有标志位,但是这对扫描没有太大用处。标志位的顺序不重要,并且标志位之间没有空格。
除了使用指定的TCP标志位,Nmap会和基本的扫描类型一样工作,若不指定基本类型Nmap就会使用SYN扫描。
nmap -sT --scanflags SYNURG 192.168.0.106
一般我们在非一般场景使用该选项。
使用-sI选项就可以启用空闲扫描。空闲扫描是Nmap高级用法,允许进行端口完全欺骗扫描。可以使攻击者能够不使用自己的IP向目标主机发送数据包,它可以利用不活跃的僵尸主机反弹给攻击者一个旁通信道,从而进行端口扫描。IDS会把不活跃的僵尸主机当作攻击者,这是一种非常隐蔽的扫描方法。
nmap -sI www..0day.co 192.168.0.106
这里是利用僵尸主机为www..0day.co的主机对192.168.0.106进行空闲扫描,如果有IDS,IDS则会把www0day.co当作扫描者。
上面的演示中主要用的是僵尸主机的80端口,如果要使用另外的端口可以在僵尸主机后加入“冒号端口号”(例如www.0day.co:445)。需要注意的是选择的端口必须不能被自己的Nmap主机或目标主机过滤掉并且该端口必须为开放的,我们可以事先对僵尸主机进行端口扫描。
使用-sO选项就可以启用IP协议扫描。这里的“O”不是数字“0”而是大写字母“O”。该选项会确定目标端口的协议类型,这并不是一种严格的端口扫描方式,因为它并不是扫描TCP、UDP端口号,而是IP协议号。IP协议扫描可以帮助用户确定目标主机哪些是支持IP协议的,例如TCP、ICMP、IGMP。虽然它便利的是IP协议号并不是TCP或UDP端口,但仍可以使用-p选项选择需要扫描的协议号。它不是在UDP报文的端口域上循环,而是在IP协议域的8位上循环,发送空的IP报文头。
nmap -sO -T4 192.168.0.106
从输出的结果可以得知目标主机有两个IP协议是开放的,这两个协议分别是ICMP和TCP,对应的协议标号是1和6。这里需要注意的是,协议扫描关注的不是ICMP端口不可到达的消息,关注的是ICMP协议不可到达的消息。例如,Nmap从目标主机接收到任何协议的响应,Nmap就会把那个协议标记为Open。ICMP不可到达的错误,例如类型3代号2,Nmap会标记为Closed,其他的ICMP不可到达协议会标记为Filtered。如果一直接受不到响应,Nmap就会标记为Open|Filtered。
使用-b选项就可以进行FTP Bounce Scan扫描。它允许用户连接到一台FTP服务器,然后要求文件送到一台第三方服务器,这种扫描方式已经很少被支持了,但这也不失是一种躲避防火墙的好办法,或许用户能获取到更多可靠的结果。