IP ID idle 扫描简单介绍
在1998年的时候,一个名叫 Antirez 的工程师,发现了这种扫描技术,攻击者可以通过不直接向目标主机发送报文的形式,进行端口扫描,而是通过一台僵尸主机对目标主机进行端口扫描。
Idle 扫描是一种相对比较复杂的扫描技术,下面对扫描技术简单进行讲解
- 检查 TCP 端口是否开启的一种方式是通过向目标主机发送 SYN 请求,如果目标主机上被扫描的端口是开放的,那么主机将对请求报文应答 ACK 报文。
- 如果目标主机上端口是关闭的,那么目标主机将向攻击者应答 RST 报文。
- 大多数计算机会对每一个发送的报文进行简单的编号,一般是升序编号,通过探测报文的编号可以知道目标主机从上一次探测到最新的探测发送了多少报文。
报文序列号空闲扫描技术
IP ID idle 扫描主要通过以下三步完成
- 探测一个僵尸主机的 IP ID 并记录此 ID 号。
- 伪装一个僵尸主机的 IP 报文想目标主机发起 SYN 探测。
- 再次对僵尸主机的 IP ID 进行探测,并与第一次探测到的僵尸主机 IP ID 进行比对。
Idle 扫描一个开放的端口
- 攻击者对僵尸主机发起一个 SYN/ACK 扫描,僵尸主机向攻击应答一个报文,攻击者记录到僵尸主机应答的报文序列号是 31337 。
- 攻击者伪装一个僵尸主机的报文,向目标主机发起一个 SYN/ACK 扫描,因为目标主机上这个端口是开放的,所以目标主机向僵尸主机返回一个报文 SYN/ACK 报文, 由于僵尸主机并没有主动向目标主机发起连接请求,所以目标主机发来的确认连接将会被僵尸主机发送一个 RST 报文进行重置,这个时候僵尸主机的报文 ID 就多了一条,变成31338。
- 攻击者再对僵尸主机发起一个 SYN/ACK 扫描,这个时候僵尸主机继续对攻击者应答一个报文,报文 ID 继续加1,这个时候为30339,这个时候攻击者就可以发现目标主机上被扫描的端口是开放的。
Idle 扫描一个关闭的端口
- 攻击者对僵尸主机发起一个 SYN/ACK 扫描,僵尸主机向攻击应答一个报文,攻击者记录到僵尸主机应答的报文序列号是 31337 。
- 攻击者伪装一个僵尸主机的报文,向目标主机发起一个 SYN/ACK 扫描,因为目标主机上这个端口关闭的,所以目标主机并不会同意连接的建立,向僵尸主机返回一个报文 RST 报文, 僵尸主机收到目标主机的 RST 报文,主机收到 RST 报文会丢弃,这个时候僵尸主机没有产生新的报文,报文 ID 不变。
- 攻击者对目标僵尸主机再次进行 SYN/ACK 扫描或者 ACK 扫描,僵尸主机进行应答,应答报文可以是 SYN/ACK 也可以是 RST,这都无所谓,但是应答的报文 ID 会加1,变成31338,这个时候就能发现目标主机上扫描的端口是关闭的。
Idle 扫描一个过滤的端口
- 攻击者对僵尸主机发起一个 SYN/ACK 扫描,僵尸主机向攻击应答一个报文,攻击者记录到僵尸主机应答的报文序列号是 31337 。
- 攻击者伪装一个僵尸主机的报文,对目标主机发起 SYN/ACK 扫描,因为目标主机对端口进行了过滤,会直接丢弃收到的报文,所以僵尸主机并不会收到应答报文,自然僵尸主机的报文 ID 也不会变。
- 攻击者再次对僵尸主机发起扫描,僵尸主机会继续应答,并且报文 ID 加1 ,可以发现这种情况下和端口关闭探测到的报文 ID 值都是一样的,所以通过这种方式扫描,不能区分端口是关闭还是过滤,所以 nmap 的扫描中会出现 closed|filtered 这种状态
总结
由于这种扫描需要寻找一台合适的主机当做僵尸主机,经过本人测试,现在绝大多数系统并不会简单的对 IP 报文的 ID 进行简单的增序处理,所以这个技术的实用度并不是很高,关于 nmap 如何伪装僵尸主机的报文进行探测,以及如何寻找一台合适的僵尸主机,可以参考以下连接。
参考
https://nmap.org/book/idlescan.html#:~:text=The%20first%20step%20in%20executing%20an%20IP%20ID,its%20IP%20ID%20sequence%2C%20confusing%20the%20scan%20logic.