DLL劫持漏洞自動化識別工具Rattler測試

0x00 前言php

最近,來自SensePost的Chris Le Roy開源了一款工具:Rattler,可用來自動識別DLL是否存在預加載漏洞(也能夠理解爲DLL劫持漏洞,文中該名詞均採用DLL劫持漏洞)。雖然DLL劫持漏洞已再也不是新技術,可追溯到2010年,可是我對自動化非常感興趣,因而對此作了進一步研究。html

本文將理清DLL劫持漏洞原理,實例分析,測試自動化工具Rattler,分享心得,並測試一個存在該漏洞的軟件——Explorer Suite安裝包c++

注:git

Explorer Suite安裝包內包含CFF Explorer,免費,經常使用來編輯PE文件格式,最後更新於2012年11月18日,是比較小衆的一款工具。對於分析PE文件格式,建議使用做者另外一款更專業的工具:Cerbero Profilergithub

Chris Le Roy介紹Rattler的博客地址:shell

https://sensepost.com/blog/20...windows

Chris Le Roy在BSides Cape Town上也介紹了Rattler,簡介以下:api

http://www.bsidescapetown.co....瀏覽器

0x01 簡介DLL劫持漏洞根源app

程序在調用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

詳細內容見:

https://msdn.microsoft.com/en...

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. 若是直接修復,或許會影響老版本程序,兼容性很差

注:

該文章對理清上述順序起到很大幫助:http://www.freebuf.com/articl...

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/20...

NDP461-KB3102438-Web.exe的下載地址:

http://www.microsoft.com/zh-c...

使用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
參考地址:

https://msdn.microsoft.com/li...

注:

設置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所解決的問題

項目地址:

https://github.com/sensepost/...

思路:

枚舉進程調用的dll列表,解析出dll的名稱

將測試dll分別重命名爲列表中的dll名稱

再次啓動程序,檢測是否成功建立進程calc.exe,若是成功,表明存在漏洞,不然不存在

實際測試:

使用Visual Studio編譯Rattler

將payload.dll放於同級目錄下

payload.dll下載地址:

https://github.com/sensepost/...

管理員權限的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

下載地址: http://www.ntcore.com/exsuite...

一樣藉助Process Monitor查看CFF Explorer的安裝包ExplorerSuite.exe在啓動過程當中的操做

如圖,找到ExplorerSuite.exe在啓動過程當中加載的dll列表

經實際測試,將payload.dll重命名爲apphelp.dll或者dwmapi.dll均可以觸發payload,彈出計算器

自動化程序測試:

如圖,得出存在劫持漏洞的dll列表

注:

在反覆啓動進程的過程當中,calc.exe正常被關閉,因此得出的結果準確

0x06 防護一、開發者須要注意的問題:

調用第三方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上使用

詳情見:

https://support.microsoft.com...

二、用戶須要注意的問題:

留意瀏覽器下載目錄下是否有可疑dll,防止其劫持下載的安裝程序

對於「不可信」的程序,建議使用Process Monitor或者Rattler檢查是否存在DLL劫持漏洞

0x07 小結

我在對DLL劫持漏洞原理的研究過程當中,走了一小段彎路,某些資料提到

若是進程嘗試加載的DLL並不存在,那麼進程仍然會嘗試去當前目錄加載這個DLL,這是SafeDllSearchMode所沒法防範的。

這讓我產生了以下疑問:

這裏提到的「並不存在的DLL」到底是指哪些dll?系統不存在的dll?但CRYPTSP.dll倒是系統默認的包含的dll

「SafeDllSearchMode所沒法防範的」DLL劫持究竟是指什麼?難道DLL劫持還有多種?有幾種?

好在最終解決了這些問題,但願本文也能幫助有一樣疑惑的人

利用DLL劫持漏洞自動化識別工具Rattler對經常使用工具進行測試,能很快找出存在的漏洞位置,高效,方便,值得測試使用

做者:CanMengBlog
來源:CSDN
原文:https://blog.csdn.net/weixin_... 版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索