方程式组织CDR解析器样本分析报告
时间 : 2024年05月13日 来源: 安天CERT
1.概述
CDR(Call Detail Record)又名呼叫详细记录,是由电话交换机类电信设备生成的数据记录,记录了通过电信设备的呼叫或其他电信交易的详细信息。该记录包含呼叫的各种属性,例如时间、持续时间、完成状态、源号码和目的地号码。
2016年8月,“影子经纪人”称其入侵了NSA下属部门方程式组织,该黑客团伙公开了大量NSA的网络攻击工具。安天对相关工具进行分析梳理,在其中发现一类针对呼叫详细记录(Call Detail Record)的解析提取工具并分析形成报告初稿,本报告则基于该历史报告初稿完善形成。
该CDR解析器位于orleans文件夹下,共计16个文件,涉及的操作系统包括SunOS、AIX5.1(Advanced Interactive eXecutive 5.1)。其中AIX架构样本7个,版本号从v2.2到v3.1.0.1。SPARC架构样本9个。SPARC架构样本全部基于SunOS系统,其中SunOS5.8的样本8个,SunOS5.9的样本1个,版本号从v2.0到v3.1.0.1。CDR解析器能够按照指定的匹配条件(如时间范围等)对CDR文件进行搜集,随后根据加密的参数文件内容(如位置区域码,电话号码等)对搜集到的CDR文件数据进行解析。调查模式还能够使攻击者对具有多个SIM卡的设备ID,与每一个移动交换中心关联的小区ID列表进行收集。
2.样本分析
通过对影子经纪人泄露的众多文件进行分析,我们在\Linux\doc\old\etc目录下找到了名称为user.tool.orleansstride.COMMON的使用说明文件。该COMMON文件记录了通过orleansstride.v1.0.SunOS5.8进行CDR解析的详细指令。根据该CDR解析器的名称可知:攻击者将CDR解析器工具内部命名为orleansstride,orleansstride.v1.0.SunOS5.8为orleansstride基于SunOS5.8系统的v1.0版本。
2.1 orleansstride使用说明(user.tool.orleansstride.COMMON)
表2-1 orleansstride使用说明文档
|
原始文件名 |
user.tool.orleansstride.COMMON |
|
MD5 |
b1ddd062b8ab90f08b437d6cc58220c5 |
|
文件大小 |
7.21 KB (7,392 bytes) |
|
文件格式 |
Text |
该COMMON文件内部名称为ORLEANSSTRIDE PARSING,是一份orleansstride.v1.0.SunOS5.8的使用说明文档。CDR数据的解析还需要orleansstride与加解密工具cryptTool一起搭配来完成。cryptTool被用于参数文件的加密,以及收集到的CDR数据的解密。cryptTool在对CDR数据进行解密时,需要同时指定参数选项“-d -c”。除cryptTool以外,CDR解析器orleansstride的主要参数信息如下表所示。
表2-2 orleansstride主要参数信息
|
主要参数 |
说明 |
|
参数文件 |
以加密的形式作为orleansstride参数,原始内容为待解析CDR信息(如电话号码、位置区码等)。 |
|
环境变量“B” |
保存orleansstride的参数信息。 |
|
参数k |
指定加解密密钥。密钥通过md5sum生成。 |
|
参数z |
指定待搜集CDR文件需满足的匹配条件(如特定时间范围)。 |
|
参数P |
指定参数文件。 |
|
参数x |
指定orleansstride工作于调查模式。检查具有多个SIM卡关联的设备ID信息。 |
|
参数y |
指定orleansstride工作于调查模式。生成与每一个移动交换中心关联的小区ID列表。 |
使用说明文档首先声明了4个后续会使用到的变量。其中,ProjectName用于表示本次解析的项目名称。

图2-1 ORLEANSSTRIDE PARSING 全局声明
加解密使用到的密钥由md5sum指令对特定文件的计算生成,并保存至cryptkey.orleansstride.DDMonYY目录。DDMonYY为当天的日期。

