zeljkovranjes/brute

GitHub: zeljkovranjes/brute

一个用于监控 SSH 等协议暴力破解攻击的工具,记录凭据尝试并提供地理位置、统计分析及实时 WebSocket 流传输。

Stars: 9 | Forks: 1

# Brute [github](https://github.com/chomnr/brute) [os](/) [version](https://github.com/chomnr/brute/releases) Brute 是一个用于监控服务器上 OpenSSH 认证尝试的项目。它跟踪并记录每一次尝试,提供有关尝试来源的详细信息。 目前,该项目必须使用特定版本的 OpenSSH。不幸的是,所做的更改可能会损害您服务器的安全性,因此请**谨慎**使用。 - **简单直接** — 只需调用端点 `/brute/attack/add`,Brute 就会为您记录、分析并存储凭据。 - **可扩展指标** — Brute 允许开发者根据需要轻松添加或移除指标。 - **位置信息** — 在独立模式下,信息通过 [IPinfo](https://ipinfo.io/) API 获取。在 Cloudflare Workers 模式下,地理数据直接从 Cloudflare `cf` 请求对象中读取 —— 无需外部 API token。 - **WebSocket 支持** — Brute 支持 WebSocket 连接以进行实时流传输。在独立模式下,这使用 actix-web-actors。在 Workers 模式下,这使用可休眠的 WebSocket Durable Object。 - **双重部署模式** — 作为由 PostgreSQL 支持的独立 Tokio/Actix 服务器运行,或使用 D1 (SQLite) 和 Analytics Engine 部署到 Cloudflare Workers。
## 架构 ``` brute/ ├── brute-core/ # Shared data models, validation, and trait definitions ├── brute-http/ # Standalone server (Tokio + Actix, PostgreSQL, IPinfo) ├── brute-worker/ # Cloudflare Workers (D1 + Analytics Engine + Durable Objects) ├── brute-daemon/ # Traffic source daemon (SSH, FTP) └── migrations/ ├── postgres/ # PostgreSQL migration files (used by brute-http) └── d1/ # SQLite schema files (used by brute-worker via wrangler) ``` ### Crates | Crate | 用途 | |---|---| | `brute-core` | 共享模型(`Individual`、`ProcessedIndividual`、所有 `Top*` 结构体)、验证逻辑,以及 `BruteDb` / `BruteAnalytics` / `GeoProvider` trait 定义 | | `brute-http` | 独立 HTTP 服务器。通过 `PostgresDb` (sqlx) 实现 `BruteDb`,通过 `IpInfoProvider` 实现 `GeoProvider`,通过 `PostgresAnalytics` (top_* 表) 实现 `BruteAnalytics` | | `brute-worker` | Cloudflare Worker。通过 `D1Db` (workers-rs D1 binding) 实现 `BruteDb`,通过 `CfGeoProvider` (cf 请求对象) 实现 `GeoProvider`,通过 `AnalyticsEngine` 实现 `BruteAnalytics` | ### 后端对比 | 功能 | brute-http (独立) | brute-worker (Cloudflare) | |---|---|---| | Database | PostgreSQL (sqlx) | Cloudflare D1 (SQLite) | | Geo lookup | IPinfo.io HTTP API (需要 token) | Cloudflare `cf` object (免费, 内置) | | Analytics | PostgreSQL 中的聚合 `top_*` 表 | Cloudflare Analytics Engine 数据点 | | WebSocket | actix-web-actors (actor 模型) | Hibernatable WebSocket Durable Object | | Deployment | Docker / systemd / 裸机 | `wrangler deploy` | | TLS | 通过 rustls + cert.pem/key.pem 管理 | 由 Cloudflare 自动管理 | ## 安装说明 — 独立版 此处安装 `brute-http`,即从蜜罐服务器收集流量的独立 HTTP 服务器。 ``` # 下载 rustup curl https://sh.rustup.rs -sSf | sh # 添加 Rust 到 PATH (重启 shell 或运行:) source "$HOME/.cargo/env" # 验证安装 rustc -V ``` ### 非 Docker
显示说明 1. 克隆仓库: git clone https://github.com/chomnr/brute 2. 进入 `brute-http` 目录: cd brute/brute-http 3. 设置以下环境变量: DATABASE_URL=postgresql://postgres:{password}@{host}/{database} BEARER_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx IPINFO_TOKEN=xxxxxxxxxxxxxx RUST_LOG=trace RUST_LOG_STYLE=always LISTEN_ADDRESS=0.0.0.0:7000 LISTEN_ADDRESS_TLS=0.0.0.0:7443 RUNNING_IN_DOCKER=false # 可选 — 启用 AbuseIPDB 信誉评分 ABUSEIPDB_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 4. 将您的 `cert.pem` 和 `key.pem` 添加到 `brute-http/` 内的 `/certs` 文件夹中: 从 Cloudflare、Let's Encrypt 或 OpenSSL 生成一个。 如果您不想使用 TLS,请从 main.rs 中移除 serve_tls()。 5. 构建并运行: cargo build --release -p brute-http # 然后运行可执行文件,或者: cargo run -p brute-http
### Docker
显示说明 1. 克隆仓库: git clone https://github.com/chomnr/brute 2. 打开 `DockerFile` 并编辑环境变量: ENV DATABASE_URL=postgresql://postgres:{password}@{host}:{port}/brute ENV BEARER_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ENV IPINFO_TOKEN=xxxxxxxxxxxxxx ENV RUST_LOG=trace ENV RUST_LOG_STYLE=always ENV LISTEN_ADDRESS=0.0.0.0:7000 ENV LISTEN_ADDRESS_TLS=0.0.0.0:7443 ENV RUNNING_IN_DOCKER=true 3. (可选)将您的 `cert.pem` 和 `key.pem` 复制到 `brute-http/` 中: 仅当您想使用 TLS 运行时才需要。 4. 从项目根目录构建镜像: docker build --pull --rm -f "DockerFile" -t brute:latest "." 5. 运行容器: docker run --name brute -p 7000:7000 -p 7443:7443 --restart unless-stopped -d brute # sqlx 将在启动时自动应用迁移。
### 独立版环境变量 | 变量 | 必需 | 描述 | |---|---|---| | `DATABASE_URL` | 是 | PostgreSQL 连接字符串 | | `BEARER_TOKEN` | 是 | 用于 API 认证的密钥 token | | `IPINFO_TOKEN` | 是 | 用于地理查询的 IPinfo.io API token | | `LISTEN_ADDRESS` | 是 | HTTP 绑定地址,例如 `0.0.0.0:7000` | | `LISTEN_ADDRESS_TLS` | 是 | HTTPS 绑定地址,例如 `0.0.0.0:7443` | | `RUNNING_IN_DOCKER` | 是 | 在 Docker 内部运行时设置为 `true` | | `ABUSEIPDB_KEY` | 否 | AbuseIPDB API key — 启用 IP 信誉评分 | | `RUST_LOG` | 否 | 日志级别 (`trace`, `debug`, `info`, `warn`, `error`) | ## 安装说明 — Cloudflare Workers (brute-worker) `brute-worker` 部署到 Cloudflare Workers 边缘网络。它使用 D1 进行存储,使用 Analytics Engine 存储聚合事件数据,并使用 Durable Object 进行 WebSocket 广播。 ### 前置条件 ``` npm install -g wrangler # 或使用 npx wrangler ``` ### 设置 1. 创建一个 D1 数据库: wrangler d1 create worker_brute_d1 从输出中复制 `database_id` 并将其粘贴到 `brute-worker/wrangler.toml` 中: [[d1_databases]] binding = "worker_brute_d1" database_name = "worker_brute_d1" database_id = "YOUR_D1_DATABASE_ID" # <-- 粘贴到此处 2. 应用 D1 schema: wrangler d1 execute worker_brute_d1 --file=../migrations/d1/0001_initial_schema.sql 3. 设置 bearer token secret: wrangler secret put BEARER_TOKEN 4. 部署: cd brute-worker npm run deploy # 或者:wrangler deploy ### Workers 环境变量 / 绑定 | 绑定 / 变量 | 类型 | 描述 | |---|---|---| | `DB` | D1 binding | 通过 Cloudflare D1 的 SQLite 数据库 | | `ANALYTICS` | Analytics Engine binding | 写入攻击事件数据点 | | `WS_BROADCASTER` | Durable Object binding | 管理 WebSocket 连接 | | `BEARER_TOKEN` | Secret (var) | API 认证 token | 不需要 `IPINFO_TOKEN` —— 地理数据免费来自 Cloudflare `cf` 请求对象。 ### 本地开发 ``` cd brute-worker wrangler dev ``` ## API 端点 `brute-http` 和 `brute-worker` 都暴露相同的 REST API。 所有 POST 端点都需要 `Authorization: Bearer ` 标头。 ### POST | 端点 | 描述 | |---|---| | `POST /brute/attack/add` | 记录一次认证尝试 | | `POST /brute/protocol/increment` | 直接增加协议计数器 | ### GET — 统计 | 端点 | 描述 | |---|---| | `GET /brute/stats/attack` | 最近处理的攻击 | | `GET /brute/stats/username` | Top 用户名 | | `GET /brute/stats/password` | Top 密码 | | `GET /brute/stats/ip` | Top IP | | `GET /brute/stats/protocol` | Top 协议 | | `GET /brute/stats/country` | Top 国家 | | `GET /brute/stats/city` | Top 城市 | | `GET /brute/stats/region` | Top 地区 | | `GET /brute/stats/timezone` | Top 时区 | | `GET /brute/stats/org` | Top 组织 | | `GET /brute/stats/postal` | Top 邮政编码 | | `GET /brute/stats/loc` | Top 经纬度位置 | | `GET /brute/stats/combo` | Top 用户名/密码组合 | | `GET /brute/stats/combo/protocol` | 按协议筛选的 Top 组合 | | `GET /brute/stats/hourly` | 每小时攻击计数 | | `GET /brute/stats/daily` | 每日攻击计数 | | `GET /brute/stats/weekly` | 每周攻击计数 | | `GET /brute/stats/yearly` | 每年攻击计数 | | `GET /brute/stats/heatmap` | 攻击热力图 (天 × 小时) | | `GET /brute/stats/subnet` | Top /24 子网 | | `GET /brute/stats/velocity` | 攻击速度 (每分钟,最近一小时) | | `GET /brute/stats/ip/seen` | IP 首次/末次出现时间 | | `GET /brute/stats/ip/abuse` | AbuseIPDB 评分 | | `GET /brute/stats/summary` | 滚动统计摘要 | ### GET — 导出 | 端点 | 描述 | |---|---| | `GET /brute/export/blocklist` | 导出 Top IP 作为拦截列表。`?format=plain\|iptables\|nginx\|fail2ban` | ### WebSocket | 端点 | 描述 | |---|---| | `GET /ws` | 连接到实时广播流 | ## 流量源安装 在安装之前,请确定您想从何处获取流量。支持两个来源: - **OpenSSH** — 在每次认证尝试时调用 Brute 的修补版本 - **Daemon** — 监听 SSH、FTP 和其他端口的自定义守护进程 ### Daemon 支持 SSH 和 FTP。您可以通过调用 `/brute/attack/add` 并在 payload 中指定协议来集成任何协议。请仅在蜜罐服务器上使用此项。 https://github.com/chomnr/brute-daemon
显示说明 1. 克隆: git clone https://github.com/chomnr/brute-daemon cd brute-daemon 2. 构建: cargo build --release mv ~/brute-daemon/target/release/brute-daemon /usr/local/bin/brute-daemon 3. 创建 systemd 服务: nano /etc/systemd/system/brute-daemon.service [Unit] Description=Brute Daemon After=network.target [Service] ExecStart=/usr/local/bin/brute-daemon Restart=always User=root WorkingDirectory=/usr/local/bin StandardOutput=append:/var/log/brute-daemon.log StandardError=append:/var/log/brute-daemon_error.log Environment="ADD_ATTACK_ENDPOINT=https://example.com/brute/attack/add" Environment="BEARER_TOKEN=my-secret-token" [Install] WantedBy=multi-user.target 4. 启用并启动: systemctl daemon-reload systemctl enable brute-daemon systemctl start brute-daemon systemctl status brute-daemon
### OpenSSH
显示说明 1. 安装构建依赖: sudo apt update && sudo apt upgrade sudo apt install build-essential zlib1g-dev libssl-dev libpq-dev pkg-config sudo apt install libcurl4-openssl-dev libpam0g-dev autoconf 2. 克隆并修补后的 OpenSSH: git clone https://github.com/chomnr/openssh-9.8-patched cd openssh-9.8-patched autoreconf ./configure --with-pam --with-privsep-path=/var/lib/sshd/ --sysconfdir=/etc/ssh make && make install 3. 替换 `/lib/systemd/system/ssh.service` 中的系统 SSH: - ExecStartPre=/usr/sbin/sshd -t - ExecStart=/usr/sbin/sshd -D $SSHD_OPTS - ExecReload=/usr/sbin/sshd -t + ExecStartPre=/usr/local/sbin/sshd -t + ExecStart=/usr/local/sbin/sshd -D $SSHD_OPTS + ExecReload=/usr/local/sbin/sshd -t 4. 验证:`ssh -V` 应输出 `(Brute) OpenSSH_9.8...` 5. 构建并安装 PAM 模块: git clone https://github.com/chomnr/brute_pam cd brute_pam cmake . && make cp lib/brute_pam.so /lib/x86_64-linux-gnu/security/ 6. 添加到 `/etc/pam.d/common-auth`: - auth [success=1 default=ignore] pam_unix.so nullok + auth [success=2 default=ignore] pam_unix.so nullok + auth optional pam_brute.so
## 许可证 MIT License (MIT) 2024 - Zeljko Vranjes。请查看 [LICENSE.md](https://github.com/chomnr/brute/blob/main/LICENSE.md) 了解更多详情。
标签:Actix-web, D1 Database, IP地理位置, OpenSSH, PB级数据处理, PostgreSQL, Rust, SSH, Tokio, WebSocket, 依赖分析, 免杀技术, 免运维, 凭证收集, 可视化界面, 安全运维, 暴力破解检测, 测试用例, 程序员工具, 网络攻防, 网络流量审计, 蜜罐, 认证监控, 证书利用, 边缘计算, 通知系统