當前位置:
首頁 > 新聞 > 通過Mono執行shellcode

通過Mono執行shellcode

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的特性繞過靜態檢測的方法。

1.將啟動shellcode的代碼和payload分離

(1)將payload作base64加密並保存在文件中

部分示例代碼如下:

using System.IO;

byte[] shellcode64 = new byte[276] ;

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

樹形圖如下圖:

註:

調用Messagebox引用System.Windows.Forms.dll時所需文件的樹形圖如下圖:

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 原創稿件,授權嘶吼獨家發布

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

Bitbucket被濫用傳播惡意軟體
對2019全年的Mac惡意程序的全面分析