图2-2 获取密钥并保存
当解析所需要的参数文件已经准备就绪时,使用如下指令将参数文件拷贝至/current/down/argfiles目录。

图2-3 拷贝参数文件
参数文件作为orleansstride的参数被用于对CDR数据的解析,必须确保参数文件的格式正确。参数文件的格式需要为Linux格式文件,且不包含空行。

图2-4 参数文件格式调整
如果当前环境没有已准备好的参数文件,攻击者需要对参数文件进行创建。参数文件的内容为攻击者感兴趣的字段信息。参数文件中的每一个字段需要位于单独的行。字段可以是LAC(位置区码)、cell id(小区ID) 或者电话号码等。

图2-5 构造参数文件
此外,攻击者还要保证参数文件的每一行内容必须是排序之后的状态。

图2-6 对参数文件内容排序
准备好参数文件后,攻击者可以使用cryptTool对参数文件进行加密。如下图所示,cryptTool通过k参数指定加密所需的密钥信息。

图2-7 使用cryptTool加密参数文件
使用说明文档还包括对CDR目录进行查找的说明,但并未列出相关查找命令。当查找到CDR目录后,攻击者可以决定要保存数据的日期范围,该日期范围将被用于orleansstride命令的参数。

图2-8 查找CDR目录并确定保存数据日期
一切环境准备就绪后,攻击者上传orleansstride并将其命名为nscd。

图2-9 上传orleansstride
攻击者使用orleansstride对CDR文件数据进行解析如下图所示。其工作方式为:设置名称为“B”的环境变量后直接运行,并将解析结果以加密文件的方式保存。设置的环境变量包括加解密密钥,目标文件匹配指令以及加密的参数文件。

图2-10 CDR数据解析
orleansstride还能在调查模式下运行。调查模式的参数x用于检查具有多个SIM卡ID(IMSI)关联的设备ID(IMEIs)、调查模式的参数y用于生成与每个移动交换中心(MSC)地址关联的小区ID(Cell ID)列表。若要限制使用的内存,需要将参数“xy”修改为“XY”。

图2-11 调查模式
cryptTool解密加密的CDR数据的指令如下图所示。cryptTool通过k参数设置解密需要的密钥,通过“-d -c”选项设定当前为解密模式。

图2-12 cryptTool数据解密
在orleansstride的CDR数据解析动作完成前,攻击者如果要停止其解析动作,可以通过Control-C按键或者kill 指令来完成。

图2-13 停止CDR解析
orleansstride对CDR数据解析完毕后,攻击者拷贝解密后的文件至ProjectName目录下。

图2-14 拷贝解密文件
攻击者最后完成相应的清理工作。删除orleansstride、加密的参数文件以及创建的文件夹。

图2-15 清理动作
2.2 orleans_tride.sunos5.8_v.2.0样本分析
在泄露的所有CDR解析器文件中,orleansstride的最低版本为v2.0,且并未发现v1.0版本的CDR解析器。我们通过对泄露的全部CDR解析器样本的分析,发现不同版本的orleansstride样本功能基本一致。下文将对orleans_tride.sunos5.8_v.2.0样本进行分析说明。
表2-3 orleans_tride.sunos5.8_v.2.0
|
病毒名 |
GrayWare/Win32.Presenokere |
|
原始文件名 |
orleans_tride.sunos5.8_v.2.0 |
|
MD5 |
19DE7C3FD881132C6FAE1F32261D291B |
|
处理器架构 |
SPARC |
|
文件大小 |
37.4 KB (38,312 bytes) |
|
文件格式 |
ELF 32-bit MSB executable |
|
加壳类型 |
无 |
|
编译语言 |
C/C++ |
orleans_tride.sunos5.8_v.2.0样本首先通过调用sigaction来设置当指定信号发生时的处理函数。

