
Krawl v2.3.0
Krawl是一个可定制、轻量级、云原生的网络诱骗服务器和反爬虫工具,它利用逼真、随机生成的诱饵数据和AI生成的HTML模板,创建具有低悬果实漏洞的虚假Web应用。
Krawl
目录
- 演示
- 什么是 Krawl?
- Krawl 仪表盘
- 部署模式
- Krawl 封禁列表
- 快速开始
- 配置
- 封禁恶意 IP
- IP 信誉
- 在反向代理或 CDN 后运行
- 指标与监控
- 附加文档
- 使用 AI 进行欺骗
- 贡献
演示
提示:爬取 robots.txt 中的路径可获得额外乐趣
Krawl URL: http://demo.krawlme.com
查看仪表盘 http://demo.krawlme.com/das_dashboard
什么是 Krawl?
Krawl 是一个云原生欺骗服务器,旨在检测、延迟和分析恶意攻击者、网络爬虫和自动化扫描器。
它创建逼真的虚假 Web 应用程序,其中充满了易于得手的目标,如管理面板、配置文件和暴露的虚假凭据,以吸引和识别可疑活动。

通过消耗攻击者的资源,Krawl 有助于清晰地区分恶意行为和合法爬虫。
其特点包括:
- AI 生成的欺骗页面:让攻击者帮助生成你的虚假易受攻击的攻击面
- 蜘蛛陷阱页面:基于 spidertrap 项目 的无限随机链接,以消耗爬虫资源
- 虚假登录页面:WordPress、phpMyAdmin、管理面板
- 蜜罐路径:在 robots.txt 中公布以捕获扫描器
- 虚假凭据:看起来逼真的用户名、密码、API 密钥
- 金丝雀令牌集成:触发外部警报
- 随机服务器标头:基于服务器标头和版本混淆攻击
- 实时仪表盘:监控可疑活动
- 可定制词表:基于 JSON 的简易配置
- 随机错误注入:模拟真实服务器行为
你可以轻松地将 Krawl 与其他服务一起暴露,使用反向代理保护它们免受网络爬虫和恶意用户的侵害。更多详情,请参阅反向代理文档。

Krawl 仪表盘
Krawl 提供了一个全面的仪表盘,可通过启动时生成的随机秘密路径或通过 KRAWL_DASHBOARD_SECRET_PATH 配置的自定义路径访问。这使仪表盘对扫描你蜜罐的攻击者保持隐藏。
仪表盘分为六个标签页:
- 概览:攻击活动的高级视图:IP 来源的交互式地图、最近的可疑请求,以及顶级 IP、User-Agent 和路径。

- 攻击:捕获的凭据、蜜罐触发器和检测到的攻击类型(SQLi、XSS、路径遍历等)的详细分类,配有图表和表格。

-
威胁:将有效载荷按 TLSH 模糊哈希分组为战役,因此一个 webshell 及其编辑变体会被识别为同一战役,而非不相关的命中,并附有所有捕获文件的索引。
-
IP 洞察:对所选 IP 的深入取证视图:地理位置、ISP/ASN 信息、信誉标记、行为时间线、攻击类型分布、引用来源历史、捕获的文件和凭据,以及完整的访问历史。

