NSA组织“二次约会”freebsd平台样本剖析
字数 1368 2025-08-20 18:18:40
NSA组织"二次约会"FreeBSD平台样本深度剖析
概述
本文档深入分析NSA组织"二次约会"间谍软件在FreeBSD平台的样本实现,涵盖样本特征、通信模型、逆向分析技巧及环境构建方法。该间谍软件支持多种操作系统,包括Linux、FreeBSD、Solaris和JunOS等。
样本版本演变
通信特征演变
- 早期版本:使用大载荷通信(1048/1060字节)
- 中期版本:演变为小载荷通信(56/60字节)
- 最新版本:采用不定长通信载荷
检测难度:
- 大载荷UDP通信数据量少,检测系统性能影响小
- 不定长UDP通信需校验大多数数据包,性能影响大
通信算法演变
- 大载荷版本:修改版RC6算法(修改了RC6算子和keyWords循环次数)
- 小载荷版本:修改版RC6算法(仅修改RC6算子)
- 不定长版本:Salsa20算法(性能更优)
代码优化趋势
- 逆向分析难度增加:代码复杂度随版本迭代提高
- 网络流量捕获方式:
- 早期:使用libpcap和libnet库
- 新版:采用BPF技术
- 编译选项优化:
- 早期版本保留明显符号标记
- 新版删除符号标记但保持相同库调用
- 远控指令简化:
- 指令数量从11个增至19个
- 新增交互式配置指令(如rulewizard)
- 字符串加密:
- 低版本:部分字符串明文存储
- 高版本:全部字符串加密且相同字符串加密结果不同
FreeBSD环境构建
系统选择
- 样本支持的FreeBSD版本:4.4(2001)、5.0(2003)、5.4(2004)
- 实际使用版本:FreeBSD 12.4 RELEASE i386
必要工具安装
# 更新软件包索引
pkg update
# 安装逆向工具
pkg install gdb
# 解决依赖问题
pkg install misc/compat4x
pkg install misc/compat5x
pkg install misc/compat6x
pkg install misc/compat7x
pkg install misc/compat8x
pkg install misc/compat9x
样本逆向分析技巧
异常处理技巧
-
绕过fork异常:
- 问题:样本调用fork函数时异常退出
- 解决方案:使用GDB修改EIP强制绕过
b *0x08049906 # 定位到fork调用处 c set $eip=0x0804990B # 修改EIP跳过fork调用 -
绕过网络嗅探异常:
- 问题:获取网卡信息函数失败
- 解决方案:手动构造数据包并跳转到处理函数
核心函数定位
- 数据包处理函数:
sub_8051A64 - 关键断点设置:
b *0x08051AE9 # UDP数据解密函数 b *0x08051AEE
强制调试方法
# 设置初始断点
b *0x080495F4
r
# 绕过fork异常
b *0x08049906
c
set $eip=0x0804990B
ni
# 跳转到数据包处理函数
b *0x08049A9B
c
set $ebx=0xffbfed00
set $eip=0x08050BC0
# 手动注入IP数据包
set {int}($ebx+0x0)=0x54000045
set {int}($ebx+0x4)=0x0040c8bd
[...后续数据包内容...]
通信模型分析
解密流程
- 第一层解密:
- 取前4字节
0x7ee0b85f - 计算异或值:
0x7ee0b85f - 0x61E57CC6 = 0x1CFB3B99
- 取前4字节
- 数据校验:
- 检查
output[4:8] + 异或值 == 0 - 示例:
0xe304c467 + 0x1CFB3B99 = 0
- 检查
- 完整性验证:
- 第一层解密后数据按4字节循环异或结果应等于
output[8:0xc] - 示例:
31d66c5e
- 第一层解密后数据按4字节循环异或结果应等于
RC6算法修改点
- 初始化S表使用固定值
0xb7e15163 - 后续值计算:
S[i] = S[i-1] - 0x61C88647 - 轮密钥生成:
c.rk[i] = bits.RotateLeft32(c.rk[i]+(A+B), 3) L[j] = bits.RotateLeft32(L[j]+(A+B), int(A+B))
解密示例
加密数据包:
7ee0b85f # 0x7ee0b85f - 0x61E57CC6 = 0x1CFB3B99
e304c467 # 校验和
31d66c5e # 完整性校验值
d08b0669
85a6c2be
9967379e73f4043a4c3b2fcec3b6ba9d71dbd5c7af757e1aeaab6e3b242370570d388056
解密后数据:
cc703df0995df927 # RC6随机IV
9e1a833a # 固定值
0833fa27 # 序列号(每次交互+1)
00000001
00000009 # 指令代码
[...填充数据...]
总结与对抗建议
关键发现
- 样本通过版本迭代不断增强隐蔽性
- 采用环境适配检测机制,异常时自动退出
- 通信模型保持一致性但算法细节有变化
检测建议
- 监控异常fork调用和网络嗅探行为
- 检测RC6算法修改特征:
- 特殊的S表初始化值
- 减量常数
0x61C88647
- 关注UDP通信中的特殊校验模式
分析技巧
- 使用GDB强制跳转绕过环境检测
- 手动构造数据包注入分析
- 对比不同版本样本的算法差异
本分析展示了即使在样本无法正常运行的情况下,通过巧妙的调试技巧仍可提取关键功能逻辑,为同类样本分析提供了有效方法论。