hett-patell/ShardLure

GitHub: hett-patell/ShardLure

一个基于 SSH 蜜罐的攻击者行为分析与威胁情报共享平台,通过指纹聚类将分散的攻击事件归并为同一攻击者画像,并自动导出可机读的威胁指标。

Stars: 2 | Forks: 0

# ShardLure [![发布](https://img.shields.io/github/v/release/hett-patell/ShardLure?color=blue)](https://github.com/hett-patell/ShardLure/releases) [![许可证: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Go 报告卡](https://goreportcard.com/badge/github.com/networkshard/shardlure)](https://goreportcard.com/report/github.com/networkshard/shardlure) [![星标](https://img.shields.io/github/stars/hett-patell/ShardLure?style=social)](https://github.com/hett-patell/ShardLure/stargazers) image

**SSH 蜜罐遥测的攻击者身份识别引擎。** 也就是说:它让机器人以为它们攻入了真正的生产服务器,然后完全曝光它们的攻击剧本。 ShardLure 根据**剧本指纹**(OpenSSH 日志行)或 **HASSH**(Cowrie 会话)对 SSH 机器人进行聚类,而不仅仅是 IP。同一个攻击者在三个不同的 IP 上?仍然是一个攻击者。不同攻击者使用同一个地址?不同行。核心思想是“用户名口味画像,而不是谁在门口”。它包含一个 VPS 安装程序、Cowrie 集成、实时数据摄取、取证 TUI 以及一个带有旋转地球仪的网络仪表板。 ``` attacker -> port 22 (Cowrie) -> JSON/journal ingest -> SQLite actors -> dashboard you -> port 2222 (SSH) -> real admin access via keys/Tailscale ``` ## 目录 - [功能特性](#features) - [快速开始](#quick-start) - [本地开发](#local-development) - [命令](#commands) - [配置](#configuration) - [部署](#deployment) - [角色与诱饵](#persona-and-bait) - [架构](#architecture) - [安全说明](#security-notes) - [故障排查](#troubleshooting) - [路线图](#roadmap) ## 功能特性 - **双重数据摄取:** OpenSSH 日志导出和 Cowrie JSON 日志。无供应商锁定,无需 SaaS 仪表板观察你的羞愧。 - **攻击者聚类:** 根据源 IP 对日志攻击者聚类,根据 HASSH 对 Cowrie 攻击者聚类。僵尸网络根据它们的 *气质*(HASSH + 用户名语料库)进行分类,而不仅仅是它们 NAT 弹弓落点。 - **意图分类:** 探测、代理、部署、混合或未知。“部署”类型是最刺激的——那是 `curl-bash-into-tmp` 的能量。 - **实时模式:** 从 Cowrie 和日志直接尾随到地球仪表板。实时碾压。 - **VPS 引导:** 安装 Cowrie,将真实 SSH 移动到私有端口,编写 systemd 单元,启动一切。一个命令,无需额外准备。 - **隐身角色:** Ubuntu 风格的横幅,假 `prod-app-server-01` 主机名,重新生成的主机密钥,这样你就不会被识别为“明显的蜜罐 #4892”。 - **诱饵文件:** 假的 `.env`、AWS 凭据、数据库凭据、部署密钥、nginx 站点。看起来像真,实为毒。 - **部署安全同步:** 通过 tar 经过 SSH,因为直接用 `scp` 传输 Go/Python 源代码会莫名其妙地变成 UTF-16。我们不会在这件事上欺骗你——详情见故障排查。 - **增量 Cowrie 数据摄取:** 跟踪文件偏移量 + inode,因此一个 100MB 的 `cowrie.json` 不会每 5 秒被重新扫描一遍。你的 I/O 会感谢我们。 - **幂等性:** 重新运行数据摄取会去重事件,而不是重复它们。过去的你不能欺负现在的你。 - **龙之主题:** 专为 SOC 设计的仪表板,带有侧边栏导航、Chakra Petch 字体、血红色/熔金配色方案、扁平面板、锐利几何。没有玻璃拟态——这是战时控制台。 - **仪表板部件:** 威胁等级表、攻击地理分布、暴力破解雷达、最常用凭据、实时攻击时间线。全部由实时 API 轮询提供数据。 - **一键上传至 MalwareBazaar:** 直接从载荷检查模态框将捕获的有效载荷分享到 abuse.ch。无需 CLI。 - **持久化地理缓存:** IP 地理位置结果存储在 SQLite 中,重启后依然保留。不再每次页面加载都显示“解析中…”。 ## 快速开始 在一台全新的 Ubuntu/Debian VPS 上。带上你的 SSH 密钥,把密码认证留在门外。 ``` git clone https://github.com/hett-patell/shardlure.git cd shardlure sudo python3 scripts/shardlure.py run ``` 安装程序替你考虑得很周到:如果找不到 `authorized_keys`,它拒绝将 SSH 从端口 22 移走;如果新的 sshd 配置未能通过 `sshd -t` 测试,它会自动回滚。不会出现“凌晨两点把自己锁在外面”的悲剧。 安装程序会询问以下设置: | 设置项 | 默认值 | 用途 | | --- | --- | --- | | 蜜罐端口 | `22` | 攻击者的 Cowrie 监听器 | | 管理员 SSH 端口 | `2222` | 真实 SSH,仅密钥 | | 仪表板端口 | `8080` | 实时仪表板 | 设置完成后: ``` sudo python3 scripts/shardlure.py status systemctl status cowrie shardlure-live ``` 在 `http://:8080` 打开仪表板。保持 `8080` 不暴露在公网——端口 `22` 是诱饵,你的仪表板不是诱饵,别搞混。 为了给仪表板增加额外保护,在运行 `web` 或 `live` 之前设置 `SHARDLURE_DASH_TOKEN`。 ### 恢复设置 如果安装程序在 Cowrie/SSH 更改后中断: ``` sudo python3 scripts/shardlure.py finish ``` ### 植入诱饵文件 ``` sudo python3 scripts/shardlure.py plant-bait ``` 在蜜罐 shell 中验证: ``` ls -la /opt/app/ cat /opt/app/.env ``` ## 本地开发 ``` git clone https://github.com/hett-patell/shardlure.git cd shardlure go mod tidy make build ./shardlure ingest journal testdata/sample.journal --replace ./shardlure ingest cowrie /var/lib/shardlure/cowrie/var/log/cowrie/cowrie.json --replace ./shardlure actors ./shardlure actor show 188.84.0.25 ./shardlure dashboard ./shardlure web :8080 --tailscale ./shardlure live :8080 --cowrie=/path/cowrie.json --tailscale ``` 该二进制文件也可以启动 VPS 包装器: ``` sudo ./shardlure run ``` ## 命令 ### Go 命令行工具 | 命令 | 描述 | | --- | --- | | `ingest journal [--replace]` | 解析日志认证行并构建攻击者 | | `ingest cowrie [--replace]` | 解析 Cowrie JSON 日志并构建攻击者 | | `actors [--limit=N]` | 按最后出现时间列出攻击者 | | `actor show ` | 显示一个攻击者的详细资料 | | `dashboard`, `dash`, `tui` | 打开取证 TUI | | `web [:8080] [--tailscale]` | 提供网络仪表板服务 | | `live [:8080] [--cowrie=PATH] [--interval=5s] [--no-journal] [--tailscale]` | 运行实时数据摄取和仪表板 | | `run` | 启动 VPS 包装器 | | `status` | 打印事件和攻击者计数 | | `ioc` | 导出一个小型 IOC 切片 | | `share bazaar [--dry-run] [--limit N] [--sha SHA] [--since DURATION] [--anonymous] [--status]` | 将捕获的有效载荷上传至 MalwareBazaar (abuse.ch) | | `version` | 打印版本 | ### 安装程序 | 命令 | 描述 | | --- | --- | | `run`, `setup` | 完整的 VPS 引导 | | `finish` | 部分设置后恢复 | | `plant-bait`, `bait` | 将诱饵文件注入 Cowrie 的虚拟文件系统 | | `start`, `stop`, `status` | 管理服务 | ## CI GitHub Actions 在推送和拉取请求时运行: - `go mod verify` - `go vet ./...` - `go test -coverprofile=coverage.out ./...` - `go build -o shardlure ./cmd/shardlure` ## 配置 安装程序写入 `/var/lib/shardlure/shardlure.yaml`。你也可以复制 `shardlure.yaml.example`: ``` data_dir: /var/lib/shardlure admin_ips: - 100.x.x.x # Tailscale IP or trusted admin workstation ssh: admin_port: 2222 honeypot_port: 22 dashboard: port: 8080 # Change these to your VPS/operator location for the globe origin. home_lat: 19.0760 home_lon: 72.8777 home_city: Mumbai home_country: India home_cc: IN journal: unit: ssh cowrie: home: /var/lib/shardlure/cowrie json_log: /var/lib/shardlure/cowrie/var/log/cowrie/cowrie.json ``` 使用 `-config /path/shardlure.yaml` 或 `SHARDLURE_CONFIG` 覆盖路径。 不要提交你的真实配置。`admin_ips` 可能泄露私有网络详情,例如 Tailscale IP。 ## 部署 image 对于源文件,使用 tar 管道部署而不是直接使用 `scp`: ``` make deploy # 或 bash scripts/push-sources.sh arm ``` 在 VPS 上: ``` cd ~/ShardLure/shardlure bash scripts/fix-go-sources.sh sudo cp /tmp/shardlure /usr/local/bin/shardlure sudo python3 scripts/shardlure.py finish ``` ### 手动日志导出 ``` sudo journalctl -u ssh -S "30 days ago" -o short-iso --no-pager \ | grep -E 'Invalid user|Failed password|Failed publickey|Accepted ' \ > ~/journal-ssh-30d.log shardlure ingest journal ~/journal-ssh-30d.log --replace ``` ## 角色与诱饵 `install/persona/` 包含一个简单的生产服务器伪装和诱饵文件。 | 虚拟路径 | 诱饵内容 | | --- | --- | | `/opt/app/.env` | 伪造的数据库、Redis、JWT、Stripe 和 AWS 值 | | `/opt/app/config/database.yml` | 伪造的 Postgres 凭据 | | `/home/ubuntu/.aws/credentials` | 伪造的 AWS 部署配置文件 | | `/home/deploy/.ssh/id_rsa` | 伪造的部署密钥 | | `/var/backups/nightly/db_credentials.txt` | 伪造的备份凭据 | 所有凭据都是故意伪造的。每次部署应重新生成诱饵值,这样多个蜜罐就不会因相同的诱饵而被识别。 ## 威胁情报共享 (MalwareBazaar) `shardlure share bazaar` 将捕获的有效载荷提交至 [abuse.ch MalwareBazaar](https://bazaar.abuse.ch/)。每次上传都会自动分类(ELF 架构、静态 vs 动态链接、脚本语言,以及少量知名家族指纹——RedTail、Mirai、Komari、Traffmonetizer、XMRig、c3pool)并打上标签。abuse.ch 的服务端分析(YARA、ClamAV、telfhash)会进一步添加重型签名。 **设置** 1. 在 注册并复制你的 Auth-Key。 2. 编辑 `shardlure.yaml`: ```yaml intel: bazaar: api_key: "your-auth-key-here" tags: ["shardlure", "honeypot"] max_bytes: 33554432 # 32 MiB freshness_days: 10 # abuse.ch fair-use: fresh samples only ``` 3. 先试运行以检查哪些文件会被发送: ```bash shardlure share bazaar --dry-run --limit 10 ``` 4. 当输出看起来正确后,去掉 `--dry-run`: ``` shardlure share bazaar --limit 10 ``` 重新运行是安全的:每个成功提交的 sha256(包括 `file_already_known` 响应)都会被记录在 `bazaar_uploads` 中,下次运行时会跳过。 你也可以从网络仪表板分享有效载荷:在任意捕获的工件上打开载荷检查模态框,点击 **分享到 MalwareBazaar**。为此需要在环境变量或 systemd 单元中设置 `SHARDLURE_BAZAAR_KEY`。红色团队选项卡的 MalwareBazaar 面板显示上传历史、家族分类和待处理计数。 **标志** | 标志 | 默认值 | 含义 | | --- | --- | --- | | `--dry-run` | false | 打印分类和目的地而不实际 POST | | `--limit N` | 10 | 限制每次运行的上传数量(0 = 不限制) | | `--sha SHA` | – | 仅上传这个特定样本(绕过新鲜度检查) | | `--since DUR` | 240h | 仅考虑在此时间窗口内捕获的工件 | | `--anonymous` | false | 不署名提交,不与你的账户关联 | | `--status` | – | 列出 `bazaar_uploads` 中的历史上传记录,而不是上传 | **为什么选择 MalwareBazaar?** 它是蜜罐捕获的 Linux 恶意软件的事实标准共享中心。其提交政策(无 PUP/广告软件,无文件感染型病毒,样本不超过 10 天)在客户端(`share` 子命令尊重 `freshness_days`)和服务器端都得到执行。反复违规会导致账户被禁——参见 `internal/intel/bazaar/client.go` 中处理 `user_blacklisted` 致命状态并停止运行的逻辑。 ## 架构 ``` +-------------+ +--------------+ +-------------+ | Cowrie :22 | --> | cowrie.json | --> | | +-------------+ +--------------+ | SQLite | | actors | --> web :8080 +-------------+ +--------------+ | events | TUI | journal ssh | --> | tail/seed | --> | | +-------------+ +--------------+ +-------------+ ``` - **日志攻击者:** `journal:`,根据用户名剧本聚类(他们尝试的用户名分布就是他们的个性)。 - **Cowrie 攻击者:** `cowrie:`,根据 HASSH 指纹(SSH 客户端身份的 TLS 性哈希)聚类。 - **管理员 IP:** 明确排除在聚类之外,这样你不会错误地将自己分类为“快速字典喷射”攻击者。 ## 安全说明 - 在关闭原始会话**之前**,在另一个终端中验证 `ssh -p 2222 user@host`。“明天早上再修”的 SSH 故事通常结局不妙。 - 将仪表板放在 Tailscale 或其他私有网络上。将仪表板暴露在公网上就是我们所说的自我人肉搜索。 - 设置 `SHARDLURE_DASH_TOKEN` 以实现仪表板的纵深防御(常量时间比较,作为 `Authorization: Bearer …` 或 `X-ShardLure-Token` 发送)。 - 外部地理位置查询是可选加入的(`SHARDLURE_GEO_HTTP=1`)。建议使用 `SHARDLURE_IPAPI_KEY` 通过 ip-api Pro 进行 HTTPS 查询。仅在同时设置 `SHARDLURE_GEO_INSECURE_HTTP=1` 时使用明文 `http://ip-api.com`(会将攻击者 IP 泄漏到网络路径上)。 - Cowrie SSH 主机密钥在安装期间重新生成,这样你就不会与 Shodan 上其他每个懒惰的蜜罐共享相同的指纹。 - 保持诱饵凭据为假。真的,不要“几乎真实”地写如实凭据。 - SQLite 数据库自动设置为 `0600` 权限——其中可能包含攻击者提供的密码,这些密码有时会与他们*实际重复使用*的真实密码重叠。请像对待上膛的枪一样对待这个文件。 ## 故障排查 ### NUL 字节或 UTF-16 损坏 症状(你的编辑器/传输管道静默地重新编码了源文件): - `SyntaxError: null bytes` - `cannot execute binary file` - `unexpected NUL in input` 这不是你的问题,而是工具的问题。解决方法: ``` bash scripts/push-sources.sh arm ``` 在本项目中避免直接使用 `scp` 传输 Go/Python 源文件。我们还没到 `scp` 的时代。 ### Cowrie PTY 或 Shell 失败 确保 `cowrie.cfg` 指向真正的 Cowrie 数据路径: ``` data_path = /var/lib/shardlure/cowrie/src/cowrie/data state_path = /var/lib/shardlure/cowrie/var/lib/cowrie [shell] filesystem = /var/lib/shardlure/cowrie/src/cowrie/data/fs.pickle ``` ### `plant-bait` 报告文件已存在 重新运行时无害。`do_load` 表示文件内容已加载。 ### `fsctl ls` 不工作 `fsctl` 不实现 `ls`。通过蜜罐 shell 验证诱饵文件或检查 `honeyfs`: ``` ls /var/lib/shardlure/cowrie/honeyfs/opt/app/ ``` image ## 路线图 - [x] Cowrie JSON 数据摄取(HASSH、命令、有效载荷) - [x] 隐身角色和诱饵文件植入 - [x] 实时日志尾随和 Cowrie 追加数据摄取 - [x] 可配置的仪表板首页点 - [x] 增量 Cowrie 数据摄取(偏移量 + inode 跟踪,不再每 tick 扫描整个文件) - [x] 幂等日志追加(对已有事件去重) - [x] SIGINT/SIGTERM 优雅关闭(Ctrl-C 不再是战争罪行) - [x] 数据库权限 0600 + sshd 配置自动回滚(如果重载失败) - [x] MalwareBazaar 有效载荷共享(CLI + 一键仪表板上传) - [x] 龙之主题——完整的 SOC 仪表板重新设计,带侧边栏导航 - [x] 仪表板部件:威胁等级表、地理分布、凭据、暴力破解雷达、实时时间线 - [x] 持久化地理缓存(基于 SQLite,重启后保留) - [x] MalwareBazaar 仪表板部件(统计 + 上传历史 + 家族分类) - [ ] GeoLite2 MMDB 富化(摆脱 ip-api.com 的速率限制) - [ ] 实时 WebSocket 数据源(目前仪表板每 5 秒轮询一次,还不错但还有提升空间) ## FAQ(常见 vibe) **问:这会让我的服务器更安全吗?** 答:略微。它将真实的 SSH 移到了私有端口(好事)并运行一个假的(有趣)。主要价值在于*情报*:你可以了解僵尸网络对看起来像你的机器做了什么。 **问:我会得到炫酷的地图吗?** 答:会。有一个地球仪,它会旋转。血红色的弧线汇聚到你家,就像你在 2007 年的黑客电影里一样。情报控制台有威胁等级表、暴力破解雷达和攻击地理分布面板。 **问:这个可以用于生产环境吗?** 答:它适用于“单 VPS、单人操作、跑在我的笔记本上”的场景。如果你想要一个集群,需要将 SQLite 前端换成支持多写入者的东西。欢迎 PR。 **问:为什么用 Go + Python?** 答:Cowrie 是 Python 的。数据摄取、分类器和仪表板用 Go 实现,因为在一核 VPS 上用 Python 解析一百万行日志简直是折磨。Python *只*用于安装程序。 **问:诱饵文件足够逼真吗?** 答:它们对机器人来说足够逼真。人类审计 30 秒就会发现伪造的 Stripe 密钥。这没问题——机器人是我们的客户。 ## 许可证 MIT - 参见 [LICENSE](LICENSE)。 ## Shard 生态系统 | 仓库 | 功能描述 | |---|---| | [ShardLure](https://github.com/hett-patell/ShardLure) | SSH 蜜罐 + 威胁情报仪表板 | | [ShardC2](https://github.com/hett-patell/ShardC2) | Go 编写的红队 C2 框架 | [ShardFlow](https://github.com/hett-patell/ShardFlow) | 二层局域网工作台(ARP、丢弃、限速) | | [ShardShell](https://github.com/hett-patell/ShardShell) | PHP 后渗透 shell | | [ShardPass](https://github.com/hett-patell/ShardPass) | 最小化 TOTP 认证器(Chrome MV3) | | [ShardPet](https://github.com/hett-patell/ShardPet) | 像素宝可梦浏览器扩展 |
标签:AbuseIPDB, ADCS攻击, AMSI绕过, Ask搜索, CISA项目, Cloudflare, DNS解析, EVTX分析, Go语言, GreyNoise, HASSH, MITRE ATT&CK, OpenSSH, SQLite, SSH蜜罐, STIX 2.1, TUI界面, VirusTotal, VPS部署, Web仪表盘, 云存储安全, 威胁情报, 威胁检测, 开发者工具, 开源项目, 情报共享, 指标导出, 插件系统, 攻击溯源, 攻击者指纹, 数据展示, 日志审计, 程序破解, 红队, 网络安全, 网络扫描, 自动化告警, 蜜罐, 证书利用, 软件分析, 进程注入, 逆向工具, 隐私保护