好友
阅读权限 20
听众
最后登录 1970-1-1
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子! 病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途! 禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!
背景:
之前项目在对VBA宏代码进行免杀得时候,发现某些杀软会针对VBA的WinAPI函数隐式调用部分进行字符串查杀,而这个部分当有过一个想法,就是能否向C/C++那样能够显式加载API,当时搜寻一翻没有发现相关的资料,而最近在一个机缘巧合下我看到了一篇关于COM接口的文章,其中提到了相关技术的介绍.
Cobalt Strike默认生成:
以下为Cobalt Strike 4.1默认生成VBA宏代码的声明:
Private Declare Function AllocStuff Lib "kernel32" Alias "VirtualAllocEx" (ByVal hProcess As Long, ByVal lpAddr As Long, ByVal lSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
我们注意到对WinAPI引用的规则,其中要使用这些API必须按照VBA的规则来进行声明,且Kernel32VirtualAllocEX
这两个字符串是无法进行加密解密的,必须按照规定在VBA中进行声明.大家都知道一般的检测引擎检测VBA的方式基本是静态匹配,所以VBA的规避方式一般是通过混淆脚本块来进行规避的,但是有个别杀软的检测比较狠,只要存在隐式声明,就对其声明的字符串进行规则匹配,当然这个声明是无法被混淆的.
1
修改隐式声明:
在C/C++中,可以通过LoadLibrary和GetProcAddress来获得”倚天剑和屠龙刀”,为什么说是倚天剑和屠龙刀呢,原因很简单通过这两个API可以动态加载Windows上所有的导出函数,包括未公开的函数通过动态加载API可以很大程度规避杀软对于导入表的查杀,之前就一直有这个想法是否能够在VBA中实现这个功能,很遗憾的是相关的资料少之又少,直到最近我偶然间看到了下面的介绍.
2
正如介绍中说的那样,我们可以通过DispCallFunc函数来实现我们需要的功能.
该函数的声明如下:
3
pvInstance
接口的实例.
oVft
要执行的API的函数地址.
cc
用约定.CALLCONV值之一,例如CC_STDCALL.
vtReturn
函数返回值的变量类型.使用VT_EMPTY表示空白.
cActuals
函数参数的数量.
prgvt
函数参数的变量类型的数组.
prgpvarg
函数参数.
pvargResult
函数返回值.
根据上述函数的调用约定我们构造一个简单的例子.
4
修改导入方式:
我们都知道PE文件的导出方式有两种,分别是名称导入和序号导出,是否可以在VBA中实现序号导入的方式呢.
首先通过PE工具得到我们需要使用的API的序号值.
5
6
7
这里的值是16进制的,转换成对应的10进制即可,值得注意的是该序号的值可能根据操作系统版本的不同会有有所变化,所以说要在之前加入判断当代码,函数的名称也可以随之修改为任意函数名.
8
在野样本:
我们在VT上进行关联发现了个别使用该方法的样本,该样本比较简单,调用了2次APICall.
9
首先看下Decode64函数,这个是Base64的解码函数.
10
第一个参数首先被Base64编码,之后调用了decrypt函数解密.
11
我们可以看到根据Decode64函数返回的数据与Base64解码后的数据相同,证明我们的分析是没错的.
12
13
如下图所示,将加密字符串和密钥解码出来.
14
15
接下来我们看下decrypt函数,该函数的算法比较简单,转换成伪C代码即:
for(int i =0 ,i<strlen(strInput),++i)
{
strInput=strInput-second
}
也就是说将传入字符串的ASCII码-8即还原了被加密的字符串.
16
为了方便看,我整理了下对应的代码,可以看到第一次调用APICall,使用了5次解密函数.
第一次:
17
第二次:
18
第三次:
19
第四次:
20
第五次:
21
APICall的功能没什么可说的,就是将部分需要以指针传入的数据进行转换,然后通过LoadLibrary和GetProcAddress获得需要执行API的地址后,通过DispCallFunc执行.
22
URLDownloadToFileW功能是下载指定URL的内容到指定位置,也就是说调用该API会下载"http://taroba.fm.br/sistema/exploit.exe"数据到系统目录的"APPDATA"下命名为"Example.exe".
第二次调用APICall,如果我猜得不错应该是运行下载的PE文件,这里5调用了解码函数.
23
第一次:
24
第二次:
25
第三次:
26
第四次:
27
第五次:
28
ShellExecuteW功能是运行一个外部程序或打开某个文件/目录,也就是说.通过ShellExecuteW API运行系统目录下的"APPDATA"目录中名为:"Example.exe"的程序.
总结:
至此该样本的宏代码部分就执行完成了.也就是说该样本实际上是一个下载者,VBA的语法实际与VB大都相同,随着VB语言的没落该方向的资料也比较少或比较老旧,但是其有部分灵活的用法依旧值得研究并能够应用在免杀当中.
IOC:
hxxp://taroba.fm.br/sistema/exploit.exe
9f8bc3cfcab3056fd71076bed82664b2
免费评分
查看全部评分