
该扫描器作者为Gcow安全团队-唐小风,写下这段文字的时候,已经是凌晨三点。
屏幕上 cscan 的控制台还在疯狂跳动,一行行绿色的端口开放信息像瀑布一样流淌。看着任务管理器里几乎不仅不慢的 CPU 占用率,和那快得让我有点心惊肉跳的扫描进度,我长舒了一口烟气。
终于,我拥有了一个完全属于自己的、顺手的、不再臃肿的资产扫描工具。
做安全的朋友都知道,在这个圈子里,我们不仅缺漏洞,更缺好用的“铲子”。市面上的扫描器多吗?多,如过江之鲫。Nmap 是神,但它太重;Masscan 是快,但它太糙;各种语言写的小脚本满天飞,但一遇到大规模资产梳理,那个效果和资源占用能让你怀疑人生。
作为一名甲方安全建设者,我受够了在这个工具和那个工具之间切来切去,受够了维护那一堆支离破碎的脚本。
“为什么不能有一个既轻量、又高性能,还能把端口、指纹、POC 扫描一条龙搞定的东西?”
这个念头一旦产生,就像野草一样疯长。于是,我决定造轮子。这个轮子,就叫 cscan。

决定重写的那一刻,我毫不犹豫地抛弃了Rust。不是 Rust 不好,而是我不会。
我要的是Go。
但是,光用 Go 写个脚本是不够的。我要做的是一个平台,一个可以持续迭代、甚至可以微服务化的系统。这时候,go-zero 闯入了我的视野。
很多人问我,写个扫描器而已,至于上微服务框架吗? 我的回答是:至于。非常有必要。
Go-Zero 这种“契约优先”(API First)的设计理念,简直是强迫症患者的福音。在写下一行逻辑代码之前,我先用 .api 文件定义好了整个系统的灵魂。
你看,这是 cscan 的骨架,干净得让我着迷:
// 核心设计:任务、扫描、结果三权分立
syntax = "v1"
info (
title: "cscan 扫描平台核心 API"
desc: "集成端口扫描、指纹识别和漏洞扫描功能的API"
author: "txf"
version: "v1.0.0"
)
// ... (省略部分鉴权代码)
// 任务系统:一切扫描的起点
@server (
jwt: Auth
group: task
)
service newproject-api {
@doc "创建扫描任务"
@handler createTask
post /api/task/create (CreateTaskReq) returns (CreateTaskReply)
// ... 实时监控任务状态
@handler getTaskStatus
get /api/task/status/:taskId (GetTaskStatusReq) returns (GetTaskStatusReply)
}
// 结果系统:数据落地的港湾
@server (
jwt: Auth
group: scan
)
service newproject-api {
@doc "获取端口扫描结果"
@handler getPortScanResults
get /api/scan/port/:taskId (GetPortScanResultsReq) returns (GetPortScanResultsReply)
// ... 指纹与POC结果
@handler getFingerprintResults
get /api/scan/fingerprint/:taskId (GetFingerprintResultsReq) returns (GetFingerprintResultsReply)
}
通过 goctl 一键生成代码的那一刻,我感到了前所未有的掌控感。
goctl api go -api cscan.api -dir .随着这行命令敲下,路由、Handler、Logic 层瞬间就位。我不再需要去纠结项目目录结构,不再需要去手写繁琐的 HTTP 解析。我只需要专注于最核心的业务逻辑:怎么让扫描更快、更准。

这种开发体验,真的,一旦习惯了就回不去了。
cscan 不仅仅是一个端口扫描器,我给它的定义是“资产发现与风险识别的一站式平台”。



而在数据结构的设计上,我力求简洁明了:
// 扫描结果的标准化定义
type (
ScanResult {
Type string `json:"type"` // 结果类型(portscan, fingerprint, pocscan)
Data interface{} `json:"data"` // 泛型数据,灵活兼容
}
// ...
FingerprintResult {
URL string `json:"url"`
Title string `json:"title"`
Server string `json:"server"`
Technologies []string `json:"technologies"` // 这一眼就能看透对方底裤
}
)
作为一个常年写后端的直男,写前端对我来说无异于绣花。
但是,我不希望 cscan 只是一个冰冷的命令行工具。我希望它有一个现代化的、清爽的 Dashboard。
于是我硬着头皮上了 Vue3 + Element Plus。
npm create vite@latest ui -- --template vue那个周末,我为了调一个 CSS 的 Flex 布局,陪AI模型熬掉了半盒烟。但当看到扫描任务在网页上实时滚动进度条,当看到扫描结果以漂亮的表格呈现时,我觉得一切都值了。
现在,你只需要简单几步,就能拥有这套前后端分离的现代化扫描平台:
git clone https://github.com/tangxiaofeng7/cscan.git
cd cscan
# 直接启动
docker-compose up -d --build说实话,把这个项目开源出来,我是有过犹豫的。
每一行代码都是AI的心血,每一个逻辑判断都藏着我对网络攻防的理解。但转念一想,开源精神不就是“独乐乐不如众乐乐”吗?
既然我已经造好了这个轮子,为什么不让更多的人用上它?也许你会发现我代码里的 Bug(请务必提 Issue!),也许你会觉得某个功能还可以优化(欢迎 PR!),也许它能帮你快速完成了某次紧急的资产盘点任务。
如果 cscan 能在你的工作中起到哪怕一点点的帮助,那我在那些深夜里敲击键盘的声音,就有了回响。
项目地址:
https://github.com/tangxiaofeng7/cscan
如果你觉得这个项目还不错,或者你认可这种 Go-Zero + Vue3 的全栈开发模式,请不要吝啬你的 Star。
那颗小小的星星,对于坐在屏幕前的我来说,是最大的鼓励,也是我继续维护、更新、死磕性能的动力。
兄弟们,Star 走一波,扫码加入工具交流群,我们 GitHub 见!