图2-16 设置指定信号的处理函数
其设置的信号处理函数用于退出进程,设置的信号如下表所示。
表2-4 进程退出信号
|
SIGNUM |
宏 |
含义 |
|
13 |
SIGPIPE |
管道破损,没有读端的管道写数据 |
|
16 |
SIGSTKFLT |
栈溢出 |
|
17 |
SIGCHLD |
子进程退出 |
|
10 |
SIGUSR1 |
用户信号1 |
|
3 |
SIGQUIT |
退出 |
|
14 |
SIGALRM |
alarm发出的信号 |
|
1 |
SIGHUP |
挂起 |
|
2 |
SIGINT |
中断 |
|
11 |
SIGSEGV |
无效内存访问 |
|
15 |
SIGTERM |
终止信号 |
|
6 |
SIGABRT |
abort发出的信号 |
|
8 |
SIGFPE |
浮点异常 |
|
4 |
SIGILL |
非法指令 |
orleans_tride.sunos5.8_v.2.0随后对内置字符串进行解密操作。解密逻辑为:对加密字符串逐字符乘0x1D。

图2-17 字符串解密
orleans_tride.sunos5.8_v.2.0解密后的部分字符串内容如下表所示。
表2-5 orleans_tride.sunos5.8_v.2.0解密字符串
|
地址 |
字符串 |
含义 |
|
0x28a20 |
exec=ORLEANSTRIDE;
ver=2.0; |
exec=ORLEANSTRIDE;
ver=2.0; |
|
0x28a40 |
Time
Stamp,Call Duration, |
时间戳,通话时长 |
|
0x28a60 |
Served
MSISDN,Served IMEI,Served IMSI, |
服务的用户ID,服务的设备ID,服务的SIM卡ID |
|
0x28a88 |
Served
MCC,Served MNC,Served LAC,Served Cell ID, |
服务的移动国家代码,服务的移动网络号码,服务的位置区域码,服务的小区ID |
|
0x28ac0 |
Other
MSISDN/Global Title,Other IMEI, |
其他用户ID/GT码,其他设备ID |
|
0x28ae8 |
Other
IMSI,Other MCC,Other MNC,Other LAC, |
其他SIM卡ID,其他移动国家代码,其他移动网络号码,其他位置区域码 |
|
0x28b18 |
Other Cell
ID,Call Direction, |
其他小区ID,通信方向 |
|
0x28b38 |
Record
Type,Served MSISDN NOA/NP, |
记录类型,服务的用户ID NOA/NP |
|
0x28b60 |
Other
Party NOA/NP,MSC Address,MSC Address NOA/NP |
其他社区 NOA/NP,移动交换中心地址,移动交换中心地址 NOA/NP |
|
0x28bc8 |
Telephony |
电话 |
|
0x28bd8 |
Emergency |
紧急情况 |
|
0x28be8 |
SMS Terminating |
短信中断 |
|
0x28bf8 |
SMS
Originating |
短信发起 |
|
0x28c08 |
FAX and
Speech |
传真和语音 |
|
0x28c18 |
FAX |
传真 |
|
0x28c20 |
Unavailable |
不可达 |
|
0x28c30 |
howxyrm:p:P:z:k:X:Y: |
程序的选项参数 |
|
0x28c48 |
###
Multiple IMSIs for IMEI |
设备ID的多个SIM卡ID |
|
0x28c68 |
### IMEI: |
设备ID |
|
0x28c78 |
###
TIME IMSI MSCADDRESS |
时间 SIM卡ID MSC地址 |
|
0x28cb8 |
B |
环境变量B |
|
0x28cc0 |
done: |
完成 |
|
0x28cd0 |
lb |
参数m内容 |
|
0x28d58 |
###MSCID: |
移动交换中心ID |
|
0x28d68 |
### LOCATION: |
位置 |
orleans_tride.sunos5.8_v.2.0随后对程序的传入参数进行解析,并根据参数解析的结果对指定全局地址进行标记。参数的选项字符串为“howxyrm:p:P:z:k:X:Y:”,不同参数对应的目标地址如下图所示。此外,orleansstride还通过getenv函数获取名称为“B”的环境变量,并根据环境变量的解析结果为程序参数进行赋值。

