DDE通信研究
作為一個安全研究人員來講,聽到最多關于DDE的東西可能就是office DDE 攻擊這種釣魚攻擊手法。
- 為什么只有Office可以進行DDE攻擊?
- 有哪些軟件默認支持DDE協(xié)議?
- DDE還可以做什么?
DDE通信還有其他功能命令,如:動態(tài)修改Excel表格內(nèi)容。
本文只針對雙擊桌面上的xls文件時,Explorer通過DDE將文件路徑傳給Excel的過程進行研究。
1)研究背景
大部分Office系列軟件如Excel、Word等程序默認支持基于Windows消息機制的DDE通信協(xié)議。使用DDE的程序,如Excel軟件在啟動時的命令行參數(shù)只有" /dde"
這樣Excel就會默認創(chuàng)建一個隱藏的窗口作為DDEServer,并等待接收用戶雙擊桌面xls文件時,DDE Client(Explorer.exe)發(fā)來的DDE消息。
2)DDE會話流程
一個程序既可以作為DDE服務器,也可以作為DDE客戶端,兩者通訊的標識是彼此的窗口句柄HWND。微軟建議每次建立會話都應該建立不同的窗口句柄。
第一步:建立會話,客戶端必須通過SendMessage廣播一條WM_DDE_INITIATE消息給所有窗口,來定位Excel的DDE Server。
如果lParam的LOWORD為NULL,任何DDEServer可以回復這個消息。DDE Server收到一個WM_DDE_INITIATE消息后,如果該消息的lParam的HIWORD為NULL,DDE Server為它支持的所有Topic都回復一個WM_DDE_ACK 消息。
SendMessage((HWND)HWND_BROADCAST, // 廣播消息給所有窗口 WM_DDE_INITIATE, // 初始化會話 (WPARAM)g_hHwnd, // 當前DDE Client的窗口句柄 MAKELONG(atomApplication, // application-name atom (Excel默認是"Excel") atomTopic)); // topic-name atom (Excel默認是"System")服務端回復WM_DDE_INITIATE消息
DDE Server收到WM_DDE_INITIATE消息后,根據(jù)wParam中保存的DDE Client句柄回復消息。服務端必須回復一個WM_DDE_ACK消息,告訴客戶端,它收到了建立會話的申請!
回復WM_DDE_ACK消息時,將自己的窗口句柄,作為wParam參數(shù)回復給客戶端。至此會話建立完成,剩下的消息必須使用根據(jù)各種保存的對方窗口句柄,使用PostMessage來通訊
客戶端收到握手會話的回復后,在消息處理中保存DDE服務端的窗口句柄
case WM_DDE_ACK:{// 客戶端接收DDE服務器回復,保存DDEServer句柄,刪除lParam中的GlobalAtomHWND g_hServerHwnd = (HWND)wParam;} break;第二步:發(fā)送命令,告訴Excel打開指定xls文件
// 發(fā)送命令給Excel// 服務器數(shù)據(jù)項內(nèi)容 CONST wchar_t sCommand[] = L"[open(\"D:\\1.xlsx\" /ou \"\")]"; // 分配DDEDATA格式化的全局共享內(nèi)存塊 HGLOBAL hCommand = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, sizeof(sCommand)); // 鎖定內(nèi)存塊地址 LPWSTR lpCommand = (LPWSTR)GlobalLock(hCommand); // 填充數(shù)據(jù)項內(nèi)容 wcscpy(lpCommand, (WCHAR*)sCommand); // 解鎖內(nèi)存塊 GlobalUnlock(hCommand); // 獲取當前窗口的安全句柄 // 組合消息參數(shù)lParam LONG lDataPack = PackDDElParam(WM_DDE_EXECUTE, 0, (UINT)hCommand); // 發(fā)出遠程命令消息 PostMessage(g_hServerHwnd, WM_DDE_EXECUTE, (WPARAM)g_hHwnd, (LPARAM)lDataPack); // 釋放內(nèi)存 GlobalFree(hCommand);第三步: 結(jié)束會話 WM_DDE_TERMINATE
PostMessage(g_hServerHwnd, WM_DDE_TERMINATE, (WPARAM)g_hHwnd, 0);3)分析Exploer和Excel的DDE通訊消息
3.1)觀察DDE消息通訊
通過Spy++可以查看Explorer和Excel通過DDE通訊的消息類型,打開Spy++,選擇Excel進程,消息選項中過濾DDE消息。
隨后雙擊桌面上的xls文件,可以觀察到Explorer發(fā)送給Excel的消息由一下3條,下面消息中第三列數(shù)據(jù):R、S、P標志,具體含義可以參考Spy++手冊。
通過上面可以看到,Explorer給Excel發(fā)送了3條消息,分別是:
- 建立會話WM_DDE_INITATE
- 執(zhí)行命令WM_DDE_EXECUTE
- 結(jié)束會話WM_TERMINATE
其中要打開的xls文件路徑,就保存在WM_DDE_EXECUTE執(zhí)行命令消息中,其消息具體格式,參考https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-dde-execute
3.2)觀察發(fā)送的命令格式
通過x64dbg調(diào)試Explorer,設置PackDDEParam函數(shù)斷點,命中后,可以查看Explorer發(fā)送的WM_DDE_EXECUTE消息的命令內(nèi)容
4)補充
DDE已經(jīng)被應用在IE、Adobe、Office、等軟件中,我們可以通過木馬程序給目標DDEServer發(fā)送消息來控制目標軟件的行為。
比如下面宏代碼給IE瀏覽器發(fā)送DDE消息,可以控制它訪問指定網(wǎng)頁
Sub AutoOpen() On Error GoTo MyErr lngChannel = DDEInitiate(App:="IExplore", Topic:="WWW_OpenURL") DDEExecute Channel:=lngChannel, Command:="www.qq.com" DDETerminate Channel:=lngChannel MyErr: End Sub甚至可以使用DDE消息讀取、修改指定office文檔內(nèi)容,由于是基于windows消息以及共享內(nèi)存交互數(shù)據(jù),這樣不會觸發(fā)任何讀取文件的行為,可以規(guī)避安全軟件的文件行為防御,可用于高級定向攻擊,竊取指定敏感文件內(nèi)容的APT木馬中。
下面來說說為什么DDE攻擊只被用到了office中,經(jīng)過逆向分析,原來Office系列在向外發(fā)送DDEInitiate消息的時候,如果目標DDE Server進程不存在,則會嘗試創(chuàng)建這個進程。
Sub AutoOpen() On Error GoTo MyErr lngChannel = DDEInitiate(App:="c:\\Windows\\system32\\cmd.exe", Topic:="/c calc") MyErr: End Sub但是Office軟件也會給用戶對應的彈窗提示,這個提示中的路徑很明顯,這個也有辦法繞過,繞過方法可以參考我這篇文章:https://blog.csdn.net/cssxn/article/details/91867028
5)參考資料
- https://docs.microsoft.com/en-us/windows/win32/dataxchg/using-dynamic-data-exchange
- https://www.cnblogs.com/organic/p/9175276.html
- https://blog.csdn.net/u012252959/article/details/49590827
- https://docs.microsoft.com/en-us/office/vba/api/word.application.ddeinitiate
總結(jié)
- 上一篇: 莫比乌斯反演详解
- 下一篇: opencv用于医学图像分割