MamBa项目的插件编写-TikiTorch生成器

因为在家闲的无事,便开始利用winform编写了一个插件式工具。

下面将介绍插件编写的过程。

插件项目地址:https://github.com/sf197/Mamba-Plugin

一、插件构建

插件可以通过直接建立Winform工程来编写,上手简单,及易修改。

这里工具对插件有个硬性要求,那就是工具给插件留下的窗口只有System.Drawing.Size(1027, 481)。(由于比较菜,暂时没想到有什么好的定位方式。

接下来就是拖放控件了,这里就不再描述了。

二、制作动态生成器

由于这款插件是基于TikiTorch编写的,所以需要一个获取shellcode的窗口和一个输出路径

生成的原理也很简单,就是通过CompileAssemblyFromSource编译源代码

CSharpCodeProvider provider = new CSharpCodeProvider();
            //设置好编译参数
            CompilerParameters paras = new CompilerParameters();

            //引用第三方dll
            paras.ReferencedAssemblies.Add(@"System.dll");
            //是否内存中生成输出
            paras.GenerateInMemory = false;
            //是否生成可执行文件
            paras.GenerateExecutable = false;
            //选择生成的路径
            paras.OutputAssembly = path;

            CompilerResults cr = provider.CompileAssemblyFromSource(paras, code);
            if (cr.Errors.Count > 0)
            {
                StringBuilder sb = new StringBuilder();
                foreach (var er in cr.Errors)
                    sb.AppendLine(er.ToString());
                MessageBox.Show(sb.ToString());
            }
            else
            {
                MessageBox.Show("编译成功");
            }

我在这里创建了一个GetCode类,里面有个函数用于获取我要动态生成的代码并传入到CompileAssemblyFromSource中去

但是由于生成后的Dll需要应用TikiLoader.dll,可以直接用ReferencedAssemblies.Add添加,但是这有个弊端就是生成后的dll也必须在namespace中引入TikiLoader

于是乎找到一个解决方案

1.当程序加载该dll失败的时候会触发AssemblyResolve事件

2.监听该事件,放事件触发后从Resource资源文件中加载该dll

具体代码:

static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            //获取加载失败的程序集的全名
            var assName = new AssemblyName(args.Name).FullName;
            if (args.Name.Contains(""TikiLoader""))
            {
                //读取资源
                using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(""TikiLoader.dll""))
                {
                    var bytes = new byte[stream.Length];
                    stream.Read(bytes, 0, (int)stream.Length);
                    return Assembly.Load(bytes);//加载资源文件中的dll,代替加载失败的程序集
                }
            }
            throw new DllNotFoundException(assName);
        }

在从构造函数中添加事件监听

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

这时候只需要在生成的时候添加资源就可以了

paras.EmbeddedResources.Add(System.Environment.CurrentDirectory + @"TikiLoader.dll");

三、修改插件接口

当插件界面大致完成后,引用插件基类PlugInBase.dll,开始就修改Form继承的接口为UserControlBase

并在窗口初始化的构造函数中设置插件的名称,插件项目名称要包含以“Uc”的命名,否则无法被工具读取。

public partial class Form1 : UserControlBase
    {
        public Form1()
        {
            InitializeComponent();
            ucName = "UcTikiTorch"; // 插件名称
        }
}

并删除Program.cs

修改生成类型为类库,并放入MamBa程序的Plugins目录下

通过msf生成payload来测试生成结果

 打开powershell加载

 成功反弹

原文地址:https://www.cnblogs.com/wh4am1/p/12252397.html