作者: 啟明星辰ADLab

一、背景

       2017年5月12日晚間時候,一款名為“WanaCry”的勒索蠕蟲病毒開始肆虐全球,波及上百個國家和成千上萬個組織機構,影響深遠,關于該蠕蟲的詳情請見啟明星辰ADLab的分析報告《“WanaCry”事件分析與啟示:警惕下一個“永恒之藍”》。該款蠕蟲基于“Shadow Brokers”(影子經紀人)近期泄露的NSA旗下的黑客團隊 “Equation Group”(方程式組織)的漏洞利用工具之一“EternalBlue”(永恒之藍),被“幸運”的選為蠕蟲載體的原因可能是其打擊范圍涵蓋了windows xp到windows 2012(目前來看,是此次泄露的工具中覆蓋最廣的)。在上面提及的報告后半部分,我們提到勒索是目的,漏洞是先決條件,下一個能承載該目的的并非只有永恒之藍。而這次我們的主角便是“Esteemaudit”。相較EternalBlue,Esteemaudit影響范圍只包括windows 2003和windows xp,但是一方面這兩個系統目前的用戶量仍不在少數,另一方面因為微軟早已對2003和xp停止支持(除了5月13日針對此次永恒之藍的緊急補丁),也就是說該工具利用的漏洞還是個0 day。

       本文首先針對該0 day的細節做深入的分析,另外對于安全研究人員來說該批泄露工具中部分利用在使用上以及測試環境搭建上的問題造成了很多觸發漏洞不成功的情況,針對Esteemaudit尤其如此,因此我們加入了該部分的詳細說明并給出對比測試結論,排除研究該漏洞帶來的干擾。

后續,我們會放出該漏洞的檢測工具。

二、Esteemaudit涉及0day漏洞的分析

(1)漏洞描述

       Windows 2000以后的版本都支持SmartCard認證機制,SmartCard中包含一個芯片存儲用戶登錄信息,包括私鑰和公鑰,登錄本地計算機時,需要將SmartCard插入本地計算機,并向WINLOGON輸入PIN碼;登錄遠程計算機時,在本地計算機插入Smartcard,輸入PIN碼,遠程計算機Winlogon將會對PIN碼進行驗證,如下圖所示。                                           基于SmartCard認證的RDP協議

     其中,gpkcsp.dll模塊中的MyCPAcquireContext函數存在漏洞,該模塊由winlogon.exe調用。MyCPAcquireContext函數的功能是創建Prov Context,通過接收SmartCard數據,對Prov Context結構體賦值。如果構造超長的SmartCard數據,在對Prov Context進行賦值時可能覆蓋其他字段,產生溢出。

(2)Smart Card協議

     根據智能卡協議標準smartcard_standard_ISO7816,發送命令請求的數據包格式定義如下:                                           command APDU structure

其中,部分字段的意義如下:

  • INS:指令碼,取值范圍如下表:

  • Lc:表示數據段的長度。

  • Le:表示期望接收命令應答的最大長度。
(3)利用工具分析

首先,Esteemaudit利用代碼會初始化一些從xml文件和腳本輸入中獲得的配置信息。

在初始化信息之后,exploit開始構造漏洞利用數據包。

     首先構造第一段數據(buffer1),內容隨機,長度為0xb2,并將GlobalBufAddr+4(0x080190dc)的地址賦值給buffer偏移0x8d的位置,將0x9000寫入buffer偏移0x91的位置。其中這個GlobalBufAddr來自xml配置文件,是目標機上存在漏洞的模塊gpkcsp.dll中一個全局變量的地址,該地址用來存儲客戶端中讀取的data。由于被攻擊目標(xp和2003)中不存在ASLR,所以xml可以根據不同的目標機版本硬編碼這個地址。

     這里漏洞利用代碼并不是完美無缺,如果想要成功觸發漏洞,這段數據中的第五個字節不能為0x30,否則RDP程序將會進入另一個分支,而作者是通過隨機方式來填充第五個字節,也就是說該利用程序可能會有1/256的可能會失敗。

第二段數據(buffer2)主要是從一個Exp參數結構體中取出從xml文件中獲取的rop鏈地址。

第三段數據的內容是shellcode,其內容被固定的放在Esteemaudit的數據段中。

之后,Esteemaudit程序會模擬SmartCard和被攻擊端進行通訊,通訊的過程中將構造的exploit數據通過數據包發送到被攻擊端,和漏洞相關的部分通信代碼邏輯如下:

