作为表演汽车维修的新手,我可以努力工作数小时,试图将我的基本工具(锤子,胶带,扳手等)适应手头的任务。当我惨败并把我的jalopy拖到真正的机械师身上时,他总是在一个巨大的工具箱里钓鱼,直到拔出完美的小玩意,这使工作显得毫不费力。港口扫描的艺术相似。专家了解数十种扫描技术,并为给定任务选择适当的(或组合)。没有经验的用户和脚本孩子,另一方面,尝试通过默认SYN扫描解决所有问题。由于NMAP是免费的,因此港口扫描掌握的唯一障碍是知识。当然,这击败了汽车世界,在这里可能需要一项伟大的技能来确定您需要一个支撑杆弹簧压缩机,然后您仍然必须为此支付数千美元。
大多数扫描类型仅适用于特权用户。这是因为他们发送和接收原始数据包,这需要在UNIX系统上访问根。建议在Windows上使用管理员帐户,尽管当WinPCAP已经加载到OS中时,NMAP有时适用于该平台上的无私人用户。当NMAP在1997年发布时,需要根本特权是一个严重的限制,因为许多用户只能访问共享外壳帐户。现在,世界是不同的。计算机便宜,越来越多的人始终可以直接访问Internet访问,并且桌面UNIX系统(包括Linux和Mac OS X)很普遍。现在可以使用Windows版本的NMAP,可以在更多台式机上运行。由于所有这些原因,用户不需要从有限的共享外壳帐户中运行NMAP。这很幸运,因为特权选项使NMAP变得更加强大和灵活。
虽然NMAP试图产生准确的结果,但请记住,其所有见解都是基于目标机器返回的数据包(或它们前面的防火墙)。这样的主机可能是不信任的,并发送旨在混淆或误导nmap的答复。更常见的是不符合RFC的宿主,它们对NMAP探针不应响应。 FIN,NULL和圣诞节扫描特别容易受到此问题的影响。此类问题特定于某些扫描类型,因此在单个扫描类型条目中进行了讨论。
本节记录了NMAP支持的十几个端口扫描技术。一次只能使用一种方法,除了UDP扫描(-sU
)和SCTP扫描类型中的任何一种(-sY
,,,,-sZ
)可以与任何TCP扫描类型中的任何一种结合使用。作为记忆辅助,端口扫描类型选项是形式-s
, 在哪里<C>
<C>
通常是扫描名称中的突出特征,通常是第一个。一个例外是弃用的FTP反弹扫描(-b
)。默认情况下,NMAP执行SYN扫描,尽管如果用户没有适当的特权发送原始数据包(需要UNIX上的root访问),则可以替换连接扫描。在本节中列出的扫描中,非特权用户只能执行Connect和FTP反弹扫描。
-sS
(TCP SYN扫描)- 出于充分的理由,SYN扫描是默认和最受欢迎的扫描选项。它可以快速执行,在不受限制性防火墙阻碍的快速网络上扫描数千个端口。它也相对不引人注目和隐形,因为它从未完成TCP连接。 SYN扫描可用于任何合规的TCP堆栈,而不是根据特定平台的特质,因为NMAP的FIN/NULL/XMAS,MAIMON和IDLE SCANS都可以使用。它还允许在
open
,,,,closed
, 和filtered
国家。
该技术通常称为半开扫描,因为您没有打开完整的TCP连接。您发送SYN数据包,就好像要打开真实的连接,然后等待响应。 SYN/ACK表示端口正在侦听(打开),而RST(重置)表示非上位数。如果在几次重新启动后未收到响应,则将端口标记为过滤。如果收到ICMP无法实现的错误(类型3,代码0、1、2、3、9、10或13),则该端口也会被标记过滤。如果收到SYN数据包(没有ACK标志)的响应,则该端口也被认为是打开的。这可能是由于非常罕见的TCP功能,称为同时打开或分开的握手连接(请参阅https://nmap.org/misc/split handshake.pdf)。 -sT
(TCP连接扫描)- 当不是选择SYN SCAN时,TCP Connect扫描是默认的TCP扫描类型。当用户没有原始数据包特权时,就是这种情况。 NMAP不像大多数其他扫描类型一样编写原始数据包,而是要求基础操作系统通过发出与目标机器和端口建立连接
connect
系统电话。这是与Web浏览器,P2P客户端以及大多数其他网络启用的应用程序相同的高级系统调用,用于建立连接。它是称为伯克利插座API的编程接口的一部分。 NMAP使用此API来获取每次连接尝试的状态信息,而不是从电线上读取原始数据包响应。
当可以使用SYN扫描时,通常是一个更好的选择。 NMAP对高水平的控制权很少connect
致电比原始数据包,使其效率降低。系统调用完成了与打开目标端口的连接,而不是执行SYN扫描所做的半开重置。这不仅需要更长的时间,并且需要更多的数据包来获取相同的信息,而且目标机更有可能记录连接。不错的ID也会捕获,但是大多数机器都没有这样的警报系统。当NMAP连接然后关闭连接而无需发送数据时,您的平均UNIX系统上的许多服务都会为Syslog添加注释,有时是一个隐秘的错误消息。当这种情况发生时,真正可悲的服务崩溃了,尽管这并不常见。一个管理员在单个系统中看到她的日志中有一堆连接尝试的管理员应该知道她已经被扫描了。 -sU
(UDP扫描)- 虽然Internet上最受欢迎的服务通过TCP协议运行,但UDP服务被广泛部署。 DNS,SNMP和DHCP(注册端口53、161/162和67/68)是最常见的三个。由于UDP扫描通常比TCP慢,更困难,因此一些安全审计师忽略了这些端口。这是一个错误,因为可利用的UDP服务很普遍,而且攻击者当然不会忽略整个协议。幸运的是,NMAP可以帮助库存UDP端口。
UDP扫描被激活-sU
选项。它可以与TCP扫描类型(例如SYN SCAN)结合(-sS
)在同一运行期间检查两个协议。
UDP扫描通过将UDP数据包发送到每个目标端口来工作。对于某些常见端口,例如53和161,发送特定于协议的有效载荷以提高响应率,但是对于大多数端口,该数据包是空的,除非--data
,,,,--data-string
, 或者--data-length
指定选项。如果返回ICMP端口无法到达的错误(类型3,代码3),则该端口为closed
。其他ICMP无法到达的错误(类型3,代码0、1、2、9、10或13)将端口标记为filtered
。有时,服务会用UDP包做出响应,证明它是open
。如果重新授课后未收到任何响应,则将端口归类为open|filtered
。这意味着端口可以打开,或者可能会阻止交流的数据包过滤器。版本检测(-sV
)可以用来帮助将真正的开放端口与过滤端口区分开。
UDP扫描的一个巨大挑战正在迅速进行。打开和过滤的端口很少发送任何响应,而NMAP超时,然后进行重新召集,以防探测或响应丢失。封闭端口通常是一个更大的问题。他们通常会将ICMP端口无法到达错误发送回错误。但是与封闭的TCP端口发送的第一个数据包响应SYN或连接扫描,许多主机速率限制默认情况下,ICMP端口无法到达消息。 Linux和Solaris对此特别严格。例如,Linux 2.4.20内核将目标无法到达的消息限制为每秒一个(innet/ipv4/icmp.c
)。
NMAP检测速率限制并减速,以避免用目标机器降低的无用数据包淹没网络。不幸的是,每秒的Linux风格限制的限制使65,536端口扫描需要超过18个小时。加速UDP扫描的想法包括并行扫描更多主机,首先对流行端口进行快速扫描,从防火墙后面扫描并使用--host-timeout
跳过慢速主机。 -sY
(SCTP INIT扫描)- sctp是TCP和UDP协议的相对较新的替代方案,结合了TCP和UDP的大多数特征,还添加了新功能,例如多居住和多流程。它主要用于SS7/Sigtran相关服务,但也有可能用于其他应用程序。 SCTP INIT扫描是TCP SYN扫描的SCTP。它可以快速执行,在不受限制性防火墙阻碍的快速网络上扫描数千个端口。像SYN扫描一样,Init扫描相对不引人注目和隐形,因为它从未完成SCTP关联。它还允许在
open
,,,,closed
, 和filtered
国家。
该技术通常称为半开扫描,因为您不打开完整的SCTP关联。您发送了一个初始化的块,好像您要开设一个真正的关联,然后等待回复。 Init-Ack的块表示端口正在侦听(打开),而中止块则表示非列表。如果在几次重新启动后未收到响应,则将端口标记为过滤。如果收到ICMP无法实现的错误(类型3,代码0、1、2、3、9、10或13),则该端口也会被标记过滤。 -sN
;-sF
;-sX
(TCP NULL,FIN和圣诞节扫描)- 这三种扫描类型(与
--scanflags
下一节中描述的选项)利用了一个微妙的漏洞TCP RFC区分open
和closed
端口。 RFC 793的第65页说“如果[目的地]端口状态关闭……。不包含rst的传入段导致首先发送响应。透明然后,下一页讨论发送到打开端口的数据包,而无需SYN,rst或ack Bits设置,并指出:“您不太可能到达这里,但是如果这样做,请放下细分市场并返回。透明
当符合此RFC文本的扫描系统时,如果端口关闭,则不包含SYN,rST或ACK位的任何数据包将导致返回的rst,并且如果端口打开,则根本没有响应。只要不包括这三个位,其他三个(FIN,PSH和URG)的任何组合就可以了。 NMAP用三种扫描类型利用这一点:- 空扫描(
-sN
) - 没有设置任何位(TCP标志标头为0)
- FIN扫描(
-sF
) - 仅设置TCP FIN位。
- 圣诞节扫描(
-sX
) - 设置鳍,PSH和URG旗帜,像圣诞树一样将包装照明。
这三种扫描类型在行为中完全相同,除了探针数据包中设置的TCP标志。如果收到了第一个数据包,则考虑该端口
closed
,虽然没有回应意味着open|filtered
。端口被标记filtered
如果收到ICMP无法到达的错误(类型3,代码0、1、2、3、9、10或13)。
这些扫描类型的关键优势在于,它们可以潜入某些非势能防火墙和数据包过滤器。另一个优点是,这些扫描类型甚至比SYN扫描更隐秘。不过,请不要指望这一点 - 大多数现代IDS产品可以配置以检测它们。最大的缺点是,并非所有系统都遵循RFC 793的字母。无论端口是否打开,许多系统都会向探针发送第一个响应。这导致所有端口被标记closed
。这样做的主要操作系统是Microsoft Windows,许多Cisco设备,BSDI和IBM OS/400。但是,该扫描确实可以针对大多数基于UNIX的系统。这些扫描的另一个缺点是他们无法区分open
端口一定filtered
那些,让你做出回应open|filtered
。 - 空扫描(
-sA
(TCP ACK扫描)- 该扫描与迄今为止讨论的其他扫描不同,因为它永远无法决定
open
(甚至open|filtered
)端口。它用于绘制防火墙规则集,确定它们是否已陈述,并且哪些端口被过滤。
ACK扫描探针数据包仅具有ACK标志集(除非您使用--scanflags
)。当扫描未经过滤的系统时,open
和closed
端口都将返回第一个数据包。 Nmap然后将它们标记为unfiltered
,这意味着ACK包可以到达它们,但是它们是否是open
或者closed
不确定。未响应或发送某些ICMP错误消息的端口(类型3,代码0、1、2、3、9、10或13)被标记filtered
。 -sW
(TCP窗口扫描)- 窗口扫描与ACK扫描完全相同,只是它利用某些系统的实现细节将开放端口与封闭端口区分开,而不是总是打印
unfiltered
当返回rest时。它通过检查返回的第一个数据包的TCP窗口字段来做到这一点。在某些系统上,开放端口使用正窗口尺寸(即使对于RST数据包),而封闭的端口的窗口为零。因此,而不是总是将端口列为unfiltered
当它接收到第一个后退时,窗口扫描将端口列为open
或者closed
如果该重置中的TCP窗口值分别为正或零。
此扫描依赖于互联网上少数系统的实现细节,因此您不能总是信任它。不支持它的系统通常会返回所有端口closed
。当然,机器可能确实没有开放端口。如果大多数扫描端口是closed
但是一些常见的端口号(例如22、25、53)是filtered
,该系统很可能很容易受到影响。有时,系统甚至会显示出完全相反的行为。如果您的扫描显示1,000个开放端口和三个关闭或过滤的端口,那么这三个端口很可能是真正的开放端口。 -sM
(TCP Maimon扫描)- Maimon扫描以其发现者Uriel Maimon的名字命名。他描述了该技术phrack杂志第49期(1996年10月)。包括此技术在内的Nmap后来发布了两个问题。此技术与NULL,FIN和XMAS扫描完全相同,只是探针为FIN/ACK。根据RFC 793(TCP),应根据端口是打开还是关闭的探测来生成第一个数据包。但是,乌里尔(Uriel)注意到,如果端口打开,许多BSD衍生的系统只需丢弃数据包即可。
--scanflags
(自定义TCP扫描)- 真正的高级NMAP用户不需要将自己限制为所提供的罐装扫描类型。这
--scanflags
选项使您可以通过指定任意的TCP标志来设计自己的扫描。让您的创意果汁在逃避入侵检测系统的同时流动他们的供应商只是通过NMAP MAN页面添加了特定规则的供应商!
这--scanflags
参数可以是一个数值标志值,例如9(PSH和FIN),但是使用符号名称更容易。只需将任何组合捣碎URG
,,,,ACK
,,,,PSH
,,,,RST
,,,,SYN
, 和FIN
。例如,--scanflags URGACKPSHRSTSYNFIN
设置所有内容,尽管它对扫描不是很有用。这些指定的顺序是无关紧要的。
除了指定所需标志外,您还可以指定TCP扫描类型(例如-sA
或者-sF
)。该基本类型告诉NMAP如何解释响应。例如,SYN扫描认为无响应表明filtered
端口,而鳍扫描与open|filtered
。 NMAP的行为将以基本扫描类型的方式相同,只是它将使用您指定的TCP标志。如果未指定基本类型,则使用SYN扫描。 -sZ
(SCTP Cookie回声扫描)- SCTP cookie Echo扫描是更高级的SCTP扫描。它利用了这一事实,即SCTP实现应默默地放下包含cookie Echo块的数据包在开放端口上,但是如果端口关闭,则发送流产。这种扫描类型的优点是,它不像端口扫描那样明显。此外,可能会有非国家的防火墙规则集阻止初始化块,但没有cookie Echo块。不要愚弄以为这会使港口扫描看不见。一个好的IDS也将能够检测到SCTP Cookie Echo扫描。不利的一面是SCTP Cookie Echo扫描无法区分
open
和filtered
港口,让您居住open|filtered
在这两种情况下。 -sI
(空闲扫描)<zombie host>
[:<probeport>
]- 这种高级扫描方法允许对目标进行真正盲目的TCP端口扫描(这意味着没有来自您的实际IP地址将数据包发送到目标)。取而代之的是,唯一的侧通道攻击利用了僵尸主机上可预测的IP碎片ID序列生成,以收集有关目标上开放端口的信息。 IDS系统将显示扫描,作为来自您指定的僵尸计算机(必须启动并符合某些条件)的扫描。这种迷人的扫描类型的完整详细信息已该部分称为“ TCP空闲扫描(
-sI
)。
除了非常隐形(由于其盲目的性质)外,这种扫描类型还允许绘制机器之间基于IP的信任关系。端口清单显示开放端口从僵尸主持人的角度来看。因此,您可以尝试使用您认为可能被信任的各种僵尸扫描目标(通过路由器/数据包过滤器规则)。
如果您希望在僵尸上探测IP ID更改,则可以在僵尸主机上添加一个冒号,然后将端口号添加到僵尸主机。否则,NMAP将使用其默认情况下用于TCP PINGS(80)的端口。 -sO
(IP协议扫描)- IP协议扫描允许您确定目标机器支持哪些IP协议(TCP,ICMP,IGMP等)。从技术上讲,这不是端口扫描,因为它通过IP协议号而不是TCP或UDP端口号循环。但是它仍然使用
-p
选择扫描的协议编号,在普通端口表格式中报告其结果,甚至使用与真实端口扫描方法相同的基础扫描引擎。因此,它离这里属于端口扫描足够近。
除了本身有用外,协议扫描还展示了开源软件的功能。尽管基本想法非常简单,但我并没有想到添加它,也没有收到任何有关此类功能的请求。然后在2000年夏天,Gerhard Rieger构思了这个想法,写了一个很好的补丁,并将其发送给宣布邮件列表(然后打电话nmap黑客)。我将该补丁合并到NMAP树中,并在第二天发布新版本。很少有商业软件具有足够热情的用户来设计和贡献自己的改进!
协议扫描与UDP扫描类似。它没有通过UDP数据包的端口号字段进行迭代,而是发送IP数据包标题并通过八位IP协议字段进行迭代。标题通常是空的,没有数据,甚至没有适当的标题。例外是TCP,UDP,ICMP,SCTP和IGMP。包含适当的协议标头,因为某些系统不会否则不会发送它们,并且因为NMAP已经具有创建它们的功能。协议扫描没有观察ICMP的信息协议无法到达的消息。如果NMAP从目标主机中收到任何协议中的任何响应,则NMAP将该协议标记为open
。 ICMP协议无法到达的错误(类型3,代码2)导致协议被标记为closed
端口无法到达(类型3,代码3)标记协议open
。其他ICMP无法到达的错误(类型3,代码0、1、9、10或13)导致协议被标记filtered
(尽管他们证明ICMP是open
同时)。如果重新提交后未收到响应,则标记该协议open|filtered
-b
(FTP反弹扫描)<FTP relay host>
- FTP协议的一个有趣功能(RFC 959)支持所谓的代理FTP连接。这允许用户连接到一台FTP服务器,然后要求将文件发送到第三方服务器。这样的功能在许多层面上都是滥用的成熟,因此大多数服务器都停止了支持它。此功能允许的滥用之一是导致FTP服务器端口扫描其他主机。只需要求FTP服务器依次将文件发送到目标主机的每个有趣端口。错误消息将描述端口是否打开。这是绕过防火墙的好方法,因为组织FTP服务器通常被放置在与任何旧Internet主机相比,他们可以访问其他内部主机的位置。 NMAP支持FTP反弹扫描
-b
选项。它需要形式的论点<username>
:<password>
@<server>
:<port>
。<Server>
是脆弱的FTP服务器的名称或IP地址。与普通URL一样,您可能会忽略<username>
:<password>
,在这种情况下,匿名登录凭据(用户:anonymous
密码:-wwwuser@
使用)。也可以省略端口号(以及前结肠),在这种情况下,默认的FTP端口(21)<server>
使用。
1997年NMAP发布时,这种脆弱性广泛,但在很大程度上是固定的。脆弱的服务器仍在附近,因此当其他所有操作失败时,值得尝试。如果您的目标是绕过防火墙,请扫描目标网络21(如果您扫描所有具有版本检测的端口)并使用该目标网络ftp-bounce
NSE脚本。 NMAP会告诉您主机是否脆弱。如果您只是试图遮盖轨道,则无需(实际上不应该)将自己限制在目标网络上的主机上。在扫描脆弱的FTP服务器的随机互联网地址之前,请考虑Sysadmins可能不欣赏您以这种方式滥用其服务器。