Nmap使用教程(二)
TCP空闲扫描
这种先进的扫描方法允许对目标进行一个真正的盲目TCP端口扫描(即没有数据包从你的真实IP地址发送到目标)。相反独特的侧信道攻击利用僵尸主机上可预测的IP分段ID序列生成来收集关于目标的开放端口的信息。IDS系统只会显示扫描是从您指定的僵尸机发起。这在进行MITM(中间人攻击)非常有用的。
nmap -sI zombie 目标 #选项-sL将显示一个列表,并执行指定的IP地址反向DNS查找。
这里简单介绍下空闲的原理:
1、向僵尸主机发送SYN/ACK数据包,获得带有分片ID(IPID)的RST报文。
2、发送使用僵尸主机IP地址的伪数据包给目标主机。 如果目标主机端口关闭,就会向僵尸主机响应RST报文。如果目标端口开放,目标主机向僵尸主机响应SYN/ACK报文,僵尸主机发现这个非法连接响应,并向目标主机发送RST报文,此时IPID号开始增长。
3、通过向僵尸主机发送另一个SYN/ACK报文以退出上述循环并检查僵尸主机RST报文中的IPID是否每次增长2,同时目标主机的RST每次增长1。 重复上述步骤直到检测完所有的端口。
接下来是进行空闲扫描的步骤:
1、寻找合适的僵尸主机
一个常见的方法就是在NMAP下执行Ping扫描一些网络。你可以选择NMAP提供的随机IP选项(-iR),但是这很有可能造成与Zombie主机之间的大量延迟。
在Zombie主机候选列表中执行一个端口扫描以及操作系统识别(-o)比简单的使用Ping命令筛选更容易找寻到合适的。只要启动了详细模式(-v),操作系统检测通常会确定IP ID增长方法,然后返回“IP ID Sequence Generation: Incremental”。如果这个类型被作为增长或是破损的低字节序增长量,那么该机是不错的僵尸主机备选。
还有一种方法是对运行ipidseq NSE脚本。该脚本探测一台主机的IP ID生成方法并进行分类,然后就像操作系统检测一样输出IP ID分级。
NMAP --script ipidseq [ --script-args probeport=port] 目标
我们也可以使用hping用于发现僵尸主机。
首先选择使用Hping3发送数据包,并观察ID号是不是逐一增加,那么该主机就是空闲的。如果ID号随意增加,那么主机实际上不是空闲的,或者主机的操作系统没有可预测的IP ID。
hping3 -s 目标
发送伪造SYN包到你指定的目标主机上的端口。
hping3 -spoof 僵尸主机 -S p 22 目标
正如你所看到的,没有任何反应,这表明数据包100%的丢失。这意味着我们并没有发现僵尸主机。同时我们将检查确认以下的步骤。
hping3 -S 目标 #检查PID值是否逐一增加
2、使用NMAP进行攻击
NMAP -Pn -p- -sI 僵尸主机 目标
首先我们用NMAP扫描僵尸主机的端口:
发现僵尸主机22端口是关闭着的。
我们指定利用僵尸主机的22端口进行空闲扫描,结果显而易见,无法攻击目标。
默认情况下,NMAP的伪造探针使用僵尸主机的80端口作为源端口。您可以通过附加一个冒号和端口号僵尸名选择一个不同的端口(例如www.baidu.com:90)。所选择的端口必须不能被攻击者或目标过滤。僵尸主机的SYN扫描会显示端口的开放状态。
这里解释下参数的含义:
-Pn:防止NMAP的发送初始数据包到目标机器。
-p-:将扫描所有65535个端口。
-sI:用于闲置扫描和发送数据包欺骗。
TCP空闲扫描
作为一个渗透测试人员,我们必须明白nmap TCP空闲扫描的内部运行原理,然后用我们自己的方法来实现同样的事情。为此,我们将使用NMAP的数据包跟踪选项。
nmap -sI 僵尸主机:113 -Pn -p20-80,110-180 -r - packet-trace -v 目标 #-Pn是隐身的必要,否则ping数据包会用攻击者的真实地址发送到目标。未指定-sV选项是因为服务识别也将暴露真实地址。 -r选项(关闭端口随机化)让这个例子运行起来更简单。
nmap首先通过发送6个 SYN / ACK数据包并分析响应,测试僵尸主机的IP ID序列生成。在这里R表示复位包,意味该端口不可达。
正如我之前说的,成功的攻击需要选择一个合适的僵尸主机端口。
TCP空闲扫描原理:
众所周知,空闲扫描允许完全盲端口扫描。 攻击者实际上可以扫描目标,而无需从自己的IP地址向目标发送单个数据包! 取而代之的是,旁道攻击可以使扫描从无辜的“僵尸主机”反弹。 入侵检测系统(IDS)的报告会将无辜的僵尸指为攻击者。 除了非常隐秘之外,此扫描类型还允许发现机器之间基于IP的信任关系。
尽管空闲扫描比到目前为止讨论的任何技术都复杂,但可以归纳出如下基本特点:
确定TCP端口是否打开的一种方法是将SYN(会话建立)数据包发送到该端口。 如果端口打开,则目标计算机将以SYN / ACK(会话请求确认)数据包进行响应,如果端口是关闭的,则将以RST(重置)数据包进行响应。 这是前面讨论的SYN扫描的基础。
收到未经请求的SYN / ACK数据包的计算机将以RST响应。 未经请求的RST将被忽略。
Internet上的每个IP数据包都有一个片段标识号(IP ID)。 由于许多操作系统只是为它们发送的每个数据包增加该数字,因此探测IPID可以告诉攻击者自上次探测以来已发送了多少个数据包。
通过组合这些特征,可以在伪造您的身份的同时扫描目标网络,以使它看起来像是无辜的僵尸机器进行的扫描。
空闲扫描步骤
从根本上说,空闲扫描包括三个步骤,每个端口都重复进行以下操作:
探测僵尸主机的IP ID并记录下来。
伪造来自僵尸主机的SYN数据包,并将其发送到目标上的所要探测的端口。 根据端口状态,目标的反应可能会或着不会导致僵尸主机的SYN数据包的IP ID增加。
再次探测僵尸主机的IP ID。 然后,通过将此新IP ID与步骤1中记录的IP ID进行比较,来确定目标端口状态。
在此过程之后,僵尸主机的IP ID应该增加一到两个。增加1表示僵尸主机除了向攻击者的探测回复外没有发送任何数据包。缺少发送的数据包意味着端口未打开(目标必须向僵尸发送了RST数据包,该数据包被忽略,或者什么都没有发送)。增加两个表示僵尸在两个探测器之间发送了一个数据包。这个额外的数据包通常意味着端口是开放的(目标可能会响应伪造的SYN数据包而向僵尸主机发送SYN / ACK数据包,从而导致了僵尸主机发送了RST数据包)。大于2的增量通常表示恶意僵尸主机。它可能没有可预测的IP ID号,或者可能参与了与空闲扫描无关的通信。
即使已关闭的端口的情况与过滤的端口稍有不同,但攻击者在两种情况下的测量结果相同,即IP ID增加1。因此,空闲扫描无法区分关闭并过滤端口。 Nmap记录IP ID增加1时,表示端口已关闭或者已过滤。
对于那些想要了解更多细节的人,以下三个图准确显示了在打开,关闭和过滤端口的三种情况下发生的情况。
图1 空闲扫描开放端口
图2 空闲扫描关闭端口
图3 空闲扫描过滤端口
TCP空闲扫描是真正的隐身扫描。 Nmap提供了诱饵扫描(-D)来帮助用户屏蔽其身份,但是(不同于空闲扫描)攻击者仍然需要攻击者从其真实IP地址向目标发送一些数据包,以获取扫描结果。 空闲扫描的一个结果是,入侵检测系统通常会发送警报,声称僵尸计算机已对其发起了扫描。
寻找在进行空闲扫描的僵尸主机
执行IP ID空闲扫描的第一步是找到合适的僵尸。它需要在全局(而不是与其通信的每个主机)的基础上递增地分配IP ID数据包。它应该是空闲的(因此具有扫描名称),因为无关的流量会增加其IP ID序列,从而混淆扫描的逻辑。
尝试进行空闲扫描时,Nmap会测试建议的僵尸并报告其任何问题。如果一个不起作用,请尝试另一个。僵尸候选人并不难找到足够的互联网主机。由于主机需要处于空闲状态,因此选择知名主机(例如www.yahoo.com或google.com)几乎是行不通的。我们不仅在上图中选择了打印机图标来代表僵尸主机,还有其他简单有趣的网络设备通常会成为巨大的僵尸,因为它们通常都未被充分利用(闲置),并且内置了简单的网络堆栈,容易受到IP ID流量检测的攻击。
一种常见的方法是简单地执行某些网络的Nmap ping扫描。您可以使用Nmap的随机IP选择模式(-iR),但是这很可能会导致遥远的僵尸出现大量延迟。选择靠近您的源地址或目标位置的网络会产生更好的结果。您可以尝试从ping扫描结果中使用每个可用主机进行TCP空闲扫描,直到找到一个有效的主机为止。
在候选的僵尸网络上执行端口扫描和OS标识(-O)而不是仅执行ping扫描有助于选择一个好的僵尸。只要启用了详细模式(-v),OS检测通常就会确定IP ID序列生成方法并打印一行,例如“ IP ID序列生成:增量”。如果将类型指定为“增量”或“小尾数递增”,则该机器是不错的僵尸候选对象。这仍然不能保证它会正常工作,因为Solaris和其他一些系统会为与它们通信的每个主机创建一个新的IP ID序列。主机也可能太忙。操作系统检测和开放端口列表还可以帮助识别可能处于空闲状态的系统。
识别僵尸候选者的另一种方法是针对主机运行ipidseq NSE脚本。该脚本探测主机以对其IP ID生成方法进行分类,然后像操作系统检测一样打印IP ID分类。像大多数NSE脚本一样,ipidseq.nse可以针对许多主机并行运行,这使得它在扫描整个网络以寻找合适的主机时成为另一个不错的选择。
虽然确定合适的僵尸需要一些初步工作,但您可以继续重复使用那些好的僵尸。
执行空闲扫描
一旦找到合适的僵尸,进行扫描就很容易了。 只需将僵尸主机名指定给-sI选项,其余的由Nmap完成。 例5.19展示了Ereet通过在名为Kiosk的Adobe机器上启动空闲扫描来扫描美国唱片业协会的示例。
针对RIAA的空闲扫描
从上面的扫描中,我们了解到RIAA不太注重安全性(请注意开放的端口PC anywhere等端口)。 由于它们显然没有防火墙,因此它们不太可能具有IDS。 但是,如果这样做,它将显示kiosk.adobe.com作为第一扫描者。 -Pn选项可防止Nmap将初始ping数据包发送到RIAA计算机。 不加-Pn ,则会泄露真实地址。 由于指定了-p-来扫描所有端口(1-65535),因此扫描花费了很长时间。 由于该地址(kiosk.adobe.com)已被移除,请勿尝试使用该地址进行扫描。
默认情况下,Nmap将僵尸网络的源端口80伪装为目标探针。 我们可以通过在所用的僵尸网络后附加冒号和端口号来选择其他端口(例如-sI kiosk.adobe.com:113)。所选端口必须不得被攻击者机器或目标机所过滤的。
IP协议扫描
nmap -sO 目标 #IP协议扫描可以让您确定哪些IP协议(TCP,ICMP,IGMP等)是目标机器的支持。
这不是技术上的端口扫描,因为只是IP协议号的循环而不是TCP或UDP端口号。
FTP弹跳扫描
nmap –b ftp rely host #这允许用户连接到一个FTP服务器,然后文件被发送到目标主机
NMAP会发送文件到你指定的目标主机上的端口,通过错误消息判断该端口的状态。
这是绕过防火墙的好方法,因为相对于互联网上的主机,公司或组织的FTP服务器经常被放置在可被内网访问的范围中。它的格式为:@:。 是一个脆弱的FTP服务器的名称或IP地址。
FTP弹跳扫描
nmap –b ftp rely host #这允许用户连接到一个FTP服务器,然后文件被发送到目标主机
如使用用户名“username”,密码为“password”的FTP服务器“FTP server.tld”,ftp端口则是21,用于扫描的文件是服务器上的victim.tld。
nmap -T0-b username:password@ftpserver.tld:21 victim.tld
如果FTP服务器支持匿名登录,就不用填写“username:password@”部分。如果FTP端口是默认的21,也可以省略不写,但如果FTP端口是21之外的必须得指明。
端口规范和扫描顺序
除了所有的前面讨论的扫描方法,NMAP提供选项用于指定被扫描的端口和扫描顺序是随机的或顺序的。默认情况下NMAP扫描最常见的1000个端口。
-p(只扫描指定的端口)
此选项指定要扫描的端口范围,并覆盖默认。单个端口号也行,因为是用连字符(例如1-1023)分割范围。范围的起始或结束可以被省略,NMAP会分别使用1和65535。所以你可以指定-p-,相当于从1到65535进行扫描。
nmap -p1-1023 目标
也可以指定用于端口扫描的协议类型,比如T代表TCP,U代表UDP,S代表SCTP,P代表IP。
nmap -p U:53,111,137,T:21-25,80,139,8080 目标
-F(快速(有限的端口)扫描)
指定比默认情况下更少的端口数。
nmap -F 目标 #通常情况下的NMAP扫描每个扫描协议中最常见的1000个端口。用-F将会减少到100个。
-r(不要随机端口)
默认情况下NMAP会随机扫描端口,但您可以指定-r为顺序(从最低到最高排序)端口扫描来代替。
nmap -r 目标
在接下来的部分,我将使用NMAP绕过防火墙,创建自定义利用程序。