1
图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 模板主要是在 shellcodestandalonewindowspayloads 文件中。 -
接下来,笔者将按攻击阶段对该框架进行简要分析,并提出检测建议,希望能在此特殊时期给大家些许帮助。
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 漏洞
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. 执行指令
phpnode 由 phplistener 完成:
win64node 则由 win64 完成:
3. 权限维持
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,我们简单看一下其执行流程:
如上图,该模块为一个以服务方式运行的监听模块,根据参数监听主机 IP 和端口,接下来接收 Shellcode 并执行:
3
整体而言,该部分框架最大亮点之处在于几个未公开 exp 漏洞的稳定利用代码,针对其检测工作也可以分为短期和中期两部分工作来做:短期较快能提取的特征则是各类 shellcode 模板,恶意代码模板,以及回连端口和流量特征;中期是需要逐个分析 exp 提取相关特征码。当前,我们的 TDP 产品已能覆盖大部分流量特征:
公众号内回复“CA”,可获取 PDF 版报告。
关于微步在线研究响应团队
内容转载与引用
微步在线
研究响应中心
-长按二维码关注我们-
本文始发于微信公众号(微步在线研究响应中心):浅析 canvas 框架及相关检测思路
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论