DLL劫持漏洞自動化識別工具Rattler檢測
最近,來自SensePost的Chris Le Roy開源了一款工具:Rattler,可用來自動識別DLL是否存在預載入漏洞(也可以理解為DLL劫持漏洞,文中該名詞均採用DLL劫持漏洞)。雖然DLL劫持漏洞已不再是新技術,可追溯到2010年,但是我對自動化很是感興趣,於是對此做了進一步研究。
本文將理清DLL劫持漏洞原理,例項分析,測試自動化工具Rattler,分享心得,並測試一個存在該漏洞的軟體——Explorer Suite安裝包
IIS7網站監控可以及時防控網站風險,快速準確監控網站是否遭到各種劫持攻擊,網站在全國是否能正常開啟(檢視域名是否被牆),精準的DNS汙染檢測,具備網站開啟速度檢測功能,第一時間知道網站是否被黑、被入侵、被改標題、被掛黑鏈。精益求精的產品,缺陷為零資料提供!
它可以做到以下功能:1、檢測網站是否被黑2、檢測網站是否被劫持3、檢測域名是否被牆4、檢測DNS是否被汙染5、網站真實的完全開啟時間(獨家)6、擁有獨立監控後臺,24小時定時監控域名官方地址:官方圖:
注:
Explorer Suite安裝包內包含CFF Explorer,免費,常用來編輯PE檔案格式,最後更新於2012年11月18日,是比較小眾的一款工具。對於分析PE檔案格式,建議使用作者另一款更專業的工具:Cerbero Profiler
Chris Le Roy介紹Rattler的部落格地址:
https://sensepost.com/blog/2016/rattleridentifying-and-exploiting-dll-preloading-vulnerabilities/
Chris Le Roy在BSides Cape Town上也介紹了Rattler,簡介如下:
0x01 簡介DLL劫持漏洞根源
程式在呼叫DLL時未指明DLL的完整路徑
SafeDllSearchMode
從WindowsXPSP2開始,SafeDllSearchMode預設開啟,SafeDllSearchMode的存在是為了阻止在XP時代存在的DLL劫持漏洞
注:
強制關閉SafeDllSearchMode的方法:建立登錄檔項HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerSafeDllSearchMode值設為0
程式在呼叫DLL時,如果未指明DLL的完整路徑,那麼系統會按照一套固定的搜尋順序尋找DLL
如果SafeDllSearchMode開啟,程式會依次從以下位置查詢DLL檔案:
The directory from which the application loaded
The system directory
The 16-bit system directory
The Windows directory
The current directory
The directories that are listed in the PATH environment variable
如果關閉,則從以下位置查詢DLL檔案:
The directory from which the application loaded
The current directory
The system directory
The 16-bit system directory
The Windows directory
The directories that are listed in the PATH environment variable
詳細內容見:
(VS.85).aspx
KnownDLLs
登錄檔位置:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerKnownDLLs
KnownDLLs登錄檔項下包含一系列常見的系統dll,如usp10.dll、lpk.dll、shell32.dll、user32.dll
注:
如果建立登錄檔項HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerExcludeFromKnownDlls並指定具體dll名稱,可以使KnownDLLs列表中同名的dll保護失效修改後需要重啟才能生效
SafeDllSearchMode+KnownDLLs
二者結合可用來防範對系統dll的劫持
注:
系統dll是指排除ExcludeFromKnownDlls項後,KnownDLLs登錄檔項下包含的dll列表
如果呼叫的dll“不常見”,也就是並未出現在KnownDLLs的列表中,那麼無論SafeDllSearchMode是否開啟,dll搜尋的第一順序均為程式的當前目錄,這裡就存在一個DLL劫持漏洞:
在程式同級目錄下預先放置一個同名的dll,在程式啟動的過程中會優先載入,實現劫持
注:
這裡提到的DLL劫持漏洞微軟尚未給出直接的修復方法,個人認為原因有以下幾點:1. 這是開發者的失誤,換用絕對路徑就能避免這個問題2. 利用的前提是攻擊者已經能夠在同級目錄放置檔案,這代表系統已經被攻破3. 如果直接修復,或許會影響老版本程式,相容性不好
注:
該文章對理清上述順序起到很大幫助:
0x02 利用例項
接下來編寫一個存在DLL劫持漏洞的例項,演示如何利用
測試dll:
使用dll模板,具體程式碼略,載入成功後彈出計算器
測試程式的c++程式碼如下:
#include "stdafx.h"#include <windows.h> int main(){HMODULE hDllLib = LoadLibrary(_T("Kernel32.dll"));if (hDllLib){FARPROC fpFun = GetProcAddress(hDllLib, "GetVersion");DWORD dwVersion = (*fpFun)();DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));printf("version:%d,%d n", dwWindowsMajorVersion, dwWindowsMinorVersion);FreeLibrary(hDllLib);}HMODULE hDllLib2 = LoadLibrary(_T("CRYPTSP.dll"));FreeLibrary(hDllLib2);return 0;}
程式透過LoadLibrary分別呼叫Kernel32.dll和CRYPTSP.dll
實際測試:
將測試dll重新命名為Kernel32.dll,並放於程式同級目錄下,
由於Kernel32.dll出現在KnownDLLs的列表中,所以在程式同級目錄下的Kernel32.dll並不會被載入
然後將測試dll重新命名為CRYPTSP.dll,並放於程式同級目錄下,
由於CRYPTSP.dll並未在KnownDLLs的列表中,所以在程式同級目錄下的CRYPTSP.dll被載入,成功彈出計算器
0x03 實際利用
本節透過例項介紹如何使用Process Monitor查詢程式中存在的DLL劫持漏洞,測試例項為Chris Le Roy在介紹Rattler的部落格中提到過的NDP461-KB3102438-Web.exe
部落格地址如下:
https://sensepost.com/blog/2016/rattleridentifying-and-exploiting-dll-preloading-vulnerabilities/
NDP461-KB3102438-Web.exe的下載地址:
使用Process Monitor做如下設定:
Include the following filters:Operation is CreateFileOperation is LoadImagePath contains .cplPath contains .dllPath contains .drvPath contains .exePath contains .ocxPath contains .scrPath contains .sysExclude the following filters:Process Name is procmon.exeProcess Name is Procmon64.exeProcess Name is SystemOperation begins with IRP_MJ_Operation begins with FASTIO_Result is SUCCESSPath ends with pagefile.sys
參考地址:
注:
設定Exclude Result is SUCCESS後會只顯示NAME NOT FOUND項,也就是隻檢視未成功載入的dll項,即KnownDLLs的列表中不包含的dll名稱,可用於查詢存在漏洞的dll路徑
啟動NDP461-KB3102438-Web.exe後,檢視Process Monitor,
可以看到NDP461-KB3102438-Web.exe在啟動的過程中會載入CRYPTSP.dll,同時顯示NAME NOT FOUND,表示無法找到該檔案,載入失敗
現在將測試dll重新命名為CRYPTSP.dll,並放於NDP461-KB3102438-Web.exe的同級目錄下
開啟Process Monitor,設定Filter,去掉Exclude Result is SUCCESS項,再次啟動NDP461-KB3102438-Web.exe並記錄
顯示C:testCRYPTSP.dll已被成功載入,Result為Success,DLL劫持成功
程式在執行過程中成功彈出計算器
0x04 程式自動化實現
透過Process Monitor檢視DLL劫持漏洞是比較直接的方法,但是對於較大的程式,載入的DLL數目很多,手動查詢很不現實,費事費力,所以如果能夠透過程式實現上述過程,自動查詢並利用,就可以大大提高效率,這就是Rattler所解決的問題
專案地址:
思路:
·
列舉程式呼叫的dll列表,解析出dll的名稱
·
·
將測試dll分別重新命名為列表中的dll名稱
·
·
再次啟動程式,檢測是否成功建立程式calc.exe,如果成功,代表存在漏洞,否則不存在
·
實際測試:
使用Visual Studio編譯Rattler
將payload.dll放於同級目錄下
payload.dll下載地址:
/releases/download/v1.0/payload.dll
管理員許可權的cmd下執行命令:
Rattler.exe NDP461-KB3102438-Web.exe 1
注:
因為NDP461-KB3102438-Web.exe需要管理員許可權執行,所以cmd也需要管理員許可權
自動找到存在預載入漏洞的dll列表
注:
在反覆啟動程式的過程中,calc.exe沒有正常被關閉,所以得出的結果要多於實際結果
補充:
下載的NDP461-KB3102438-Web.exe通常位於Downloads資料夾下,所以只要在該目錄預先放置CRYPTSP.dll,那麼在使用者下載執行NDP461-KB3102438-Web.exe的過程中,就能夠實現載入CRYPTSP.dll
同時,安裝NDP461-KB3102438-Web.exe需要管理員許可權,那麼此時CRYPTSP.dll也獲得了管理員許可權
0x05 驗證測試
掌握該方法後,測試其他程式,例如CFF Explorer的安裝包Explorer Suite
下載地址:
同樣藉助Process Monitor檢視CFF Explorer的安裝包ExplorerSuite.exe在啟動過程中的操作
找到ExplorerSuite.exe在啟動過程中載入的dll列表
經實際測試,將payload.dll重新命名為apphelp.dll或者dwmapi.dll均能夠觸發payload,彈出計算器
自動化程式測試:
得出存在劫持漏洞的dll列表
注:
在反覆啟動程式的過程中,calc.exe正常被關閉,所以得出的結果準確
0x06 防禦1、開發者需要注意的問題:
·
呼叫第三方DLL時,使用LoadLibrary API載入DLL時使用絕對路徑,類似的情況還包括其他API如LoadLibraryEx, CreateProcess, ShellExecute等,將所有需要使用到的DLL放在應用程式所在的目錄,不放到系統目錄或者其他目錄
·
·
呼叫系統DLL時,使用絕對路徑
·
·
程式啟動時呼叫API SetDllDirectory(L”“)將當前目錄從DLL載入順序中移除
·
補充:
從Windows 7的KB2533623補丁開始,微軟更新了三個解決DLL劫持問題的新API:SetDefaultDllDirectories,AddDllDirectory,RemoveDllDirectory這幾個API配合使用,可以有效的規避DLL劫持問題
但是這些API只能在打了KB2533623補丁的Windows7和Server2008上使用
詳情見:
2、使用者需要注意的問題:
·
留意瀏覽器下載目錄下是否有可疑dll,防止其劫持下載的安裝程式
·
·
對於“不可信”的程式,建議使用Process Monitor或者Rattler檢查是否存在DLL劫持漏洞
·
0x07 小結
我在對DLL劫持漏洞原理的研究過程中,走了一小段彎路,某些資料提到
如果程式嘗試載入的DLL並不存在,那麼程式仍然會嘗試去當前目錄載入這個DLL,這是SafeDllSearchMode所無法防範的。
這讓我產生了如下疑問:
1.
這裡提到的“並不存在的DLL”究竟是指哪些dll?系統不存在的dll?但CRYPTSP.dll卻是系統預設的包含的dll
2.
3.
“SafeDllSearchMode所無法防範的”DLL劫持到底是指什麼?難道DLL劫持還有多種?有幾種?
4.
好在最終解決了這些問題,希望本文也能幫助有同樣疑惑的人
利用DLL劫持漏洞自動化識別工具Rattler對常用工具進行測試,能很快找出存在的漏洞位置,高效,方便,值得測試使用
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69989477/viewspace-2738609/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深入解析DLL劫持漏洞
- 裝置漏油檢測識別系統 漏油自動識別系統
- 子域名劫持漏洞的挖掘指南、子域名劫持怎麼檢測
- CMS漏洞檢測工具 – CMSmap
- 漏洞型別及檢測型別
- 自動化測試工具QTPQT
- 自動化裝置測試與自動化測試的區別
- iOS自動化測試驅動工具探索iOS
- 網易開源支援影像識別的自動化UI測試工具,零基礎親測好評!UI
- 人臉檢測識別,人臉檢測,人臉識別,離線檢測,C#原始碼C#原始碼
- Windows桌面自動化測試工具:WinAppDriverWindowsAPP
- bats-Bash自動化測試工具BAT
- 微軟自動化測試工具palywright微軟
- DLL劫持並使用MinHookHook
- appium uiautomator 移動端自動化測試工具APPUI
- 自動化軟體測試知識分享,上海權威軟體檢測公司有哪些?
- 工地揚塵自動監測識別系統
- 錄製回放效果差異檢測 | 自動化測試
- 【自動化測試】移動端測試輔助工具 - adb
- 網站 DNS劫持 檢測,網站被DNS劫持該怎麼檢測出來網站DNS
- airtest自動化測試工具快速入門AI
- Playwright自動化測試工具之高階使用
- AppUI 自動化中的影像識別的使用APPUI
- 自動化測試的理想境界:AppCrawler自動遍歷工具APP
- 自動化測試系列 —— UI自動化測試UI
- app安全:如何應對介面劫持、介面劫持如何檢測APP
- 網站漏洞檢測對漏洞檢測修復方案網站
- JB測試之旅-淺談自動化知識
- 談軟體自動化測試工具的評測方法
- 功能測試、自動化測試、效能測試的區別
- OCR檢測與識別技術
- 文字檢測與識別資源
- 垃圾溢滿堆放識別檢測
- 渣土車識別檢測系統
- Python人臉識別微笑檢測Python
- php實現自動化執行環境檢測PHP
- 基於DotNetty實現自動釋出 - 自動檢測程式碼變化Netty
- 自動化測試:Monkey工具實踐應用~