本地进行测试实验,准备两台机器,一台已经被感染,另一台存在 ms17-010 漏洞。需要两个比较重要的样本,第一个是较大的 spoolsv.exe 与位于 System32 文件夹下的 EnrollCertXaml.dll,启动后使用火绒剑观察下进程的各种行为,如下。
捕获网络流量后会发现开始进行漏洞利用,发起攻击。攻击者 192.168.153.136,受害者 192.168.153.129。
在受害者机器 192.168.153.129 利用 ProcessMonitor 进行进程行为监控,发现会接收到攻击者传输过来的文件,正在为之后的蠕虫传播做准备。
传输过来了 EnrollCertXaml.dll,如下。
Microsoft 文件夹的修改日期没有经过伪装,是真实的创建时间,这里也可以作为系统被感染的时间定位,如下。
Microsoft 文件夹下的内容看起来是 NSA 漏洞利用工具包,如下。
同样释放出了 wmassrv.dll 文件,如下。
查询记录发现 wmassrv.dll 这个恶意 dll 文件会被安装为服务(通过操作注册表的方式),如下是监控的记录。
已经设置完成的具体注册表键值,如下,显示的名称会让人以为是一个微软的合法服务。
整体一个攻击与传播感染流程与之前安天分析的差不多,只有个别存在不同,图来源于安天的分析报告,此处为引用。
5 样本分析
5.1 spoolsv.exe(大)分析
对 spoolsv.exe(大)bf98a0555212d2adbb7c020cb39084b6 进行下分析,无壳,64 位 C++程序,如下。
查找时间戳为 2018 年 6 月 26 日,如下。
调试时可去掉 ASLR,如下。
IDA 对其分析后,发现主体功能如下,注释为已经分析过的结论,是一个多线程的 C++编写的程序,无 GUI,与 32 位汇编不同的是,在 x64 下,是寄存器传参。前 4 个参数分别是 rcx、rdx、r8、r9 进行传参,多余的通过栈传参从右向左入栈,如下是整个主程序的大致流程。
5.1.1 x64dbg 调试多线程
针对多线程的调试,之前是使用的是 ollydbg,这次使用 x64dbg 对其调试。那么在 x64dbg 中如何调试多线程?这里就举当前分析的挖矿蠕虫恶意样本(bf98a0555212d2adbb7c020cb39084b6)。首先进入 main 函数位置,如下。
接下来会看到存在连续几个线程的创建,就以调试 thread1(已经在上述的 IDA 中对这些线程进行了重命名)为例。
先在 thread1 线程入口设置断点,如下。
在执行创建 thread2 线程时会进行跳转,如下。
此时来到线程列表窗口,如下。
将主线程挂起,避免影响 thread1 线程调试。
此时回到之前的汇编窗口,如下。
一步步调试,就会切换到 thread1 线程入口。
此时就可以对 thread1 线程进行调试了,针对需要调试其中一些线程的时候,其余线程都可以进行挂起,避免对正在调试的线程造成影响。
现在演示下调试第二个 thread2 线程,如下,先恢复主线程。
在 thread1 线程里进行单步调试, 不一会就立马跳转到了主线程区域。
此时接着查看线程列表窗口,将之前调试的 thread1 线程进行挂起,如下。
在需要调试的 thread2 线程入口下断点,如下。
在主线程进行单步调试,会跳转到线程处理部分,此时再将主线程进行挂起,如下。
接着调试 thread3,此时需要在线程窗口将主线程给恢复,如下。
此时处于 thread2 区域,如下。
将 thread2 线程给挂起,如下。
在主线程区域执行完创建 thread3 线程的函数,如下,此时还无法跳转。
此时来到线程列表窗口,在之前刚调试的 thread2 右键选择【转到线程】,此时回到反汇编窗口,查看是否已经是 thread2 线程区域,这时再在线程列表窗口里将主线程右键选择【挂起线程】,目前就可以继续进入 thread2线程区域调试,目的是为了调用 Sleep 函数,达到线程切换。当在 thread2 里调用 Sleep 函数后,此时就切换到 thread3 线程区域,然后将 thread2 再次进行挂起,如下。
运行之后就会切换到 thread3 线程区域,如下。
成功跳转到 thread3,如下。
重新调试程序,一直单步调试,直到进入到 thread3 区域后将其余线程给挂起,当然如果线程之间有相互的数据共享,挂起其余线程后也影响当前调试的线程,所以调试时还是具体进行决定是否全部挂起线程。
5.1.2 具体动态调试
首先出现的是硬编码的互斥量{F5175396-40C2-0218-278D6EE},已感染的系统最早的恶意文件为 C:\Windows\System32\EnrollCertXaml.dll 与 spoolsv.exe(498k 大小)。
5.1.2.1 thread1 分析
拼接所需的路径,创建以下目录,C:\\Windows\\SpeechsTracing\\与 C:\\Windows\\SpeechsTracing\\Microsoft\\,之后 spoolsv.exe(498k 大小)进程会从 EnrollCertXaml.dll 提取并释放出 Crypt 文件,该文件为一个压缩文件。之后对其解压释放到 C:\\Windows\\SpeechsTracing\\Microsoft\\目录下,实际查看后发现为 NSA漏洞利用工具。再接着从从EnrollCertXaml.dll分别释放出x86.dll与x64.dll到 C:\\Windows\\SpeechsTracing\\Microsoft\\目录下。
会释放出 Crypt 文件,后续会被进行解压到目录下成为 NSA 工具利用包,最后会删除 Crypt 文件。
会删除 Crypt 文件,如下。
释放出 NSA 工具包后,第一步会先执行永恒之蓝漏洞工具并记录攻击日志,如下。
永恒之蓝利用时用到的相关配置文件 svchost.xml 会从程序的资源文件区域 BIN 进行读取创建,如下。
第一阶段记录的攻击日志,如下。
永恒之蓝漏洞利用成功后,接着会使用双星漏洞进行进行利用并进行日志记录,来注入恶意 dll,如下。
其中利用的双星漏洞的配置文件,如下。
对应的攻击日志,如下。
永恒之蓝的漏洞利用配置文件,如下。
获取到相应的 IP 地址时就会写入刚刚的配置文件内,如下。
开始进行漏洞利用,如下。
整体的一个利用过程,如下。
5.1.2.2 thread2 分析
thread2 每隔 500ms 最终启动 64 个线程,加快扫描速度。
再次创建线程,进行端口的扫描侦查,如下。
尝试连接 445 与 63257 端口,如下。
最终开启的大量线程进行扫描,如下。
5.1.2.3 thread3 分析
thread3 主要是获取本地 IP 地址,并排除本地环回地址。
之后将获取的到 IP 共享给其余线程使用
5.1.2.4 thread4 分析
thread4 由之前两个线程来获取有效的 ip 地址后并采用 TcpTable 进行管理,如下。
开始获取到本地的 IP 范围,准备交由 thread2 进行多线程扫描,如下。
获取到了 445 端口开启的 IP 地址,如下。
之后获取到有效 IP 后就交由 thread1 启动攻击行为
5.1.2.5 thread5 分析
thread5 会存在与 C2 的通信,并进行更新本地恶意软件,不过截止分析时已无法从 C2 获取相应数据。
字符串如何隐藏的?此处汇编层面采用了 SSE 指令,直接进行 16 个字节字符传送拼接,对抗静态分析,这样静态分析时查不到相应的硬编码字符串,这里的话是拼接后会成为一个域名。
采用 strings.exe 才查询到相应的字符串,如下
对 C2(task.attendecr.com)进行访问来获取数据,如下。
5.1.2.6 thread6 分析
thread6 此处暂未发现有使用,如下。
5.1.2.7 thread7 分析
thread7 再次传输本地的扫描与错误信息至 C2 服务器,会访问 scan.attendecr.com:80/status、error.attemdecr.com:8080/log、error.attemdecr.com:8080/error,如下。
同时也会从服务端读取数据至本地,如下。
5.2 x86.dll 分析
主要为后续在受害机器中进行服务安装保持持久化,如下,查看其导出函数。
该 dll 执行后会创建互斥量为{B3DD887C-4738-EBD0-6CD0105},后续主要为创建服务 svchost.exe -k netsvcs(netsvcs 工作组)作为持久化运行。
5.3 x64.dll 分析
与 x86.dll 实现的功能一致,只是针对是 64 位平台,同样会读取 EnrollCertXaml.dll 并解密释放出 wmassrv.dll,之后将其安装为服务驻留在系统里。
现在首先来看看 HalPluginsServices.dll 是如何出现的,幸好在之前本地模拟攻击流程时导出了相应的进程记录,通过搜索发现了释放 HalPluginsServices.dll 的进程为 svchost.exe,如下。
svchost.exe 之前有被安装为服务,启动的源地址见下图注册表内容,如下。
5.4 wmassrv.dll 分析
所以接下来就来分析下 wmassrv.dll 这个恶意文件,对其反汇编后,如下,出现了 HalPluginsServices.dll 字符串,表示接下来有可能会对其进行操作。
该处会开启 mongoose web 服务,在 63257 端口上来传输给受害机器文件 EnrollCertXaml.dll,如下。
文件传输至受害机器完成后,会获取当前目录的文件的修改时间,对释放的文件的修改时间进行修改,确保与当前目录里文件的修改时间一致,达到伪装的目的。
利用 rundll32.exe 启动恶意 dll 文件,ServicesMain 为恶意 dll 的参数,启动后开启挖矿行为,如下。
5.5 HalPluginsServices.dll 分析
问题来了,分析挖矿程序,主要的是还是找到挖矿地址,现在发现 HalPluginsServices.dll 是一个挖矿程序,那么怎么才能找到这个挖矿的地址呢?最后字符串里发现是 2018 年 10 月 17 日编译的挖矿程序,可以说明,如果不是黑客故意伪装编译时间,该变种从 2018 年 10 月 17 日之后才开始活跃起来,如下。
找到的矿池地址:m -o physic.kinuckle.com:443 -u physics1 -p x -t 1 --donate-level=1 –nicehash
目前还没有标记,同时也可以看到,域名注册时间与挖矿程序编译时间吻合,这个过期时间还蛮长的……。
6 恶意技术
6.1 程序详细信息
恶意程序伪装成类似微软的相关程序,如下。
6.2 修改时间
获取当前目录的时间戳,修改释放的文件为对应的目录的时间 2009 年 7 月 14 日。
6.3 安装服务
x86.dll(x64.dll)执行后释放 wmassrv.dll 后,使用 C:\Windows\System32\svchost.exe -k netsvcs(netsvcs 工作组)参数来创建服务,服务名称为 Windows Modules Activations Services,看起来像是微软的服务,但请注册,这是恶意程序伪装的。
6.4 疑似合法程序挖矿
利用 rundll32.exe 启动一个恶意 dll 来开启挖矿,这样显示的就是一个合法的微软程序在运行,如果 CPU 使用率不高,不是很容易让人觉察到,这里存在恶意的程序。
6.5 同名文件
恶意文件命名为 spoolsv.exe,但与系统自有文件不在相同目录,因为 spoolsv.exe 是 Print Spooler 的进程,管理所有本地和网络打印队列及控制所有打印工作。如果此服务被停用,本地计算机上的打印将不可用。该进程属 Windows 系统服务,所以此处也进行了伪装。
7 简单溯源
对找到的完整域名进行查询,最终发现了 A 记录为之前 WireShack 抓取流量时遇到的 IP 地址,可以判断之前确实是存在挖矿行为。