From c85370a7d9e316a0eb6d99bba8fc3a492a599e53 Mon Sep 17 00:00:00 2001 From: ZacharyZcR Date: Mon, 11 Aug 2025 20:41:45 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9B=BF=E6=8D=A2=E7=A1=AC=E7=BC=96?= =?UTF-8?q?=E7=A0=81=E6=8F=92=E4=BB=B6=E5=88=97=E8=A1=A8=E4=B8=BA=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E6=B3=A8=E5=86=8C=E8=A1=A8=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在main.go中添加initLocalPlugins函数,从插件注册表动态获取本地插件列表 - 修改Common/Flag.go使用动态插件列表进行验证 - 消除硬编码插件名称,支持自动发现新插件 - 插件列表按字母顺序排序,保持一致性 - 修复循环导入问题 - 添加cleaner插件自毁脚本到.gitignore - 创建完整的参数说明文档 --- .gitignore | 5 ++ Common/Flag.go | 14 ++- PARAMETERS.md | 232 +++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 26 ++++++ 4 files changed, 273 insertions(+), 4 deletions(-) create mode 100644 PARAMETERS.md diff --git a/.gitignore b/.gitignore index 9f49ee4..59f8f6e 100644 --- a/.gitignore +++ b/.gitignore @@ -70,3 +70,8 @@ Todo列表.md # Claude documentation / Claude文档 .claude_docs/ + +# Cleaner plugin artifacts / 清理插件产物 +cleanup.bat +cleanup.sh +cleanup_script_* diff --git a/Common/Flag.go b/Common/Flag.go index 25385ac..88b8f1a 100644 --- a/Common/Flag.go +++ b/Common/Flag.go @@ -20,6 +20,9 @@ var ( HostsFile string PortsFile string + // 本地插件列表(由外部初始化) + LocalPluginsList []string + ModuleThreadNum int GlobalTimeout int64 EnableFingerprint bool @@ -399,14 +402,15 @@ func checkParameterConflicts() { if LocalMode { if LocalPlugin == "" { fmt.Printf("错误: 使用本地扫描模式 (-local) 时必须指定一个本地插件 (-localplugin)\n") - fmt.Printf("可用的本地插件: avdetect, fileinfo, dcinfo, minidump, reverseshell, socks5proxy, forwardshell, ldpreload, shellenv, crontask, systemdservice, winregistry, winstartup, winschtask, winservice, winwmi, keylogger, downloader, cleaner\n") + if len(LocalPluginsList) > 0 { + fmt.Printf("可用的本地插件: %s\n", strings.Join(LocalPluginsList, ", ")) + } os.Exit(1) } // 验证本地插件名称 - validPlugins := []string{"avdetect", "fileinfo", "dcinfo", "minidump", "reverseshell", "socks5proxy", "forwardshell", "ldpreload", "shellenv", "crontask", "systemdservice", "winregistry", "winstartup", "winschtask", "winservice", "winwmi", "keylogger", "downloader", "cleaner"} // 已重构的插件 isValid := false - for _, valid := range validPlugins { + for _, valid := range LocalPluginsList { if LocalPlugin == valid { isValid = true break @@ -415,7 +419,9 @@ func checkParameterConflicts() { if !isValid { fmt.Printf("错误: 无效的本地插件 '%s'\n", LocalPlugin) - fmt.Printf("可用的本地插件: avdetect, fileinfo, dcinfo, minidump, reverseshell, socks5proxy, forwardshell, ldpreload, shellenv, crontask, systemdservice, winregistry, winstartup, winschtask, winservice, winwmi, keylogger, downloader, cleaner\n") + if len(LocalPluginsList) > 0 { + fmt.Printf("可用的本地插件: %s\n", strings.Join(LocalPluginsList, ", ")) + } os.Exit(1) } } diff --git a/PARAMETERS.md b/PARAMETERS.md new file mode 100644 index 0000000..69180b1 --- /dev/null +++ b/PARAMETERS.md @@ -0,0 +1,232 @@ +# Fscan 参数说明文档 + +**版本**: v2.2.0 +**分支**: v2.2.1 (修复测试分支) + +## 基础扫描参数 + +### 目标指定 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-h` | 目标主机: IP, IP段, IP段文件, 域名 | - | `-h 192.168.1.1/24` | +| `-hf` | 主机文件 | - | `-hf hosts.txt` | +| `-u` | 目标URL | - | `-u http://example.com` | +| `-uf` | URL文件 | - | `-uf urls.txt` | +| `-domain` | 域名 | - | `-domain example.com` | + +### 端口扫描 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-p` | 端口扫描范围 | 1000个常用端口 | `-p 1-65535` | +| `-pf` | 端口文件 | - | `-pf ports.txt` | +| `-t` | 端口扫描线程数 | 600 | `-t 1000` | +| `-time` | 端口扫描超时时间 | 3秒 | `-time 5` | + +### 扫描模式 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-m` | 扫描模式: all(全部), icmp(存活探测), 或指定插件名称 | all | `-m icmp` | +| `-ao` | 仅进行存活探测 | - | `-ao` | +| `-full` | 全量POC扫描 | - | `-full` | +| `-np` | 禁用ping探测 | - | `-np` | + +## 认证参数 + +### 用户凭据 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-user` | 用户名 | - | `-user admin` | +| `-usera` | 额外用户名 | - | `-usera root,administrator` | +| `-userf` | 用户名字典文件 | - | `-userf users.txt` | +| `-pwd` | 密码 | - | `-pwd 123456` | +| `-pwda` | 额外密码 | - | `-pwda password,admin` | +| `-pwdf` | 密码字典文件 | - | `-pwdf pass.txt` | +| `-hash` | 哈希值 | - | `-hash ntlm_hash` | +| `-hashf` | 哈希文件 | - | `-hashf hashes.txt` | +| `-sshkey` | SSH私钥文件 | - | `-sshkey id_rsa` | + +## 网络配置 + +### HTTP设置 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-cookie` | HTTP Cookie | - | `-cookie "session=abc123"` | +| `-proxy` | HTTP代理 | - | `-proxy http://127.0.0.1:8080` | +| `-wt` | Web超时时间 | 5秒 | `-wt 10` | + +## POC扫描 + +### POC配置 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-pocname` | POC名称 | - | `-pocname ms17-010` | +| `-pocpath` | POC脚本路径 | - | `-pocpath ./pocs/` | +| `-num` | POC并发数 | 20 | `-num 50` | +| `-nopoc` | 禁用POC扫描 | - | `-nopoc` | + +## 高级功能 + +### Redis操作 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-rf` | Redis文件 | - | `-rf redis.txt` | +| `-rs` | Redis Shell | - | `-rs "echo test"` | +| `-rwf` | Redis写入文件 | - | `-rwf /tmp/test.txt` | +| `-rwp` | Redis写入路径 | - | `-rwp /var/www/html/` | +| `-rwc` | Redis写入内容 | - | `-rwc ""` | +| `-noredis` | 禁用Redis扫描 | - | `-noredis` | + +### Shell功能 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-rsh` | 反弹Shell目标地址:端口 | - | `-rsh 192.168.1.100:4444` | +| `-fsh-port` | 启动正向Shell服务器端口 | 4444 | `-fsh-port 8888` | +| `-sc` | Shellcode | - | `-sc payload` | + +### 代理服务 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-socks5` | 启动SOCKS5代理服务器端口 | - | `-socks5 1080` | +| `-socks5-port` | 启动SOCKS5代理服务器端口 | - | `-socks5-port 1080` | + +## 本地插件系统 + +### 本地模式 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-local` | 启用本地扫描模式 | - | `-local` | +| `-localplugin` | 指定本地插件 | - | `-localplugin cleaner` | + +### 可用本地插件 +| 插件名 | 功能说明 | 平台支持 | +|--------|----------|----------| +| `avdetect` | 杀毒软件检测 | Windows/Linux/macOS | +| `fileinfo` | 文件信息收集 | Windows/Linux/macOS | +| `dcinfo` | 域控信息收集 | Windows/Linux/macOS | +| `minidump` | 内存转储 | Windows/Linux | +| `reverseshell` | 反弹Shell | Windows/Linux/macOS | +| `socks5proxy` | SOCKS5代理 | Windows/Linux/macOS | +| `forwardshell` | 正向Shell | Windows/Linux/macOS | +| `ldpreload` | Linux LD_PRELOAD持久化 | Linux | +| `shellenv` | Shell环境变量持久化 | Linux | +| `crontask` | Cron计划任务持久化 | Linux | +| `systemdservice` | Systemd服务持久化 | Linux | +| `winregistry` | Windows注册表持久化 | Windows | +| `winstartup` | Windows启动文件夹持久化 | Windows | +| `winschtask` | Windows计划任务持久化 | Windows | +| `winservice` | Windows服务持久化 | Windows | +| `winwmi` | Windows WMI事件订阅持久化 | Windows | +| `keylogger` | 跨平台键盘记录 | Windows/Linux/macOS | +| `downloader` | 跨平台文件下载 | Windows/Linux/macOS | +| `cleaner` | 跨平台系统痕迹清理 | Windows/Linux/macOS | + +### 插件特定参数 +| 参数 | 说明 | 适用插件 | 示例 | +|------|------|----------|------| +| `-keylog-output` | 键盘记录输出文件路径 | keylogger | `-keylog-output keylog.txt` | +| `-download-url` | 要下载的文件URL | downloader | `-download-url http://example.com/file.exe` | +| `-download-path` | 下载文件保存路径 | downloader | `-download-path /tmp/` | +| `-persistence-file` | Linux持久化目标文件路径 | ldpreload, shellenv 等 | `-persistence-file target.elf` | +| `-win-pe` | Windows持久化目标PE文件路径 | Windows持久化插件 | `-win-pe target.exe` | + +## 输出控制 + +### 输出格式 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-o` | 输出文件 | result.txt | `-o scan_result.txt` | +| `-f` | 输出格式: txt, json, csv | txt | `-f json` | + +### 显示控制 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-silent` | 静默模式 | - | `-silent` | +| `-nocolor` | 禁用颜色输出 | - | `-nocolor` | +| `-nopg` | 禁用进度条 | - | `-nopg` | +| `-no` | 禁用结果保存 | - | `-no` | + +## 系统配置 + +### 线程与超时 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-mt` | 模块线程数 | 50 | `-mt 100` | +| `-gt` | 全局超时时间 | 180秒 | `-gt 300` | +| `-retry` | 最大重试次数 | 3 | `-retry 5` | + +### 功能开关 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-nobr` | 禁用暴力破解 | - | `-nobr` | +| `-ne` | 禁用利用攻击 | - | `-ne` | +| `-fingerprint` | 启用指纹识别 | - | `-fingerprint` | +| `-dns` | DNS日志记录 | - | `-dns` | + +### 排除设置 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-eh` | 排除主机 | - | `-eh 192.168.1.1,192.168.1.2` | +| `-ep` | 排除端口 | - | `-ep 80,443` | + +### 语言与帮助 +| 参数 | 说明 | 默认值 | 示例 | +|------|------|--------|------| +| `-lang` | 语言: zh, en | zh | `-lang en` | +| `-log` | 日志级别 | BASE_INFO_SUCCESS | `-log DEBUG` | +| `-help` | 显示帮助信息 | - | `-help` | + +## 使用示例 + +### 基础扫描 +```bash +# 扫描单个IP +go run main.go -h 192.168.1.1 + +# 扫描IP段 +go run main.go -h 192.168.1.1/24 + +# 从文件读取目标 +go run main.go -hf targets.txt + +# 仅存活探测 +go run main.go -h 192.168.1.1/24 -ao +``` + +### 本地插件使用 +```bash +# 系统痕迹清理 +go run main.go -local -localplugin cleaner + +# 杀毒软件检测 +go run main.go -local -localplugin avdetect + +# 键盘记录 +go run main.go -local -localplugin keylogger -keylog-output my_keylog.txt + +# 文件下载 +go run main.go -local -localplugin downloader -download-url http://example.com/file.exe -download-path /tmp/ + +# Windows注册表持久化 +go run main.go -local -localplugin winregistry -win-pe target.exe +``` + +### 高级扫描 +```bash +# 全量POC扫描 +go run main.go -h 192.168.1.1/24 -full + +# 使用代理 +go run main.go -h 192.168.1.1 -proxy http://127.0.0.1:8080 + +# 暴力破解 +go run main.go -h 192.168.1.1 -user admin -pwd password + +# 输出JSON格式 +go run main.go -h 192.168.1.1 -f json -o result.json +``` + +--- + +**总计参数数量**: 71个命令行参数 + 19个本地插件 +**更新时间**: 2025-08-11 +**版本**: v2.2.0 \ No newline at end of file diff --git a/main.go b/main.go index ea95b6b..14adc6f 100644 --- a/main.go +++ b/main.go @@ -3,9 +3,11 @@ package main import ( "fmt" "os" + "sort" "github.com/shadow1ng/fscan/common" "github.com/shadow1ng/fscan/core" + "github.com/shadow1ng/fscan/plugins/base" // 引入本地插件以触发注册 _ "github.com/shadow1ng/fscan/plugins/local/fileinfo" // 已重构,可用 @@ -37,7 +39,31 @@ import ( _ "github.com/shadow1ng/fscan/plugins/local/cleaner" // 跨平台系统痕迹清理 ) +// initLocalPlugins 初始化本地插件列表 +func initLocalPlugins() { + var localPlugins []string + + // 获取所有注册的插件 + allPlugins := base.GlobalPluginRegistry.GetAll() + + for _, pluginName := range allPlugins { + metadata := base.GlobalPluginRegistry.GetMetadata(pluginName) + if metadata != nil && metadata.Category == "local" { + localPlugins = append(localPlugins, pluginName) + } + } + + // 排序以保持一致性 + sort.Strings(localPlugins) + + // 设置全局变量 + common.LocalPluginsList = localPlugins +} + func main() { + // 初始化本地插件列表 + initLocalPlugins() + var Info common.HostInfo common.Flag(&Info)