绕过3环的shellcode框架内附x86版本SysWhispers

admin 2023年9月11日01:10:11评论15 views字数 2994阅读9分58秒阅读模式

绕过3环的shellcode框架内附x86版本SysWhispers


1
概述

之前分析CS4的stage时,有老哥让我写下CS免杀上线方面知识,遂介绍之前所写shellcode框架,该框架的shellcode执行部分利用系统特性和直接系统调用(Direct System Call)执行,得以免杀主流杀软(火绒、360全部产品、毒霸等),该方式也是主流绕过3环AV、EDR、沙箱的常用手段。Ps:感谢邪八Moriarty的分享课。


2
简要介绍


该框架主要由四个项目组成:

GenerateShellCode:负责生成相关功能的shellcode。

EncryptShellCode:负责以AES128加密所将执行的shellcode。 

FunctionHash:负责计算shell中所用到函数的hash值。 

XShellCodeLoader:负责执行加密后的shellcode。


2.1 GenerateShellCode

写shellcode有几个原则:不能有全局变量、不能调用系统函数、不能嵌套调用函数。下面以简单弹窗messagebox生成的shellcode作介绍,先看定义的入口函数MyEntry(),里面定义了GetProcAddr()、LoadLibaryA()和MessageBoxA()三个函数对应的hash,然后通过MyGetProcAddress()传入hash值和kernel32基址返回相关函数地址再进行调用。

绕过3环的shellcode框架内附x86版本SysWhispers

自定义函数入口需在项目属性->链接器->入口点中进行设置:

绕过3环的shellcode框架内附x86版本SysWhispers

通过GetKernel32Base()函数获得kernel32基址:作比较:

绕过3环的shellcode框架内附x86版本SysWhispers

通过MyGetProcAddress()函数传入hash值找出对应的函数名,函数内容就是解析kernel32的导出表,遍历每个函数并计算出相应hash并与传入的hash作比较:

绕过3环的shellcode框架内附x86版本SysWhispers

GetProcHash()把函数名转为相应的hash:

绕过3环的shellcode框架内附x86版本SysWhispers

Release x86模式生成后exe程序后,010editor打开找到.text代码段,将其抠出后得到shellcode:

绕过3环的shellcode框架内附x86版本SysWhispers

绕过3环的shellcode框架内附x86版本SysWhispers

2.2、EncryptShellCode 

首先打开已经抠出的shellcode文件,并将器读入内存:

绕过3环的shellcode框架内附x86版本SysWhispers

AES循环加密0x10个字节AES加密的实现是WjCryptLib_Aes开源项目:

绕过3环的shellcode框架内附x86版本SysWhispers

加密后保存到新文件:

绕过3环的shellcode框架内附x86版本SysWhispers

2.3、FunctionHash

这个比较简单,计算所需要用到函数的hash值:

绕过3环的shellcode框架内附x86版本SysWhispers

2.4、XShellCodeLoader

下面着重介绍下shellcode的执行实现,因为x86、x64进0环进3环的方式不同,在这里简单介绍下不同版本3环进0环的方式:

一、32位的程序在32位系统上运行有两种方式进0环,第一个是中断门int 02Eh,第二种是sysenter

二、32位的程序在64位系统上运行,通过FastSystemCall进0环

三、64位的程序在64位系统上运行,通过syscall进0环

这里用vs的Release x86来进行编译,所生成的32位exe程序在32位系统运行使用sysenter进0环,在64位系统则使用FastSystemCall进0环。


下面我们先以32位程序运行在32位系统的sysenter进行讲解:

首先自定义一个区段,该区段的属性最好只为read,一定不要read、write、execute全上,这种全属性在内存中会显得很可疑,区段名最好为系统常用的而这个程序又没用到的,如.edata,因为360杀毒可能会对不常见的区段名报毒,另外不建议使用#pragma section(".edata",read,execute,nopage) 该方式定义区段名,因为该方式生成的区段会出现在程序中所有区段的最前面,360杀毒报毒,特征较明显。使用以下方式去定义区段,区段的内容为已AES加密的shellcode:

绕过3环的shellcode框架内附x86版本SysWhispers

然后通过遍历自身程序的区段查找出自定义的区段:

绕过3环的shellcode框架内附x86版本SysWhispers

接着调用NtProtectVirtualMemory()修改自定义区段的属性为可读可写,即readwrite,

