通过 Boolang 语言执行 shellcode 的利用分析

发布于 2025-02-02 22:15:45 字数 8167 浏览 7 评论 0

0x00 前言

在之前的文章 《SILENTTRINITY 利用分析》 学习了 C#利用 IronPython 引擎从内存加载 payload 的方法,我在 byt3bl33d3r 的 GitHub 上又看到了利用 Boolang 语言执行 shellcode 的代码,于是对这项技术做了研究。

本文将要介绍 Boolang 语言的特点和用法,分析通过 Boolang 语言执行 shellcode 的优点,给出防御检测的建议。

0x01 简介

本文将要介绍以下内容:

  • Boolang 语言简介
  • Boolang 语言的用法
  • 通过 Boolang 语言执行 shellcode 的实现代码
  • 利用分析
  • 防御检测

0x02 Boolang 语言简介

学习资料:https://github.com/boo-lang/boo

Boolang 是面向对象的语言,结合了 Python 的语法,Ruby 的功能以及 C#的速度和安全性

具有如下特点:

  • 语法非常接近 Python,使用友好
  • 静态类型,相比动态类型的 Python,更加安全
  • 可以扩充编译器,能够在.NET Framework 或 Mono 上运行
  • 代码开源

0x03 Boolang 语言的用法

首先需要下载编译后的 Boolang 文件,地址如下:https://github.com/boo-lang/boo/releases

文件中包括以下三个可执行程序:

  1. booi.exe,用作执行脚本
  2. booish.exe,实时编译程序,便于测试代码
  3. booc.exe,用作编译脚本

具体用法如下:

1.使用 booi.exe 执行 Boolang 脚本

test.boo 的内容如下:

print "Hello, World!"

命令如下:

booi.exe test.boo

结果如下图

Alt text

2.使用 booish.exe 实时编译

启动 booish.exe,在命令行输入如下代码:

print "Hello, World!"

结果如下图

Alt text

3.使用 booc.exe 编译 Boolang 脚本

test.boo 的内容如下:

print "Hello, World!"

命令如下: enter code here booc -output:test.exe test.boo

生成文件 test.exe

4.使用 booc.exe 编译 Boolang 脚本(使用 Boo.Lang.Compiler API)

test.boo 的内容如下:

import Boo.Lang.Compiler
import Boo.Lang.Compiler.IO
import Boo.Lang.Compiler.Pipelines

compiler = BooCompiler()
compiler.Parameters.Input.Add(StringInput("<script>", "print('Hello!')"))
compiler.Parameters.Pipeline = Run()

compiler.Run()

命令如下:

booc -output:test.exe test.boo

生成文件 test.exe

5.使用 c#调用 Boolang 脚本

参考资料:https://github.com/boo-lang/boo/wiki/Scripting-with-the-Boo.Lang.Compiler-API

script.boo 的内容如下:

static def stringManip(item as string): //static lets us invoke this method without needing to instanize a class.
    return "'${item}'? What the hell are you talking about?"

runBoo.cs 的内容如下:

using System;
using System.Text;
using System.Reflection;

using Boo.Lang.Compiler;
using Boo.Lang.Compiler.IO;
using Boo.Lang.Compiler.Pipelines;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            BooCompiler compiler = new BooCompiler();
            compiler.Parameters.Input.Add(new FileInput("script.boo"));
            compiler.Parameters.Pipeline = new CompileToMemory();
            compiler.Parameters.Ducky = true;

            CompilerContext context = compiler.Run();
            //Note that the following code might throw an error if the Boo script had bugs.
            //Poke context.Errors to make sure.
            if (context.GeneratedAssembly != null)
            {
                Type scriptModule = context.GeneratedAssembly.GetType("ScriptModule");
                MethodInfo stringManip = scriptModule.GetMethod("stringManip");
                string output = (string)stringManip.Invoke(null, new object[] { "Tag" } );
                Console.WriteLine(output);
            }
            else
            {
                foreach (CompilerError error in context.Errors)
                    Console.WriteLine(error);
            }
        }
    }
}

使用 csc.exe 编译 runBoo.cs,命令如下:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /r:Boo.Lang.dll,Boo.Lang.Compiler.dll,Boo.Lang.Parser.dll /t:exe runBoo.cs

生成文件 runBoo.exe,调用 script.boo 的命令如下:

runBoo.exe script.boo

结果如下图

Alt text

注:runBoo.exe 的同级目录下需要存在以下三个 dll:

  • Boo.Lang.dll
  • Boo.Lang.Compiler.dll
  • Boo.Lang.Parser.dll

