m 文件 dll matlab 中调用_利用USO服务将特权文件写入武器化
James Forshaw發現的DiagHub DLL loading技術已經非常有名了。每當你在Windows或一些第三方軟件中發現SYSTEM權限的任意文件寫漏洞時,你就可以用這一招來造成任意代碼執行,而且不用重啟。不幸的是這種方法在Windows 10 build 1903年被微軟禁止。Andrea Pierini在Twitter上簡單地提到了這一點。在這里,我想和大家分享一下我在最新版本的Windows上尋找DLL劫持弱點時發現的另一種加載dll的方法。
前言
在本文的開頭,我想澄清一下:
這不算是一個漏洞。正如我們所看到的,為了能夠使用這個技巧,必須先將一個專門制作的DLL植入C:WindowsSystem32文件夾,當然只有 “SYSTEM” 權限的用戶才能做到這一點。
寫在開始
作為出發點,我決定尋找一些簡單的例子,例如在以NT AUTHORITY/System運行的服務中的DLL劫持。我的想法是監控那些可以被普通用戶啟動或至少是 “影響 “的服務。為此,我做了一個非常簡單的PowerShell腳本,每秒鐘檢查一個服務是否被啟動或停止。
在Windows操作系統的后臺,運行Process Monitor來記錄文件系統操作。我簡單地配置了一個過濾器,只顯示涉及*.dll文件的操作,如果找不到的話就返回NAME NOT FOUND錯誤代碼。然后,我試著在沒有管理員權限的情況下,一次一次地啟動所有能啟動的服務。不幸的是,我沒有用這個方法發現任何東西。不過我發現了以下內容。
當 “Process Monitor “在后臺運行時,它捕捉到一些定期打開 “windowscoredeviceinfo.dll “文件的操作。頻率不一,可能每小時發生一次,也可能每30分鐘發生一次。事件的屬性顯示了該進程的命令行。通過查看事件的屬性能夠發現這個操作是由命令行”C:WINDOWS/System32/svchost.exe -k utcsvc -p”造成的。
知道了這一點,就可以很容易地通過以下PowerShell命令找到相應的服務,例如。在這種情況下,可以用DiagTrack命令。
注:我也可以使用進程的PID,例如在任務管理器中查找它。這種方法的缺點是,你不知道它什么時候啟動,在你檢查的時候,進程可能并不在運行。
我們的第一個目標
“Process Monitor “中的事件屬性顯示了一些關于DLL如何被加載的信息。Stack選項卡顯示了導致這次操作的調用列表。在這里,我們可以看到,初始調用是從diagtrack.dll進行的。DiagTrack服務加載了FlightSettings.dll文件,它又使用了dcntel.dll中的GetCensusRegistryLocation()方法,最后,使用標準的LoadLibraryEx()WinApi調用加載了windowscoredeviceinfo.dll。
為了確定我的方向是正確的,我在IDA中打開最后一個DLL,并查找windowscoredeviceinfo.dll的出現。Strings標簽頁中能夠清楚的找到這個dll的名字。
注意:你必須配置視圖以包含unicode字符串,這不是IDA的默認設置……。
然后,我們可以直接到它在.rdata部分的位置,尋找Xrefs。在這種情況下,只有一個。這個字符串確實是在QueryWCOSDeviceInformation()方法中使用的。好吧,說明我們的路線是對的!
IDA生成的偽代碼非常清晰。我們發現前面看到的Process Monitor的LoadLibraryEx("windowscoredeviceinfo.dll")調用。然后,如果庫被成功加載,就會進行下面的調用。GetProcAddress("QueryDeviceInformation"),也就是說這個函數應該是windowscoredeviceinfo.dll的導出函數。
我們來總結一下情況。目前,我們知道以下幾點。
- DiagTrack服務定期(每30分鐘或每小時)運行一個未知任務。
- 每次,它都會嘗試加載一個名為 “windowscoredeviceinfo.dll “的DLL,而這個DLL默認情況下并不存在。
- 如果成功加載,則導入 “QueryDeviceInformation “函數。
這是一個好的開始,但我缺少一些關鍵要素。例如,我不知道這個 “任務 “是如何運行的。我甚至不知道作為一個普通用戶是否能夠觸發它。所以,與其在不知道自己在尋找什么的情況下就開始對服務進行逆向工程,我決定創建一個PoC DLL,并驗證我是否真的能以NT AUTHORITYSystem的方式獲得任意代碼執行。
制作一個PoC DLL
這個PoC DLL的目標非常簡單。我想記錄一些關于加載它的進程的關鍵信息:命令行、當前用戶名、PID和PPID。所有這些都會被記錄到C:tempdll.log中。
首先,我想出了以下代碼。TrackCall()函數負責收集和記錄信息。它會被DllMain()和QueryDeviceInformation()執行,用來跟蹤它的調用者。
#include #include #include // UNLEN + GetUserName#include // CreateToolhelp32Snapshot()int TrackCall(const wchar_t * callingFrom){ WCHAR strSt[4096], strUsername[UNLEN + 1]; WCHAR * strComandLine; SYSTEMTIME st; HANDLE hFile, hToolhelpSnapshot; PROCESSENTRY32 stProcessEntry; DWORD dwPcbBuffer = UNLEN, dwBytesWritten, dwProcessId, dwParentProcessId; BOOL bResult; strComandLine = GetCommandLine(); // Get Command line of the current process bResult = GetUserName(strUsername, &dwPcbBuffer); // Get current user name dwProcessId = GetCurrentProcessId(); // Get PID // Get PPID hToolhelpSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); stProcessEntry = { 0 }; stProcessEntry.dwSize = sizeof(PROCESSENTRY32); dwParentProcessId = 0; if (Process32First(hToolhelpSnapshot, &stProcessEntry)) { do { if (stProcessEntry.th32ProcessID == dwProcessId) { dwParentProcessId = stProcessEntry.th32ParentProcessID; break; } } while (Process32Next(hToolhelpSnapshot, &stProcessEntry)); } CloseHandle(hToolhelpSnapshot); // Create log entry GetLocalTime(&st); wsprintfW(strSt, L"[%.2u:%.2u:%.2u] - PID=%d - PPID=%d - USER='%s' - CMD='%s' - METHOD='%s'n", st.wHour, st.wMinute, st.wSecond, dwProcessId, dwParentProcessId, strUsername, strComandLine, callingFrom); // Save to log file hFile = CreateFile(L"C:Tempdll.log", FILE_APPEND_DATA, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) bResult = WriteFile(hFile, strSt, lstrlenW(strSt)*sizeof(WCHAR), &dwBytesWritten, NULL); CloseHandle(hFile); return S_OK;}HRESULT __stdcall QueryDeviceInformation(){ TrackCall(L"QueryDeviceInformation()"); return S_OK;}BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: TrackCall(L"DllMain()"); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE;}然后,作為管理員,我把這個DLL復制到C:/Windows/System32,然后,等待它被調用…
過了一會兒,windowscoredeviceinfo.dll的調用終于出現在Process Monitor中。所有的CreateFile操作都成功返回。但是,在C:temp中沒有創建日志文件的跡象。當然,這意味著DLL沒有被正確加載,問題是:為什么?我猜測,我創建的DLL沒有導出進程所需的所有函數。
此時,我不知道該如何繼續,但是,當我回到Process Monitor時,我看到了一些以前沒有看到的事件。
文件windowscoredeviceinfo.dll也被一個名為usocoreworker.exe的進程加載,這個進程的權限為NT AUTHORITY/System。這時,一些信息被記錄到C:Tempdll.log中,這說明代碼此時已經正確執行了。
這看起來更有希望,所以我決定拋開DiagTrack服務,看看這個新目標。
轉移到新目標
我們又回到了起點。我們需要找出usocoreworker.exe進程是如何創建的。為此,我們可以尋找與寫入日志文件的PPID對應的進程。根據任務管理器,它是svchost.exe的一個實例,就像大多數Windows服務一樣,所以PPID對我們的幫助不大。
對應的服務是 BrokerInfrastructure,它的描述是 “處理后臺任務”。好吧,這也沒什么用……。
讓我們來看看我們可以從Process Monitor 中找到什么。訪問與這個進程相關的事件的屬性,然后,進入Stack選項卡,會顯示以下內容。我們可以看到,有很多對rpcrt4.dll和combase.dll的引用。這可能意味著這個進程是由一個COM相關的RPC調用觸發的。如果是這樣的話,根據遠程對象和接口的權限,也可以作為普通用戶觸發。
注。COM用于進程間通信(IPC)。因此,它可以為低權限的進程提供運行高權限操作的能力。
從二進制文件的屬性來看,我們可以看到如下描述:USO Core Worker Process。
根據前幾個要素,我試圖在谷歌上找到更多信息。第一個結果把我引向answsers.microsoft.com上的一個帖子。根據其中一條信息,我發現這個文件與 “Update Orchestrator Service “有關。
細細研究,我發現了這個非常有趣的關于 “USO客戶端 “的非官方文檔。首先,我們了解到 “USO “是 “Update Session Orchestrator “的縮寫。
我們還了解到,”USO客戶端”(usoclient.exe)是取代 “WUAUCLT “的工具,而WUAUCLT在以前的Windows版本中是用來管理Windows更新的。事實上,這個工具已經被Windows系統管理員所熟知,因為雖然它不被微軟官方支持,但它能讓他們自動完成更新管理過程。
注:他們甚至引用了TechNet上微軟員工的回復,其中說你不應該直接運行這個工具。這越來越有趣了。我們喜歡做我們不應該做的事情,不是嗎?
文檔中列出了所有你可以使用的選項。所以,我試著玩玩usoclient命令,看看是否能觸發我之前觀察到的相同行為。從StartScan開始,根據描述,它會觸發一個簡單地獲取可用更新的檢查。
我像往常一樣在后臺運行 Process Monitor,運行命令,成了。
結論
通過一個簡單的命令,我們能夠讓Update Orchestrator服務以NT AUTHORITY/System的方式運行任意代碼。這種方法的另一個好處是,我們可以在DllMain之外運行我們的代碼(即在加載器鎖之外)。
注意:根據微軟的說法,應避免在DllMain中運行代碼,因為它可能會導致應用程序死鎖。更多信息查看這里。
然而,這種技術也有一些缺點。
- 這需要你能夠控制一個特權文件創建或移動的操作。
- 導致ACL覆蓋的漏洞等。
- 作為一個普通用戶,我們不知道DLL是否已經成功加載。
依賴于usoclient工具而不了解其工作原理也是我不喜歡這種技術的地方。所以,我對客戶端和服務進行了逆向工程,以便制作一個可以在未來項目中重復使用的開源工具。UsoDllLoader。我將在本文的第二部分嘗試解釋這個過程。敬請期待
Links & Resources
- Windows開發技巧。利用任意文件寫入來提升本地的權限。
https://googleprojectzero.blogspot.com/2018/04/windows-exploitation-tricks-exploiting.html
https://googleprojectzero.blogspot.com/2018/04/windows-exploitation-tricks-exploiting.html - Twitter – MS終于修復了Win 10 1903的 “Diag Hub Collector “漏洞。
https://twitter.com/decoder_it/status/1131247394031579138
https://twitter.com/decoder_it/status/1131247394031579138 - 非官方的USO客戶文件
https://www.urtech.ca/2018/11/usoclient-documentation-switches/
https://www.urtech.ca/2018/11/usoclient-documentation-switches/ - 關于 “USO客戶端 “工具的主題,在TechNet上。
https://social.technet.microsoft.com/Forums/en-US/7619f7fa-ffc1-433b-a885-12e26f9762bf/usoclientexe-usage?forum=win10itprogeneral
https://social.technet.microsoft.com/Forums/en-US/7619f7fa-ffc1-433b-a885-12e26f9762bf/usoclientexe-usage?forum=win10itprogeneral - 動態鏈接庫最佳實踐
https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-best-practices
https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-best-practices
本文翻譯自 itm4n.github.io, 原文鏈接 。如若轉載請注明出處。
總結
以上是生活随笔為你收集整理的m 文件 dll matlab 中调用_利用USO服务将特权文件写入武器化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: yii2 redis封装类 php,yi
- 下一篇: php字符串从a到z排序,js怎么实现中