NSA组织“二次约会”间谍软件通信模型剖析与对比
字数 3120 2025-08-20 18:18:11
NSA组织"二次约会"间谍软件通信模型深度剖析
概述
"二次约会"(Seconddate)是NSA组织开发的一款间谍软件,主要用于网络流量嗅探和会话劫持。本文将对"二次约会"间谍软件的通信模型进行全面剖析,包括样本版本对比、远控指令分析、会话劫持原理以及通信数据结构等关键内容。
样本版本梳理及对比
通过对泄露资料的分析,共提取32个"二次约会"间谍软件样本:
- 控制端程序17个,被控端程序15个
- 涉及17个不同大小版本
- 支持多种操作系统:Linux、FreeBSD、Solaris、JunOS等
- 兼容多种体系架构:i386、x86、x64、SPARC等
根据通信载荷长度,可分为5种类型:
-
1048字节通信载荷
- 版本:v1.1.1.1
- 文件名:Seconddate_CnC(控制端)、Seconddate_Implant(被控端)
-
1060字节通信载荷
- 版本:1.3.0.1、1.5.1.2、1.5.1.3、1.6.2.3
- 文件名格式:seconddate_Client_[版本]UNKNOWN(控制端)、seconddate_ImplantStandalone[版本]_linux(被控端)
-
56字节通信载荷
- 版本:1.7.0.3、1.7.0.4
- 运行平台:FreeBSD
-
60字节通信载荷
- 版本:Revoked_2.0.1.1
-
不定长通信载荷
- 版本:1.1.4.0、3.0.3.1-3.0.3.6、3.1.0.2、3.1.1.2
- 特点:每次启动控制端后,发送的通信载荷长度均为随机长度
样本远控指令对比
通过对控制端程序的分析,发现指令集随版本迭代而增加:
| 版本 | 指令数 | 新增指令 |
|---|---|---|
| v1.1.1.1 | 11 | clearlog, disable, enable, getinfo, getlog, help, ping, quit, rule, showrule, uninstall |
| 1.3.0.1-1.6.2.3 | 12 | 新增commit |
| 1.7.0.3 | 16 | 新增channel, exit, getrule, rulewizard |
| 2.0.1.1 | 16 | 新增network, sync |
| 1.1.4.0-3.1.0.2 | 19 | 新增delete, fin, rekey |
1048/1060通信载荷间谍软件会话劫持原理
网络流量嗅探-数据包捕获
老版本使用libpcap库函数实现:
pcap_findalldevs:获取可用网络接口pcap_open_live:打开网络接口pcap_compile:编译过滤规则pcap_setfilter:应用过滤规则pcap_next:捕获数据包
网络流量嗅探-正则表达式匹配
使用PCRE库函数:
pcre_compile:编译正则表达式pcre_exec:执行正则匹配
特定网络会话劫持篡改
使用libnet库函数构建和发送数据包:
libnet_build_data:添加负载数据libnet_build_tcp:构建TCP头部libnet_build_ipv4:构建IPv4头部libnet_build_ethernet:构建以太网帧libnet_write:发送数据包
较新版本使用BPF(Berkeley Packet Filter)技术捕获数据包。
1048/1060通信载荷间谍软件网络通信模型剖析
远控指令梳理
| 指令 | 编号 | 功能说明 |
|---|---|---|
| help / ? | - | 帮助说明 |
| quit / 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后新增) |
通信数据结构
通信数据包采用多层加密和校验结构:
------------------------------------------------
| 第一层加密 | |
| 数据头:12字 | 第一层加密数据:1036字节 |
| 节校验数据 | |
------------------------------------------------
| 8字节 | |
| IV值 | 第二层加密数据:1028字节|
| | |
-----------------------------------
| 8字节 | |
| 校验 | 有效数据载荷: |
| 数据 | 1020字节 |
--------------------------
第一层加密数据头(12字节校验数据):
- output[:4]:校验值(output[:4]-0x61E57CC6),同时用作第一层数据解密的异或key
- output[4:8]:校验值(output[:4]-0x61E57CC6 + output[4:8]等于0)
- output[8:0xc]:校验第一层解密后的数据是否正确(解密数据按4字节循环异或结果等于此值)
8字节IV值:用于RC6算法运算
8字节校验数据:
- output[:4]:固定值0x9e1a833a
- output[4:8]:序列号,控制端启动时随机生成,每次指令交互后加1
指令详细分析
指令9-第一次执行指令时
每次启动控制端后,第一次运行任何指令前会自动执行指令9。
通信数据:
发送数据:
9e1a833a #固定值
5bb2dc00 #序列号
00000009 #指令
...1016字节随机数据...
返回数据:
9e1a833a #固定值
5bb2dc00 #序列号
80000009 #指令|0x80000000
...1016字节:与发送数据相同...
指令1-ping测试通信
功能:测试木马通信是否畅通。
通信数据:
发送数据:
9e1a833a #固定值
5bb2dc01 #序列号+1
00000001 #指令
...1016字节00数据...
返回数据:
9e1a833a #固定值
5bb2dc01 #序列号
80000001 #指令
...1016字节:与发送数据相同...
指令2-配置规则
核心功能指令,支持以下配置参数:
- --srcaddr addr(0)
- --srcmask mask(255.255.255.255)
- --dstaddr addr(0)
- --dstmask mask(255.255.255.255)
- --protocol prot(6/TCP)
- --srcport port(0)
- --dstport port(0)
- --mininterval(60)
- --maxinjections(5)
- --injectwindow(0)
- --checkhttp (default) | --nocheckhttp
- --checkregex (default) | --nocheckregex
- --tcpflag (FIN ACK) URG | ACK | PSH | RST | SYN | FIN
- --regexfile
- --injectfile
示例:
rule 1 --dstport 2345 --maxinjections 2 --injectwindow 600 --nocheckregex --injectfile /root/Desktop/response
通信数据结构:
9e1a833a #固定值
5bb2dc02 #序列号
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
...后续为regexfile(256字节)和injectfile(512字节)数据...
指令3-启用规则
运行后会将全局变量g_ruleCount值加1,用于判断是否进入会话劫持代码。
通信数据:
9e1a833a #固定值
5bb2dc03 #序列号
00000003 #指令
...1016字节00数据...
指令5-显示规则详情
示例输出:
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
指令6-获取规则触发日志
示例输出:
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
通信数据结构:
返回数据:
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数据...
指令7-获取程序基本信息
示例输出:
SecondDate Version: 01010101
Current number of active log entries is 1
Current number of active rules is 1
通信数据结构:
返回数据:
9e1a833a
5bb2dc06
80000007
00000000
00000000
01010101 #SecondDate Version
00000001 #当前活动日志条目数
00000001 #当前活动规则数
...996字节00数据...
指令11-永久存储配置规则
v1.1.1.1版本后新增,将配置规则加密存放于ELF文件中。
通信数据:
发送数据:
9e1a833a
031046b2
0000000b #指令
...1028字节00数据...
总结
"二次约会"间谍软件具有以下特点:
- 支持多平台多架构,适用范围广
- 采用多层加密通信模型,安全性高
- 具备完整的规则配置和会话劫持功能
- 版本迭代过程中不断增加新功能
- 采用多种技术实现流量嗅探和会话劫持
通过深入分析其通信模型,可以帮助安全研究人员更好地检测和防御此类高级威胁。