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时,表示端口已关闭或者已过滤。

对于那些想要了解更多细节的人,以下三个图准确显示了在打开,关闭和过滤端口的三种情况下发生的情况。

Nmap使用教程(二)的更多相关文章

  1. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(二)-Hexo参数设置

    前言 前文手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置介绍了github注册.git相关设置以及hexo基本操作. 本文主要介绍一下hexo的常用参数设置. ...

  3. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  4. 无废话ExtJs 入门教程二十一[继承:Extend]

    无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...

  5. 无废话ExtJs 入门教程二十[数据交互:AJAX]

    无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...

  6. 无废话ExtJs 入门教程二[Hello World]

    无废话ExtJs 入门教程二[Hello World] extjs技术交流,欢迎加群(201926085) 我们在学校里学习任何一门语言都是从"Hello World"开始,这里我 ...

  7. Android Studio系列教程二--基本设置与运行

    Android Studio系列教程二--基本设置与运行 2014 年 11 月 28 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处! 上面一篇博客,介绍了Studio的 ...

  8. Laravel教程 二:路由,视图,控制器工作流程

    Laravel教程 二:路由,视图,控制器工作流程 此文章为原创文章,未经同意,禁止转载. View Controller 上一篇教程我们走了那么长的路,终于把Laravel安装好了,这一篇教程我们就 ...

  9. Android高手进阶教程(二十八)之---Android ViewPager控件的使用(基于ViewPager的横向相册)!!!

      分类: Android高手进阶 Android基础教程 2012-09-14 18:10 29759人阅读 评论(35) 收藏 举报 android相册layoutobjectclassloade ...

  10. NGUI系列教程二

    接下来我们创建一个Label,NGUI->Open the Widget Wizard,打开widgetTool对话框,在Template中选择Label,确定AddTo右侧选项为panel,点 ...

随机推荐

  1. BAT 脚本判断当前系统是 x86 还是 x64 系统

    本文告诉大家在写 BAT 脚本的时候,如何判断当前的系统是 32 位系统的还是 64 位系统 通过注册表进行判断方法 @echo OFF reg Query "HKLM\Hardware\D ...

  2. dotnet core 用值初始化整个数组

    如果想要创建一个数组,在这个数组初始化一个值,有多少不同的方法? 本文告诉大家三个不同的方法初始化 在开发中,会不会用很多的时间在写下面的代码 var prime = new bool[1000]; ...

  3. 两种方法,轻松上手ConfigMap!

    属性配置文件在任何应用程序中都非常重要.它们不仅可以让应用程序具备灵活性,还能够根据文件中配置的值产生不同的功能.实际上,在staging.开发.测试.UAT或生产环境中,我们都使用属性配置文件来驱动 ...

  4. C#面试题整理2(不带答案)

    一.C# 理论 1.1.简述 private. protected. public. internal.protected internal 访问修饰符和访问权限 1.2.简述abstract.sea ...

  5. Cortex-A9 Timing

    在Cortex-A9的文档<Cortex-A9 NEON Media Processing Engine>Technical Reference Manual中有关于Instruction ...

  6. 14.python类型总结,集合,字符串格式化

    借鉴:https://www.cnblogs.com/linhaifeng/articles/5935801.html  https://www.cnblogs.com/wupeiqi/article ...

  7. $UVA10559\ Blocks\ $区间$dp$

    \(Des\) • 有一排数量为N的方块,每次可以把连续的相同颜色的区间消除,得到分数为 区间长度的平方,然后左右两边连在一起,问最大分数为多少. • n<=1 \(Sol\) 正解状态设得奇奇 ...

  8. 「JOISC 2014 Day1」历史研究 --- 回滚莫队

    题目又臭又长,但其实题意很简单. 给出一个长度为\(N\)的序列与\(Q\)个询问,每个询问都对应原序列中的一个区间.对于每个查询的区间,设数\(X_{i}\)在此区间出现的次数为\(Sum_{X_{ ...

  9. Java工程师阅读源码的一些见解

    一.为何阅读源码 就是说,通过阅读源码能给你带来什么好处. 学习如何从需求-设计-实现,开阔你的思维,提升你的架构设计能力: 帮助更好地理解原理和架构设计: 帮助更快地定位线上问题BUG 可以根据自己 ...

  10. shell正则表达式和cut命令

    正则表达式 符号 描述 $ 匹配输入字符串的结尾位置 () 标记一个子表达式的开始和结束位置 * 匹配前面的子表达式零次或多次 + 匹配前面的子表达式一次或多次 . 匹配除换行符(\n)之外的任何单字 ...