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