news 2026/10/2 17:58:43

Hetty 安全研究 HTTP 工具包:开源 MITM 代理、流量拦截与重放全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hetty 安全研究 HTTP 工具包:开源 MITM 代理、流量拦截与重放全指南
  • 网络安全
  • 应用安全

【免费下载链接】hetty

An HTTP toolkit for security research.

项目地址:https://gitcode.com/GitHub_Trending/he/hetty
点击查看免费下载

导读

Hetty 是一款面向安全研究(security research)的 HTTP 工具包,目标是成为 Burp Suite Pro 等商业软件的开源替代方案,面向 infosec 与 bug bounty 社区的实际需求设计。它内置了带日志与高级搜索能力的中间人(MITM)HTTP 代理、可手动构造/编辑请求并回放代理流量的 HTTP 客户端、请求/响应拦截、Scope 作用域管理,以及基于项目的数据库存储与 Web 管理界面。读完本文,你将掌握 Hetty 的安装方式、全部 CLI 参数、MITM 与 CA 证书原理、代理日志搜索语法、拦截配置、Scope 规则与 Sender 重放流程,并能在本地快速搭建一套完整的安全测试工作环境。

Hetty 是什么:核心特性一览

Hetty 以单个可执行文件同时提供 HTTP 代理、GraphQL 服务与 Web 管理界面三部分能力。官方 README.md 列出的核心特性包括:

  • Machine-in-the-middle(MITM)HTTP 代理,支持流量日志与高级搜索;
  • HTTP 客户端(Sender),用于手动创建/编辑请求,并可回放代理捕获的请求;
  • 请求与响应拦截,供人工审查(可编辑、发送/接收、取消);
  • Scope 作用域支持,帮助保持工作有条理;
  • 易用的 Web 管理界面;
  • 基于项目(Project)的数据库存储,帮助组织工作内容。

从源码结构看,这一整套能力由几个核心包协同完成:代理与证书逻辑位于 pkg/proxy,请求日志与搜索位于 pkg/reqlog,拦截服务位于 pkg/proxy/intercept,Scope 规则位于 pkg/scope,Sender 位于 pkg/sender,数据库层则基于 bbolt 实现于 pkg/db/bolt。前端管理界面是位于 admin 目录下的 Next.js + React + MUI 应用,构建产物会被嵌入 Go 二进制(见 cmd/hetty/hetty.go 中的go:embed admin指令)。

安装 Hetty:五种获取方式

README 建议通过包管理器快速安装和更新 Hetty,覆盖 macOS、Linux、Windows 三大平台,另提供 Docker 与从源码编译两种方式。

macOS

brew install hettysoft/tap/hetty

Linux

sudo snap install hetty

Windows

scoop bucket add hettysoft https://github.com/hettysoft/scoop-bucket.git scoop install hettysoft/hetty

其他平台:下载发布版二进制

如果操作系统不在上述包管理器或 GitHub Releases 的覆盖范围内,可以下载对应 OS 与架构的最新发布版,将二进制放入$PATH中的某个目录即可运行;也可从源码编译。

Docker

Docker 镜像通过 GitHub Container Registry 与 Docker Hub 分发。使用如下命令运行,同时挂载数据卷用于数据库与证书存储,并将 8080 端口映射到宿主机:

docker run -v $HOME/.hetty:/root/.hetty -p 8080:8080 \ ghcr.io/dstotijn/hetty:latest

容器内部默认工作目录为/app,入口即./hetty,镜像暴露 8080 端口——这与 Dockerfile 中的EXPOSE 8080与ENTRYPOINT ["./hetty"]一致。宿主机的$HOME/.hetty目录对应容器内/root/.hetty,其中保存着 CA 证书、私钥与数据库文件,保证重启容器后数据不丢失。

从源码编译

仓库根目录的 Makefile 提供了完整构建流程:make build会先执行build-admin(在admin目录下yarn install --frozen-lockfile && yarn run export,将 Next.js 静态导出产物移动到cmd/hetty/admin),再执行go build ./cmd/hetty产出可执行文件。构建时通过-ldflags="-s -w -X main.version=${HETTY_VERSION}"注入版本号(见 Dockerfile)。如果只想构建后端而跳过前端,可分别执行make build-admin与go build ./cmd/hetty。