(4)漏洞原理分析

     被攻擊端漏洞發生在gpkcsp.dll的MyCPAcquireContext函數中,要想明確漏洞觸發的原因先要理解和漏洞有關的兩個buffer,第一個buffer是存在于gpkcsp.dll中的全局變量數組,我們把其命名為_pbRecvBuffer(地址0x080190d8);第二個buffer是程序分配的用于存放CSP context的結構體,我們稱之為_TAG_Prov_Context(大小為0xB8),其數據結構如下所示。在這該數據結構中比較重要的位置有兩個(紅色標注的位置),一個是位于偏移0x18處的char數組keyset_name,通過逆向判斷其長度不能超過128字節;另一個位于偏移0xa0處的HCRYPTKEY,這個位置稍后會被覆蓋并導致程序流程被劫持。

typedef struct _TAG_Prov_Context
{
    HProvider _0000;//+0000
    SCARDHANDLE hCard;//+0004
    DWORD dwCspFlags;//+0008
    int _000C;//+000C;//index?
    int _0010;
    int _0014;
    char keyset_name[128];//+0x18//"Gemplus GemSAFE Card CSP Default Container"
    char _0098[4];//
    HCRYPTKEY _009C;//+9C
    HCRYPTKEY _00A0;//+A0//g_buffer+4;//destrokey(_0xA0);
    int _00A4;
    int _00A8;
    int _00AC;
    int _00B0;
    int _00B4;
}TAG_Prov_Context;//sizeof=0xB8

MyCPAcquireContext在一開始的時候會對HCRYPTKEY置0。

接著,程序讀取Esteemaudit發送來的buffer1然后將buffer1的數據拷貝到全局變量_pbRecvBuffer中。

上圖中紅色的數據是這個全局變量的_pbRecvBuffer 地址+4,藍色的數據是0x9000,其他數據則是隨機生成(之前我們提到過)。隨后我們會看到如下的代碼,代碼首先從_pbRecvBuffer+4的位置(之前提到的第5個字節)讀取數據和0x30h比較,如果相等的話就跳轉到800e2a4處執行指令(會跳過存在漏洞的代碼分支)。如果不相等則向_TAG_Prov_Context+0x18位置也就是keyset_name拷貝數據,被拷貝的數據是從_pbRecvBuffer的第六個字節開始,長度是_pbRecvBuffer的長度0xb2-7(十進制171)。

由于拷貝的時候并沒有檢查長度的大小是否大于keyset_name數組大小(171>128),從而導致了溢出的產生。

此時,位于_pbRecvBuffer +0x8d位置的0x080190dc(被復制的第0x88字節)正好能夠覆蓋_TAG_Prov_Context指針偏移0xA0的位置處的HCRYPTKEY指針(0x8d-5+0x18=0xa)。

接著Esteemaudit發送buffer2,也就是rop的數據,這段數據同樣被保存在_pbRecvBuffer中,圖中的紅框是我們構造的rop鏈的第一個代碼片段地址(pop ret0c)。

之后,MyCPAcquireContext會調用ReleaseProvider。

在ReleaseProvider中會取出TAG_Prov_Context中偏移a0位置的hkey并調用ADVAPI32!CryptDestroyKey,此時hkey已經被覆蓋成了0x080190dc。

在CryptDestroyKey函數會取出hkey(也就是該函數的參數),并執行命令call dword ptr [esi+8]。

這個esi+ 8正好是rop鏈的第一個代碼片段的地址。

三、Esteemaudit的利用驗證

     Esteemaudit利用工具針對windows 2003和windows xp,利用成功需要被攻擊機開啟域和遠程桌面(默認3389端口)。域(Domain)是Windows網絡中獨立運行的單位,基于域可進行用戶身份統一認證和安全邊界集中管理等。

(1)環境搭建(以windows 2003為例)

1.域的安裝和設置
1.1 DC的安裝

     要建立和管理域需要域控制器(DC),DC上存儲著域中的信息資源如名稱、位置和特性描述等。通過在一臺服務器上安裝活動目錄(AD)來實現DC,首先要給DC設置一個靜態IP,然后在windows 2003的“運行”中輸入dcpromo,打開Active Directory安裝向導。創建一個新域,填寫DNS域名和NetBIOS域名,如下所示。

