写了一个 SRE 调试工具,类似一个小木马

gohttpd 是一个面向 SRE 临时调试场景的小型 HTTP 工具,可用于受控环境下远程执行命令、上传下载文件、打印 HTTP 请求和调试 Webhook。

作者 巴辉特

远程操作机器有时会比较麻烦,我写了一个工具,主要功能:1.远程执行命令 2.上传下载文件。是一个 Web Server,通过 HTTP 请求来操作机器,类似一个小木马。当然,因为是一个 Web Server,所以也提供了打印 HTTP 请求的能力,方便调试 Webhook 场景。下面给大家演示一下。

适用场景和安全边界

gohttpd 更适合作为 SRE 在受控环境里的临时调试工具,而不是长期暴露在公网的远程管理系统。它的价值是把“登录机器、执行命令、传文件、看 Webhook 请求体”这些临时动作封装成简单的 HTTP 接口,方便排查问题或验证集成。

使用前先明确几个边界:

  • 只在可信网络、临时环境或隔离机器上启动,不建议暴露到公网。
  • 启动时必须设置认证密码,调试结束后及时关闭进程。
  • /run 具备远程执行命令能力,应按高危操作对待。
  • 上传下载文件适合临时传递调试材料,不适合作为正式文件分发系统。
  • /request/print 更适合 Webhook、告警回调、HTTP Header 与 Payload 调试。
能力 接口或入口 解决的问题 风险提示
远程执行命令 /run 临时查看主机状态、执行诊断命令 权限很高,必须控制网络和认证
下载文件 根路径文件列表 从目标机器取回日志或临时文件 不要在敏感目录长期运行
上传文件 /upload 向目标机器传调试脚本或材料 上传内容需自行确认可信
打印 HTTP 请求 /request/print 调试 Webhook 请求格式 注意请求体里可能包含敏感信息

安装

工具代码放到 Github 上了,感兴趣的朋友可以瞧瞧,没多少行代码。也给大家编译好了,下载地址在这里:https://github.com/UlricQin/gohttpd/releases。提供 x86 和 arm64 的 Linux 版本,下载后解压就可以直接运行。

# 我是 arm64 架构的机器,所以下载 arm64 版本,下载完了解压缩
tar zxvf gohttpd-v0.3-linux-arm64.tar.gz

# 进入解压缩出来的目录里
cd gohttpd-v0.3-linux-arm64

# 运行 gohttpd,监听 8888 端口,认证密码是 Pa55word
./gohttpd 8888 Pa55word

如上,运行 gohttpd 时,需要传入两个参数,第一个是要监听的端口号,第二个是认证密码。这里我传入的是 8888 和 Pa55word。我这个机器的 IP 是 10.211.55.3,下面给大家演示一下。

操作演示

命令执行

我先通过这个 HTTP Server 在目标机器执行个命令:

ulric@ulric-flashcat ~ % curl 10.211.55.3:8888/run -d 'hostname;uptime'
Authorization is blank

报错了,说 Authorization 为空,这是缺少认证信息,认证信息就是 Pa55word,所以我再加上认证信息(放 header 里):

ulric@ulric-flashcat ~ % curl -H "Authorization: Pa55word" 10.211.55.3:8888/run -d 'hostname;uptime'
ubuntu-linux-22-04-desktop
 11:01:56 up 2 days, 16:42,  3 users,  load average: 0.29, 0.15, 0.11

OK,正常输出了机器名和 uptime 信息。当然,通过 -d 的方式可能不方便编辑,尤其是在换行的时候,我们可以使用 postman 这类工具,更方便的编辑请求体。比如

写了一个 SRE 调试工具,类似一个小木马 - 图1

下载文件

刚才命令执行的时候,调用的接口(URL路径)是 /run,我们不加任何 URL 路径,直接请求,就可以列出当前目录下的文件,比如:

写了一个 SRE 调试工具,类似一个小木马 - 图2

点击对应的文件,就可以下载了。如果你在 Linux 根目录下运行 gohttpd,那么你就可以下载整个系统的文件了,所以要注意安全。

上传文件

上传文件的 URL 是 /upload,使用浏览器打开,如图:

写了一个 SRE 调试工具,类似一个小木马 - 图3

可以选择多个文件,上传,完事去首页看看,就可以看到上传的文件了。

接口调试

有些产品对外提供 Webhook 能力,但是我想之后 Webhook 的具体内容格式,这时候可以用这个工具来打印 HTTP 请求,比如:

