通过 Boolang 语言执行 shellcode 的利用分析
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
文件中包括以下三个可执行程序:
- booi.exe,用作执行脚本
- booish.exe,实时编译程序,便于测试代码
- booc.exe,用作编译脚本
具体用法如下:
1.使用 booi.exe 执行 Boolang 脚本
test.boo 的内容如下:
print "Hello, World!"
命令如下:
booi.exe test.boo
结果如下图
2.使用 booish.exe 实时编译
启动 booish.exe,在命令行输入如下代码:
print "Hello, World!"
结果如下图
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
结果如下图
注: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) 测试功能
可用命令如下:
- runBoo.exe shellcode.boo InjectQueueUserAPC
- runBoo.exe shellcode.boo InjectSelf
- 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
内容同上
实际测试如下图
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 技术交流群。

下一篇: Jvm 常量池
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论