zoukankan      html  css  js  c++  java
  • 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加载

     成功反弹

  • 相关阅读:
    HAProxy、Keepalived 在 Ocatvia 的应用实现与分析
    Octavia 的 HTTPS 与自建、签发 CA 证书
    Octavia 创建 loadbalancer 的实现与分析
    OpenStack Rally 质量评估与自动化测试利器
    自建 CA 中心并签发 CA 证书
    Failed building wheel for netifaces
    通过 vSphere WS API 获取 vCenter Datastore Provisioned Space 置备空间
    OpenStack Placement Project
    我们建了一个 Golang 硬核技术交流群(内含视频福利)
    没有图形界面的软件有什么用?
  • 原文地址:https://www.cnblogs.com/wh4am1/p/12252397.html
Copyright © 2011-2022 走看看