NSA组织“二次约会”间谍软件通信模型剖析与对比
字数 3120 2025-08-20 18:18:11

NSA组织"二次约会"间谍软件通信模型深度剖析

概述

"二次约会"(Seconddate)是NSA组织开发的一款间谍软件,主要用于网络流量嗅探和会话劫持。本文将对"二次约会"间谍软件的通信模型进行全面剖析,包括样本版本对比、远控指令分析、会话劫持原理以及通信数据结构等关键内容。

样本版本梳理及对比

通过对泄露资料的分析,共提取32个"二次约会"间谍软件样本:

  • 控制端程序17个,被控端程序15个
  • 涉及17个不同大小版本
  • 支持多种操作系统:Linux、FreeBSD、Solaris、JunOS等
  • 兼容多种体系架构:i386、x86、x64、SPARC等

根据通信载荷长度,可分为5种类型:

  1. 1048字节通信载荷

    • 版本:v1.1.1.1
    • 文件名:Seconddate_CnC(控制端)、Seconddate_Implant(被控端)
  2. 1060字节通信载荷

    • 版本:1.3.0.1、1.5.1.2、1.5.1.3、1.6.2.3
    • 文件名格式:seconddate_Client_[版本]UNKNOWN(控制端)、seconddate_ImplantStandalone[版本]_linux(被控端)
  3. 56字节通信载荷

    • 版本:1.7.0.3、1.7.0.4
    • 运行平台:FreeBSD
  4. 60字节通信载荷

    • 版本:Revoked_2.0.1.1
  5. 不定长通信载荷

    • 版本: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数据...

总结

"二次约会"间谍软件具有以下特点:

  1. 支持多平台多架构,适用范围广
  2. 采用多层加密通信模型,安全性高
  3. 具备完整的规则配置和会话劫持功能
  4. 版本迭代过程中不断增加新功能
  5. 采用多种技术实现流量嗅探和会话劫持

通过深入分析其通信模型,可以帮助安全研究人员更好地检测和防御此类高级威胁。

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字节校验数据) : 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。 通信数据: 指令1-ping测试通信 功能:测试木马通信是否畅通。 通信数据: 指令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 示例: 通信数据结构: 指令3-启用规则 运行后会将全局变量g_ ruleCount值加1,用于判断是否进入会话劫持代码。 通信数据: 指令5-显示规则详情 示例输出: 指令6-获取规则触发日志 示例输出: 通信数据结构: 指令7-获取程序基本信息 示例输出: 通信数据结构: 指令11-永久存储配置规则 v1.1.1.1版本后新增,将配置规则加密存放于ELF文件中。 通信数据: 总结 "二次约会"间谍软件具有以下特点: 支持多平台多架构,适用范围广 采用多层加密通信模型,安全性高 具备完整的规则配置和会话劫持功能 版本迭代过程中不断增加新功能 采用多种技术实现流量嗅探和会话劫持 通过深入分析其通信模型,可以帮助安全研究人员更好地检测和防御此类高级威胁。