图2-18 getopt解析参数与对应地址
当orleans_tride.sunos5.8_v.2.0运行参数未指定“p:P:z:k:X:Y”时,用于参数解析的函数返回True,程序打印错误信息并退出。当m参数内容不为“lb”时,地址0x2A96C处的值为0,程序在条件判断后执行exit退出进程。

图2-19退出进程的错误参数判断
orleans_tride.sunos5.8_v.2.0随后对P、k参数对应的内容进行解析。其中对P参数指定的文件内容进行解析的流程如下图所示。

图2-20 对p参数指定的文件进行处理
orleans_tride.sunos5.8_v.2.0随后通过popen函数fork子进程,并对z参数设定的指令内容进行执行。

图2-21 fork子进程解析命令并写入文件
在z参数指令执行完毕后,orleans_tride.sunos5.8_v.2.0读取指令执行结果,在解析处理后生成目标文件。程序在目标文件生成前还会对xy参数进行额外处理。

图2-22 对参数包含xy的情况进行解析
2.3 不同版本差异对比
CDR解析器除了v2.0版本外,还有多个版本,但不同版本的CDR解析器样本功能基本一致,我们仅以其最高版本为例,对v.3.1.0.1版本与v.2.0版本orleansstride样本间的差异进行说明。
表2-6 orleans_stride.sunos5.8_v.3.1.0.1
|
原始文件名 |
orleans_stride.sunos5.8_v.3.1.0.1 |
|
MD5 |
1C0A0D7A2FCDC0E059B090859E3B9873 |
|
处理器架构 |
SPARC |
|
文件大小 |
168 KB (172,804 bytes) |
|
文件格式 |
ELF 32-bit MSB executable |
|
加壳类型 |
无 |
|
编译语言 |
C/C++ |
2.3.1 函数名称大量混淆
相对于未混淆的v2.0版本orleansstride,v.3.1.0.1版本orleansstride的函数名称被大量混淆。混淆导致程序的函数功能更加难以理解,分析者需要对混淆的大量函数名称进行反混淆处理。混淆的orleans_stride.sunos5.8_v.3.1.0.1如下图所示。

图2-23 orleans_stride.sunos5.8_v.3.1.0.1函数名称混淆
2.3.2 样本选项参数更多
v.3.1.0.1版本orleansstride样本的选项参数为“fgHhklmoOpPrvwxXyYz”,相比v.2.0版本orleansstride额外增加了“fglv”四个参数。分析发现,新增加的四个参数中,参数f,l与参数z存储参数内容的地址相同。此外,四个参数可对其分别指定的全局地址赋予布尔值。
orleans_stride.sunos5.8_v.3.1.0.1在对名称为“B”的环境变量进行解析时,额外增加了参数字符串“--m39@C~5TG”的比较。只有当参数内容包含该字符串时,orleansstride才能继续后续的流程。

图2-24 解密参数字符串
2.3.3 数据解析能力更强
v.3.1.0.1版本orleansstride有两种方式对加密字符串进行解密,分别为逐字节乘0x9和逐字节乘-0x53。v2.0版本orleansstride仅有一种解密算法用于字符串解密,方式为逐字节乘0x1D。

