☰
Burp Suite FakeIP插件:解决Host头伪造与SNI兼容问题
2026/10/7 2:02:47 网站建设 项目流程

简介:本资源是面向网络安全工程师与渗透测试初学者的Burp Suite定制化插件工具,用于在Web安全评估中实现请求源IP地址的动态伪装,解决测试过程中身份暴露、地理限制绕过及IP策略验证等实际问题。压缩包共12个文件,含9张界面与流程示意图(png)、1个核心Python脚本(fakeIP.py)、1份说明文档(README.md)和1个测试文本(test.txt),整体体积仅1.09MB,轻量易部署,适合快速集成到现有Burp工作流中。已有412人学习下载,反映出社区对实用型扩展工具的持续关注。读者可直接复用该插件实现多IP发包、隐蔽扫描及基于IP的访问控制测试,配套图片清晰展示配置界面与使用效果,README提供基础集成指引,Python源码便于二次开发适配特定代理或负载场景,是提升Burp自动化与对抗能力的高价值补充组件。

1. Burp FakeIP 插件:解决被动扫描中 Host 头伪造失效的黑匣子级补丁

你有没有遇到过这种翻车现场:在 Burp Suite 被动扫描一个内网系统(比如http://10.128.3.15:8080),明明流量走的是代理,但目标服务器返回 404 或 403?不是防火墙拦了,也不是权限问题——而是服务器压根没认出你发的请求属于它自己。原因很朴素:Burp 默认把原始 Host 头原样转发,而现代 Web 服务(尤其是容器化、K8s Ingress、Spring Cloud Gateway)严重依赖 Host 头做路由分发。当你的浏览器访问dev.internal.company.com,Burp 把请求发给10.128.3.15,却还带着Host: dev.internal.company.com,后端一看这域名不归我管,直接拒收。FakeIP 插件就是专治这个“身份错位”的玄学问题:它让 Burp 在发送请求前,自动把 Host 头替换成目标 IP + 端口(如Host: 10.128.3.15:8080),同时保留原始域名用于 DNS 解析和证书校验——既骗过服务端路由逻辑,又不破坏 TLS 握手。这不是锦上添花的功能,而是内网渗透、红队横向移动、云原生资产测绘时绕过 Host 白名单的刚需补丁。适合所有用 Burp 做被动扫描、重放测试、Intruder 批量探测,且目标存在虚拟主机或反向代理架构的从业者。


2. 插件原理与选型依据:为什么是 FakeIP 而不是改 Host 或写 Python 脚本

2.1 核心机制:Host 头双轨制处理

FakeIP 的设计不是简单粗暴地覆盖 Host 头,而是采用“解析-替换-还原”三段式流程:

  1. DNS 解析阶段:插件监听 Burp 的 DNS 查询事件,记录原始域名(如admin.prod.internal)对应的 IP 地址(如172.16.5.22);
  2. HTTP 请求构造阶段:在请求进入发送队列前,将Host头值从域名强制替换为IP:Port(如Host: 172.16.5.22:443);
  3. TLS 层兼容阶段:关键点来了——它不修改 SNI 字段。SNI(Server Name Indication)仍使用原始域名,确保 TLS 握手时证书能正确匹配,避免SSLHandshakeException。这是区别于手动改 Host 的致命优势:纯文本改 Host 会导致 HTTPS 请求直接失败,而 FakeIP 在应用层改 Host、网络层保 SNI,两全其美。

提示:该插件基于 Burp Extender API v2.x 开发,兼容 Burp Suite Professional v2.4+ 和 Community Edition v2.4+(Community 版需确认是否启用 Extender 功能)。不支持 v1.x 旧版本,强行加载会报ClassNotFoundException: burp.IBurpExtender。

2.2 为什么不用 Burp 内置的 “Override Host header”?

Burp 自带的 Host 头覆盖功能(Proxy → Options → Match and Replace → Add)看似能解决,但存在三个硬伤:

  • 作用域窄:仅对 Proxy 流量生效,Intruder、Repeater、Scanner 发起的请求不受影响;
  • 静态配置:必须提前知道目标 IP,无法动态解析域名(比如*.staging.company.com指向不同 CNAME,IP 经常变);
  • 无 SNI 保护:直接覆盖 Host 后,SNI 仍为原始域名,HTTPS 请求在 TCP 握手阶段就卡死。

FakeIP 是唯一能打通 Proxy/Intruder/Repeater/Scanner 全链路,且全自动适配动态 DNS 的方案。

2.3 为什么不写 Python 脚本自己实现?

有人会说:“我用 Python + requests 写个中间代理不就行了?”——理论上可行,但实操血泪经验告诉你:

  • Burp 的流量调度是异步非阻塞的,自建代理需处理连接池、超时、重试、TLS 透传,调试成本远高于加载一个插件;
  • Burp 的 Scanner 引擎深度耦合 Extender 接口,自建代理无法触发被动扫描规则(如XSS、SQLi检测);
  • FakeIP 已通过 200+ 内网环境验证(含 Nginx Ingress、Traefik、Istio Gateway、Spring Cloud Gateway),稳定性远超 DIY 方案。

3. 部署与配置:从 GitHub 下载到 Burp 中生效的完整闭环

3.1 下载与解压:确认文件结构与签名完整性

从 GitHub 仓库下载burpFakeIP-master.zip后,解压得到标准 Maven 项目结构:

burpFakeIP-master/ ├── pom.xml # Maven 构建配置,指定 burpsuite-pro-2.4.jar 为 provided 依赖 ├── src/ │ └── main/ │ ├── java/ │ │ └── burp/ │ │ ├── BurpExtender.java # 主入口,实现 IBurpExtender 接口 │ │ ├── FakeIPRequestHandler.java # 核心逻辑:Host 替换 + SNI 保留 │ │ └── Utils.java # DNS 解析工具类(调用 InetAddress.getByName) │ └── resources/ │ └── config.json # 可选配置:白名单域名、端口映射规则 └── target/ └── burp-fakeip-1.0.0.jar # 编译后的插件 JAR(需自行 mvn package)

注意:GitHub 仓库未提供预编译 JAR,必须本地构建。若你看到网上流传的.jar文件,务必用jarsigner -verify校验签名,防止恶意注入。

3.2 编译插件:Maven 构建命令与依赖处理

执行以下命令生成可加载的 JAR(假设已安装 JDK 11+ 和 Maven 3.6+):

cd burpFakeIP-master # 下载 Burp Suite Professional SDK(关键!) wget https://portswigger.net/burp/releases/download?product=professional&version=2024.7 -O burpsuite-pro-2024.7.jar # 将 SDK 安装到本地 Maven 仓库(路径需与 pom.xml 中 <version> 一致) mvn install:install-file \ -Dfile=burpsuite-pro-2024.7.jar \ -DgroupId=burp \ -DartifactId=burpsuite-pro \ -Dversion=2024.7 \ -Dpackaging=jar # 编译插件 mvn clean package -Dmaven.test.skip=true

编译成功后,target/burp-fakeip-1.0.0.jar即为可用插件。

3.3 Burp 中加载插件:Extender 面板操作与日志验证

  1. 打开 Burp Suite →Extender→Extensions→Add;
  2. Extension Type 选择Java;
  3. Select file 选择target/burp-fakeip-1.0.0.jar;
  4. 点击Next,等待加载完成(控制台输出Loaded extension: FakeIP);
  5. 关键验证步骤:打开Extender → Output标签页,发起一次 HTTPS 请求(如访问https://dev.internal.company.com),观察日志是否出现:
    [FakeIP] Resolved dev.internal.company.com -> 10.10.20.55 [FakeIP] Replaced Host header: dev.internal.company.com -> 10.10.20.55:443 [FakeIP] SNI preserved: dev.internal.company.com
    若有此日志,说明插件已生效;若无,检查 Burp 版本是否 ≥2.4,或 Java 环境是否为 JDK 11+(JDK 17 亦可,但需确认 pom.xml 中<java.version>一致)。

4. 高级配置与边界场景:白名单、端口映射与多域名处理

4.1 通过 config.json 控制作用域:避免误伤生产域名

插件默认对所有 HTTP/HTTPS 请求生效,但实际工作中需规避某些域名(如login.company.com必须保持 Host 不变,否则单点登录失效)。此时编辑src/main/resources/config.json:

{ "whitelist": ["login.company.com", "api.company.com"], "port_mapping": { "80": 8080, "443": 8443 }, "enable_https_sni_preserve": true }
  • whitelist:数组形式,匹配的域名跳过 Host 替换;
  • port_mapping:当目标服务监听非标端口时(如 HTTP 服务跑在8080),插件会将Host: ip:80替换为Host: ip:8080;
  • enable_https_sni_preserve:设为false可关闭 SNI 保留(仅调试用,生产环境严禁关闭)。

修改后需重新mvn clean package生效。

4.2 处理 CDN 或多层代理:IP 回溯与真实 Host 提取

某些架构中,域名先经 CDN(如 Cloudflare),再转发到内部负载均衡器,最终到达应用服务器。此时InetAddress.getByName()解析出的是 CDN IP,而非真实后端 IP。FakeIP 提供X-Forwarded-For和X-Real-IP头提取逻辑:

// FakeIPRequestHandler.java 片段 private String getTargetIp(IHttpRequestResponse message) { String host = getOriginalHost(message); // 优先从 X-Forwarded-For 提取(需 Burp Proxy 设置中开启 "Support invisible proxying") String xff = getHeader(message, "X-Forwarded-For"); if (xff != null && !xff.trim().isEmpty()) { return xff.trim().split(",")[0].trim(); // 取第一个 IP } // fallback 到 DNS 解析 return resolveHost(host); }

提示:启用此功能需在 Burp Proxy → Options → Proxy Listeners → Edit → Request handling → 勾选"Support invisible proxying",否则X-Forwarded-For头不会被 Burp 透传。

4.3 Intruder 与 Scanner 的联动验证:确保全链路生效

FakeIP 对 Burp 全模块生效,但需针对性验证:

模块验证方法预期现象
Proxy浏览器访问https://test.internal,查看 HTTP history 中 Host 头值Host 显示10.10.20.55:443,非域名
Repeater右键发送到 Repeater,修改任意参数后点击Send响应状态码 200(此前为 403/404)
Intruder设置 Payload 位置为 URL path,启动攻击,观察结果列中Host是否统一为 IP所有请求 Host 头均为IP:Port,无域名残留
Scanner对https://test.internal/api/v1/users发起被动扫描扫描结果中Host头被替换,且漏洞报告正常生成

若某模块未生效,检查 Burp 版本兼容性(v2.4+)及插件是否在Extender → Extensions中显示为Loaded(非 Error 状态)。


5. 避坑指南:五个真实踩过的坑与对应解法

5.1 现象:HTTPS 请求全部失败,Burp 日志报javax.net.ssl.SSLHandshakeException: No subject alternative names present

原因:插件未正确保留 SNI,导致服务器返回的证书不包含 IP 地址的 SAN(Subject Alternative Name)。虽然 FakeIP 默认开启 SNI 保留,但若 Burp 版本过低(<v2.4)或 JDK 不兼容,SNI 传递会失效。
解决:升级 Burp Suite 至 v2.4+,使用 JDK 11 或 JDK 17(JDK 8 不支持 TLS 1.3 SNI 透传),并在config.json中显式设置"enable_https_sni_preserve": true。

5.2 现象:Host 头被替换,但服务器返回502 Bad Gateway

原因:目标服务部署在 Nginx 反向代理后,Nginx 的server_name配置为域名(如server_name admin.internal;),而 FakeIP 替换 Host 后,Nginx 无法匹配 server block,转到 default server 返回 502。
解决:修改 Nginx 配置,在对应 server block 中添加server_name匹配 IP:

server { listen 443 ssl; server_name admin.internal 10.10.20.55; # 添加 IP ... }

或联系运维在反向代理层启用underscores_in_headers on;并允许 IP 作为 Host。

5.3 现象:插件加载后 Proxy 流量正常,但 Scanner 扫描无任何结果

原因:Burp Scanner 默认对Host头为 IP 的请求降低扫描优先级(认为是内网地址,风险低),导致 passive scan 跳过。
解决:进入Scanner → Options → Passive Scan Options → Scope,勾选 **"Include items with IP addresses in the Host header"**;同时在 **Scope → Include in scope** 中添加目标 IP 段(如10.10.20.0/24`)。

5.4 现象:config.json修改后不生效,仍对白名单域名替换 Host

原因:Maven 编译时未将config.json打包进 JAR,或打包路径错误(应位于 JAR 根目录,而非resources/子目录)。
解决:检查target/burp-fakeip-1.0.0.jar内容:

jar -tf target/burp-fakeip-1.0.0.jar | grep config.json # 正确输出应为:config.json(无路径前缀)

若输出为resources/config.json,修改pom.xml中<resources>配置,确保src/main/resources/config.json被复制到 JAR 根目录。

5.5 现象:Burp 启动时报java.lang.NoClassDefFoundError: burp/IBurpExtender

原因:Maven 编译时未正确引入 Burp SDK,或burpsuite-pro-x.x.jar版本与当前 Burp 不匹配(如用 v2.4 SDK 加载 v2024.7 Burp)。
解决:严格按 3.2 节步骤,下载与当前 Burp 版本完全一致的 SDK JAR,并执行mvn install:install-file;编译前运行mvn dependency:tree | grep burp确认依赖版本正确。


6. 实战技巧:用 FakeIP 复现 CVE-2022-26134 时的关键绕过策略

CVE-2022-26134(Confluence OGNL 注入)的复现,常卡在 Host 头校验环节。官方 PoC 要求Host: confluence.example.com,但内网靶机实际 IP 是192.168.100.20,直接发包返回400 Bad Request。FakeIP 在这里不是辅助工具,而是通关钥匙。

6.1 构造精准 PoC 请求:Host 替换 + 路径混淆

标准 PoC 是:

GET /%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3...... HTTP/1.1 Host: confluence.example.com

但靶机拒绝此 Host。用 FakeIP 后,实际发送为:

GET /%3C%3C%3C...(同上) HTTP/1.1 Host: 192.168.100.20:8090 User-Agent: Mozilla/5.0 ...

关键点:Confluence 默认监听8090端口,因此必须在config.json中配置"port_mapping": {"80": 8090, "443": 8443},否则 Host 变成192.168.100.20:80,请求被拒。

6.2 Scanner 被动扫描的深度利用:自动发现隐藏路径

FakeIP 开启后,Scanner 对https://confluence.internal的被动扫描会捕获所有响应,包括原本因 Host 不匹配而返回 404 的/s/、/rest/等 API 路径。此时可:

  1. 在Target → Site map中右键目标域名 →"Engagement tools → Find applications on this host";
  2. Burp 自动发起目录爆破,因 Host 头已修正,所有请求均返回真实状态码;
  3. 结合Scanner → Issues查看Path Traversal、XSS等高危漏洞,这些在 Host 错误时根本不会触发扫描引擎。

6.3 Repeater 中的动态调试:实时验证 Host 替换效果

在 Repeater 中,右键任意请求 →"Send to Repeater",然后:

  • 修改 URL 路径为/rest/api/content?os_authType=basic;
  • 观察下方Request区域的 Host 头是否已变为192.168.100.20:8090;
  • 点击Send,若返回200 OK且含 JSON 数据,说明 FakeIP 生效;若仍为400,检查config.json中端口映射是否正确,或靶机是否监听8090(可通过nmap -p 8090 192.168.100.20验证)。

从那以后我每次做内网渗透前,都强制走一遍 FakeIP 的三步验证:

  1. 解压后mvn clean package编译;
  2. 加载到 Burp 后发一个 HTTPS 请求,确认 Extender Output 出现Resolved和Replaced Host日志;
  3. 在 Repeater 中手动构造一个带敏感路径的请求,确保能拿到 200 响应。
    这三步花不了 2 分钟,却能避免后面几小时卡在 Host 头问题上反复抓包、怀疑网络、重装 Burp——它不是锦上添花的插件,而是你打开内网大门时,钥匙串上最基础的那一把。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询