吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12997|回复: 45
收起左侧

[系统底层] shellcode免杀框架内附SysWhispers2_x86直接系统调用

  [复制链接]
mai1zhi2 发表于 2021-1-28 12:23
本帖最后由 mai1zhi2 于 2021-1-28 12:27 编辑

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

以简单弹窗messagebox生成的shellcode作介绍,定义的入口函数MyEntry(),先定义GetProcAddr()LoadLibaryA()MessageBoxA()三个函数对应的hash,然后通过MyGetProcAddress()传入hash值和kernel32基址返回相关函数地址再进行调用

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



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

图片 4.png


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

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

图片 7.png
图片 8.png
2.2、EncryptShellCode

首先打开已经抠出的shellcode文件,并将器读入内存:
图片 9.png
AES循环加密0x10个字节AES加密的实现是WjCryptLib_Aes开源项目:
图片 10.png



加密后保存到新文件:


图片 11.png

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

图片 12.png

2.4、XShellCodeLoader

下面着重介绍下shellcode的执行实现,因为x86x640环进3环的方式不同,在这里简单介绍下不同版本3环进0环的方式:一、32位的程序在32位系统上运行有两种方式进0环,第一个是中断门int 02Eh,第二种是sysenter二、32位的程序在64位系统上运行,通过FastSystemCall0环三、64位的程序在64位系统上运行,通过syscall0环这里用vs的Release x86来进行编译,所生成的32位exe程序在32位系统运行使用sysenter0环,在64位系统则使用FastSystemCall0环。

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

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



NtProtectVirtualMemory()是由汇编所写的直接系统调用:
图片 16.png

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


接着循环把自定义区段解密出来:
图片 17.png
把自定义区段的属性还原到read、execute:
图片 18.png
执行shellcode:

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

图片 20.png


Call internal_cleancall_wow64_gate,internal_cleancall_wow64_gate的值为__readfsdword(0xC0),即FS[0xC0]  WOW32Reserved3、执行效果
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位系统执行



火绒版本号:


图片 27.png



静态查杀,未发现风险:


图片2.png

360安全管家及360杀毒版本号:
图片 28.png
图片 29.png
静态查杀,未发现风险:

图片 30.png



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


图片 26.png
卡巴斯基,静态扫描未发现风险:

图片3.png



执行时则被查杀:


图片4.png



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


3.3、64位系统执行
同样成功执行并上线(测试过程同上)


图片 31.png

附上框架项目地址:https://github.com/mai1zhi2/ShellCodeFramework
4、SysWhispers2项目简介

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

一、SW2_HashSyscall()
图片 30.png
该方法是计算传入的函数名的hash值。
二、SW2_PopulateSyscallList()该函数中首先找到ntdll的基址:
图片 31.png



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


SW2_SYSCALL_ENTRY的列表按照函数地址进行从小到大冒泡排序:
图片5.png
三、SW2_GetSyscallNumber该函数传入需要的函数hash值,遍历列表,返回对应的序号即系统调用号

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

免费评分

参与人数 16吾爱币 +16 热心值 +15 收起 理由
hackAll + 1 我很赞同!
Y2pj + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
纯金的大铜佛 + 1 + 1 谢谢@Thanks!
TXKJ + 1 + 1 用心讨论,共获提升!
Nernst + 1 + 1 不错的思路
wh421 + 1 + 1 用心讨论,共获提升!
gaosld + 1 + 1 谢谢@Thanks!
legendary666 + 1 + 1 谢谢@Thanks!
寒枫雨雪 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
poisonbcat + 1 + 1 谢谢@Thanks!
victos + 1 + 1 谢谢@Thanks!
XiaoLongGg + 1 + 1 我很赞同!
nws0507 + 1 + 1 我很赞同!
4oo4 + 1 + 1 用心讨论,共获提升!
麻辣书生 + 1 + 1 我很赞同!
nj001 + 1 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

  • · Aarow|主题: 991, 订阅: 304

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ice_cream16 发表于 2021-6-3 18:20
mai1zhi2 发表于 2021-6-3 14:46
应该是流量特征

现在改了cs.store、改了profile,编译运行比之前拦截会晚几秒,wd弹出两次拦截,一次是Swrort在内存里的processStart,一次是显示cs马,抓到的文件是XShellCodeLoaderWow64.exe。怀疑可能是下载下来的内容里还有特征
ice_cream16 发表于 2021-6-1 11:43
请问楼主有对windows defender测试吗?在用这个框架测试的时候使用cs的shellcode,在运行时被windows defender被杀,所以做了静态扫描,可以过。所以怀疑cs下发过程可能有特征,想问问楼主有没有什么办法?
third1979 发表于 2021-1-28 12:32
好东西啊,果然是高手,就怕过不了多久就不会免杀了
30461616168 发表于 2021-1-28 12:49
好文章啊
Airey 发表于 2021-1-28 12:55
赞!我还是觉得shellcode Bypass好难啊,还是要多学习,跟随大佬的脚步
nj001 发表于 2021-1-28 13:20
框架写的很好,感谢分享,请问楼主git上有没有开源的直接系统调用相关的库,感觉写这个是个体力活
 楼主| mai1zhi2 发表于 2021-1-28 22:10
nj001 发表于 2021-1-28 13:20
框架写的很好,感谢分享,请问楼主git上有没有开源的直接系统调用相关的库,感觉写这个是个体力活

我分享的那个就是了
wbzlvoeme 发表于 2021-1-28 23:28
学习了.回头拿来分析下代码
yunruifuzhu 发表于 2021-1-28 23:29
火绒工程师正在赶往现场
zedong 发表于 2021-1-29 00:20
本帖最后由 zedong 于 2021-1-29 00:22 编辑

我看到微信公众号。。原来来至吾爱
慵懒丶L先森 发表于 2021-1-29 00:56
今天刚在某VX公众号看到文章,发现标名来源首发是在吾爱,老哥厉害,学习学习这一块的知识
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-19 10:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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