图2-25 orleansstride字符串解密算法
v.3.1.0.1版本orleansstride解析内容不仅包括之前的各种CDR,还包括了CFW(转发记录)、GWO(传出网关记录)等。orleans_stride.sunos5.8_v.3.1.0.1解密得到的部分字符串内容如下表所示。
表2-7 orleans_stride.sunos5.8_v.3.1.0.1解密字符串
|
地址 |
内容 |
含义 |
解密key |
|
0x345a0 |
#
%d files found. %d files processed. %d records found. %d records processed.
%d records output. %d target hits. |
发现的文件 处理的文件 发现的记录
处理的记录 输出的记录 命中的目标 |
0x9 |
|
0x346b0 |
--m39@C~5TG |
解析字符串 |
-0x53 |
|
0x34708 |
MSC
Address |
MSC地址 |
0x9 |
|
0x34718 |
MCC |
移动国家代码 |
0x9 |
|
0x34720 |
MNC |
移动网络代码 |
0x9 |
|
0x34728 |
LAC |
位置区域码 |
0x9 |
|
0x34730 |
CI |
小区ID |
0x9 |
|
0x34748 |
IMEI |
设备ID |
0x9 |
|
0x34750 |
IMSI |
SIM卡ID |
0x9 |
|
0x34758 |
Time
Stamp |
时间戳 |
0x9 |
|
0x347a8 |
Record
Type |
记录类型 |
0x9 |
|
0x347b8 |
Served
MSISDN |
服务的用户ID |
0x9 |
|
0x347c8 |
Served
IMEI |
服务的设备ID |
0x9 |
|
0x347d8 |
Served
IMSI |
服务的SIM卡ID |
0x9 |
|
0x347e8 |
Served
LAC |
服务的位置区域码 |
0x9 |
|
0x347f8 |
Served
Cell ID |
服务的小区ID |
0x9 |
|
0x34808 |
Other
MSISDN |
其他用户ID |
0x9 |
|
0x34818 |
Other
IMEI |
其他设备ID |
0x9 |
|
0x34828 |
Other
IMSI |
其他SIM卡ID |
0x9 |
|
0x34838 |
Other
LAC |
其他位置区域码 |
0x9 |
|
0x34848 |
Other
Cell ID |
其他小区ID |
0x9 |
|
0x34858 |
Served
MSISDN NOA/NP |
服务的用户ID NOA/NP |
0x9 |
|
0x34870 |
Other
MSISDN NOA/NP |
其他用户ID NOA/NP |
0x9 |
|
0x34898 |
Call
Duration |
通话时长 |
0x9 |
|
0x348a8 |
Content
Type |
内容类型 |
0x9 |
|
0x348b8 |
Served
MCC |
服务的移动国家代码 |
0x9 |
|
0x348c8 |
Served
MNC |
服务的移动网络号码 |
0x9 |
|
0x348d8 |
Other
MCC |
其他移动国家代码 |
0x9 |
|
0x348e8 |
Other
MNC |
其他移动网络号码 |
0x9 |
|
0x348f8 |
MSC
Address NOA/NP |
MSC地址 NOA/NP |
0x9 |
|
0x34948 |
#exec=ORLEANSSTRIDE;
ver= |
#exec=ORLEANSSTRIDE;
ver= |
-0x53 |
|
0x34968 |
wp |
wp |
-0x53 |
|
0x34970 |
;
built_for= |
构建 |
0x9 |
|
0x34990 |
;
host_os= |
主机_操作系统 |
0x9 |
|
0x349a0 |
AIX |
AIX操作系统 |
0x9 |
|
0x34a30 |
Served
IMSI,BSC Number,Served MSISDN,MOSMS Count,Timecounts |
服务的SIM卡ID,基站控制器数量,服务的用户ID,短信发送数量,时间计数 |
0x9 |
|
0x34a70 |
#CATCHER_SURVEY |
捕手_调查 |
0x9 |
|
0x34a88 |
#DATE_OF_DATA=%s |
数据日期 |
0x9 |
|
0x34aa8 |
#SETTINGS<DIGIT=%s,SMS_COUNT=%d,TOTAL_EVENT=%d,BLACK_LIST=%d,RAM_SIZE=%d> |
设置<数字,短信数量,事件总数,黑名单,内存大小> |
0x9 |
|
0x34b28 |
aCdfgHhklmoOpPrvwxXyYz |
选项参数字符串 |
-0x53 |
|
0x34b40 |
MOC |
移动主叫 |
-0x53 |
|
0x34b48 |
MTC |
移动被叫 |
-0x53 |
|
0x34b50 |
MO_SMS |
发送短信 |
-0x53 |
|
0x34b58 |
MT_SMS |
接收短信 |
-0x53 |
|
0x34b60 |
INCH |
INCH |
-0x53 |
|
0x34b68 |
GWI |
全球信息技术 |
-0x53 |
|
0x34b70 |
GWO |
传出网关记录 |
-0x53 |
|
0x34b78 |
TRANSIT |
传输 |
-0x53 |
|
0x34b80 |
CFW |
转发记录 |
-0x53 |
|
0x34b90 |
DTMF
used |
使用的双音多频 |
-0x53 |
|
0x34bc8 |
C
Party Number |
C方数量 |
-0x53 |
|
0x34bd8 |
C
Party NOA/NP |
C方 NOA/NP |
-0x53 |
|
0x34be8 |
MSRN |
移动通信站漫游号码 |
-0x53 |
|
0x34bf0 |
MSRN
NOA/NP |
移动通信站漫游号码 NOA/NP |
-0x53 |
|
0x34c00 |
Other
MSRN |
其他移动通信站漫游号码 |
-0x53 |
|
0x34c10 |
SME
Party |
公共站管理实体方 |
-0x53 |
|
0x34c20 |
Raw
Location |
原始位置 |
-0x53 |
|
0x34c30 |
DTMF |
双音多频 |
-0x53 |
|
0x34c38 |
done: |
完成 |
0x9 |
2.3.4 参数内容加密存储
v.3.1.0.1版本orleansstride的参数“flz”内容会被逐字符乘0x39加密后放入对应的地址空间,使用时再次逐字符乘0x9进行解密。以参数z为例,orleansstride获取的z参数内容被加密放入地址0x00086E5C+0x185D处。

