SKILL.md
Fscan 是一款内网综合扫描工具,功能包括:
二进制路径:当前项目编译产物 fscan_cli,或系统 PATH 中的 fscan。
# AI agent 标准用法:NDJSON 输出,无人类日志干扰
fscan -h <目标> -silent [其他参数]
# 解析输出
fscan -h 192.168.1.0/24 -silent | jq 'select(.type=="VULN")'
| 参数 | 说明 | 示例 |
|---|---|---|
-h | 目标主机(IP / CIDR / 范围) | -h 192.168.1.0/24 -h 10.0.0.1-10.0.0.100 |
-hf | 从文件读取目标 | -hf targets.txt |
-p | 指定端口(逗号/范围) | -p 22,80,443,445,3306 -p 1-1000 |
-ep | 排除端口 | -ep 25,110 |
-eh | 排除主机 | -eh 192.168.1.1 |
-u | 指定 URL(Web 扫描) | -u https://example.com |
-uf | URL 文件 | -uf urls.txt |
| 参数 | 说明 | 默认值 |
|---|---|---|
-m | 扫描模式 | all |
-t | 端口扫描线程数 | 600 |
-mt | 模块线程数 | 20 |
-time | 连接超时(秒) | 3 |
-gt | 全局超时(秒) | 180 |
-np | 跳过存活检测 | false |
-ntp | 禁用 TCP 补充探测 | false |
-ao | 仅存活检测 | false |
-nobr | 禁用暴力破解 | false |
-full | 全量 POC 扫描 | false |
-max-retries | 最大重试次数 | 1 |
| 参数 | 说明 |
|---|---|
-user | 用户名 |
-pwd | 密码 |
-usera | 追加用户名 |
-pwda | 追加密码 |
-userf | 用户名字典文件 |
-pwdf | 密码字典文件 |
-domain | 域名(SMB/WMI) |
-sshkey | SSH 私钥文件 |
-hash / -hashf | NTLM Hash / Hash 文件 |
| 参数 | 说明 |
|---|---|
-socks5 | SOCKS5 代理 (127.0.0.1:1080) |
-proxy | HTTP 代理 (http://127.0.0.1:8080) |
-iface | 指定本地网卡 IP(VPN 场景) |
| 参数 | 说明 |
|---|---|
-silent | 静默模式:stdout 仅输出 NDJSON |
-o | 输出文件路径(默认 result.txt) |
-f | 输出格式:txt / json / csv |
-no | 禁用文件保存 |
-debug | 调试模式:日志写入 fscan_debug.log |
-log | 日志级别(debug / info / base / error) |
-m 的取值| 值 | 说明 |
|---|---|
all | 全部扫描(默认) |
icmp | 仅 ICMP 存活检测 |
| 插件名 | 仅运行指定插件(如 ssh、smb、ms17010、webtitle) |
| 插件 | 默认端口 | 功能 |
|---|---|---|
ftp | 21 | FTP 弱口令 |
ssh | 22 | SSH 弱口令 |
telnet | 23 | Telnet 弱口令 |
smtp | 25 | SMTP 弱口令 |
findnet | 135 | RPC 网络信息发现(NetInfo) |
netbios | 139 | NetBIOS 信息收集 |
smb | 445 | SMB 弱口令 |
ms17010 | 445 | MS17-010 永恒之蓝检测 |
ldap | 389 | LDAP 弱口令 |
mssql | 1433 | MSSQL 弱口令 |
oracle | 1521 | Oracle 弱口令 |
mysql | 3306 | MySQL 弱口令 |
rdp | 3389 | RDP 弱口令 + 系统信息 |
postgresql | 5432 | PostgreSQL 弱口令 |
vnc | 5900 | VNC 弱口令 |
redis | 6379 | Redis 未授权 + 弱口令 |
elasticsearch | 9200 | ES 未授权 |
mongodb | 27017 | MongoDB 未授权 + 弱口令 |
memcached | 11211 | Memcached 未授权 |
kafka | 9092 | Kafka 未授权 |
activemq | 61616 | ActiveMQ 弱口令 |
rabbitmq | 5672 | RabbitMQ 弱口令 |
cassandra | 9042 | Cassandra 弱口令 |
neo4j | 7687 | Neo4j 弱口令 |
rsync | 873 | Rsync 未授权 |
webtitle | 80/443 | Web 标题 + 指纹识别 |
webpoc | 80/443 | Web 漏洞 POC |
-local)fscan -local avdetect # 杀软检测
fscan -local systeminfo # 系统信息收集
fscan -local envinfo # 环境变量信息
fscan -local dcinfo # 域控信息
fscan -local fileinfo # 敏感文件搜索
-silent 模式)每行一个 JSON 对象,所有字段定义:
| 字段 | 类型 | 出现条件 | 说明 |
|---|---|---|---|
type | string | 必有 | HOST / PORT / SERVICE / VULN |
target | string | 必有 | 原始目标 host 或 host:port |
status | string | 必有 | 状态描述 |
host | string | 必有 | IP 地址 |
port | int | PORT/SERVICE/VULN | 端口号 |
service | string | SERVICE/VULN | 服务名(ssh, smb, http 等) |
protocol | string | HOST/SERVICE | 协议(ICMP, TCP, http, https) |
banner | string | SERVICE | 服务 Banner |
title | string | SERVICE (web) | 网页标题 |
url | string | SERVICE (web) | 完整 URL |
vulnerability | string | VULN | 漏洞名称 |
username | string | VULN (弱口令) | 用户名 |
password | string | VULN (弱口令) | 密码 |
plugin | string | SERVICE/VULN | 产生结果的插件名 |
version | string | SERVICE | 服务版本号 |
os | string | SERVICE | 操作系统信息 |
{"type":"HOST","target":"192.168.1.5","status":"alive","host":"192.168.1.5","protocol":"ICMP"}
{"type":"PORT","target":"192.168.1.5","status":"open","host":"192.168.1.5","port":22}
{"type":"PORT","target":"192.168.1.5","status":"open","host":"192.168.1.5","port":445}
{"type":"SERVICE","target":"192.168.1.5:22","status":"identified","host":"192.168.1.5","port":22,"service":"ssh","banner":"SSH-2.0-OpenSSH_8.9p1","version":"8.9p1","plugin":"portscan"}
{"type":"SERVICE","target":"192.168.1.5:80","status":"web","host":"192.168.1.5","port":80,"service":"http","protocol":"http","url":"http://192.168.1.5:80","title":"Welcome","plugin":"webtitle"}
{"type":"VULN","target":"192.168.1.5:445","status":"MS17-010 (Windows Server 2012 R2 Standard 9600)","host":"192.168.1.5","port":445,"vulnerability":"MS17-010","service":"smb","plugin":"ms17010"}
{"type":"VULN","target":"192.168.1.5:22","status":"weak_credential: root:123456","host":"192.168.1.5","port":22,"service":"ssh","username":"root","password":"123456","plugin":"ssh"}
{"type":"VULN","target":"192.168.1.5:6379","status":"Redis unauthorized","host":"192.168.1.5","port":6379,"vulnerability":"Redis unauthorized access","service":"redis","plugin":"redis"}
HOST — 存活探测阶段PORT — 端口扫描阶段(与 SERVICE 可能交错)SERVICE — 服务识别阶段VULN — 漏洞/弱口令检测阶段同一 host:port 可产生多条结果(PORT + SERVICE + VULN)。
fscan -h 192.168.1.0/24 -silent
fscan -h 192.168.1.0/24 -silent -np
fscan -h 10.0.0.0/24 -silent -p 22,80,443,445,3389,3306,6379
fscan -h 172.16.0.0/16 -silent -m icmp
fscan -h 192.168.1.0/24 -silent -t 30 -time 5
fscan -h 10.0.0.0/24 -silent -socks5 127.0.0.1:1080
fscan -h 192.168.1.10 -silent -m ssh -user root -pwdf /path/to/passwords.txt
fscan -u https://target.com -silent -full
fscan -hf targets.txt -silent -o results.json -f json
# NDJSON 到 stdout,debug 日志到文件,互不干扰
fscan -h 192.168.1.0/24 -silent -debug
# 事后查看:cat fscan_debug.log
import json, subprocess
proc = subprocess.Popen(
["fscan", "-h", "192.168.1.0/24", "-silent"],
stdout=subprocess.PIPE, text=True
)
hosts, services, vulns = [], [], []
for line in proc.stdout:
r = json.loads(line)
if r["type"] == "HOST":
hosts.append(r["host"])
elif r["type"] == "SERVICE":
services.append(r)
elif r["type"] == "VULN":
vulns.append(r)
proc.wait()
# 提取所有弱口令
fscan -h 10.0.0.0/24 -silent | jq -r 'select(.username != null) | "\(.host):\(.port) \(.service) \(.username):\(.password)"'
# 提取所有漏洞
fscan -h 10.0.0.0/24 -silent | jq -r 'select(.type=="VULN") | "\(.host):\(.port) \(.vulnerability)"'
# 提取 Web 服务
fscan -h 10.0.0.0/24 -silent | jq -r 'select(.url != null) | "\(.url) \(.title)"'
# 统计开放端口
fscan -h 10.0.0.0/24 -silent | jq -r 'select(.type=="PORT") | .port' | sort -n | uniq -c | sort -rn
-silent 抑制所有人类可读日志,stdout 仅输出 NDJSONomitempty)0 正常完成,非 0 表示参数错误或初始化失败-silent 和 -debug 可同时使用,互不干扰