欢迎访问Sunbet,Sunbet是欧博Allbet的官方网站!

首页Sunbet_新闻事件正文

通过Mono(跨平台.NET运行环境)执行shellcode

b9e08c31ae1faa592020-03-0423技术

0x00 前言

在上篇文章《通过Boolang语言执行shellcode的利用分析》介绍了利用Boolang语言执行shellcode的方法,本文将按照同样的思路,使用Mono(跨平台.NET运行环境)实现执行shellcode的功能,分析利用思路,给出防御建议。

0x01 简介

· Mono简介

· Mono使用示例

· 通过Mono执行shellcode的方法

· 利用分析

· 防御检测

0x02 Mono简介

参考资料:

https://www.mono-project.com/

https://github.com/mono/mono

Mono是Microsoft .NET Framework的开源实现。

包括C,编译器和通用语言架构。

Mono项目不仅可以运行于Windows系统上,还可以运行于Linux,FreeBSD,Unix,OS X和Solaris。

0x03 Mono使用示例

开发环境: Win7x64

下载Mono安装包,地址如下:

https://www.mono-project.com/download/stable/,download-win

默认安装路径:C:\Program Files\Mono\

1.编译程序输出hello world

HelloWorld.cs的内容如下:

using System;

public class HelloWorld
{
    public static void Main(string[] args)
    {
        Console.WriteLine ("Hello Mono World");
    }
}

使用mcs.exe进行编译,命令如下:

"C:\Program Files\Mono\bin\mcs" HelloWorld.cs

生成HelloWorld.exe。

2.编译程序调用Messagebox

Messagebox.cs的内容如下:

using System;
using System.Windows.Forms;
namespace MessageboxTest
{
    class Program
    {
        static void Main(string[] args)
        {          
            MessageBox.Show("Hello World");
        }
    }
}

使用mcs.exe进行编译,命令如下:

"C:\Program Files\Mono\bin\mcs" Messagebox.cs -r:System.Windows.Forms.dll

注:

需要加-r参数指定引用的dll,否则报错提示如下:

Messagebox.cs(2,22): error CS0234: The type or namespace name `Forms' does not exist in the namespace `System.Windows'. Are you missing `System.Windows.Forms' assembly reference?
Compilation failed: 1 error(s), 0 warnings

3.编译程序执行shellcode

Shellcode.cs已上传至GitHub,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/Shellcode.cs

使用mcs.exe进行编译,命令如下:

"C:\Program Files\Mono\bin\mcs" Shellcode.cs

生成Shellcode.exe。

0x04 通过Mono执行shellcode的方法

在0x03简单介绍了使用mcs.exe编译程序的方法。

这一节着重介绍利用Mono的特性绕过静态检测的方法。

​论网络战的意义和开启模式: 俄罗斯APT攻击组织Gamaredon又改进了针对乌克兰政府,军事的工具集

Gamaredon是一个俄罗斯的APT攻击组织,首次出现于2013年,主要是针对乌克兰进行网络间谍活动。2017年,Palo Alto披露过该组织针对乌克兰攻击活动的细节,并首次将该组织命名为Gamaredon 组织。自从发现后,就一直活跃在攻击第一线,特别是针对乌克兰地区的攻击。最近安全公司SentinelOne,引入了新的组成部分以增强其对乌克兰政府的进攻能力。根据安全公司SentinelOne最近发现的样本,Gamaredon APT在过去几个月里又在攻击中引入了新的攻击模块,以增强其对乌克兰政府的进攻力量。简单来说: 1. Gamaredon 组织已经扩大了其业务规模,攻击了更多的受害者,并针对特定目标调整了其工具和社会工程的实现过程。 2. Gamaredon的活动是俄罗斯军方观察当代暴力冲突或全国性政治对抗中网络战潜力的试验场。 3.

1.将启动shellcode的代码和payload分离

(1)将payload作base64加密并保存在文件中

部分示例代码如下:

using System.IO;
byte[] shellcode64 = new byte[276] {xxx};
String AsBase64String = Convert.ToBase64String(shellcode64);
StreamWriter sw = new StreamWriter(@"C:\test\ShellcodeBase64.txt");
sw.Write(AsBase64String);
sw.Close()

base64编码后的payload已上传至GitHub,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/ShellcodeBase64.txt

(2)从指定文件读取payload,作base解密后加载shellcode

实现代码已上传至GitHub,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/ReadShellcode.cs

2.使用csc将生成的文件编译成只能通过Mono加载的形式

使用mcs编译出来的程序可以直接运行,这有可能被查杀。

使用csc进行编译可选的选项更多,我在csc帮助文件中发现可以生成只能通过Mono加载的形式,参数说明如下:

-target:appcontainerexe       Build an Appcontainer executable (Short form: -t:appcontainerexe)

因此完整的编译命令如下:

"C:\Program Files\Mono\bin\csc" ReadShellcode.cs -target:appcontainerexe

生成文件ReadShellcode.exe,无法直接执行,只能通过Mono加载,加载的命令如下:

"C:\Program Files\Mono\bin\mono.exe" ReadShellcode.exe

3.构造精简的Mono运行环境

如果我们要在另一系统执行以上文件,不必安装Mono的安装包。

经过测试只需要以下文件:

· /bin/mono-2.0-sgen.dll

· /bin/mono.exe

· /bin/ReadShellcode.exe

· /bin/ShellcodeBase64.txt

· /lib/mono/4.5/mscorlib.dll

树形图如下图:

通过Mono(跨平台.NET运行环境)执行shellcode  技术 第1张

注:

调用Messagebox引用System.Windows.Forms.dll时所需文件的树形图如下图:

通过Mono(跨平台.NET运行环境)执行shellcode  技术 第2张

0x05 利用分析

通过Mono(跨平台.NET运行环境)执行shellcode,有以下两个优点:

1.通过Mono.exe加载启动程序,启动程序不包括恶意的功能,payload可保存在另一个脚本文件中。

2.通过Mono能够构造一个.Net环境,这可以解决某些程序对.Net环境的依赖。

例如:

程序只能在.Net 4下运行,而当前系统不支持.Net 4,借助Mono就可以解决这个问题

0x06 防御检测

通过跨平台.NET运行环境Mono执行shellcode,父进程为Mono.exe,值得注意。

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

0x07 小结

本文介绍了Mono(跨平台.NET运行环境)的使用方法,分享了几种绕过静态检测的方法,分析利用思路,给出防御建议。

本文为 3gstudent 原创稿件,授权嘶吼独家发布,