安全矩阵

 找回密码
 立即注册
搜索
查看: 6683|回复: 0

你不知道的Nmap之空闲扫描

[复制链接]

9

主题

55

帖子

290

积分

中级会员

Rank: 3Rank: 3

积分
290
发表于 2020-12-16 21:08:49 | 显示全部楼层 |阅读模式
本帖最后由 Angelica 于 2020-12-16 21:17 编辑

原文链接:https://mp.weixin.qq.com/s?__biz=MzAwMzYxNzc1OA==&mid=2247488885&idx=1&sn=ec99a0b8a4ea7dc8aba63d2f7e7e0376&chksm=9b3933c4ac4ebad2c7e74226a7f9689be93b21995fd267fdb0d6fb52304907f18f75556166c9&mpshare=1&scene=23&srcid=1216Jja5TJXl3C4kMzNxIvP7&sharer_sharetime=1608114128379&sharer_shareid=ff83fe2fe7db7fcd8a1fcbc183d841c4#rd


前言


在渗透测试的过程中,我们会经常会用到Nmap进行信息收集。但是Nmap存在一个缺点就是在进行探测过程中会向目标发送大量数据包,从而产生大量流量,这样极其容易引起目标警觉,甚至追踪到渗透测试者的真实IP地址。那我们该如何做才能做到既隐藏了自己的真实IP地址同时又能实现我们信息收集的任务呢?
Nmap中有一种比较强大的扫描方式是空闲扫描(Idle Scan),命令是-sI(I为i的大写)。这种技术是利用空闲主机欺骗目标主机IP并且隐藏本机真实IP。


IP报文中的ID及TCP握手
空闲扫描利用了IP协议报文中的ID和TCP协议通信原理。首先我们先来看下IP协议报文结构:

标识:唯一的标识主机发送的每一分数据报。通常每发送一个报文,它的值+1。当IP报文长度超过传输网络的MTU(最大传输单元)时必须分片,这个标识字段的值被复制到所有数据分片的标识字段中,使得这些分片在达到最终目的地时可以依照标识字段的内容重新组成原先的数据。
就是说当我们发送的IP报文未超过MTU时,通常每个报文的标识会+1,当然这个是该端口所有IP报文公用的。当我们向10个目标及端口发送IP包时,每个报文的标识会依次递增+1。这也是为什么我们需要空闲的主机的原因,可以根据IP报文中的标识来推测扫描结果。
TCP协议正常三次握手:

熟悉TCP协议的同学知道TCP在建立链接的时候会有三次握手行为。除了正常的控制位,还有一些用于其他情况的标识位如:RST
RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
当打开的TCP端口接收到非法报文会回复RST以示对面重置该连接。空闲扫描也正是利用了这点达到目的。

空闲扫描原理
空闲扫描利用 TCP的通信原理:当直接发送SYN,ACK包时目标会因为握手流程不合法,所以会回复RST包以重置。但此时回复的包中会带有目标IP包中的ID。

第一步:
向僵尸主机开放的TCP端口(如80端口的HTTP服务)发送SYN,ACK包,僵尸主机会回复RST。僵尸主机回复的报文中的IP协议中ID为1397。

第二步:
伪造僵尸主机的IP(192.168.81.2)向目标的端口发送SYN报文,如果该端口开放会按照TCP协议握手流程向僵尸主机回复SYN,ACK报文。但是僵尸主机收到的第一个报文为SYN,ACK流程不合法,会回复RST并且ID会 +1 。

第三步:
这时候我们重复第一步的流程,向僵尸主机开放的TCP端口(如80端口的HTTP服务)发送SYN,ACK包,僵尸主机会回复RST。我们可以根据僵尸主机回复的报文中的IP协议中ID来判断目标主机跟僵尸主机是否产生了通信:
如果ID=1399(跟1397比+2),目标端口跟僵尸主机产生过通信,故目标端口开放。
如果ID=1398(跟1397比+1),目标端口跟僵尸主机未产生过通信,故目标端口未开放。


Nmap空闲扫描算法实现
虽然我们对原理进行了阐述,但是Nmap在实际中的实现要复杂一些。这时可以利用包追踪的方式来理解Nmap的实现。Nmap的---packet-trace选项可以显示出包追踪的详情:

