NSA方程式Easybee攻擊程序漏洞復現與分析
影子經紀人(Shadow Brokers)最近曝光的NSA方程式Windows攻擊程序中有一個針對Mdaemon郵件服務器漏洞的遠程攻擊程序——Easybee,本文將對Easybee漏洞攻擊進行復現,并分析漏洞攻擊原理。
環境搭建
Easybee是針對Mdaemon郵件服務器遠程邏輯漏洞的攻擊程序,它支持對下列版本的Mdaemon服務器進行攻擊:
- 9.5.2
- 9.6.0
- 9.6.1
- 9.6.2
- 9.6.3
- 9.6.4
- 9.6.5
- 9.6.6
- 10.0.1
- 10.0.2
- 10.0.3
- 10.0.4
- 10.0.5
- 10.1.0
- 10.1.1
- 10.1.2
我這里找到一個10.1.1版本的Mdaemon進行測試,首先需要兩臺測試機:
- 192.168.1.3——攻擊機 Win2003安裝Python,運行Fuzzbunch
- 192.168.1.105——靶機 WindowsXP安裝Mdaemon 10.1.1
在靶機上的Mdaemon中添加域名testeasybee.com,由于這個域名并沒有在互聯網上注冊,所以我們自己搭建一個DNS服務器,把testeasybee.com的MX記錄設置為192.168.1.105,并在192.168.1.3中設置DNS服務器為我們自己的DNS。然后在Mdaemon的testeasybee.com域名中新建用戶admin@testeasybee.com,密碼Aa654321。
漏洞利用復現
在攻擊機192.168.1.3中運行Fuzzbunch攻擊框架,設置Target IP為192.168.1.105,Callback IP為192.168.1.3,Redirection為no。
新建Project設置一些log目錄之類的常規參數,然后運行Easybee,設置攻擊參數:
具體攻擊參數的意義為:
- TargetIp —— 目標IP地址,這里是192.168.1.105
- TargetWCPort —— WorldClient端口,默認為3000
- TargetWAPort —— WebAdmin端口,默認為1000
- WorldClientProtocol —— WorldClient協議,默認為http
- WorldClientDomain —— WorldClient所屬域名,這里是testeasybee.com
- WorldClientPort —— WorldClient端口,默認為3000
- WebAdminProtocol —— WebAdmin協議,默認為http
- WebAdminDomain —— WebAdmin所屬域名,這里是testeasybee.com
- WebAdminPort —— WebAdmin端口,默認為1000
- TargetAcctDomain —— 目標域名,testeasybee.com
- TargetAcctUsr —— 目標賬號,這里是admin
- TargetAcctPwd —— 賬號密碼,這里是Aa654321
- TargetAcctIsAdmin —— 賬號是否為管理員,這里是yes
- CFEmailFrom —— 用于觸發內容過濾器的發件人,我是自己發給自己就寫admin@testeasybee.com
- CFEmailSubj —— 用于觸發內容過濾器的郵件標題,隨便寫xxxooo
- CFEmailFile —— 用于觸發內容過濾器的附件名,這個要求是允許的附件類型,最好是.txt類型
- AREmailFrom —— 同CFEmailFrom即可
- AREmailSubj —— 發送郵件標題,隨便寫hahahoho
- PTEmailFrom —— 同CFEmailFrom即可
- PTEmailSubj —— 同AREmailSubj即可
- PayloadName —— 上傳到服務器運行的文件名,隨便寫個t.exe即可
- PayloadFile —— 要上傳的木馬程序,我這里只是測試就傳個計算器,寫C:\windows\system32\calc.exe
- WorldClientVersion —— Mdaemon的版本,我這里選10.1.1execute之后,經過一系列的攻擊,最終攻擊成功。
我們看一些靶機上面,我們上傳的計算器已經成功執行。
如果Mdaemon是以服務形式運行,那么它的子進程都是SYSTEM權限且沒有圖形界面,但是計算器也能成功運行。
漏洞分析
經過分析發現,這個漏洞是Mdaemon的Auto Responder(自動應答器)和Content Filter(內容過濾器)的一個邏輯漏洞,具體漏洞利用的步驟是:
1. 通過HTTP協議訪問目標3000端口的WorldClient,POST用戶名密碼進行登錄,通過返回Cookie解析出WCSESSIONID
2. 通過HTTP協議訪問目標1000端口的WebAdmin,POST用戶名密碼進行登錄,通過返回Cookie解析出WASESSIONID
3. 通過訪問WebAdmin的如下URL獲取Auto Responder是否開啟
http://192.168.1.105:1000/useredit_autoresp.wdm?accountedit=1&user=admin@testeasybee.com
4. 通過POSTXML的方式修改用戶自動應答所執行的腳本
運行到這里我們看到自動應答已經被添加了命令執行:
這樣一來,每次收到郵件就會把郵件內容中@@后面內容當做CMD命令來執行
5. 以POST方式通過WorldClient發送一封郵件給admin@testeasybee.com去觸發自動應答的處理命令,內容是一系列以@@開頭的CMD命令:
這段批處理依次執行下面命令:
1)從目標郵箱目錄下找到對應的郵件.msg文件,其中iOE4ZuLw44是發送郵件標題中的隨機字符串。
2)讀取.msg文件的內容。
3)讀取UserList.dat文件的內容,這里面有加密過的密碼。
4)讀取WebAcces.dat文件的內容,把MDaemon@testeasybee.com賬號的權限全部打開:Access=YYYYYYYYYYYYYYYYY
5)讀取CFRules.dat文件內容,這個是Content Filter內容過濾器規則。
6)讀取CFilter.ini文件的內容。Content Filter內容過濾器配置文件。
7)讀取MDaemon.ini服務器配置文件。
8)最后把所有內容集合在一起重新寫入原郵件的.msg文件中。
可以看出這段批處理的作用是,讀取一系列配置文件內容,并且修改MDaemon@testeasybee.com賬號的權限為最高。
6. 通過WorldClient確保郵件已收到,讀取郵件內容,通過UserList.dat文件內容獲取MDaemon@testeasybee.com賬號的加密密碼,并解出明文密碼。
解密算法在trfo-2.dll的TfBase64Decode函數中,就是Base64的一種變形:
- void *__cdecl TfBase64Decode(int a1, unsigned int a2, int a3)
- {
- unsigned int v3; // esi@1
- int v4; // edi@1
- void *result; // eax@2
- int v6; // ebx@4
- unsigned int v7; // ecx@4
- char v8; // al@6
- unsigned __int8 v9; // al@8
- void *v10; // [sp+8h] [bp-10h]@1
- char v11[4]; // [sp+Ch] [bp-Ch]@16
- unsigned int v12; // [sp+10h] [bp-8h]@1
- char Src; // [sp+14h] [bp-4h]@20
- v3 = a2;
- v4 = 0;
- v12 = 0;
- v10 = calloc((3 * a2 >> 2) + 1, 1u);
- if ( v10 )
- {
- if ( a2 > 0 )
- {
- do
- {
- v6 = 0;
- v7 = 0;
- do
- {
- if ( v12 >= v3 )
- break;
- v8 = 0;
- do
- {
- if ( v8 )
- break;
- v9 = *(_BYTE *)(v12++ + a1);
- if ( (unsigned __int8)(v9 - 43) > 0x4Fu )
- v8 = 0;
- else
- v8 = byte_1000711D[v9];
- if ( v8 )
- v8 = (v8 - 61) & ((v8 == 36) - 1);
- }
- while ( v12 < a2 );
- v3 = a2;
- if ( v12 >= a2 )
- {
- v11[v7] = 0;
- }
- else
- {
- ++v6;
- if ( v8 )
- v11[v7] = v8 - 1;
- }
- ++v7;
- }
- while ( v7 < 4 );
- if ( v6 )
- {
- sub_10001000((int)v11, (int)&Src);
- if ( v6 != 1 )
- {
- memcpy((char *)v10 + v4, &Src, v6 - 1);
- v4 += v6 - 1;
- }
- }
- v3 = a2;
- }
- while ( v12 < a2 );
- }
- *((_BYTE *)v10 + v4) = 0;
- if ( a3 )
- *(_DWORD *)a3 = v4;
- result = v10;
- }
- else
- {
- result = 0;
- }
- return result;
- }
7. 通過CFilter.ini文件內容判斷Content Filter是否開啟,如果沒開啟還需要發送一封郵件觸發自動應答腳本執行批處理命令寫入CFilter.ini文件來開啟Content Filter。
8. 以獲取到的MDaemon@testeasybee.com賬號的密碼登錄進WebAdmin,通過POSTXML的方式添加一條Content Filter規則:
這條規則就是說,當發現郵件標題中包含xxxooo字符串,就執行命令cmd /c “move /Y uu.txt t.exe & t.exe & del t.exe”,把附件uu.txt文件復制為t.exe并運行。
9. 核心一步,發送標題為xxxooo,帶有payload附件的郵件。觸發Content Filter規則,運行payload。
10. 最后,發送包含命令的郵件清除所做修改和清除郵件。
可以看出來這個漏洞最關鍵點在于攻擊者可以通過WebAdmin以POSTXML的方式修改用戶自動應答腳本,以至發送特定內容郵件就可以達到執行任意命令的目的。
解決方案
升級Mdaemon到最新版本可修復此漏洞。