TCP空闲扫描是一种隐秘的扫描技术,要知道它的原理,首先要介绍一下一般端口扫描的原理。
判断一个TCP端口是否开放,其中一种方法是向该端口发送一个 SYN(建立会话) 数据包,如果该端口是开放的,则它会返回一个 SYN/ACK(会话确认) 数据包;如果该端口是关闭的,则它返回 RST(重置) 数据包;如果端口是被过滤状态,则它什么都不返回。一般来说我们通过这种方法判断扫描的主机端口是否开放。
还需要另一个背景知识:互联网上的每个IP数据包都有一个分段身份识别号(IP ID)。许多操作系统只是简单的把该识别号递增,因此分析最后一次的IPID就可以告诉攻击者已经此主机发送了多少数据包。
现在我们想象:已知一台主机 Z ,他是空闲的,不在网络上与其他主机进行网络通信。我们直接向他发送一个 SYN/ACK 包。因为他没有向我们发送过 SYN 包,所以接受到 SYN/ACK 包之后不知道我们是什么意思,就回给我们一个 RST 包,包里会附有 IP ID,就假设是31337吧。
现在我们制作一个IP地址伪装成主机 Z 的 SYN 数据包,将它发送到要扫描的真实主机 T 的某个端口(为方便描述,我们假设想扫描 T 的 21 号端口)。注意,这个包是我们发送的,主机 Z 并不知道有人假装它发送了数据包,它的 IP ID 不会受到影响。然后我们等一会,再向主机 Z 发送一个 SYN/ACK 的数据包,Z 会返回一个 RST ,我们查看里面的 IP ID。
要分析此时得到的 IP ID 可能是多少,就要先分析我们发送了伪造的数据包后发生了什么。
可想而知,根据主机 T 的 21 号端口的状态,可能有三种情况发生:
- 21 端口打开
这种情况下主机 T 收到我们的 SYN 包,由于 21 端口开放,他要返回一个 SYN/ACK。它查看 SYN 包里的来源 IP,那里写着的是 Z 的 IP 地址,于是它向主机 Z 发送了一个 SYN/ACK 包。主机 Z 接到这个包之后就傻了,它心想我没想连接你的 21 端口啊,然后 Z 发送了一个 RST 给 T, Z T 之间通讯结束。
注意加粗的部分,Z 主动发送一个 RST 包的时候,IP ID 需要加一,这个包里的 IP ID 为 31338。所以我们接受到的那个 RST 包的 IP ID 就会是 31339。
- 21 端口关闭
这种情况下主机 T 机收到我们的 SYN 包,由于他没开这个端口,所以准备返回一个 RST 包。和 1 中情形类似,他把这个 RST 包发给了 Z 。Z 不明所以,就没管。
因为这个过程中 Z 没有发送任何数据包,所以我们接受收到来自 Z 的 RST 包中的 IP ID 会是31338。
- 21端口被过滤
这种情况呢 T 收到 SYN 之后,会直接无视这个包。同情况2,我们接受到的来自 Z 的 RST 包中的 IP ID 会是 31338。
21 端口状态 | 收到的 RST 包中的 IP ID |
---|---|
OPEN | 31339 (+2) |
CLOSED | 31338 (+1) |
FILTERED | 31338 (+1) |
所以通过检查收到的 RST 包中的 IP ID,就可以判断我们需要探查的主机的特定端口是否开启。
这种扫描的好处就是,被扫描主机 T 并不知道我们在扫描他,T 并不知道我们的真实 IP。缺点是速度慢而且并不能判断端口到底是关闭还是被过滤。
但是这种扫描还可能反映出主机间的信任关系。
想象以下情况:老板让网络管理员在防火墙上打开一个端口,以便他可以使用家里的 IP 地址来访问公司内部的网络资源。这经常发生在高管不想或不会用 VPN (或类似产品)的情况下。
空闲扫描有时候能够映射出这种信任关系。因为空闲扫描列出的开放端口是相对于僵尸主机而言。若对上述数据库服务器进行一次常规的扫描,可能显示未开放任何端口,但是使用老板家里主机的 IP 作为僵尸主机,进行空闲扫描却显示该数据库相关的服务端口是开放的,由此可以断定他们之间存在信任关系。
若能映射出他们之间的信任关系,将对攻击者非常有用,可以优先把它当成攻击目标。如果不能注意到连带的数据库访问,那么上述讨论的僵尸主机对于攻击者而言就是一个非常普通服务器。
作者:椋鸟
链接:http://www.jianshu.com/p/b67955427926
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。