可以看到Nmap首先对空闲僵尸主机192.168.81.2尝试发送了6个SA(SYN,ACK)的TCP包,空闲僵尸主机回复了6个R(RST)的TCP包。6个回复的RST包中的id为5449-5454,Nmap确认其类型为递增,开始进行下一步。

Nmap会伪造以目标IP地址(192.168.81.130)向空闲主机端口发送了 4 个SA(SYN,ACK) 包和 1个以真实IP(192.168.81.129)向空闲主机端口发送的的SA(SYN,ACK)包。发送真实IP的SA包用来接收空闲主机发回来的RST包,用RST包的id来确定之前发送的4个伪造以目标IP的包空闲主机是否接收并产生交互。我们可以看到RST包中id为5459而扫描之前id为5454,相差5,正好是4个伪造包
  • 1个真实包。所以Nmap认为目标和空闲主机之间是可以通信交互的。
最后就是利用原理进行扫描:Nmap开始伪造以空闲主机IP地址(192.168.81.2)向目标发送SYN包,以期待目标(192.168.81.130)接收到以空闲主机IP(192.168.81.2)的SYN包后,按照TCP握手协议来向空闲主机(192.168.81.2)发送第二次握手的SYN,ACK包。空闲主机直接接收到SYN,ACK,判定握手不合法会回复RST包,并且包中id+1。Nmap以真实IP向空闲主机发送SYN,ACK包,空闲主机回复RST包,包中id再一次+1。从图中而可以看到扫描的端口的包中id从5459-5461,5463-5461等均相差为2 ,则可认为目标端口开放。

ipidseq脚本
Nmap提供基于该框架下的NSE(Nmap ScriptEngine)脚本来进行扫描时的自定义扩展。NSE能够完成网络发现、复杂版本探测、脆弱性探测、简单漏洞利用等功能。
在我们寻找空闲僵尸主机的时候可以使用官方脚本ipidseq来帮助进行寻找。
地址:https://svn.nmap.org/nmap/scripts/ipidseq.nse
我们来看下其中的基本实现和判断,主要判断实现在ipidseqClass中:


整体看来如果结果是Incremental!(递增),是最优选择。如果没有则Brokenincremental!(损坏递增)勉强可堪一用,但扫描结果不太保证。

Nmap空闲扫描实战中的注意事项
首先找到一个空闲的僵尸主机,我们可以使用上一节提到的ipidseq脚本来进行探测寻找。
探测网段中空闲主机的命令为:
nmap --script ipidseq 192.168.81.1/24
直接使用会报没有权限的问题:

我们需要使用 sudo :

可以看到我们运气很不错,探测192.168.81.2的80端口在ipidseq脚本结果为Incremental!(递增),这代表我们可以尝试使用该台主机的80端口作为空闲僵尸主机。
我们直接使用192.168.81.2作为空闲僵尸主机对目标192.168.81.130进行空闲扫描
一般的使用命令为:
nmap -Pn -sI 192.168.81.2 92.168.81.130

等一下之后即可看到利用成功,扫描结果也显示出来了。
在实战中如果该空闲主机不可用,则可能会报以下类型的错误:

这时候就需要更换空闲主机。

总结
虽然Nmap提供欺骗扫描技术(-D)来帮助用户保护自己的身份,但是这种扫描(不像空闲扫描)仍需要攻击者使用自己真实的IP发送很多的数据包以便获取扫描结果。空闲扫描的优点之一是即使入侵检测系统若发出警报,则会报告空闲僵尸主机已开始对他们扫描。因此可以用该种扫描技术给其他主机栽赃。当然默认情况下空闲扫描虽然可以伪造IP地址进行发包,但是MAC地址依然是真实主机的,所以在检测和防御时可以以此为依据机型判断。
随着攻防对抗的升级无论何种扫描形式最终都会被捕获察觉。当我们在研究原理和实现之后,再不断地进行优化,保持不断地自我更新才能在这日益月薪攻方的浪潮中立于前方。一起加油吧~

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-9-20 19:41 , Processed in 0.015919 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表