ulric@ulric-flashcat ~ % curl 10.211.55.3:8888/request
r.RequestURI: /request
r.URL.Path: /request
r.URL.Host:
r.URL.Hostname():
r.Method: GET
r.URL.Scheme:
gohttpd pid: 842085

Headers:
User-Agent: curl/8.4.0
Accept: */*

Payload:

ulric@ulric-flashcat ~ % curl 10.211.55.3:8888/request -d 'hello world'
r.RequestURI: /request
r.URL.Path: /request
r.URL.Host:
r.URL.Hostname():
r.Method: POST
r.URL.Scheme:
gohttpd pid: 842085

Headers:
User-Agent: curl/8.4.0
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded

Payload:
hello world

如上,通过 /request 接口,可以打印出 HTTP 请求的详细信息,包括 URL、Method、Headers、Payload 等。但是这个内容是通过 HTTP Response 直接返回的。不方便调试 Webhook 场景,Webhook 场景可以使用 /print 接口,别的服务调用 /print 接口的时候,就会在 gohttpd 的控制台打印出 HTTP 请求的详细信息。

比如我 curl 一下 /print

ulric@ulric-flashcat ~ % curl 10.211.55.3:8888/print -d 'hello world'
ok

然后到启动 gohttpd 的控制台看看:

root@ubuntu-linux-22-04-desktop:~/download/gohttpd-v0.2-linux-arm64# ./gohttpd 8888 Pa55word
2024/04/10 11:00:04 main.go:211: listening http on 8888
r.RequestURI: /print
r.URL.Path: /print
r.URL.Host:
r.URL.Hostname():
r.Method: POST
r.URL.Scheme:
gohttpd pid: 842085

Headers:
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
User-Agent: curl/8.4.0

Payload:
hello world

对于调试 Webhook 的场景,这就比较方便了。

使用建议

如果只是想看某个 Webhook 到底发了什么,优先使用 /print/request,不要开启不必要的命令执行操作。如果确实要执行命令,建议只在短时间内启动 gohttpd,使用完立即停止。

更稳妥的调试流程是:

  1. 在目标机器的临时目录启动 gohttpd。
  2. 使用只对当前调试人员可见的网络路径访问。
  3. 先用 /request/print 验证 HTTP 请求格式。
  4. 必要时再用 /run 执行只读诊断命令,例如 hostnameuptimedf -h
  5. 调试完成后关闭进程,并清理上传的临时文件。

常见问题

Q1:gohttpd 能否当作长期远程运维平台使用? A:不建议。它是临时调试工具,适合短时间、受控网络、明确目的的排障场景。

Q2:为什么说 /run 要谨慎使用? A:/run 可以在目标机器执行命令,一旦认证信息泄露或网络暴露范围过大,就可能带来严重风险。

Q3:Webhook 调试时应该用 /request 还是 /print A:如果是自己发请求并想直接在响应里看结果,用 /request;如果是第三方服务回调,响应体不方便查看,就用 /print 在 gohttpd 控制台看请求细节。

如上知识,希望对你有帮助。文末请允许我插播一个小广告。本人创业两年了,我们公司的业务如下,如果你有这方面的需求,欢迎联系我们做产品技术交流哈。

🎯 关于快猫星云

快猫星云是一家云原生智能运维科技公司,由知名开源项目“夜莺(Nightingale)”的核心开发团队组成,创始团队均来⾃阿⾥、百度、滴滴等互联⽹公司。夜莺是一款开源云原生监控工具,是中国计算机学会接受捐赠并托管的第一个开源项目,在GitHub上有超过8000颗星,迭代发布了超过100多个版本,上百位社区贡献者,是国内领先的开源可观测性解决方案。

快猫星云以开源夜莺为内核打造的“Flashcat平台”,是国内顶级互联⽹公司可观测性实践的产品化落地,致力于让可观测性技术更好的服务企业,保障服务稳定性。Flashcat 平台具有以下特点:

  • 统一采集:采用插件化思路,内置集成上百种采集插件,服务器、网络设备、中间件、数据库、应用、业务,均可监控,开箱即用。
  • 统一告警:支持几十种数据源对接,收集各类监控系统的告警事件,进行统一的告警收敛、降噪、排班、认领、升级、协同,大幅提升告警处理效率。
  • 统一观测:将 Metrics、Logs、Traces、Events、Profiling 等多种可观测性数据融会贯通,并预置行业最佳实践,既提供全局业务视角、技术视角的驾驶舱,也提供层层下钻的故障定位能力,有效缩短故障发现和定位时间。

联系我们交流

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

标签 SRE
快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云