作者:启明星辰ADLab
2017年9月6日,安全公司赛门铁克发布消息称,著名俄罗斯黑客组织“Dragonfly”近期活动更加频繁。“Dragonfly”是一个专门以能源电力机构、ICS设备制造厂商、石油管道运营商等为攻击目标的黑客组织,该黑客组织曾经攻击过法国、德国、意大利、波兰、土耳其、美国等欧美国家的能源公司。该黑客组织自2010年开始活跃,直到2014年被该公司披露后,一度停止了攻击活动。最近发现的“Dragonfly”从攻击目的和恶意代码技术上都有所提升,被称为“蜻蜓二代”或者“Dragonfly2.0”。目前的证据表明,实际上蜻蜓二代在2015年12月份就已经有了活动迹象。
蜻蜓二代“Dragonfly2.0”和一代一样,使用多种攻击方式(恶意电子邮件、水坑攻击和合法软件捆绑)对目标进行渗透并植入恶意代码。
蜻蜓二代攻击组件简单描述如下:
Backdoor.Dorshel组件采用逃避框架Sheller处理过的恶意代码,实现其他恶意组件的下载执行;
Trojan.Karagany.B组件为Trojan.Karagany(蜻蜓一代中出现)的升级版,原始文件名为“install_flash_player.exe”,其伪装成为Flash更新,黑客组织可能通过社交网络或者水坑式攻击提供Flash更新链接,诱使受害者点击运行,该组件能够感染系统并常驻于系统,并且还具有窃密文件回传、远程执行任意命令、下载扩展组件执行等功能;
Trojan.Heriplor组件为该黑客组织专用后门,第一代和第二代都有出现,用于下载恶意组件执行;
Trojan.Listrix组件主要用于收集受害者主机信息,其中包含计算机名称、用户名称、文件列表、进程列表、操作系统版本、CPU信息等;
Hacktool.Credrix组件可用于窃取用户凭证及其他敏感信息;
Backdoor.Goodor组件常驻于受害者主机,以实现额外组件的下载和执行;
Trojan.Phisherly组件会以邮件的形式进行传播,主要用于窃取用户凭证。
本文先对 Backdoor.Dorshel
和Trojan.Karagany.B
组件进行详细的技术剖析,剩下的组件我们将会在后续的篇幅中进行分析阐述。
该组件通过 Sheller 逃避框架进行了代码处理,在一定程度能够躲避安全软件的监控。该框架将真实恶意代码执行点切入到预执行代码中执行,而在真实的入口函数中实现一些无害代码,比如创建窗口程序执行正常合法行为。
我们通过分析发现,恶意代码的运行时库初始化代码被做了劫持,被劫持的函数为多线程初始化函数_mtinit
中的__calloc_crt
函数。如下图中所示,正常CRT代码应该调用__calloc_crt
函数。
因此,在恶意代码的 WinMain 函数运行之前,恶意代码会首先得到执行,创建线程执行连接黑客C&C服务器,下载恶意组件执行。线程启动完成后,该段劫持代码执行流程会通过 PUSH-RET 的方式跳转 0x4036b6 的__calloc_crt
函数,最后跳回到原始的多线程初始化代码中执行,直到 WinMain 函数得到执行。
恶意线程通过PEB动态初始化要调用的系统API函数,接着连接C&C服务器 103.41.177.69 发送 HTTPS GET 请求,请求链接为https://103.41.177.69/A56WY
。
如果连接失败,恶意代码会进行10次重连(该C&C服务器当前已经不能连接);连接成功,则会提取有效载荷并加载到内存中运行。
该组件伪装成为 Flash 更新文件,黑客组织可能通过社交网络或者水坑式攻击提供 Flash 更新链接,诱使受害者点击运行,该组件以感染系统、常驻系统以及下载扩展组件执行为目的。此外该组件还会用于目标主机信息的获取,而C&C服务器会根据这些情报信息下发不同的 payload 给该组件执行。
该组件内置有一个加密的PE完整镜像数据,被存储于地址 0x41f000 处。组件执行后会解密该 PE 数据,通过 PE 结构定位到 PE 入口后执行入口函数。
内置 PE 代码得到执行后,如果当前执行文件路径不为 STService,则会对受害主机实施感染操作:检测当前进程是否以 STService 名称运行,如果不是则将自身拷贝到 Application Data 目录的 STService/STService.exe
,并以 ST Service Scheduling 为参数运行,在恶意代码将自身拷贝到 STService 目录时,会修改文件时间,并设置文件属性为系统隐藏。
否则启动恶意线程工作,首先收集受害主机信息,其中包含用户名称、操作系统版本号、架构、安装日期等信息,并将这些信息拼接在一起。这些信息一则用着互斥事件(Event对象)名称,来保证每次只有一个实例在主机上运行,二则会被回传到控制端服务器实现恶意组件的上线功能。
然后,通过利用 COM 接口在开始菜单的启动文件夹下创建快捷方式来实现自启动。
完成感染后,该组件会重新启动并且以 STService 进程运行,接着就会循环创建 320 个线程,其中有一个线程是用来了与远程地址通信,其他线程不断的执行申请内存、写入11111111、释放内存等操作,可能用于干扰内存监视工具。
恶意代码的配置信息以加密字符串形式存储,其中以$$$开始,以###作为分隔,解密方法为 xor,但每个配置信息 xor 的 key 不同。
该组件首先连接默认 C&C 为 37.1.202.26,向其提交本地的基本信息并且获取控制命令,如果无法成功完成该 C&C 的上线和控制命令的获取,该恶意组件会使用备用 C&C。判断默认C&C上线是否成功的依据是响应的数据中是否包含有“uE4GMN”
,如果包含则表示成功,否则表明失败。在默认 C&C 上线失败的情况下,恶意代码会判断状态标志文件“%APPDATA%\STService\status_svr.txt”
,如果该文件存在,则使用备用 C&C 进行上线和控制命令的获取。
首先,根据本机信息来实现url和请求参数的构造,构造明文数据如下:
其中的getimage/830411.gif
为 url 地址,di59d=23947132339773951032&zv=15a0718¶m=635
为根据本机信息拼接成的字符串。
url格式化串为:
[配置信息中的上线包路径getimage]/%d%d[.jpg|.png|.gif]
数据格式化串为:
%si%dd=%d[本机信息字符串]&%sv=%d%s[配置信息中的标记0718]¶m=%d。
恶意代码会对数据信息进行加密,并通过base64编码,在转换成url编码。
上图为di59d=23947132339773951032&zv=15a0718¶m=635
加密后的十六进制数值。随后通过编码转化后的请求参数如下:
最后,恶意代码添加HTTP请求头,通过https协议的方式实现上线请求及控制命令的获取。
当远程服务器成功响应数据后,恶意代码组件会根据服务器返回的内容执行指定操作,包括下载执行其他组件、进行卸载等。
注:其中上传文件是通过监控线程实现,恶意代码将控制端返回的指定路径的文件拷贝到C:\Documents and Settings\Lorz\Application Data\Update\Tmp\
目录,然后监控线程会将该目录下的文件上传到控制端服务器。
恶意代码运行过程中会创建线程监控"C:\Documents and Settings\Lorz\Application Data\Update\Tmp\*.*"
目录,如果发现该目录下存在文件,则读取文件内容进行上传。其中上传的 url 路径为/upload/[rand][.jpg/.png/.gif]
,其中的upload来自解密后的配置信息(由fdyyvw解密出来),恶意代码会从.jpg、.png、.gif、中随机选取作为上传服务器目标路径。
本报告对蜻蜓二代“Dragonfly2.0”的其中两个组件 Backdoor.Dorshel 和 Trojan.Karagany.B 进行了深入完整的剖析,后续启明星辰ADLab会对蜻蜓二代剩下的组件进行一一分析,敬请期待。
启明星辰积极防御实验室(ADLab)
ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员。截止目前,ADLab通过CVE发布Windows、Linux、Unix等操作系统安全或软件漏洞近300个,持续保持亚洲领先并确立了其在国际网络安全领域的核心地位。实验室研究方向涵盖操作系统与应用系统安全研究、移动智能终端安全研究、物联网智能设备安全研究、Web安全研究、工控系统安全研究、云安全研究。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。