图2-26 参数z内容获取并加密
orleans_stride.sunos5.8_v.3.1.0.1随后从0x00086E5C+0x185D地址处获取z参数内容,并进行解密操作。v2.0版本orleansstride则是直接对参数z的原始内容进行处理。

图2-27 参数z内容解密
2.3.5 文件匹配机制升级
相较于v2.0版本orleansstride直接通过popen进行CDR文件匹配的方式,v.3.1.0.1版本orleansstride在获取解密的z参数内容后,z参数内容将被作为正则表达式,随后利用编译后的正则表达式对目标文件进行匹配。

图2-28 正则匹配目标文件
3.CDR解析器对应的ATT&CK映射图谱

图3-1 技术特点对应ATT&CK的技战术映射
具体ATT&CK技术行为描述表:
表3-1 ATT&CK技术行为描述表
|
ATT&CK阶段/类别 |
具体行为 |
注释 |
|
执行 |
利用命令和脚本解释器 |
通过shell执行CDR解析器 |
|
利用进程间通信 |
通过popen创建子进程,并读取管道传递的数据 |
|
|
防御规避 |
混淆文件或信息 |
通过加密的方式隐藏明文字符串 |
|
发现 |
发现文件和目录 |
查找指定格式的CDR文件和目录 |
|
发现系统信息 |
查找指定名称的环境变量 |
|
|
收集 |
压缩/加密收集的数据 |
对收集的数据进行加密处理 |
|
收集信息库数据 |
对CDR文件进行收集 |
|
|
命令与控制 |
使用动态参数 |
通过传递指定参数的执行结果作为输入并解析 |
|
影响 |
操纵数据 |
对数据文件进行加密或删除 |
4.小结
运营商作为一个数据通讯、数据汇聚的枢纽节点,在美方情报机构眼中有巨大的战略价值,是美方情报机构长期窥伺的目标。据斯诺登曝光的资料显示,“星风”(STELLARWIND)计划中的“主干道”与“核子”就是专门针对全球电信通话数据的收集和监听计划,“主干道”通过与运营商建立合作关系获得相关数据,“核子”则截获电话通话中的对话内容及关键词获得指定数据。
本报告分析的CDR工具就是美方专门针对电信数据获取的工具,从本次分析工具的技术细节来看,该工具符合美方模块化的作业和严格加密的习惯和特点,该工具仅负责数据筛选和获取并加密存储,并不负责回传。攻击者可以在入侵之后通过参数构建各种条件规则进行针对性的数据获取,并搭配数据解密、数据回传工具进行完整的入侵窃密攻击。