第66篇:顶级APT后门Sunburst通信流量全过程复盘分析(修正篇)

news2024/11/16 11:30:32

7661ac09ac04e76ed3360e380ae76519.png

 Part1 前言 

由于先前文章存在部分错误,原文ABC_123已删除,上周末把文章修正,重新发布

大家好,我是ABC_123。前面几周分享了Solarwinds供应链攻击事件的详细攻击流程及Sunburst后门的设计思路,但是多数朋友还是对Sunburst后门的通信过程还是没看明白。本期ABC_123就从流量的角度,把Sunburst后门的通信过程完整地复盘一下,这样可以更直观地展示Sunburst后门是如何绕过流量监控的,从中我也学到了很多东西。

注:国外很多分析文章对于Sunburst后门的通信过程说法不一,很多细节描述存在很多矛盾的地方。ABC_123按照自己的理解,综合各个安全公司的文章进行了复盘,其中难免有疏漏之处,敬请修正。

注:Sunburst后门通信逃过了美国耗时十多年、花费数百亿美元建造的网络攻击防御系统“爱因斯坦”(Einstein)。

建议大家把公众号“希潭实验室”设为星标,否则可能就看不到啦!因为公众号现在只对常读和星标的公众号才能展示大图推送。操作方法:点击右上角的【...】,然后点击【设为星标】即可。

d89be937d31984e33e8f5bcda7dd20a4.png

 Part2 后门通信的前置知识 

  • C2控制Sunburst后门的方式

上一篇文章ABC_123详细介绍过,本期再简单回顾一下。C2服务端的攻击者会通过控制C2域名解析到不同的ip地址段,间接控制Sunburst后门的行为,接下来看一个简单的例子,看看攻击者如何控制Sunburst后门,使其永久退出。

首先,Sunburst后门发起了ea99hr2sfen95nkjlc5g.appsync-api.eu-west-1.avsvmcloud.com的dga域名请求,C2服务端的攻击者打算让这个后门永久停止退出,于是将这个dga域名解析到ip地址96.31.172.116,Sunburst获取到这个ip之后,查询如下列表,然后立即转为”Truncate”状态,清除各种痕迹后,永久终止执行。

39b09f06ac86cdc5344c13211292fad3.png

  • C2控制Sunburst后门的图解

cef0d07d54255d139073e254aabd6b14.png

蓝色部分CONTINUE的IP地址当C2服务端攻击者将dga域名解析成图中蓝色部分的IP地址时,说明C2服务端的攻击者还未决定目标是否是有价值的目标,是否要进一步渗透,所以需要Sunburst后门会继续发起dga域名请求,以便接收攻击者发送下一步指令。

红色部分的STOP的IP地址如果随后攻击者发现目标计算机价值不大,或者目标机器安装的防护软件太强,需要放弃对此目标的渗透。C2服务端攻击者就会将dga域名解析为红色部分的ip地址,这样Sunburst得到这部分的ip之后,会清理痕迹,然后永久停止运行。

紫色的TARGET部分的IP地址如果攻击者觉得受害目标值得进一步渗透,就将dga域名解析为上图紫色部分的ip,然后返回一个cname域名,Sunburst会接收这个域名(如图中的deftsecurity.com),用作第2阶段的HTTP C2阶段的域名,开始正式接收C2的指令和回传指令执行结果。

  • 延迟定时器

C2的域名服务器不仅仅通过将dga域名解析到不同的ip地址来控制Sunburst后门的行为,还通过控制解析IP地址的最后8位字节来控制Sunburst后门的下一次执行命令的等待时间。例如,C2服务端将dga域名解析为96.31.172.116的ip地址时,Sunburst后门会将IP地址的最后一个八位数与掩码0x54进行与运算得到一个“与结果”,然后参考下表中选择一个延时时间,在该间隔内Sunburst随机选择一个延时时间。

626860fd4841af031c4236f9a54df0bf.jpeg

  • C2控制后门终止运行案例

首先放出一张国外视频中给出的一个截图,讲述了C2控制Sunburst后门终止运行的全过程。

