2023年年初,360netlab团队发布了一篇文章《警惕:魔改后的CIA攻击套件Hive进入黑灰产领域》,文章中讲述了攻击者利用CIA被泄露的Hive项目源码,魔改了CIA组织下的Hive攻击套件,攻击者不仅对木马通信流量做了进一步的防护,还在原始代码基础上增加了不少功能指令。
再次回顾,其实Hive攻击套件源码早在2017年就被维基解密(WikiLeaks)公开,公开资料中输出了HIVE项目早期版本的部分源代码及可执行程序,同时也介绍了HIVE项目是一款CIA内部使用的远程植入木马,由EDB部门开发,使用HTTPS协议进行通信,主要用于控制目标机器并窃取敏感信息。
虽然离Hive项目泄露源码的时间已经过了好几年,但本着技术研究与从全球最顶尖木马攻击套件中学习的态度,笔者从如下几个角度对CIA Hive项目进行了研究:
基于Hive平台泄露源码,模拟复现CIA Hive攻击套件的生产编译环境:通过构建交叉编译环境,笔者可自由构建适用于mt-x86、mt-mips、mt-mipsel、mt-ppc、linux-x86、sol-x86、sol-sparc等平台的不同架构样本;
基于泄露资料及新编译的Hive攻击套件,模拟复现CIA Hive攻击套件的攻击场景:server木马可隐秘运行于受控主机中,只有当接收到来自client端的“暗语”数据包时,才会开启网络行为进行木马上线;(“暗语”数据包:从国家计算机病毒应急处理中心发布的《美国中央情报局(CIA)“蜂巢”恶意代码攻击控制武器平台分析报告 ——关于美国中情局主战网络武器的预警》文章中引用)
基于逆向分析、数据包加解密等技术,模拟当发现CIA Hive攻击套件行为时,如何从数据包角度对CIA Hive攻击套件攻击行为链还原:对CIA Hive攻击套件中使用的加解密算法进行详细剖析对比,对加密密钥提取提出笔者的思考;
在网络中有很多关于CIA Hive平台泄露资料的分析文章,大家可自行查阅,并自行从泄露项目中提取不同分支版本代码,相关截图如下:
成功提取CIA Hive攻击套件源码后,笔者对源码进行了剖析,发现在client、server、ilm-client、common目录中均存在Makefile文件,且common目录中的Makefile文件即用于编译适用于mt-x86、mt-mips、mt-mipsel、mt-ppc、linux-x86、sol-x86、sol-sparc等系统的server端程序,相关截图如下:
进一步对common目录中的Makefile文件进行分析,发现此Makefile文件主要用于对编译代码所需要的编译器进行配置,从Makefile文件中提取分析出此项目使用buildroot(用于嵌入式系统的开源工具集,它可以自动化构建嵌入式Linux系统)构建交叉编译工具链,相关截图如下:
大致清楚了此项目的交叉编译环境框架后,尝试模拟构建buildroot交叉编译环境对项目源码进行编译,详细操作流程如下:
构建buildroot交叉编译环境的操作步骤很简单,但是构建过程却不是很顺利,笔者也是尝试了很多次之后,才把buildroot交叉编译环境构建成功。
由于源码中使用的buildroot版本为“buildroot-2010.11-x86”,为避免后续编译源码过程中,由于版本不对应导致异常情况产生,因此笔者选择了32位操作系统及折中版本的buildroot进行尝试;笔者实际使用的编译环境操作系统为“ubuntu 16.04 LTS 32位”,buildroot版本为“buildroot-2017.11.tar.gz”,buildroot交叉编译工具可从“https://buildroot.org/downloads/”网站下载。
buildroot交叉编译环境构建步骤如下:
基础库环境配置
在构建buildroot交叉编译环境时,由于缺少部分库环境,会导致编译失败,因此可提前将部分库环境安装。
sudo apt-get install build-essential libncurses5-dev bison flex texinfo zlib1g-dev gettext libssl-dev autoconf gcc-multilib
相关截图如下:
配置buildroot
在正式编译前,需要先配置buildroot,可使用如下命令进行编译配置。
make menuconfig
相关截图如下:
配置菜单中,各选项卡的功能含义如下:
选项菜单 | 功能含义 |
---|---|
Target options | 目标选项:这个选项卡包含了一些目标平台和架构相关的配置选项,比如目标处理器架构、目标设备型号等。 |
Build options | 构建选项:这个选项卡包含了一些构建过程相关的配置选项,比如构建方式、并行编译选项等。 |
Toolchain | 工具链:这个选项卡用于配置交叉编译工具链的相关选项,比如选择工具链类型、路径设置等。 |
System configuration | 系统配置:这个选项卡包含了一些系统基本配置选项,比如 root 文件系统类型、init 系统选择等。 |
Kernel | 内核:这个选项卡用于配置 Linux 内核相关的选项,比如选择内核版本、配置内核参数等。 |
Target packages | 目标软件包:这个选项卡是用来选择和配置要构建到目标系统中的软件包的。 |
Filesystem images | 文件系统镜像:这个选项卡用于配置生成的文件系统镜像的格式和内容,比如选择文件系统格式、添加额外的文件等。 |
Bootloaders | 引导加载程序:这个选项卡用于配置引导加载程序相关的选项,比如选择引导加载程序类型、配置引导加载程序参数等。 |
通过对比,重点对Target options选项进行配置,即可满足基本编译需求,相关截图如下:
编译buildroot
使用如下命令即可开始编译,编译过程会很费时间,可能会耗费几个小时,因为整个buildroot工具包只有5MB左右大小,因此在编译过程中,需要大量下载编译第三方库。而且编译过程中可能会出现异常情况,处理异常过程可能会使编译时间再次延长。(小技巧:可尝试构建代理环境,可有效提升第三方库的下载速度)
make
相关截图如下:
编译输出文件
编译成功后,buildroot将把最终生成的文件存放于output目录下,output目录下将生成4个目录,用于存放不同的数据。
目录 | 含义 |
---|---|
images | 用于存放生成的系统镜像文件。其中可能包括根文件系统镜像、内核镜像、引导加载程序镜像等。这些镜像文件可以直接烧录到目标设备的存储介质上,用于启动和运行最终的嵌入式系统。 |
host | 用于存放Buildroot 在构建过程中生成的主机工具链(host toolchain)。主机工具链是用来在开发主机上编诨和运行目标系统的工具集合,比如交叉编译器、调试器等。 |
staging | 用于存放交叉编译后的目标系统的基本文件结构,包括头文件、库文件和符号链接等。这些文件可以用来作为目标系统的基础文件系统,或者供开发人员进行交叉编译应用程序时使用。 |
target | 用于存放目标系统的完整文件系统。这个文件系统可以直接复制到目标设备的存储介质上,并配合相应的内核镜像和引导加载程序镜像来启动和运行最终的嵌入式系统。 |
通过对比,重点对host目录进行关注,我们所需的交叉编译器均在其中,相关截图如下:
备注:由于client端程序可直接基于操作系统自带的编译器进行编译,因此不需要修改Makefile文件即可正常编译程序。
首先进入client目录,通过执行make命令可查看详细编译参数,相关截图如下:
根据提示梳理支持的命令如下:
make linux-x86 #编译32位client程序
make linux-x86_64 #编译64位client程序
make patcher #需要将所有支持版本server程序构建好后才能执行构建
make DEBUG=1 linux-x86 #编译32位dbg版本的client程序
make clean #清理构建过程中产生的中间文件
make distclean #将构建环境完全恢复到初始状态
client程序构建成功后截图如下:
执行make linux-x86命令后,默认将构建2个ELF可执行文件,2个md5校验文件,相关截图如下:
备注:由于server端程序需要交叉编译,因此需要修改server端的Makefile文件才能正常编译server程序。
首先进入server目录,通过执行make命令可查看详细编译参数,相关截图如下:
根据提示梳理支持的命令如下:
#编译对应架构的server程序
make linux-x86
make linux-x86_64
make mikrotik-x86
make mikrotik-mips
make mikrotik-ppc
make ubiquiti-mips
make avtech-arm
#编译对应版本的dbg版本程序
make DEBUG=1 <target> For symbols only
make DEBUG=2 <target> Hive debug code
make DEBUG=3 <target> Hive and PolarSSL debug code
make clean #清理构建过程中产生的中间文件
make distclean #将构建环境完全恢复到初始状态
修改Makefile文件
在编译linux-x86下的server程序时,需要重新配置common目录下的Makefile-include.linux-x86文件,相关截图如下:
编译server程序
修改完Makefile文件后,直接执行“make linux-x86”指令,即可实现对server程序的编译,相关截图如下:
执行”make linux-x86“命令后,默认将构建1个ELF可执行文件,1个md5校验文件,相关截图如下:
异常处理
在编译过程中,可能会出现以下报错,提示找不到i586-linux-sstrip文件,相关截图如下:
通过对比,发现buildroot目录下确实没有此文件,因此,笔者尝试了多种解决办法,最终发现可基于ELFkickers工具包(用于处理ELF文件的实用程序)编译生成sstrip文件,然后将生成的sstrip文件拷贝至报错文件处即可,相关操作流程如下:
#编译生成sstrip文件
xxx@ubuntu:~/Desktop$ tar -zxvf ELFkickers-3.2.tar.gz
......
xxx@ubuntu:~/Desktop$ cd ELFkickers-3.2/
xxx@ubuntu:~/Desktop/ELFkickers-3.2$ ls
bin COPYING ebfc elfrw infect Makefile objres rebind
Changelog doc elfls elftoc INSTALL MANIFEST README sstrip
xxx@ubuntu:~/Desktop/ELFkickers-3.2$ make
......
xxx@ubuntu:~/Desktop/ELFkickers-3.2$ ls bin/
ebfc elfls elftoc infect objres rebind sstrip
xxx@ubuntu:~/Desktop/ELFkickers-3.2$
#处理异常
xxx@ubuntu:~/Desktop/ELFkickers-3.2$ sudo cp ./bin/sstrip /opt/buildroot-2017.11/output/host/usr/bin/i586-linux-sstrip
xxx@ubuntu:~/Desktop/ELFkickers-3.2$
通过构建mips架构交叉编译器,即可正常编译mips架构下的server程序。
buildroot下host目录输出截图如下:
Makefile文件截图如下:
编译成功后,相关截图如下:
通过构建sparc架构交叉编译器,即可正常编译sparc架构下的server程序,由于makefile中没有solaris-sparc选项,因此直接对Makefile-include.linux-x86文件进行修改也可成功编译sparc架构下的server程序。
buildroot下host目录输出截图如下:
Makefile文件截图如下:
编译成功后,文件信息截图如下:
通过分析,发现泄露源码中snapshot_20141017-1409、snapshot_20141217-1052、snapshot_20141107-1345目录下存在可执行程序,尝试对其进行模拟复现,发现无法直接运行成功,进一步对其进行剖析,发现是由于可执行程序版本、证书过期等多方面原因导致其无法成功运行。
进一步梳理CIA Hive攻击套件的使用方法,详细情况如下:
由于内置的SSL证书存在过期等问题,因此需要对证书文件进行更新,相关指令截图如下:
openssl genrsa -out ca.key 2048
openssl req -new -key ca.key -out ca.csr
openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -days 365 -in server.csr -out server.crt
rm ca.csr ca.key ca.srl server.csr
CIA Hive攻击套件支持两种方式进行木马上线:
使用hive-patcher程序生成内置命令行的server端程序;(通过测试,发现hive-patcher文件中内置了各架构server程序,因此单独运行即可输出server程序)
使用命令行方式直接运行server端程序;