快速上手:启动与 CLI 参数全解

安装完成后,直接在终端运行:

hetty

服务启动后默认监听:8080,同时提供代理端口、GraphQL API(/api/graphql/)与 Web 管理界面。命令行下可用hetty --help查看全部可用选项,README 给出的完整输出如下:

$ hetty --help Usage: hetty [flags] [subcommand] [flags] Runs an HTTP server with (MITM) proxy, GraphQL service, and a web based admin interface. Options: --cert Path to root CA certificate. Creates file if it doesn't exist. (Default: "~/.hetty/hetty_cert.pem") --key Path to root CA private key. Creates file if it doesn't exist. (Default: "~/.hetty/hetty_key.pem") --db Database file path. Creates file if it doesn't exist. (Default: "~/.hetty/hetty.db") --addr TCP address for HTTP server to listen on, in the form \"host:port\". (Default: ":8080") --chrome Launch Chrome with proxy settings applied and certificate errors ignored. (Default: false) --verbose Enable verbose logging. --json Encode logs as JSON, instead of pretty/human readable output. --version, -v Output version. --help, -h Output this usage text. Subcommands: - cert Certificate management Run `hetty <subcommand> --help` for subcommand specific usage instructions. Visit https://hetty.xyz to learn more about Hetty.

各参数的作用与底层行为

各参数的解析与默认值定义在 cmd/hetty/hetty.go 中,要点如下:

参数默认值说明
--cert~/.hetty/hetty_cert.pem根 CA 证书路径,文件不存在时自动创建
--key~/.hetty/hetty_key.pem根 CA 私钥路径,文件不存在时自动创建
--db~/.hetty/hetty.dbBoltDB 数据库文件路径,不存在时自动创建
--addr:8080HTTP 服务监听地址,格式为host:port
--chromefalse启动 Chrome 并自动套用代理设置、忽略证书错误
--verbosefalse开启详细日志
--jsonfalse以 JSON 格式输出日志(替代人类可读的格式化输出)
--version/-v-输出版本号
--help/-h-输出帮助信息

从实现上看,--cert、--key、--db三个路径中的~会在启动时通过homedir.Expand展开为真实主目录(见 cmd/hetty/hetty.go);随后调用proxy.LoadOrCreateCA加载或生成 CA 密钥对,再用bolt.OpenDatabase打开数据库;HTTP 服务通过net.SplitHostPort解析监听地址,若监听在localhost或本机回环地址,管理界面访问地址会显示为http://localhost:<port>。

cert 子命令:证书管理

hetty cert子命令用于管理系统信任库中的 CA 证书,其下再分install与uninstall两个子命令(实现在 cmd/hetty/cert.go):

  • hetty cert install:将证书安装到系统信任库,并(可选)安装到 Firefox 与 Java 信任库。参数包括--cert(默认~/.hetty/hetty_cert.pem)、--firefox(默认 false)、--java(默认 false)、--skip-system(跳过系统信任库安装,默认 false)。
  • hetty cert uninstall:从系统信任库卸载证书,参数与 install 相同。

安装到系统信任库时可能会提示输入密码(源码中会输出对应提示日志);--skip-system可在只操作 Firefox/Java 信任库时跳过系统信任库。信任库操作底层依赖smallstep/truststore库完成跨平台集成。

MITM 代理与 CA 证书机制

作为安全研究工具,Hetty 的核心能力是中间人代理:客户端把流量指向 Hetty,Hetty 在转发给目标服务器的同时记录、拦截和修改请求与响应。其中最关键的是 TLS 流量解密——这依赖于一套本地根 CA。

CA 的生成与持久化

首次启动时,proxy.LoadOrCreateCA会尝试用tls.LoadX509KeyPair从--cert/--key指定的文件加载已有密钥对;若文件不存在,则调用NewCA生成新的根 CA(CommonName 为 "Hetty",组织为 "Hetty CA",有效期 365 天),并把 PEM 格式的证书与 PKCS8 私钥写入磁盘(见 pkg/proxy/cert.go)。私钥文件以0600权限写入,以限制其他用户读取。

基于 SNI 的动态证书签发

NewCertConfig为代理构建 MITM 用的 TLS 配置:TLSConfig中的GetCertificate回调根据客户端 TLS ClientHello 中的 SNI 服务器名,动态签发一张临时证书——使用根 CA 为其签名,有效期 24 小时,证书主体(CommonName)即为目标主机名(见 pkg/proxy/cert.go)。这样浏览器在访问任意 HTTPS 站点时都能收到一张"看似可信"的证书,前提是根 CA 已被客户端信任。

请求转发链路

Proxy实现了http.Handler(pkg/proxy/proxy.go):普通 HTTP 请求直接进入httputil.ReverseProxy转发;CONNECT方法(HTTPS 隧道)则先Hijack连接,用代理 CA 与客户端完成 TLS 握手,再在隧道内继续转发。请求与响应在转发过程中会依次经过各中间件(RequestModifier/ResponseModifier),这正是日志记录与拦截功能挂载的钩子点。转发传输层默认关闭压缩(DisableCompression: true),并在modifyResponse中自动解压 gzip 响应体(见 pkg/proxy/gzip.go),确保后续日志与拦截看到的是明文内容。

让客户端信任根 CA

要使 HTTPS 流量被正确解密,需要把根 CA 安装到浏览器或操作系统的信任库。最便捷的方式是使用上文提到的hetty cert install(支持系统信任库及 Firefox、Java 信任库);另外hetty --chrome参数会启动一个套用代理设置并忽略证书错误的 Chrome 实例(基于 chromedp 实现,见 cmd/hetty/hetty.go),适合快速体验而无需手动配置浏览器。

代理日志与高级搜索

所有流经代理的 HTTP 请求/响应都会被记录(前提是存在激活的项目),并可在管理界面的日志页(Logs)进行高级搜索。日志数据结构RequestLog/ResponseLog定义于 pkg/reqlog/reqlog.go,记录了 URL、方法、协议版本、头部、请求体与响应状态码、状态短语、响应体等信息。

搜索表达式语法

日志搜索采用一套自研的过滤表达式语言,词法与语法分析器分别位于 pkg/filter/lexer.go 与 pkg/filter/parser.go,支持以下操作符:

操作符含义
=等于
!=不等于
><>=<=大小比较(当前按字符串比较)
=~正则匹配
!~正则不匹配
ANDORNOT逻辑组合,支持括号分组

例如:method = "GET" OR url =~ "/foobar"。

可搜索的字段键

日志匹配逻辑实现在 pkg/reqlog/search.go,支持请求侧与响应侧两类字段:

  • 请求侧(req.*):req.id(日志 ID)、req.proto(协议版本,如 HTTP/1.1)、req.url(完整 URL)、req.method(方法)、req.body(请求体)、req.timestamp(时间戳);
  • 响应侧(res.*):res.proto、res.statusCode(状态码)、res.statusReason(状态短语)、res.body(响应体);
  • 特殊键:req.headers与res.headers用于对头部做匹配(与=、!=、=~、!~操作符配合,匹配格式为Key: Value,实现见 pkg/filter/http.go)。

此外,输入一个裸字符串(不带操作符)时,会执行全文子串匹配:只要请求/响应的任意头部(Key: Value形式)或上述任意字段包含该字符串(大小写不敏感)即命中。解析器的行为由 pkg/filter/parser_test.go 中的测试用例覆盖验证。

过滤与作用域联动

日志页还提供"仅显示作用域内请求(Only show in-scope requests)"的开关(前端实现见 admin/src/features/reqlog/components/Search.tsx),配合 Scope 规则把注意力聚焦在目标范围内。后端FindRequestsFilter携带OnlyInScope与SearchExpr两个维度(见 pkg/reqlog/reqlog.go)。另外,项目设置中若开启"跳过作用域外请求的日志记录",代理日志会在不匹配任何 Scope 规则时被旁路(bypass),不写入数据库。

拦截请求与响应

拦截功能允许在代理转发前"冻结"请求或响应,供人工审查与修改后再放行。拦截服务实现于 pkg/proxy/intercept/intercept.go,通过 Go channel 实现阻塞式等待:代理管线中的InterceptRequest/InterceptResponse会把请求/响应登记进待处理队列并阻塞,管理界面处理完后调用ModifyRequest/ModifyResponse把修改后的对象送回队列,解除阻塞继续转发。

拦截设置项

拦截行为以项目为单位配置,相关设置通过 GraphQL 变更updateInterceptSettings下发(Schema 见 pkg/api/schema.graphql),设置项包括:

  • requestsEnabled:是否启用请求拦截;
  • responsesEnabled:是否启用响应拦截;
  • requestFilter:请求过滤表达式,仅匹配的请求被拦截;
  • responseFilter:响应过滤表达式,仅匹配的响应被拦截。

管理界面中的设置页(admin/src/features/settings/components/Settings.tsx)以开关与文本框形式暴露这些选项,过滤表达式的占位示例为method = "GET" OR url =~ "/foobar"(请求)与statusCode =~ "^2" OR body =~ "foobar"(响应)。请求/响应过滤表达式的可用字段键见 pkg/proxy/intercept/filter.go:请求侧为proto、url、method、body、headers;响应侧为proto、statusCode、statusReason、body、headers。

拦截后的操作

在拦截页(/proxy/intercept,对应 admin/src/pages/proxy/intercept/index.tsx)中,可以对被拦截的请求/响应执行:

  • 编辑并发送(Forward):修改 URL、方法、协议、头、请求体(响应侧则为状态码、状态短语、头、响应体)后放行;
  • 取消 / 丢弃(Cancel):中止请求,不再向目标服务器发送(后端返回ErrRequestAborted并取消请求上下文,见 pkg/proxy/intercept/intercept.go)。

拦截页 UI 由上下两个面板组成:上方是请求/响应编辑区,下方是待处理请求列表,且会自动选中列表中的第一个待处理请求以便快速连续处理(见 admin/src/features/intercept/components/Intercept.tsx)。左侧导航栏的 Intercept 入口还会显示待处理数量的角标(见 admin/src/features/Layout.tsx)。当请求拦截由启用切换为禁用时,后端会自动清空所有待处理请求(UpdateSettings中的清理逻辑)。

Scope 作用域规则

Scope 用于界定"当前关注的目标范围",帮助把日志、拦截等操作聚焦在特定主机、路径或特征上。Scope 规则由三条可独立使用的正则维度构成(实现见 pkg/scope/scope.go):

  • URL:对请求的完整 URL 做正则匹配;
  • Header:对请求头的 Key 与 Value 分别做正则匹配(仅填其一则只匹配其一,两者都填则需同时命中);
  • Body:对请求体做正则匹配。

只要请求命中任意一条规则的任意一个维度即视为"在作用域内"。规则可通过 GraphQLsetScope变更提交;管理界面的 Scope 页(admin/src/features/scope/components/AddRule.tsx)目前暴露 URL 类型的规则添加,输入框占位示例为^https:\/\/(.*)example.com(.*),即以正则表达目标站点。作用域同时被日志过滤(onlyInScope)、日志旁路(bypass out-of-scope)与拦截过滤共用。

Sender:手工构造请求与回放

Sender 是 Hetty 内置的 HTTP 客户端,用于手工创建/编辑请求,并可回放代理日志中捕获的请求。前端入口为 admin/src/features/sender/components/Sender.tsx(上方面板编辑请求、下方面板显示历史记录)。

请求编辑能力

编辑区(admin/src/features/sender/components/EditRequest.tsx)支持:

  • 选择 HTTP 方法(GET/HEAD/POST/PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH)与协议版本(HTTP/1.0、HTTP/1.1、HTTP/2.0,默认 HTTP/2);
  • 编辑 URL(修改 URL 时自动同步查询参数表格)与请求头;
  • 编辑请求体,并支持从代理日志一键导入请求(createSenderRequestFromHttpRequestLog)。

协议版本由 pkg/sender/transport.go 中的自定义HTTPTransport实现:基于请求上下文中的协议值,在http.DefaultTransport(尝试 HTTP/2)与禁用 HTTP/2 的 HTTP/1.1 专用 transport 之间切换。发送请求默认超时 30 秒。

请求持久化与历史

Sender 请求保存在数据库(sender_requests桶),每个请求可记录响应结果,形成可复用的历史列表;后续可直接从历史重新发送或再次编辑。发送流程通过 GraphQLcreateOrUpdateSenderRequest+sendRequest完成(Schema 见 pkg/api/schema.graphql)。