绕过3环的shellcode框架内附x86版本SysWhispers

而NtProtectVirtualMemory()是由汇编所写的直接系统调用:

绕过3环的shellcode框架内附x86版本SysWhispers

解析上述汇编,首先把001911B13h这个对应NtProtectVirtualMemory函数名的hash值压栈,然后调用SW2_GetSyscallNumber函数(后面解析syswhier框架时会提及),该函数会返回NtProtectVirtualMemory对应的系统调用号,mov ecx,5h是把函数个数赋值给ecx,再把NtProtectVirtualMemory()函数所传入的参数相继压栈,然后调用sysenter。

接着循环把自定义区段解密出来:

绕过3环的shellcode框架内附x86版本SysWhispers

把自定义区段的属性还原到read、execute:

绕过3环的shellcode框架内附x86版本SysWhispers

执行shellcode:

绕过3环的shellcode框架内附x86版本SysWhispers

再来看看32位程序运行在64位系统的KiFastSystemCall,其主要区别只在于汇编部分:


绕过3环的shellcode框架内附x86版本SysWhispers

Call internal_cleancall_wow64_gate,

internal_cleancall_wow64_gate的值为__readfsdword(0xC0),即FS[0xC0]  WOW32Reserved


3
执行效果


3.1、实验环境:

Team server: Kali 2020 ip: 192.168.202.131

控制端:win7 32位 ip:192.168.202.134

受控端1:win 7 32位 ip: 192.168.202.140

受控端2:win10 1907位 ip: 192.168.202.1


3.2、32位系统执行

火绒版本号:

绕过3环的shellcode框架内附x86版本SysWhispers

静态查杀,未发现风险:

绕过3环的shellcode框架内附x86版本SysWhispers

360安全管家及360杀毒版本号:

绕过3环的shellcode框架内附x86版本SysWhispers

绕过3环的shellcode框架内附x86版本SysWhispers

静态查杀,未发现风险:

绕过3环的shellcode框架内附x86版本SysWhispers

执行均未拦截,运行上线:

绕过3环的shellcode框架内附x86版本SysWhispers

卡巴斯基,静态扫描未发现风险:

绕过3环的shellcode框架内附x86版本SysWhispers

执行时则被查杀:

绕过3环的shellcode框架内附x86版本SysWhispers

原因是stage执行下载后的Beacon.dll在内存中反射调用时被卡巴斯基规则检测到,也有相应的解决办法,等下篇文章魔改cobalt strike再来相应解决。


3.3、64位系统执行

同样成功执行并上线(测试过程同上)

绕过3环的shellcode框架内附x86版本SysWhispers

附上框架项目地址:

https://github.com/mai1zhi2/ShellCodeFramework


4
SysWhispers2项目简介

该项目较为简单,主要方法有三个:

一、SW2_HashSyscall()

绕过3环的shellcode框架内附x86版本SysWhispers

该方法是计算传入的函数名的hash值。

二、SW2_PopulateSyscallList()

该函数中首先找到ntdll的基址:

绕过3环的shellcode框架内附x86版本SysWhispers

遍历ntdll.dll的导出函数,并将其函数名对应的hash值和函数地址保存在SW2_SYSCALL_ENTRY结构体中:

绕过3环的shellcode框架内附x86版本SysWhispers

将SW2_SYSCALL_ENTRY的列表按照函数地址进行从小到大冒泡排序:

绕过3环的shellcode框架内附x86版本SysWhispers

三、SW2_GetSyscallNumber

该函数传入需要的函数hash值,遍历列表,返回对应的序号即系统调用号

绕过3环的shellcode框架内附x86版本SysWhispers

原版只有64位程序运行在64系统的syscall,最后附上该项目修改后的32位程序运行在32位系统的sysenter和32位程序运行在64位系统的KiFastSystemCall版本,使用方法均与原版一致:https://github.com/mai1zhi2/SysWhispers2_x86


5
关注公众号

本公众号不定期更新视频和文章 欢迎关注

绕过3环的shellcode框架内附x86版本SysWhispers



END


原文始发于微信公众号(白帽子):绕过3环的shellcode框架内附x86版本SysWhispers

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年9月11日01:10:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   绕过3环的shellcode框架内附x86版本SysWhispershttp://cn-sec.com/archives/868849.html

发表评论

匿名网友 填写信息