
从终端到浏览器给fscan内网扫描工具搭一个Web管理平台的全程记录【免费下载链接】fscan一款内网综合扫描工具方便一键自动化、全方位漏扫扫描。(An intranet comprehensive scanning tool, enabling one-click automated, all-round vulnerability scanning)项目地址: https://gitcode.com/GitHub_Trending/fs/fscan凌晨三点终端里滚动的不是日志是一屏一屏的扫描结果。你在等一条弱口令命中同时还得手动翻找哪个网段的扫描跑完了。fscan 是目前用的人挺多的内网扫描工具主机探测、端口扫描、服务爆破、Web 指纹一条龙都能干但它的交互方式只有一种命令行。这篇文章讲的就是怎么给 fscan 套一层 Web 管理平台浏览器里填参数、点开始扫描结果像直播一样逐条推进页面。不用改 fscan 的核心引擎整个改造只加了一百来行 Go 代码加一个前端工程。读完你能在自己的仓库里把这套东西跑起来。先看终端输出的信息密度一屏里混着端口、服务、漏洞、账号密码扫得越猛刷得越快人眼根本追不上。这就是要做的 Web 平台要解决的事——把盯着终端等结果换成打开网页看直播。整体蓝图四个部件怎么拼在一起先给全局观后面所有代码都挂在这张图上四个角色各司其职浏览器负责收参数和展示HTTP API 层负责接任务、查状态结果广播中枢一个 WebSocket Hub负责把引擎产出实时发给所有在线页面扫描执行器负责把表单参数翻译成引擎能懂的东西然后调起 fscan 真正的扫描逻辑。先让服务活过来一个二进制同时提供API和页面fscan 仓库里已经内置了这套 Web 能力的骨架藏在构建标签后面。所有 Web 相关文件都带着//go:build web声明意味着不加标签编译出来的就是纯 CLI 版本行为分毫不差。入口 main_web.go 短得不能再短// 只认识两个参数监听端口(默认10240)和语言 port : flag.Int(port, 10240, Web server listen port) lang : flag.String(lang, zh, Language (zh/en)) if err : web.StartServer(*port); err ! nil { os.Exit(1) }web/server.go 里的StartServer干了三件事hub : ws.NewHub() // 结果广播中枢独立goroutine跑起来 go hub.Run() mux : http.NewServeMux() api.RegisterRoutes(mux, hub) // REST接口 mux.HandleFunc(/ws, func(w, r) { // WebSocket长连接 ws.ServeWs(hub, w, r) })最巧妙的是静态资源这块。前端工程构建完的dist目录被embed直接打进二进制//go:embed dist/* var distFS embed.FS这样交付物就是单个fscan-web可执行文件API 和页面同端口分发还带 SPA 路由回退——找不到静态文件就返回index.html前端路由随便刷新不 404。对内部安全工具来说拷一个文件过去就能用这个性质很值钱。API 面不大按职责分三类接口干什么POST /api/scan/start提交扫描参数异步开扫POST /api/scan/stop/GET /api/scan/status取消扫描 / 查进度和统计GET /api/results、/api/results/export拉全量结果或导出GET /api/config/plugins、/api/projects插件清单、项目结果缓存把扫描任务塞进状态机怎么保证不跑飞任务调度这块作者的选择很务实不造任务队列只留一个同一时间只跑一个扫描的状态机。扫描工具是重资源活儿真让你并行开五个全端口扫描机器先扛不住。所以防重的核心是一次 CAS// 原子地把状态从 idle 拨到 running失败说明已有任务在跑 if !atomic.CompareAndSwapInt32(h.state, idle, running) { return 409, scan already running } go h.runScan(req) // HTTP请求秒回扫描在后台跑runScan是全部调度逻辑的浓缩主干长这样fv : common.FlagVars{} // 表单参数 → 引擎配置 fv.Ports req.Ports fv.ThreadNum req.ThreadNum // ... 其余字段 默认值兜底 config : common.BuildConfigFromFlags(fv) session : common.NewScanSession(config, state, fv) common.SetResultCallback(func(result interface{}) { h.results.Add(result) // 存进内存结果仓库 h.hub.Broadcast(scanResult, result) // 同时推给所有浏览器 }) core.RunScan(ctx, info, session) // 引擎开跑支持ctx取消两个设计点值得琢磨。第一停止不靠杀进程靠context.CancelFunc——点停止只是拨一下 context扫描内部协程自己会感知退出优雅得多。第二结果不再只写文件而是每产出一条就分两路走一路进内存仓库供 REST 接口查询和导出一路走 WebSocket 广播给在线页面。接上前端一条表单换一条实时结果流前端 web-ui/ 是标准的 React TypeScript 工程页面就两个ScanPage参数表单 实时面板和 ResultsPage结果聚合与导出。但真正有意思的是通信模型——表单提交只负责点火后续所有数据全走推送// 点火一次性把表单变成JSON POST过去 await api.startScan(form) // 结果流长连接上逐条接收边收边渲染 useWebSocket((msg) { if (msg.type scan_result) feed.append(msg.data) if (msg.type scan_completed) setRunning(false) })组件分工很清晰ScanForm.tsx收集目标和参数LiveFeed.tsx负责把结果流逐条吐到屏幕StatsPanel.tsx做计数ResultsChart.tsx画分布图。构建这一步 Makefile 也包办了——make build-web会先跑前端的npm install npm run build把产物拷进web/dist再编译后端产物里前端就已经嵌好了。和fscan引擎对接的两个关键口子整篇文章最该记住的是 Web 层和 fscan 引擎之间只有两个真正的对接点其余都是胶水。第一个口子是参数翻译。表单提交的是人类友好的 JSON目标网段、端口串、线程数、是否跳过 Ping引擎吃的是命令行时代的FlagVars。中间那层转换代码做的事很机械补默认值不填端口就给常用端口串线程数缺省 600然后走BuildConfigFromFlags和NewScanSession——注意这条链路和 CLI 版本跑-h参数时走的是同一条所以 Web 版的扫描能力和命令行完全等价引擎一行代码没动。第二个口子是结果回调。引擎扫描时每确认一个事实端口开了、服务识别了、口令撞上了都会调一次全局结果回调Web 层只做了注册这件事钩进去往 WebSocket 推。插件体系这边更省事SSH、MySQL、Redis 这些协议插件在启动时统一注册进插件表/api/config/plugins直接遍历注册表返回清单前端勾选框就是照着这个清单渲染的加新插件不需要动 Web 代码。跑起来之后三条命令到浏览器本地跑通只需要三步git clone https://gitcode.com/GitHub_Trending/fs/fscan cd fscan make build-web # 前端编译 带web标签的后端编译 ./fscan-web # 默认监听10240端口打开http://localhost:10240Scan 页面填目标网段、端口列表、线程数点 Start。接下来你看到的就是直播PORT 行先刷出来SERVICE 行跟上VULN 行混在其中——一条Redis:6379 unauthorized或者mysql:3306 root:123456命中时Live Feed 里会直接高亮出账号密码不用你再在滚屏里找。右侧统计面板实时计数扫完弹出总耗时和分项统计Results 页随时可以导出全量结果。还有个容易被忽略的好设计项目缓存。同一project_id下重复扫描时上次结果里的host:port会自动回写缓存下次直接注入已知端口优先打省掉大量重复探测。网段资产没大变动时二次扫描快得不像同一件事。还能怎么往前走多任务并行现在是单任务状态机下一步自然是任务队列 资源池让多个网段错峰跑进度条各看各的持久化与历史对比结果目前躺在内存里进 SQLite 或文件系统后就能做上次扫到这次扫的资产 diffAI 结果研判-silent模式输出的是规整 NDJSONWebSocket 上的结果流本质是同一份数据喂给 AI Agent 做自动研判和报告生成几乎是顺手的事一句话收个尾这套 Web 平台的真正杠杆点不在前端多好看而在把引擎的输出从落盘文件改成了推送给在线的人。fscan 的肌肉一点没少只是终于长出了一双眼睛。【免费下载链接】fscan一款内网综合扫描工具方便一键自动化、全方位漏扫扫描。(An intranet comprehensive scanning tool, enabling one-click automated, all-round vulnerability scanning)项目地址: https://gitcode.com/GitHub_Trending/fs/fscan创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考