APP下载

Cobalt Strike shellcode 和加载器的免杀

2021-10-11陈智峰

魅力中国 2021年31期
关键词:木马线程攻击者

陈智峰

(南京东南司法鉴定中心,江苏 南京 210008)

引言

Cobalt Strike 可以简单认为是一款远控程序,相当于木马,但它却又不仅仅是常规的木马远控。它是一款基于Java 编写的全平台多方协同后渗透攻击框架,也称为CS。由于该框架具备团队协作攻击、流量防检测、防安全软件查杀等优势,因而也被大量黑客组织用于真实的高危害性的攻击。

一、shellcode 简介

shellcode 是一段用于利用软件漏洞而执行的代码,为16 进制的机器码,因为经常让攻击者获得shell 而得名。shellcode 常常使用机器语言编写。shellcode 只是一段字符,无法执行的,需要一个加载器来运行加载。打个比喻,shellcode 就相当于毒药本身,为了给目标服用,我们还需要容器比如瓶子来装载它。毒药的免杀是欺骗目标让其服下,木马的免杀是欺骗、躲过杀毒软件的检测。免杀的手段分两大类,一种是针对shellcode(毒药本身),一种是针对加载器(容器),都是要想办法伪装成正常物品。大部分时候需要搭配使用,效果更佳。如图1 为cs 生成的64 位shellcode。

二、shellcode 免杀技术

Shellcode 的免杀,主要分为编码和加密,就是把shellcode 进行加密存储,然后在执行的时候再解密出来执行,这样杀软静态识别时候就不认识我们的shellcode。我们可以对全部shellcode 使用同一种加密,也可以对shellcode 进行分段使用不同的加密手段加密再分段解密,当然也可以进行多次加密等。其中编码有base64 编码,字符串编码,uuid 硬编码。加密的话有AES,XOR,ROT,RSA,RC4 等等。

下面以UUID 硬编码为例,全称为通用唯一识别码(Universally Unique Identifier,缩写:UUID),是用于计算机体系中以识别信息数目的一个128 位标识符,根据标准方法生成,不依赖中央机构的注册和分配,UUID 具有唯一性。如图2 是一个python 脚本,用来将shellcode 转换为UUID 硬编码。

三、加载器的免杀技术

加载器的免杀,这里首先介绍内存加载方式,这是逃避静态查杀的关键。Windows 操作系统的内存有三种属性,分别为:可读、可写、可执行。在申请内存页时,一定要把控好属性,可以在Shellcode 读入时,申请一个普通的可读写的内存页,然后再通过VirtualProtect 改变它的属性,变成可执行。

接着介绍远程加载,也是分离免杀的一种,将恶意代码放置在程序本身之外的一种加载方式。首先介绍http 方式,顾名思义就是需要一个Http server 和http client,我们需要先运行http server 提供服务,木马就是http client,运行时候去Http server 请求shellcode,再加载进内存执行。还有icmp,dns,sockets 方式,只是协议不一样,原理都是一样的。

加载器的免杀手法还有进程注入,我们可以通过线程注入的方式将病毒代码注入到系统其他正常进程中,这样不但提高了病毒和木马隐蔽性,同时如果将病毒注入到系统的核心进程中也降低了被杀毒软件查杀的可能性。[2]也就是将shellcode 注入到进程中,进程可以是存在的进程,也可以是自己新建进程。比如计划把shellcode 注入notepad.exe 中,为了不影响现有的进程,我们创建一个挂起的进程notepad.exe,读取线程上下文,读取进程内存,读取Notepad.exe 原始入口点,卸载Notepad.exe 占用的内存,将shellcode 放入内存缓冲区,在Notepad.exe 进程中分配一个内存空间,将shellcode 注入到Notepad.exe 的进程里,修改Notepad.exe 的区段,修改Notepad.exe 的入口点,恢复主线程,成功注入。这里再介绍下一种比较新形的注入,Early Bird 注入,是一种简单而强大的技术,允许攻击者在其主线程启动之前将恶意代码注入到合法进程,从而避免被大多数反恶意软件产品所使用的Windows hook 引擎检测到。Early Bird 技术代码的注入方法依赖于Windows 内置的APC(异步过程调用)函数,该函数允许应用程序在特定线程的上下文中异步执行代码。下面介绍攻击者将恶意代码注入合法进程的步骤说明:1.创建一个合法的Windows 进程的暂停进程(例如,svchost.exe);2.在该进程中分配内存(svchost.exe)并将恶意代码写入分配的内存区域;3.将异步过程调用(APC)排队到该进程的主线程(svchost.exe);4.由于APC只能在处于可警告状态时执行进程,因此只要主线程恢复,就可以调用NtTestAlert 函数强制内核执行恶意代码。

说到进程注入,不得不提反射dll 注入。常规的DLL 注入方式相信大家都很熟悉了,就是让程序A 强行加载程序B 给定的a.dll,并执行程序B 给定的a.dll 里面的代码。注意,程序B 所给定的a.dll 原先并不会被程序A 主动加载,但是当程序B 通过某种手段让程序A“加载”a.dll 后,程序A 将会执行a.dll 里的代码,此时,a.dll 就进入了程序A 的地址空间,而a.dll 模块的程序逻辑由程序B 的开发者设计,因此程序B 的开发者可以对程序A 为所欲为。因为执行命令需要借用某些合法进程,所以一般的进程注入都要绕过AV检测。反射DLL注入可以将加密的DLL保存在磁盘(或者以其他形式如shellcode 等),之后将其解密放在内存中。之后跟DLL注入一般,使用VirtualAlloc和WriteProcessMemory将DLL写入目标进程。因为没有使用LoadLibrary 函数,要想实现DLL 的加载运行,我们需要在DLL 中添加一个导出函数,ReflectiveLoader,这个函数实现的功能就是加载自身。

四、结语

以上就是目前常见的免杀技术,每一种单独的方法可能都不能直接免杀,但是多种方法的灵活组合则能达到不错的效果。

猜你喜欢

木马线程攻击者
小木马
基于微分博弈的追逃问题最优策略设计
骑木马
小木马
正面迎接批判
旋转木马
浅谈linux多线程协作
有限次重复博弈下的网络攻击行为研究
Linux线程实现技术研究
么移动中间件线程池并发机制优化改进