此外,使用仪表盘密码进行身份验证后,受保护的标签页将变为可用:
- 追踪的 IP:维护你想要长期监控的 IP 地址观察列表。
- IP 封禁列表:管理 IP 封禁、查看检测到的攻击者,并以原始或 IPTables 格式导出封禁列表。
- 超时 IP:查看当前被扣留在 tarpit 中的 IP,并豁免任何不应被扣留的 IP。
- 欺骗:管理 AI 生成的页面,导出它们或导入新页面。
- Webhook:将封禁转发到 CloudFlare 和其他防火墙。
标题栏图标可打开 API 文档、封禁列表导出,以及一个显示运行配置的设置面板和一个用于按需运行计划任务的维护页面。
更多详情,请参阅仪表盘文档。
部署模式
Krawl 支持两种部署模式,由 config.yaml 中的 mode 设置或 KRAWL_MODE 环境变量控制。
| 独立模式 | 可扩展模式 | |
|---|---|---|
| 数据库 | SQLite (WAL 模式) | PostgreSQL |
| 缓存 | 内存中的 Python 字典 | Redis(多级 TTL) |
| 副本数 | 1(单实例) | 1+(水平扩展) |
| 外部依赖 | 无 | PostgreSQL + Redis |
| 适用场景 | 开发、家庭实验室、<50 万请求 | 生产、高可用、>50 万请求 |
独立模式:适用于开发环境或请求量较低的家庭实验室。无需额外配置,只需运行 Krawl 即可工作。
- 单容器部署,无外部依赖
- 更低的 RAM 和资源占用
可扩展模式:专为生产环境或高流量蜜罐设计。Helm chart 默认使用此模式。
- 得益于 Redis 多级缓存,仪表盘更快、响应更灵敏
- Redis 作为 PostgreSQL 前面的热路径缓存,降低磁盘 I/O
- 水平扩展,在负载均衡器后增加 Krawl 副本数量
有关详细配置、Docker Compose 示例、Kubernetes/Helm 设置以及分步迁移说明,请参阅部署模式文档。
Krawl 封禁列表
Krawl 维护一份定期更新的 banlist.txt,其中包含触发了其蜜罐陷阱的攻击者的 IP 地址。该封禁列表每周发布并可下载,帮助社区即使不使用 Krawl 也能预先阻止已知的恶意行为者。
封禁列表也可直接从以下地址获取: https://demo.krawlme.com/das_dashboard/api/export-ips?categories=attacker&fwtype=raw。
在实例之间共享封禁列表
Krawl 实例可以联合其封禁列表:每个实例都可以在未认证路径上发布自己的列表,并拉取其他实例(或任何纯文本 IP 列表)的列表。获取的 IP 会合并到本地封禁决策中,并显示在仪表盘上。```yaml banlist:
Public, unauthenticated download path for this instance's banlist.
Supports the same ?categories= and ?fwtype= parameters as the main API.
Empty = disabled.
export_path: "/public_banlist.txt"
Upstream banlists to fetch and merge. Plain ".txt" lists work too.
sources: - "https://demo.krawlme.com/das_dashboard/api/export-ips?categories=attacker&fwtype=raw" - "https://krawl.example.com/public_banlist.txt"
refresh_interval: 3600 # seconds between fetches
## 快速开始
### Docker 运行
使用最新镜像以独立模式运行 Krawl:```bash
docker run -d \
-p 5000:5000 \
-e KRAWL_DASHBOARD_SECRET_PATH="/my-secret-dashboard" \
-e KRAWL_DASHBOARD_PASSWORD="my-secret-password" \
-v krawl-data:/app/data \
--name krawl \
ghcr.io/blessedrebus/krawl:latest
访问服务器地址 http://localhost:5000
Docker Compose
创建一个 docker-compose.yaml 文件,选择以下两种部署模式之一。
独立模式:仅包含使用 Sqlite 存储的 Krawl 服务器:```yaml services: krawl: image: ghcr.io/blessedrebus/krawl:latest container_name: krawl-server ports: - "5000:5000" environment: - CONFIG_LOCATION=config.yaml # - KRAWL_DASHBOARD_PASSWORD=my-secret-password volumes: - ./config.yaml:/app/config.yaml:ro - krawl-data:/app/data restart: unless-stopped
volumes: krawl-data:
**可扩展**:使用 PostgreSQL 和 Redis:
> [!CAUTION]
> 以下示例使用**默认密码**(`krawl`/`krawl`)。**在生产环境部署前请务必修改。**```yaml
services:
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: krawl
POSTGRES_USER: krawl
POSTGRES_PASSWORD: krawl
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U krawl -d krawl"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5