这种方法的优点是能将 Boolang 脚本编译到内存中并运行,对应到上面的示例,runBoo.exe 在内存中对 script.boo 进行编译并运行

0x04 通过 Boolang 语言执行 shellcode 的实现代码

代码来自 https://github.com/byt3bl33d3r/OffensiveDLR/

1.使用 c#调用 Boolang 脚本

需要使用以下两个代码文件:

(1)runBoo.cs

代码地址:https://github.com/byt3bl33d3r/OffensiveDLR/blob/master/runBoo.cs

同 0x04-5 中的 runBoo.cs 结构基本相同

在数组中分别保存了 32 位和 64 位的 shellcode

命令行第 1 个参数作为传入的 Boolang 脚本文件

命令行第 2 个参数作为注入 shellcode 的方法

(2)shellcode.boo

代码地址:https://github.com/byt3bl33d3r/OffensiveDLR/blob/master/shellcode.boo

Boolang 脚本,支持以下三种注入方法:

  • InjectQueueUserAPC,通过 QueueUserAPC 注入 explorer.exe 进程
  • InjectSelf,通过 CreateThread 注入当前进程
  • InjectRemote,通过 CreateRemoteThread 注入 explorer.exe 进程

具体用法如下:

(1) 使用 csc.exe 编译 runBoo.cs

命令如下:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /r:Boo.Lang.Compiler.dll,Boo.Lang.dll,Boo.Lang.Parser.dll /t:exe runBoo.cs

生成文件 runBoo.exe

(2) 测试功能

可用命令如下:

  1. runBoo.exe shellcode.boo InjectQueueUserAPC
  2. runBoo.exe shellcode.boo InjectSelf
  3. runBoo.exe shellcode.boo InjectRemote

注:runBoo.exe 的同级目录下需要存在以下三个 dll:

  • Boo.Lang.dll
  • Boo.Lang.Compiler.dll
  • Boo.Lang.Parser.dll

解决方法 1:

使用 ILMerge

参考资料:https://github.com/boo-lang/boo/wiki/Merge-Boo.Lang.dll-into-your-exe-or-dll

2.使用 Powershell 调用 Boolang 脚本

需要使用以下两个代码文件:

(1)Invoke-JumpScare.ps1

代码地址:https://github.com/byt3bl33d3r/OffensiveDLR/blob/master/Invoke-JumpScare.ps1

功能同 runBoo.cs,但是通过反射加载所需的三个 dll(Boo.Lang.dll,Boo.Lang.Compiler.dll,Boo.Lang.Parser.dll),同级目录下不再需要这三个 dll 文件

不需要使用 csc.exe 进行编译,不会产生中间文件

注:可以将 Boolang 脚本的内容保存在变量中,这样不需要额外的 Boolang 脚本,所有的功能只需要一个 Powershell 文件即可

(2)shellcode.boo

代码地址:https://github.com/byt3bl33d3r/OffensiveDLR/blob/master/shellcode.boo

内容同上

实际测试如下图

Alt text

0x05 利用分析

对于 byt3bl33d3r 开源的代码,相比于开源的 Boolang 代码,添加了以下功能:

  • 支持 Powershell 调用,省去使用 csc.exe 编译的步骤,Boolang 脚本是动态编译和即时执行的,使用反射加载所需的三个 dll,不需要依赖三个 dll
  • 添加执行 shellcode 的功能

这种利用方法有如下优点:

使用 Boolang 语言执行 shellcode,启动代码(Powershell 脚本) 不包括恶意的功能,payload 可保存在另一个脚本文件中

简单理解:通过 Boolang 语言开发了一个 Powershell 格式的脚本解释器,能在内存中动态加载另一脚本文件中的代码

0x06 防御检测

在之前的文章《渗透技巧——Use AutoIt script to create a keylogger》曾介绍过类似的方法,通过脚本解释器启动另一脚本文件中的代码,所以防御检测的方法类似

结合利用方法,我们在检测的时候通常会遇见以下情况:启动程序和 payload 分离,在静态检测上存在困难

但是这个技术无法绕过对程序行为的检测,所以可以通过检测进程行为的方式进行防御

0x07 小结

本文介绍了 Boolang 语言的特点和用法,结合 byt3bl33d3r 开源的代码,分析通过 Boolang 语言执行 shellcode 的优点,给出防御检测的建议。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
522 人气
更多

推荐作者

冰魂雪魄

文章 0 评论 0

qq_Wl4Sbi

文章 0 评论 0

柳家齐

文章 0 评论 0

无法言说的痛

文章 0 评论 0

魄砕の薆

文章 0 评论 0

盗琴音

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文