Magwerste/ip-scanner

GitHub: Magwerste/ip-scanner

结合本地威胁情报黑名单与VirusTotal API批量扫描IP地址的工具,主要用于Azure AD/Entra ID登录日志的安全分析。

Stars: 0 | Forks: 0

# IP 扫描器 根据本地威胁情报列表和 VirusTotal 扫描一个或多个 IP 地址。最初专为 Azure AD / Entra ID 登录日志分析而设计,但也适用于任何 IP 列表。 每个公共 IP 都会首先与本地黑名单进行比对,然后提交给 VirusTotal。如果某个 IP 被本地列表匹配到,则会在输出中合并这两种检测结果——因此您总能获得完整的信息。私有和保留 IP 会被静默跳过,且绝不会发送到任何地方。 自动执行 VirusTotal Public API 限制: - **每天 500 次请求**(通过 `quota_state.json` 跨重启追踪) - **每分钟 4 次请求**(调用之间强制执行 15 秒延迟) ## 下载 前往 [Releases](../../releases) 页面并下载 `ip-scanner.exe` —— 无需安装 Python。 ## 如何获取 VirusTotal API 密钥 1. 前往 [https://www.virustotal.com](https://www.virustotal.com) 并点击 **Join us** 注册一个免费账户。 2. 登录后,点击右上角的个人资料图标并选择 **API key**。 3. 复制该密钥 —— 您将在下一步中用到它。 免费的 Public API 每天允许 500 次查询,每分钟 4 次。无需付费。 ## 安装说明 1. 将 `ip-scanner.exe` 放在您计算机上的一个文件夹中。 2. 在同一文件夹中,创建一个名为 `.env` 的文件,其中包含您的 VirusTotal API 密钥: VT_API_KEY=your_api_key_here 3. 运行扫描器 —— 无需终端: - **双击** `ip-scanner.exe` 以打开交互式提示符并直接粘贴 IP。 - 在文件资源管理器中**将 CSV 或 TXT 文件拖放到** `ip-scanner.exe` 上以自动扫描。 ## 运行原理 ``` Input IPs │ ▼ Strip private / RFC 1918 addresses (never sent anywhere) │ ▼ Check local threat intel lists (no external API calls) ├── IPsum — downloaded fresh each run ├── CINS Army — bundled with the exe ├── Tor Exit Nodes — downloaded fresh each run └── DShield — downloaded fresh each run (subnet blocklist) │ ├── MATCH → flagged (local), then ALSO queried against VirusTotal │ └── sources combined: e.g. "IPsum, VirusTotal" │ └── NO MATCH → queried against VirusTotal │ ├── Malicious / Suspicious → flagged └── Clean → not included in output │ ▼ malicious_ips.csv — flagged IPs only, with Severity and Source columns ``` 每次运行都会下载最新的 IPsum、Tor 出口节点和 DShield 副本。CINS Army 列表已内置于 exe 中。 ## 使用说明 ### 拖放(无需终端) 在文件资源管理器中将 CSV 或 TXT 文件拖放到 `ip-scanner.exe` 上。扫描器会自动打开并开始扫描。 ### 从 Entra ID / Azure AD CSV 导出文件扫描 ``` ip-scanner.exe --file SignInLogs_export.csv ``` 扫描器会自动检测 Entra ID 格式,并且仅读取 IP 地址列——所有其他列(用户、设备、位置等)都会被直接丢弃,不予存储。 ### 从纯文本文件扫描(每行一个 IP) ``` ip-scanner.exe --file suspicious_ips.txt ``` ### 直接扫描特定 IP ``` ip-scanner.exe --ips 8.8.8.8 1.1.1.1 185.220.101.5 ``` ### 交互模式(双击或无参数) ``` ip-scanner.exe ``` 粘贴一个或多个 IP,或者每行输入一个。在空行上按回车键开始扫描。 ## 选项 | 标志 | 简写 | 描述 | |---|---|---| | `--file PATH` | `-f` | 输入文件(纯文本或 CSV) | | `--ips IP [IP ...]` | `-i` | 作为参数传入的一个或多个 IP | | `--output PATH` | `-o` | 恶意 IP CSV 的自定义路径(默认:`output/malicious_ips.csv`) | | `--no-report` | | 跳过保存 CSV 报告 | | `--quiet` | `-q` | 禁止输出每个 IP 的结果,仅显示摘要 | | `--no-enrich` | | 对本地列表命中的结果跳过 VirusTotal(节省配额,但会丢失合并的来源数据) | ## 输出 **终端:** 每个 IP 的颜色编码结果: - **红色** —— 标记为恶意 - **黄色** —— 标记为可疑 - **绿色** —— 干净 被本地列表匹配到的 IP 会以 `MALICIOUS (local)` 的形式连同匹配的源名称在内联中打印出来。 **CSV 报告:** 每次扫描后保存到 `output/malicious_ips.csv`(除非使用了 `--no-report`)。如果 `output/` 文件夹不存在,则会自动创建。仅写入被标记的 IP —— 不包括干净的 IP。列: `ip`, `severity`, `source`, `malicious_engines`, `suspicious_engines`, `reputation`, `country`, `asn`, `as_owner`, `network`, `last_analysis_date`, `scan_timestamp` | 列 | 描述 | |---|---| | `severity` | `HIGH`、`MEDIUM` 或 `LOW` —— 通俗的英文风险评级 | | `source` | 命中来源 —— 例如 `IPsum`、`VirusTotal`,或同时被两者命中则为 `IPsum, VirusTotal` | | `malicious_engines` | 在查询的引擎总数中将其标记为恶意的引擎数量 —— 例如 `3\|94` | | `suspicious_engines` | 在查询的引擎总数中将其标记为可疑的引擎数量 —— 例如 `1\|94` | 引擎计数会根据 VirusTotal 在该 IP 的特定扫描中运行的引擎数量而调整。当使用 `--no-enrich` 时,对于仅本地命中的结果会显示 `N/A`。 ### 严重性评级 | 级别 | 条件 | |---|---| | `HIGH` | 4 个或更多恶意引擎检测 | | `MEDIUM` | 1-3 个恶意引擎检测 | | `LOW` | 仅有可疑引擎(无恶意),或 Tor 出口节点 / 无 VT 恶意命中记录的本地列表 | 本地列表命中和 VirusTotal 检测是独立计算的。如果 VT 发现了恶意引擎,则使用该计数(两个来源检测到了相同的威胁)。如果 VT 未发现异常,则每个标记了该 IP 的本地列表计为一次检测 —— 因此,如果某个 IP 同时在 IPsum 和 DShield 中且没有 VT 恶意数据,则其得分为 2 → `MEDIUM`。 ## 本地威胁情报来源 | 来源 | 类型 | 更新 | |---|---|---| | [IPsum](https://github.com/stamparm/ipsum) | 已知的恶意 IP(从多个黑名单聚合) | 每次运行时下载 | | [Tor Exit Nodes](https://www.dan.me.uk/torlist/) | 活跃的 Tor 出口节点 IP | 每次运行时下载 | | [DShield](https://www.dshield.org/block.txt) | 排名前列的攻击源子网 | 每次运行时下载 | | CINS Army | 已知的恶意 IP(Collective Intelligence Network Security) | 已内置 —— 无需下载 | 如果下载失败,运行将继续而不包含该列表 —— 会打印一条警告,但不会跳过任何 IP。 ## API 配额 VirusTotal Public API 允许**每天 500 次请求**。扫描器会在 `quota_state.json` 中跟踪使用情况,并在 UTC 午夜自动重置。当剩余请求少于 50 次时会显示警告。 默认情况下,每个公共 IP 都会在 VirusTotal 中进行查询 —— 包括那些已经被本地列表捕获的 IP,以便合并来源。如果您正在扫描一个非常大的文件并且需要节省配额,请传入 `--no-enrich` 以针对本地列表命中的结果跳过 VT。 如果要扫描的 IP 数量超过您剩余的每日配额,则会在扫描开始前打印一条警告,以便您决定是继续执行还是使用 `--no-enrich`。 ## 面向开发者 ### 从源码运行 请参阅 [setup.md](setup.md) 获取完整指南(开发者/源码安装)。有关面向非技术用户的最终用户指南,请参阅 [walkthrough.md](walkthrough.md)。快速开始: ``` git clone https://github.com/Magwerste/ip-scanner cd vt-py-ip-scanner python -m venv .venv .venv\Scripts\activate pip install -e ".[dev]" ``` 使用您的 API 密钥创建一个 `.env` 文件,然后运行: ``` ip-scanner --file SignInLogs_export.csv ``` ### 项目结构 ``` vt-py-ip-scanner/ ├── src/ │ └── ip_scanner/ │ ├── __init__.py # Package marker │ ├── __main__.py # Entry point — CLI, input handling, scan loop │ ├── client.py # VirusTotal API calls and response parsing │ ├── config.py # Config loading from .env and constants │ ├── output.py # Terminal display (Rich) and CSV writing │ ├── rate_limiter.py # Per-minute and daily quota enforcement │ └── threat_intel.py # Local list download, loading, and lookup ├── tests/ # Test suite (see tests/README.md) ├── vt-scan.spec # PyInstaller build spec ├── .env # Your API key (never share or commit this) ├── .env.example # Safe template — copy this to .env ├── pyproject.toml # Package metadata and entry point definition ├── quota_state.json # Auto-created — tracks daily API usage across restarts ├── threat_intel/ # Auto-created — downloaded list files cached here ├── threat_intel_static/ # Bundled static lists (CINS Army) │ └── cinsarmy_badguys.txt # CINS Army blocklist (included in repo, bundled in exe) ├── output/ │ └── malicious_ips.csv # Auto-created — flagged IPs from each run └── .venv/ # Virtual environment (created during setup) ``` ## 致谢 如果没有以下免费且开放的资源,这个工具将无法实现: - **[VirusTotal](https://www.virustotal.com)** —— 感谢其提供免费的 Public API,使每个人都能进行大规模的 IP 信誉查询。其慷慨的每天 500 次请求配额使该工具在实际应用中切实可行。 - **[IPsum](https://github.com/stamparm/ipsum)** 由 [@stamparm](https://github.com/stamparm) 提供 —— 这是一个由社区维护的聚合黑名单,将来自数十个来源的威胁情报整合到了一个可靠的订阅源中。 - **[Tor Project / dan.me.uk](https://www.dan.me.uk/torlist/)** —— 感谢其维护了一个公开访问的活跃 Tor 出口节点列表,从而能够在登录日志中检测匿名流量。 - **[DShield / SANS Internet Storm Center](https://www.dshield.org)** —— 感谢其提供包含最活跃攻击源子网的黑名单,该名单根据安全社区贡献的真实防火墙数据每日更新。 - **[CINS Army / Collective Intelligence Network Security](https://cinsscore.com)** —— 感谢其免费分发已知恶意行为者的黑名单,该名单已直接包含在此工具中,因此无需额外设置即可开箱即用。 感谢所有维护这些数据源并免费向社区开放的人们。
标签:Ask搜索, IP查询, VirusTotal, Web技术栈, 威胁情报, 安全运营, 开发者工具, 扫描框架, 漏洞挖掘, 逆向工具