CryptBot 是一种针对 Windows 操作系统进行信息窃取的恶意软件,在 2019 年被首次发现。它旨在窃取失陷主机的敏感信息,例如浏览器凭据、加密货币钱包、浏览器 Cookie、信用卡信息与屏幕截图等。
恶意软件简介
样本启动时会创建一个进程,该进程与大量文件系统事件与注册表事件相关。
进程信息
CryptBot 会从常见的浏览器 Chrome、Firefox 和 Edge 窃取信息,
窃取 Firefox 浏览器数据
要检测对存储在浏览器中的个人数据的访问,可以使用:
process_name NOT (“chrome.exe”, ”firefox.exe”, “msedge.exe”, “opera.exe”)
AND
file_access (
%LOCALAPPDATA%\\MICROSOFT\\EDGE\\USER DATA\\*,
%APPDATA%\\Roaming\\Mozilla\\Firefox\\*,
%LOCALAPPDATA%\\Local\\Google\\Chrome\\User Data\\*
%LOCALAPPDATA%\\AppData\\Local\\Opera Software\\Opera Stable\*
)
CryptBot 通过“UNINSTALL”注册表树检查系统中已安装的软件:
检查已安装的软件
要检测访问已安装软件列表,可以使用:
reg_key is (“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall”)
AND
operation read
CryptBot 会收集系统信息,包括操作系统安装日期、计算机名称、密钥、CPU 信息:
收集系统信息
要检测读取系统安装日期,可以使用:
reg_key is (“HKLM\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION”)
AND
reg_name is (“INSTALLDATE”)
AND
operation read
CryptBot 将收集到的操作系统信息和个人数据发送到 C&C 服务器:
回传数据
要检测连接到 C&C 服务器,可以使用:
network connect
AND
(
domains are (“sginiv12[.]top” or “bytcox01[.]top”)
OR (ip == “23[.]217.138.108” and port==80)
)
回传数据是通过 HTTP 协议发送的,上传的文件名是随机生成的,但接收路径总是 gate.php 页面。
回传流量
Suricata 也对此进行了告警:
恶意流量告警
要检测恶意流量,可以使用:
network send
AND
http_verb is “POST” AND location is “gate.php”
AND
http_content includes (“form-data”, “name=\”files[]\””, “filename”)
第一次在 %APPDATA%
目录中启动恶意软件时,会创建一个空目录标记 0D445946B53E9551
。该目录允许恶意软件确定之前是否启动过。如果 CryptBot 发现曾经在该主机上启动过,它将立即停止工作。
标记目录
收集的各种信息会存储在 %TEMP%
目录的临时文件中:
临时文件
例如,其中一个文件就是有关用户名与密码的信息,并且以 base64 格式进行存储。
收集的信息
CryptBot 运行完时,会使用 CMD.EXE 在短暂延迟后删除自身:
删除自身
通过 DIE 查看,软件认为该样本文件并未加壳:
静态查看是否存在加壳
通过 Process Hacker 查看进程内存,在一个可读可写可执行的区域内发现了 PE 文件头:
进程转储
PE 文件头也是 Shellcode 的起始位置,恢复寄存器后获取 ImageBase 并将控制权转交给入口点:
反汇编
调试发现,该区域是使用 VirtualAlloc 函数分配的。将 Payload 写入其中并进行异或解密:
异或解密
解密的密钥存储在 .rdata 段中:
解密密钥
通过静态分析确认,恶意软件配置信息位于 .data 段中并且使用异或加密。
密钥与配置
通过 CyberChef 与密钥可以对配置进行解密:
配置解密
配置中可以看到 CryptBot 的目标是什么。
研究人员实现了自动提取解密的脚本,执行结果如下所示:
脚本提取结果
rule CryptBot_ShellCode
{
meta:
author = "Any.Run"
SHA256 = "183f842ce161e8f0cce88d6451b59fb681ac86bd3221ab35bfd675cb42f056ac"
date = "2023-01-19"
description = "Detect CryptBot shellcode in memory"
strings:
$shellcode = { 4D 5A 45 52 E8 00 00 00 00 58 83 E8 09 50 05 [4] FF D0 C3 }
condition:
uint16(0) != 0x5A4D and
uint16(0) > 0 and
$shellcode in (0x20..0x50)
}
rule CryptBot_Config {
meta:
author = "Any.Run"
SHA256 = "183f842ce161e8f0cce88d6451b59fb681ac86bd3221ab35bfd675cb42f056ac"
date = "2022-01-19"
description = "Detect CryptBot configuration in memory"
strings:
$s1 = "CookiesEdge"
$s2 = "ChromeDB<>_<>"
$s3 = "EdgeDB<>_<>"
$s4 = "ChromeExt<>_<>"
$s5 = "HistoryChrome<>_<>"
$s6 = "EdgeExt<>_<>"
$s7 = "CookiesFirefox<>_<>"
$s8 = "HistoryOpera<>_<>"
$s9 = "CookiesOpera<>_<>"
$s10 = "FirefoxDB<>_<>"
$s11 = "CookiesChrome<>_<>"
$s12 = "HistoryFirefox<>_<>"
$s13 = "HistoryEdge<>_<>"
$s14 = "DesktopFolder<>_<>"
$s15 = "ChromeDBFolder<>_<>"
$s16 = "ExternalDownload<>_<>"
$s17 = "ScreenFile<>_<>"
$s18 = "MessageAfterEnd<>_<>"
$s19 = "HistoryFile<>_<>"
$s20 = "FirefoxDBFolder<>_<>"
$s21 = "PasswordFile<>_<>"
$s22 = "WalletFolder<>_<>"
$s23 = "DeleteAfterEnd<>_<>"
$s24 = "EdgeDBFolder<>_<>"
$s25 = "InfoFile<>_<>"
$s26 = "CookiesFile<>"
condition:
7 of them
}
12d20a973f8cd9c6373929ae14efe123
7f277f5f8f9c2831d40a2dc415566a089a820151
183f842ce161e8f0cce88d6451b59fb681ac86bd3221ab35bfd675cb42f056ac
http://sginiv12[.]top/gate.php
http://bytcox01[.]top/gesell.dat