4cfdaad0251984a0ea33e31adfa2fb2a.jpeg

 第1步  Sunburst后门请求一个域名如下:lf9prvp9o36mhihw2hrs260g12eu1.appsync-api.eu-west-1.avsvmcloud.com,对于这个域名的lf9prvp9o36mhihw2hrs260g12eu1部分使用工具解密,发现得到目标机器所在的域名omeros.local。接着攻击者将域名解析到8.18.145.139这个ip地址,Sunburst通过ip地址的最后8字节运算,得知需要延迟一分钟之后,将安全防护软件状态信息发送给C2服务端。

 第2步  延迟一分钟之后,Sunburst后门发起第2个请求,通过dga域名的加密部分告诉C2服务端,目标机器有Carbon Black终端安全防护软件存在。C2服务端将dga域名解析为8.18.145.62,Sunburst后门解析ip地址的最后8字节,得知需要延迟1天之后再次发起dga域名请求。

 第3步  延迟1天之后,Sunburst通过ping如下dga域名,向C2请求指令,C2将域名解析为8.18.144.150,Sunburst需要继续等待1天,然后发起dga域名请求。

 第4步  延迟1天之后,Sunburst通过ping一个dga域名,C2将域名解析为8.18.145.151,Sunburst继续等待。

 第5步  延迟1天之后,Sunburst通过ping一个dga域名,C2将域名解析为20.140.84.127,Sunburst得到了这个ip,立刻明白C2让其立刻终止运行,说明C2的所有者经过思索,认为此域名计算机进一步渗透的价值不大,故放弃。

通过这个案例发现,Sunburst后门在规避流量检测方面下足了功夫,首先它在4天的时间内,仅仅发起了5个dga域名的DNS请求,而且域名appsync-api.eu-west-1.avsvmcloud.com很容易让人联想到AWS的域名,导致后期安全人员进行溯源的时候,被认为是正常域名请求。从来没有一个后门有如此的耐心,延迟时间如此之长。

 Part3 完整的后门通信案例 

接下来看一个Sunburst后门的完整通信案例,包括了Sunburst后门通过dga域名传输受害者计算机名、安全防护软件状态以及c2向Sunburst后门发送HTTP C2通信阶段的CNAME域名过程,这是第1阶段;然后再到第2阶段,Sunburst后门发起GET请求.xml文件获取C2下发的指令,后续将指令结果通过PUT请求以JSON文档格式回传给C2端;最后到第3阶段,投放加载器加载执行CobaltStrike后门的阶段。

 1   dga域名传输阶段

e144da0a3829f336abad83a2ca671564.jpeg

 第1步  2020-06-11 04:00 UTC

Sunburst发起查询:r8stkst71ebqgj66ervisu10bdohu0gt.appsync-api.us-west-2.avsvmcloud.com ⇒ AD 域,C2攻击者得到第 1 部分内容“central.pima.g”

响应:8.18.144.1 ⇒ Sunburst后门休眠 1 小时,然后继续。

 第2步  2020-06-11 05:00 UTC

Sunburst发起查询:ulfmcf44qd58t9e82w.appsync-api.us-west-2.avsvmcloud.com ⇒ AD 域,C2攻击者得到第 2 部分“ov”

响应:8.18.144.2 ⇒ Sunburst后门休眠 1 小时,然后继续(此时攻击者知道了目标计算机的完整域名是central.pima.gov)。

 第3步  2020-06-11 06:00 UTC

Sunburst发起查询:p50jllhvhmoti8mpbf6p2di.appsync-api.us-west-2.avsvmcloud.com ⇒ 无可报告。

响应:8.18.144.16 ⇒ Sunburst后门休眠 8 小时,然后继续(此时攻击者知道,目标的防护软件都处于关闭状态)。

 第4步  2020-06-11 14:00 UTC

Sunburst发起查询:(?) ⇒ 没有新的报告

