在上一篇《NSA组织“二次约会”间谍软件功能复现及加解密分析》文章中,笔者对“二次约会”v1.1.1.1样本的功能进行了复现,以及对其网络通信模型中所涉及的加解密算法进行了详细的剖析,最终成功编写解密脚本实现对“二次约会”v1.1.1.1样本通信流量的解密还原。
因此,在上一篇文章的基础上,笔者将继续对“二次约会”间谍软件进行剖析,并从如下几个方面开展技术研究:
通过对泄露资料进行梳理,笔者共提取32个“二次约会”间谍软件:
详细梳理情况如下:
通信协议 | 通信载荷长度 | Client文件名 | Implant文件名 | 备注 |
---|---|---|---|---|
UDP | 1048 | Seconddate_CnC | Seconddate_Implant | v1.1.1.1 |
UDP | 1060 | seconddate_Client_1.3.0.1_UNKNOWN | seconddate_ImplantStandalone_1.3.0.1_linux | |
UDP | 1060 | seconddate_Client_1.5.1.2_UNKNOWN | seconddate_ImplantStandalone_1.5.1.2_linux | |
UDP | 1060 | seconddate_Client_1.5.1.3_UNKNOWN | seconddate_ImplantStandalone_1.5.1.3_linux | |
UDP | 1060 | seconddate_Client_1.6.2.3_UNKNOWN | seconddate_ImplantStandalone_1.6.2.3_linux | |
UDP | 56 | seconddate_Client_1.7.0.3_UNKNOWN | seconddate_ImplantStandalone_1.7.0.3_trunklien | freebsd |
UDP | 56 | seconddate_Client_1.7.0.3_UNKNOWN | seconddate_ImplantStandalone_1.7.0.4_trunklien | freebsd |
UDP | 60 | seconddate_CommonClient_Revoked_2.0.1.1 | ||
UDP | 不定长 | seconddate_CommonClient_1.1.4.0_seconddatecnc_i386-linux | ||
UDP | 不定长 | seconddate_CommonClient_3.0.3.3_configuration_i386-linux | seconddate_ImplantStandalone_3.0.3.1_remote_i386-linux | |
UDP | 不定长 | seconddate_CommonClient_3.0.3.3_configuration_i386-linux | seconddate_ImplantStandalone_3.0.3.2_remote_x86_64-linux | |
UDP | 不定长 | seconddate_CommonClient_3.0.3.3_configuration_i386-linux | seconddate_ImplantStandalone_3.0.3.3_remote_i386-freebsd | freebsd |
UDP | 不定长 | seconddate_CommonClient_3.0.3.3_configuration_i386-linux | seconddate_ImplantStandalone_3.0.3.4_remote_x86_64-freebsd | freebsd |
UDP | 不定长 | seconddate_CommonClient_3.0.3.3_configuration_i386-linux | seconddate_ImplantStandalone_3.0.3.5_remote_sparc-solaris | solaris |
UDP | 不定长 | seconddate_CommonClient_3.0.3.3_configuration_i386-linux | seconddate_ImplantStandalone_3.0.3.6_remote_i386-solaris | solaris |
UDP | 不定长 | seconddate_CommonClient_3.1.0.2_i386-linux | seconddate_ImplantStandalone_3.1.0.2_i386-junos-8.5-abovetrunklien | freebsd |
UDP | 不定长 | seconddate_CommonClient_3.0.3.3_configuration_i386-linux | seconddate_ImplantStandalone_3.1.1.2_i386-junos-8.5-abovetrunklien | freebsd |
通过分析,每次启动控制端后,发送的通信载荷长度均为不相同的随机长度。
相关截图如下:
通过对已掌握的17个控制端程序进行分析,发现部分版本控制端程序实际上调用的是其他版本控制端程序,因此进一步梳理,共提取10个不同的控制端程序,对比分析情况如下:
详细对比情况如下:
Client文件名 | 支持指令 | 指令数 |
---|---|---|
Seconddate_CnC | clearlog、disable、enable、getinfo、getlog、help、ping、quit、rule、showrule、uninstall | 11 |
seconddate_Client_1.3.0.1_UNKNOWN | clearlog、commit、disable、enable、getinfo、getlog、help、ping、quit、rule、showrule、uninstall | 12 |
seconddate_Client_1.5.1.2_UNKNOWN | clearlog、commit、disable、enable、getinfo、getlog、help、ping、quit、rule、showrule、uninstall | 12 |
seconddate_Client_1.5.1.3_UNKNOWN | clearlog、commit、disable、enable、getinfo、getlog、help、ping、quit、rule、showrule、uninstall | 12 |
seconddate_Client_1.6.2.3_UNKNOWN | clearlog、commit、disable、enable、getinfo、getlog、help、ping、quit、rule、showrule、uninstall | 12 |
seconddate_Client_1.7.0.3_UNKNOWN | channel、clearlog、commit、disable、enable、exit、getinfo、getlog、getrule、help、ping、quit、rule、rulewizard、showrule、uninstall | 16 |
seconddate_CommonClient_Revoked2.0.1.1 | clearlog、commit、disable、enable、exit、getinfo、getlog、getrule、help、network、ping、quit、rule、showrule、sync、uninstall | 16 |
seconddate_CommonClient_1.1.4.0_seconddatecnc_i386-linux | clearlog、commit、disable、enable、delete、exit、getinfo、getlog、getrule、help、network、ping、quit、rule、showrule、sync、uninstall、fin、rekey | 19 |
seconddate_CommonClient_3.0.3.3_configuration_i386-linux | clearlog、commit、disable、enable、delete、exit、getinfo、getlog、getrule、help、network、ping、quit、rule、showrule、sync、uninstall、fin、rekey | 19 |
seconddate_CommonClient_3.1.0.2_i386-linux | clearlog、commit、disable、enable、delete、exit、getinfo、getlog、getrule、help、network、ping、quit、rule、showrule、sync、uninstall、fin、rekey | 19 |
通过对“二次约会”间谍软件新老版本进行简单对比分析,发现:
通过分析,发现在“二次约会”间谍软件的老版本中,间谍软件将调用pcap_findalldevs、pcap_open_live、pcap_compile、pcap_setfilter、pcap_next等函数实现数据包捕获功能:
相关代码截图如下:
通过分析,发现在“二次约会”间谍软件的老版本中,间谍软件将调用pcre_compile、pcre_exec等函数匹配特定数据包。
相关代码截图如下:
通过分析,发现在“二次约会”间谍软件的老版本中,间谍软件将调用libnet_build_data、libnet_build_tcp、libnet_build_ipv4、libnet_build_ethernet、libnet_write等函数实现特定网络会话劫持篡改功能:
相关代码截图如下:
通过分析,发现1048/1060通信载荷间谍软件共支持如下几个远控指令,详细情况如下:
指令 | 指令编号 | 功能说明 | 备注 |
---|---|---|---|
help or ? | 帮助说明 | ||
quit or exit | 退出 | ||
ping | 1 | 测试木马通信是否畅通 | |
rule [rulenum] [opts ...] | 2 | 配置规则 | |
enable [rulenum] | 3 | 启用规则 | |
disable [rulenum] | 4 | 关闭规则 | |
showrule [--all or rulenum] | 5 | 显示规则详情 | |
getlog [--log logfile ] [entrynum] | 6 | 获取规则触发日志 | |
getinfo | 7 | 获取程序基本信息及规则触发概要信息 | |
uninstall | 8 | 卸载程序 | |
9 | 第一次执行指令时 | ||
clearlog | 10 | 清除规则触发日志 | |
commit | 11 | 永久存储配置规则 | v1.1.1.1版本后新增 |
通过分析,发现1048/1060通信载荷间谍软件的网络通信需要层层加密、层层校验,才能成功提取有效载荷数据,因此,在剖析1048/1060通信载荷间谍软件具体指令的网络通信模型前,笔者先对通信数据包的多层通信数据结构进行详细剖析,详细情况如下:
#通信数据包的数据结构 ------------------------------------------------ | 第一层加密 | | | 数据头:12字 | 第一层加密数据:1036字节 | | 节校验数据 | | ------------------------------------------------ | 8字节 | | | IV值 | 第二层加密数据:1028字节| | | | ----------------------------------- | 8字节 | | | 校验 | 有效数据载荷: | | 数据 | 1020字节 | -------------------------- 第一层加密数据头:12字节校验数据 output[:4] : 1.用于校验(output[:4]- 0x61E57CC6);2.用作第一层数据解密的异或key; output[4:8] : 1.用于校验(output[:4]- 0x61E57CC6 + output[4:8]等于0) output[8:0xc] : 1.用于校验第一层解密后的数据是否正确,第一层解密后的数据按4字节循环异或后的结果等于output[8:0xc] 8字节IV值 用于RC6算法运算 8字节校验数据 output[:4] : 固定值:0x9e1a833a output[4:8] : 序列号,控制端程序启动时随机生成,每次指令交互后加1
第一层加密数据头数据校验代码截图如下:
8字节校验数据代码截图如下:
通过分析,发现每次启动控制端程序后,第一次运行任何一个指令时,均会在执行对应指令代码前执行指令9。
相关代码截图如下:
通信数据详情:
#发送数据--192.168.184.128->192.168.184.129 9e1a833a #固定值 5bb2dc00 #序列号 00000009 #指令 ...1016字节随机数据... #返回数据--192.168.184.129->192.168.184.128 9e1a833a #固定值 5bb2dc00 #序列号 80000009 #指令返回时,将指令数据与0x80000000做或运算 ...1016字节:与发送数据相同...
相关代码截图如下:
指令运行情况如下:
SECONDDATE> ping [#] Mon, 06 Nov 2023 18:00:02 +0800 OK. SECONDDATE>
通信数据详情:
#发送数据--192.168.184.128->192.168.184.129 9e1a833a #固定值 5bb2dc01 #序列号,每次指令交互后加1 00000001 #指令 ...1016字节00数据... #返回数据--192.168.184.129->192.168.184.128 9e1a833a #固定值 5bb2dc01 #序列号,每次指令交互后加1 80000001 #指令 ...1016字节:与发送数据相同...
此指令为“二次约会”间谍软件的核心功能代码,通过分析此指令,发现此指令支持如下配置参数:
被控端相关代码截图如下:
指令运行情况如下:
SECONDDATE> rule 1 --dstport 2345 --maxinjections 2 --injectwindow 600 --nocheckregex --injectfile /root/Desktop/response [#] Fri, 10 Nov 2023 10:21:43 +0800 OK. SECONDDATE>
通信数据详情:
#发送数据--192.168.184.128->192.168.184.129 9e1a833a #固定值 5bb2dc02 #序列号,每次指令交互后加1 00000002 #指令 00000000 00000000 00 #g_sdLog_num 01 #checkhttp_or_nocheckhttp 00 #checkregex_or_nocheckregex 19 #tcpflag 00000000 #rulenum 00000000 #srcaddr 00000000 #srcmask 00000000 #dstaddr 00000000 #dstmask 0006 #protocol 0000 #srcport 0929 #dstport 0000 0000003c #mininterval 00000002 #maxinjections 00000258 #injectwindow 00000094 #len_injectfile 00000000 00000000 00000000 00000000 #regexfile-256字节 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000 #injectfile-512字节 485454502f312e3120323030204f4b0a436f6e74656e742d547970653a20746578742f68746d6c0a436f6e74656e742d4 c656e6774683a2038370a0a3c68746d6c3e3c626f64793e48656c6c6f20576f726c6421213c62723e3c62723e54657374 205365636f6e64646174655f436e4320546f6f6c7321213c62723e3c2f696672616d653e3c2f626f64793e3c2f68746d6 c3e0a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 #... 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000 #返回数据--192.168.184.129->192.168.184.128 9e1a833a #固定值 5bb2dc02 #序列号,每次指令交互后加1 80000002 ...1016字节:与发送数据相同...
响应数据包截图如下:(与规则配置中的内容吻合)
此指令运行后,样本将对全局变量g_ruleCount值加1,g_ruleCount值用于判断是否进入后续会话劫持代码。
相关代码截图如下:
指令运行情况如下:
SECONDDATE> enable 1 [#] Sat, 11 Nov 2023 20:48:02 +0800 OK. SECONDDATE>
通信数据详情:
#发送数据--192.168.184.128->192.168.184.129 9e1a833a #固定值 5bb2dc03 #序列号,每次指令交互后加1 00000003 #指令 ...1016字节00数据... #返回数据--192.168.184.129->192.168.184.128 9e1a833a #固定值 5bb2dc03 #序列号,每次指令交互后加1 80000003 ...1016字节:与发送数据相同...
相关代码截图如下:
指令运行情况如下:
SECONDDATE> disable 1 [#] Sat, 11 Nov 2023 20:48:17 +0800 OK. SECONDDATE>
通信数据详情:
#发送数据--192.168.184.128->192.168.184.129 9e1a833a 5bb2dc09 00000004 ...1016字节00数据... #返回数据--192.168.184.129->192.168.184.128 9e1a833a 5bb2dc09 80000004 ...1016字节:与发送数据相同...
相关代码截图如下:
指令运行情况如下:
SECONDDATE> showrule 1 [#] Fri, 10 Nov 2023 10:22:57 +0800 Rule: 1 Enabled: yes Src Addr: 0.0.0.0 Src Mask: 0.0.0.0 Dst Addr: 0.0.0.0 Dst Mask: 0.0.0.0 Protocol: 6 Src Port: 0 Dst Port: 2345 Min Interval: 60 Max Inject: 2 Inject Window: 600 Inject Length: 148 TCP Flags: --- ACK PSH --- --- FIN Check HTTP: yes Custom Regex: no Next Injection Time: 41 Injection Window End Time: 540 Current Injections: 1 Total Injections: 1 Regex Pattern: [ BEGIN ] (NULL) [ END ] Inject Text: [ BEGIN ] HTTP/1.1 200 OK Content-Type: text/html Content-Length: 87 <html><body>Hello World!!<br><br>Test Seconddate_CnC Tools!!<br></iframe></body></html> [ END ] SECONDDATE>
通信数据详情:
#发送数据--192.168.184.128->192.168.184.129 9e1a833a #固定值 5bb2dc04 #序列号,每次指令交互后加1 00000005 #指令 ...1016字节00数据... #返回数据--192.168.184.129->192.168.184.128 9e1a833a #固定值 5bb2dc04 #序列号,每次指令交互后加1 80000005 #指令 00000000 00000000 00 #g_sdLog_num 01 #checkhttp_or_nocheckhttp 00 #checkregex_or_nocheckregex 19 #tcpflag 00000000 #rulenum 00000000 #srcaddr 00000000 #srcmask 00000000 #dstaddr 00000000 #dstmask 0006 #protocol 0000 #srcport 0929 #dstport 0000 0000003c #mininterval 00000002 #maxinjections 00000258 #injectwindow 00000094 #len_injectfile 00000001 #Current Injections 00000001 #Total Injections 00000029 #Next Injection Time 0000021c #Injection Window End Time #regexfile-256字节 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000 #injectfile-512字节 485454502f312e3120323030204f4b0a436f6e74656e742d547970653a20746578742f68746d6c0a436f6e74656e742d4 c656e6774683a2038370a0a3c68746d6c3e3c626f64793e48656c6c6f20576f726c6421213c62723e3c62723e54657374 205365636f6e64646174655f436e4320546f6f6c7321213c62723e3c2f696672616d653e3c2f626f64793e3c2f68746d6 c3e0a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 #... 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000
相关代码截图如下:
指令运行情况如下:
SECONDDATE> getlog [#] Fri, 10 Nov 2023 10:23:06 +0800 Index Src Address Dest Address Prot Src Port Dst Port Age(secs) rule ----- ----------- ------------ ---- -------- -------- ---------- ------ 0 192.168.184.1 192.168.184.129 6 59024 2345 28 1 stopping at curr = 1 SECONDDATE> getinfo
通信数据详情:
#发送数据--192.168.184.128->192.168.184.129 9e1a833a 5bb2dc05 00000006 ...1016字节00数据... #返回数据--192.168.184.129->192.168.184.128 9e1a833a 5bb2dc05 80000006 00000000 654d940a #timestamp(时间戳):命令执行完成时间 00000000 #Index c0a8b801 #Src Address c0a8b881 #Dest Address e690 #Src Port 0929 #Dst Port 654d93ee #timestamp(时间戳):命令下发时间 00000001 #规则编号 06 #protocol ...983字节00数据...
相关代码截图如下:
指令运行情况如下:
SECONDDATE> getinfo [#] Fri, 10 Nov 2023 10:23:11 +0800 SecondDate Version: 01010101 Current number of active log entries is 1 Current number of active rules is 1 SECONDDATE>
通信数据详情:
#发送数据--192.168.184.128->192.168.184.129 9e1a833a 5bb2dc06 00000007 ...1016字节00数据... #返回数据--192.168.184.129->192.168.184.128 9e1a833a 5bb2dc06 80000007 00000000 00000000 01010101 #SecondDate Version 00000001 #Current number of active log entries 00000001 #Current number of active rules ...996字节00数据...
相关代码截图如下:
指令运行情况如下:
SECONDDATE> uninstall [#] Sat, 11 Nov 2023 20:48:41 +0800 CnC: timedout waiting for a response. Retrying ... CnC: timedout waiting for a response. Retrying ... CnC: timedout waiting for a response. Retrying ... CnC: failed to receive a valid response after 3 retries. SECONDDATE>
通信数据详情:
#发送数据--192.168.184.128->192.168.184.129 9e1a833a 5bb2dc0c 00000008 ...1016字节00数据...
指令运行情况如下:
SECONDDATE> clearlog [#] Sat, 11 Nov 2023 20:49:40 +0800 OK. SECONDDATE>
通信数据详情:
#发送数据--192.168.184.128->192.168.184.129 9e1a833a 5bb2dc0a 0000000a ...1016字节00数据... #返回数据--192.168.184.129->192.168.184.128 9e1a833a 5bb2dc0a 8000000a ...1016字节:与发送数据相同...
通过分析,发现自v1.1.1.1版本后,“二次约会”间谍软件新增了commit命令,此命令支持永久存储植入规则;进一步分析,发现此命令的运行原理即为将配置规则加密存放于自身ELF文件中。
相关代码截图如下:
指令运行情况如下:
SECONDDATE> commit [#] Sat, 11 Nov 2023 20:49:53 +0800 OK. SECONDDATE>
通信数据详情:
#发送数据--192.168.184.128->192.168.184.129 9e1a833a 031046b2 0000000b ...1028字节00数据... #返回数据--192.168.184.129->192.168.184.128 9e1a833a 031046b2 8000000b ...1028字节:与发送数据相同...
十六进制文件对比如下: