- 网络安全
- 应用安全
【免费下载链接】hetty
An HTTP toolkit for security research.
导读
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/hettyLinux
sudo snap install hettyWindows
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.db | BoltDB 数据库文件路径,不存在时自动创建 |
--addr | :8080 | HTTP 服务监听地址,格式为host:port |
--chrome | false | 启动 Chrome 并自动套用代理设置、忽略证书错误 |
--verbose | false | 开启详细日志 |
--json | false | 以 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.
相关推荐
开源替代Burp Suite:Hetty全能HTTP拦截工具
开源替代Burp Suite:Hetty全能HTTP拦截工具 痛点直击:安全测试工程师的工具困境 你是否还在为Burp Suite的高昂授权费用而却步?是否因商
网络安全应用安全终极指南:如何用Hetty成为HTTP安全研究高手
终极指南:如何用Hetty成为HTTP安全研究高手 Hetty是一款专为安全研究打造的HTTP工具包,旨在成为Burp Suite Pro等商业软件的开源替代方
网络安全应用安全Qwen3-30B-A3B-Thinking-2507-FP8模型配置详解:从tokenizer到量化配置的完整指南
Qwen3 30B A3B Thinking 2507 FP8模型配置详解:从tokenizer到量化配置的完整指南 欢迎来到这篇关于Qwen3 30B A3B
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考