响应:8.18.144.17 ⇒ Sunburst后门休眠 8 小时,然后继续(此时攻击者在评估该目标是否有价值,是否值得进一步渗透

 第5步  2020-06-11 22:35 UTC

Sunburst发起查询:j5uqlssr1hfqnn8hkf172mp.appsync-api.us-west-2.avsvmcloud.com ⇒ 无需报告

响应:184.72.181.52 ⇒Sunburst休眠1-3 分钟(解析到该IP地址,Sunburst将会准备进入第2阶段HTTP C2阶段

 第6步  2020-06-11 22:37 UTC

Sunburst发起查询:7sbvaemscs0mc925tb99.appsync-api.us-west-2.avsvmcloud.com ⇒ Sunburst后门请求 CNAME

响应:deftsecurity.com ⇒第 2 阶段 HTTPS C2 服务器的 CNAME(此时Sunburst通过dga域名解析,发现CNAME值不为空,于是获取该CNAME值,将其作为进入第二阶段HTTP C2通信阶段的域名

 2   发起HTTP请求向C2请求指令

Sunburst后门随后进入HTTP C2通信阶阶段,Sunburst向C2的CNAME值deftsecurity.com发起如下HTTP请求,请求一个xml文件:

GET /swip/upd/Orion.UI-5.2.0.xml HTTP/1.1

If-None-Match: bfc145s6149c4290ef3b2c1732449c562a24g66d

Host: deftsecurity.com

Connection: Close

如下图所示,服务端返回一个看起来像是一个正常的xml程序集的文件,其实攻击者的控制指令就被加密隐写在这些XML文件的一些字段的值中。

64e8a58affb45a5a33b0722046763049.png

Sunburst通过解析上述xml文件中的加密部分,得到指令ID和指令的附加参数。参考如下表格,如果指令对应的ID是Exit,就是终止当前线程,如果是SetTime,就结合解密出来的附加参数设置延迟时间。

0f42051e80097bc3a9aad5aa9d8f8707.png

 3   向C2回传命令执行结果

在从xml文件中解密获取到攻击者发送的指令之后,Sunburst会执行指令,然后将返回结果回传给服务端。上篇文章ABC_123重点介绍过,对于返回结果小于10,000的情况,会向一个结尾为.woff2的url以PUT请求发送一个json格式数据,Sunburst把执行结果加密隐藏在json文档中。

url生成规则如下(详情请见上一篇文章)

23d4762985464e4065d427a9fca62e1e.jpeg

Sunburst回传数据的请求数据包大致如下(这是ABC_123根据国外分析文章拼起来的,可能会缺少部分的header头信息)

158ccb35b1570c8c1e24cc7cb6a6b008.jpeg

请求数据包的解释如下:

dd808523e81eb171873e001816ebb0a4.png

接下来Sunburst后门会不断向c2域名请求xml文件,获取需要执行的指令,然后将执行结果通过PUT请求以json文档的形式回传给c2服务端,之后进入第三阶段使用CobaltStrike后门进行内网横向阶段。

 4   CobaltStrike后门通信

接下俩进入第三阶段,Sunburst会下载一个vbs脚本及Loader加载器程序,然后放在C:\Windows目录下,伪装成合法文件。接着Sunburst使用映像劫持技术,修改注册表,将dllhost.exe与wscript.exe C:\Windows\[folder]\[trigger].vbs命令绑定,至此Sunburst后门已经完成了它的使命,系统静静等待dllhost.exe执行,进一步执行vbs脚本。bbs脚本会运行rundll32.exe加载前一步的恶意dll文件,随后清理dllhost.exe的映像劫持注册表,清理痕迹。

  • 投放TEARDROP工具

TearDrop总共发现两个变种:

第1个变种是libintl3.dll,该样本通过rundll32.exe加载,然后从当前目录读取名为 upbeat_anxiety.jpg 的图片文件,并确保它具有 jpg 标头,并从中提取shellcode,该CobaltStrike后门通过连接到 infinitysoftwares[.]com进行命令和控制。

第2个变种是NETSETUPSVC.dll,使用了添加服务的方式启动,过svchost.exe加载并调用导出函数NetSetupServiceMain,NETSETUPSVC.dll文件复用了libintl3.dll文件的代码。从当前目录读取festive_computer.jpg图片文件,该CobaltStrike后门通过连接到ervsystem[.]com进行命令和控制。

TEARDROP使用“twitter.com”作为https协议中的Referer字段的内容,会使安全人员误以为C2域名infinitysoftwares[.]com是一个正常的白名单域名,从而逃避检测。

TearDrop的CobaltStrike通信阶段的流量数据如下:

8fe2424c616b2857448a13e990fa1743.jpeg

  • 投放RAINDROP工具

以bproxy.dll形式存在,之后安装了一个7z.dll的文件之后将域渗透工具DSInternals提取到受害者机器上。对于7z.dll文件,该文件的制作依赖于7-zip开源代码为载体,攻击代码隐写在代码段中。该后门同样会以CobaltStrike方式,通过与bigtopweb.com通信实现内网横向控制,Referer伪装成bing.com迷惑安全人员,误以为bigtopweb.com是一个正常的白名单域名。

在这个阶段,有的CS实例基于HTTP的命令和控制服务器,有的是用SMB的网络通道\\.\pipe\protected_storage进行内网通信。(完整的数据包没有找到,大家从下面的日志中一窥全貌吧)

RainDrop的CobaltStrike通信阶段的流量数据如下:

dbb50c47d93281cc477f01ee65b06df5.jpeg

 Part4 总结 

1.  Sunburst后门激活后门随机等待12到14天然后正式激活执行,部分单位的安全设备日志留存12天左右,然后就会被新的日志覆盖掉。

2. C2的通信在初始阶段获取内网计算机域名和安全防护软件基本信息过程中,流量都隐藏在dga域名中,难以发现。而且在3、4天的时间,Sunburst后门仅仅发起4、5次dga域名请求,如此低频率的访问更加难以发现。

3. 价值不高的目标会被立刻终止掉,防止被检测设备发现。

4. 攻击者最终只选择了大约1%的有价值的目标进行内网横向渗透,并将安全防护很高的目标放弃掉,这种取舍,降低了被发现的概率。

5. dga域名解析的ip地址段,选用的是微软、谷歌、亚马逊的地址段,很容易直接就被检测软件加入白名单,整个通信流量看起来都是正常流量,难以甄别。

6. Sunburst后门所使用的的dga域名appsync-api.us-west-2.avsvmcloud.com很好地迷惑了安全人员的溯源,使其误以为是AWS旗下域名。

7.  综上所述,大家可以看到Sunburst设计的精妙之处,流量层面做得如此隐蔽,不得不让人惊叹,后续ABC_123会继续分享火眼FireEye公司是如何对此次攻击事件进行溯源的,敬请期待

615313578d2ecca3b071350cb2ec5e30.png

公众号专注于网络安全技术分享,包括APT事件分析、红队攻防、蓝队分析、渗透测试、代码审计等,每周一篇,99%原创,敬请关注。

Contact me: 0day123abc#gmail.com(replace # with @)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/730796.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

各种软件的启动界面(SplashScreen)修改汇总

最近装了新电脑,搞了一波萌化,顺便把我常用软件的启动界面也给换了,包括adobe全家桶、UE、3dsMax、Maya、JB家的几个,(Office想换没换成功,找了很久没找到方法,不知道有没大佬知道) …

在阿里云上部署Springboot项目

文章目录 环境准备1.安装jdk2.安装mysql3.开启端口 上传项目1.数据库上传2.项目上传 环境准备 1.安装jdk 查看系统中原来是否含有java环境 rpm -qa |grep java rpm -qa |grep jdk rpm -qa |grep gcj其中,gcj是一个轻巧的,性能优越的Java语言编译器。它…

SpringSecurityOAuth2 中 Miss grant type问题

SpringSecurityOAuth2 登录传值的时候会出现 Miss grant type问题 没有设置content-type问题 Content-Type: application/x-www-form-urlencoded 解决

timingPath/set_data_check和set_max_delay/set_multicycle_path

目录 0.timing path 1.set_data_check 1.1set_data_clk约束cdc path 1.2 set_data_check和set_max_delay区别和使用场景 2.set_mulicycle_path 0.timing path timing path的概念: start和end不只是reg的CP和REG的D pin 还可以是mem的D/Qpin和 port port--&…

大模型AI时代哪类人相对更「安全」

最近随着人工智能技术的发展,越来越多的工作被AI智能自动化取代,这导致了许多人失去了TA们的工作。这些人被视为首批因人工智能失业的人。虽然这些人的失业是非常令人遗憾的,但是我们可以从中获得一些启示,以应对未来可能出现的类…

颠覆你的认知,不用开通Plus会员也可以使用ChatGPT的插件功能(兼容3.5)

在看到这篇文章之前,你可能以为只有GPT4.0才能使用插件。但事实上,早就有人基于3.5开发了一套完整的插件体系了,不但可以使用插件,还可以自己开发插件。插件使用的就是JavaScript语法,开发起来可以说是相当简单了。 注…

excel中函数vlookup使用方法

1、VLOOKUP函数是Excel中的一个纵向查找函数,它与 LOOKUP函数和 HLOOKUP函数属于一类函数,在工作中都有广泛应用。VLOOKUP是按列查找,最终返回该列所需查询列序所对应的值;与之对应的HLOOKUP是按行查找的。接下来以5位同学成绩表为…

路径规划算法:基于吉萨金字塔建造优化的路径规划算法- 附代码

路径规划算法:基于吉萨金字塔建造优化的路径规划算法- 附代码 文章目录 路径规划算法:基于吉萨金字塔建造优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍…

pytorch—实现各种注意力

1.什么是Attention 所谓Attention机制,便是聚焦于局部信息的机制,比如图像中的某一个图像区域。随着任务的变化,注意力区域往往会发生变化。 面对上面这样的一张图,如果你只是从整体来看,只看到了很多人头&#xff0c…

JAVA ORM Bee 2.1.6 更简单,更易用;一行代码,即可完成一个表的 Sharding 分片配置

在一个工程里,同时使用 Mongodb 和 MySQL, 可以吗? 不但可以,还可以使用一套 Dao 的代码。 Java ORM Bee 不但支持 JDBC 类型的数据库,还支持 Mongodb, 也支持 Android, 鸿蒙. 最新功能介绍: V2.1.6 (2023・父亲节版) 1. 添加…

软件设计模式与体系结构-软件体系-调用-返回风格软件体系结构

目录 软件体系结构概述概述 一、调用-返回风格软件体系结构概念代码主程序-子程序软件体系结构自顶向下的设计方法的问题结构化设计的优缺点面向对象体系结构面向对象设计的优缺点主程序-子程序与面向对象体系结构相似差异 课程作业 软件体系结构概述 调用-返回风格软件体系结…

为什么现在原生家庭的问题这么严重?

匿名用户 191 人赞同了该回答 换一个玄学的角度来看这个问题,之前看b站,有一个up主说,中国有历史记载的人口数一直都很稳定,7-8千万到1亿左右,明朝2亿,清朝到民国算是增长比较多的,有4亿&#x…

内网隧道代理技术(十一)之公网资产扫描-代理池配置

公网资产扫描-代理池配置 代理池介绍 代理池的意思就是拥有多个代理可以随意切换IP的东西,每次用户的请求通过代理池,每个请求包的IP地址是不同的,那么代理池一般有几种用法呢? 购买代理池,购买的东西会自动切换IP,简单又方便(大力推荐)有些工具可以支持文本代理的方…

SpringMVC跨域写入Cookie

前后端分离的项目,SpringMVCTomcat(SpringBoot),前端Vueaxios。 不建议后端去写入Cookie,一般都是在前端写入Cookie,如果后端使用:CrossOrigin(origins "http://localhost", allowCredentials "true…

unity物理系统

物理引擎即描述真实世界中物理现象的算法,如刚体物理,软体物理和流体物理,unity本身支持的主要为刚体物理,我们也可以自己编写一些其它的模拟效果。 unity内置Nvidia开发的Physx引擎(3D)和一个开源引擎Box…

【运维知识进阶篇】Zabbix5.0稳定版详解10(Zabbix自动注册+Ansible自动部署,实现一条命令监控任意主机)

当我们的Zabbix自动注册Ansible自动部署在一起时,会碰出什么样的火花,答案就是可以实现执行ansible的一条命令,监控任意一台或多台主机。 目录 一、配置好自动注册规则 二、编写Ansible playbook 三、运行Ansible,查看监控效果…

从零开始 Spring Boot 64:Hibernate 标识符

从零开始 Spring Boot 64:Hibernate 标识符 图源:简书 (jianshu.com) Hibernate 中的实体,由标识符(Identitifier)确定了其实体实例的唯一性,这对应于表中的主键。 Id 对于单一属性作为标识符的情况&…

Web3与AI:数字时代安全隐私交易的未来

AI+web3=下一个热门赛道? 在数字时代的浪潮中,Web3和人工智能(AI)成为了两个备受关注的前沿技术。Web3代表着下一代互联网,强调去中心化、透明和用户控制的特点。而人工智能作为一种智能化的技…

【LeetCode】503. 下一个更大元素 II

503. 下一个更大元素 II(中等) 方法:单调栈 「 对于找最近一个比当前值大/小」的问题,都可以使用单调栈来解决。栈可以很好的保存原始位置,最近影射栈顶。题目要求更大,因此更大即解–出栈,更小…

【leetcode】15.三数之和(python+转为两数之和+去重)

class Solution(object):def threeSum(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""# 思路:转为两数之和# for循环遍历先固定一个数字a,寻找另外两个数字之和-a(双指针)# 难点…