基于项目的数据库存储

Hetty 使用 bbolt(纯 Go 嵌入式 KV 数据库)持久化所有数据,默认数据库文件为~/.hetty/hetty.db。数据库层实现在 pkg/db/bolt,顶层为projects桶,每个项目对应一个嵌套桶,桶内再分reqlogs(请求日志)与sender_requests(Sender 请求)子桶(见 pkg/db/bolt/proj.go)。项目与日志均以 ULID 作为 ID(pkg/proxy/proxy.go 中每个请求生成一个 ULID 并注入上下文,日志存储即复用该 ID)。

管理界面的 Projects 页用于创建/打开/删除项目;只有激活(打开)项目后,代理日志、拦截、Sender 等功能才可用(导航栏中这些入口在无激活项目时处于禁用状态,见 admin/src/features/Layout.tsx)。新项目创建后会自动打开(见 admin/src/features/projects/components/NewProject.tsx)。请求日志存储逻辑见 pkg/reqlog/reqlog.go 的RequestModifier/ResponseModifier:无激活项目时旁路记录,请求按需读取完整请求体,响应体以异步 goroutine 落库。其正确性由 pkg/reqlog/reqlog_test.go 中的TestRequestModifier等测试覆盖。

Web 管理界面与整体架构

管理界面是一个基于 Next.js(静态导出)+ React + Material UI 的 SPA,源码位于 admin/src,构建产物通过go:embed直接嵌入 Go 二进制,因此单文件分发、无需单独部署前端。路由层面,cmd/hetty/hetty.go 用gorilla/mux构建路由器:当请求的 Host 是本机主机名、hetty.proxy、localhost:<port>或监听地址时,命中管理界面与 GraphQL API 路由;其余流量(含CONNECT与带 scheme 的外部 URL)则全部落入代理处理器。

界面导航包含 Home、Logs(代理日志)、Intercept(拦截)、Sender、Scope、Projects、Settings 等页面。Settings 页目前提供项目级的 Intercept 设置(请求/响应拦截开关与过滤表达式)。

社区、贡献与许可证

  • 项目处于活跃开发状态,功能与路线图可关注官方文档(hetty.xyz)与 GitHub issues/discussions;
  • 想要参与贡献的开发者可参考仓库内的 CONTRIBUTING.md 与 CODE_OF_CONDUCT.md;
  • Hetty 以 MIT 许可证开源,版权归 Hetty Software(© 2019–2025)所有。

小结

从本文的梳理可以看到,Hetty 以"单二进制 + 内嵌前端 + bbolt 存储"的紧凑架构,覆盖了安全研究中最常用的工作流:配置 MITM 代理与 CA、浏览并搜索代理日志、按规则拦截和修改请求/响应、用 Scope 收敛目标范围、再用 Sender 手工构造与回放请求。所有核心行为都能在 pkg 与 cmd/hetty 的源码、pkg/api/schema.graphql 的 GraphQL Schema 以及各包对应的测试用例中找到确切依据,方便进一步深入阅读与二次开发。

  • 网络安全
  • 应用安全

【免费下载链接】hetty

An HTTP toolkit for security research.

项目地址:https://gitcode.com/GitHub_Trending/he/hetty
点击查看免费下载
上一篇:抖音批量下载工具技术解析:从API调用到智能管理的完整解决方案
下一篇:抖音批量下载工具完整指南:去水印、支持合集与用户主页的专业解决方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 17:57:31

JavaWeb停车场管理系统源码拆包:课程设计实战与避坑指南

简介&#xff1a;这份资源是面向高校计算机相关专业学生与JavaWeb初学者的一套停车场管理系统课程设计完整方案&#xff0c;对应大作业与实训场景&#xff0c;帮助读者在缺乏项目经验时快速完成从需求分析到功能落地的全过程。压缩包共1086个文件&#xff0c;约92.05MB&#xf…

作者头像 李华
网站建设 2026/10/2 17:50:56

STK 11.5在WIN10环境下的正规安装与配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/2 17:50:26

Windows USB驱动安装失败0x5错误深度解析与修复

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/2 17:49:45

程序员桌面美化指南:Wallpaper Engine动态壁纸挑选与性能优化技巧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华