之后,一路“下一步”直到“DNS注冊診斷”,如下圖設置

到此DC成功建立,重啟系統

1.2 創建域用戶

打開 “開始->管理工具->Active Directory用戶和計算機”在創建的域下新建一個用戶“adlab-test”如下圖。

2.域主機成員的設置

在要加入該域的主機中先開啟遠程桌面,然后打開“我的電腦->屬性?->計算機名->更改”后在域中填入剛才創建的域名,確定后輸入DC的管理員賬號密碼,在加入域前先設置自己的IP和DNS,把DNS指向DC。

加入域成功后有如下提示:

上述對應測試環境網絡拓撲如下:

(2)Esteemaudit利用
1.攻擊端(以win 10為例)

受限于fuzzbunch,攻擊端需安裝python2.6和pywin32-py2.6, 在“…\shadowbroker\windows\”下執行“fb.py”進行利用框架(Fuzzbanch)初始化設置,如下:

  1. 被攻擊機器ip
  2. 本機ip
  3. 日志存儲路徑

初始設置后使用命令“use Esteemaudit”對插件進行設置,由于初始設置了目標和監聽ip所以基本使用默認設置就可以了。需要注意的是當設置到“Listen IP [127.0.0.1]:”時這里需要填寫的是被攻擊機器的IP地址。

在“Press Any Key To Continue :”提示后,會對被攻擊機器做一次掃描,得到系統版本、平臺等信息(如下圖所示)。需要注意的是當測試不同的系統版本、平臺時需要重新運行“fb.py”掃描被攻擊機器,或者使用reset命令手動更新被攻擊機器信息。

然后,進行再次的確認或設置,如果想修改被攻擊機器的相關信息(payload的行為方式、目標機指令構架、目標機系統版本等),可以依據工具提示輸入選項號進行修改,如下所示:

最后,需要(手動)設置回連端口和(手動設置或使用默認)NSA工具庫文件的絕對路徑。例如:“D:\shadowbroker\windows\storage\rudo_x86.dll”,如下圖所示其中rudo_x86.dll、capa_x86.dll、lipa_x86.dll分別用作遠程注入、回連、監聽。

再次確認攻擊與被攻擊雙方的IP和端口(其中Destination IP [0.0.0.0] 項使用默認值不需要手動設置)。

最終需確認配置信息

若攻擊成功,會顯示如下信息。

攻擊成功后被攻擊機器會創建新進程回連之前設置的攻擊機器端口(5678),如下所示(實際測試環境請關閉防火墻):

上述通過Esteemaudit的利用流程如下:

2.對比測試

我們以被攻擊機器回連成功為標志,進行對比測試受影響系統和利用成功需要的關鍵觸發條件,結果如下

測試結論:以上環境中并未對智能卡進行特別設置,除了域環境與遠程桌面其余都是系統默認設置。所以,根據上述實驗結果,網上所說的“需要開啟智能卡登錄”容易引起歧義(此結論也呼應了漏洞分析部分關于SmartCard的全部數據都由Esteemaudit模擬實現)。因此,只要是在域中開啟了遠程桌面的目標就可以被攻擊,與是否是域控制器(DC)無關,與是否登錄了域賬號無關,與加入域后域控制器(DC)是否存在無關。

3.防御建議
  • 關閉遠程桌面
  • 退出域環境
  • 升級操作系統版本
  • 開啟防火墻,過濾不信任的鏈接

四、總結

安全源自未雨綢繆,提高安全意識,及時止損。啟明星辰ADLab會持續關注并研究由此次“永恒之藍”以及影子經紀人陸續泄露的工具引發的“余震”,最后附上影子經紀人活動時間軸,也許下一次“藍”不遠了。


啟明星辰積極防御實驗室(ADLab)

ADLab成立于1999年,是中國安全行業最早成立的攻防技術研究實驗室之一,微軟MAPP計劃核心成員。截止目前,ADLab通過CVE發布Windows、Linux、Unix等操作系統安全或軟件漏洞近300個,持續保持亞洲領先并確立了其在國際網絡安全領域的核心地位。實驗室研究方向涵蓋操作系統與應用系統安全研究、移動智能終端安全研究、物聯網智能設備安全研究、Web安全研究、工控系統安全研究、云安全研究。研究成果應用于產品核心技術研究、國家重點科技項目攻關、專業安全服務等。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/306/