robulanetteam/rdp_honeypot
GitHub: robulanetteam/rdp_honeypot
这是一个用Python编写的RDP蜜罐,用于模拟Windows机器并捕获攻击者的凭证以供安全分析。
Stars: 0 | Forks: 0
# RDP蜜罐
用Python编写的自定义RDP监听器,用于模拟域中的Windows机器。
捕获来自旧版客户端的**明文密码**以及来自NLA客户端的**NetNTLMv2哈希值**。
通过现成的Docker镜像运行——一条命令即可安装。
## 快速开始
```
# 下载 compose 文件
curl -sO https://raw.githubusercontent.com/robulanetteam/rdp_honeypot/main/docker-compose.yml
curl -sO https://raw.githubusercontent.com/robulanetteam/rdp_honeypot/main/.env.example
# 配置
cp .env.example .env
# 如有需要,请编辑 .env 文件(机器名、域名、时区等)
# (推荐) 下载 GeoIP 数据库
mkdir -p ./data/geoip
curl -fsSL https://[URL] -o ./data/geoip/GeoLite2-City.mmdb
curl -fsSL https://[URL] -o ./data/geoip/GeoLite2-ASN.mmdb
# 运行
docker compose up -d
```
蜜罐监听 **3389端口**。数据保存在宿主机的 `./data/` 目录下。
| 路径 | 内容 |
|------|------|
| `./data/private/credentials.log` | 密码和NetNTLMv2哈希值 |
| `./data/public/rdp_honeypot.txt` | 公共日志(每第N次尝试) |
| `./data/logs/analytics.jsonl` | IP分类:扫描器 / 暴力破解器 / 误触 |
| `./data/geoip/` | MaxMind GeoLite2数据库(可选) |
重启后自动启动——通过compose文件中的 `restart: unless-stopped` 和 `systemctl enable docker` 实现。
## 连接到蜜罐中心
[蜜罐中心](https://github.com/robulanetteam/rdp-honeypot-central) — 用于集中管理多个节点的Web界面。
代理**已内置于镜像**中并会自动启动。只需取消`.env`文件中的注释:
```
CENTRAL_URL=https://your-central-server:8100
CENTRAL_NODE_ID=rdp-home
CENTRAL_TOKEN=<токен из UI → Settings>
# CENTRAL_INSECURE=1 # 如果是自签名证书
```
```
docker compose up -d
```
## 更新镜像
```
docker compose pull && docker compose up -d
```
## 工作原理
大多数互联网机器人在扫描3389端口时,使用不带TLS的**旧版标准RDP安全性**。在此模式下,客户端发送包含域名、用户名和**明文密码**的Client Info PDU(使用协商的密钥进行RC4加密,而该密钥由服务器控制)。
蜜罐实现了该协议分支的完整协议栈——客户端"信任"服务器并交出密码。
### 混合策略(默认,`HONEYPOT_FORCE_LEGACY=1`)
```
Клиент → PROTOCOL_HYBRID (NLA/CredSSP)
Сервер → NEG_FAILURE (SSL_NOT_ALLOWED_BY_SERVER)
↓ большинство ботов делают retry
Клиент → PROTOCOL_RDP
Сервер → MCS + Proprietary Certificate + RC4
Клиент → Client Info PDU (RC4)
Сервер → расшифровывает → domain / user / PASSWORD ✓
```
| 客户端请求 | 服务器响应 | 结果 |
|---|---|---|
| `PROTOCOL_RDP` | MCS → RC4 → Client Info | **明文密码** |
| `PROTOCOL_SSL` | TLS → Client Info | **明文密码** |
| `PROTOCOL_HYBRID` + `FORCE_LEGACY=1` | NEG_FAILURE → 重试 | 降级后获取明文密码 |
| `PROTOCOL_HYBRID` + `FORCE_LEGACY=0` | TLS → NTLMSSP | **NetNTLMv2哈希值** (hashcat -m 5600) |
## 配置
| 变量 | 默认值 | 描述 |
|---|---|---|
| `HONEYPOT_COMPUTER` | `WIN-SRV2008` | 机器的NetBIOS名称 |
| `HONEYPOT_DOMAIN` | `CORP` | NetBIOS域名 |
| `HONEYPOT_DNS_COMPUTER` | `WIN-SRV2008.corp.local` | DNS名称 |
| `HONEYPOT_DNS_DOMAIN` | `corp.local` | DNS域名 |
| `HONEYPOT_FORCE_LEGACY` | `1` | `1` = 降级 (明文), `0` = NLA (哈希值) |
| `TZ` | `Europe/Moscow` | 时区 |
| `PUBLIC_LOG_NAME` | `rdp_honeypot.txt` | `./data/public/` 目录下的文件名 |
| `PUBLIC_LOG_EVERY_N` | `3` | 每个IP的第N次尝试 → 写入公共日志 |
| `WINDOW_HOURS` | `24` | 分类器的尝试计数时间窗口(小时) |
## 日志
`./data/logs/credentials.jsonl` — 捕获的数据:
```
{"timestamp":"2026-05-13T14:00:02+03:00","source_ip":"1.2.3.4",
"captured_via":"legacy_rdp","domain":"WORKGROUP",
"username":"Administrator","password":"Passw0rd123!"}
```
```
{"captured_via":"nla_ntlmssp","username":"admin","domain":"CORP",
"ntlm_version":"v2","hashcat":"admin::CORP:aabb...:1122...:0102..."}
```
`log_processor.py` (每分钟运行一次):
- `./data/public/rdp_honeypot.txt` — 每第N次尝试:`2026-05-13 14:00 | 1.2.3.4 | 过去24小时内第3次尝试 | scanner`
- `./data/private/credentials.log` — 所有密码和hashcat格式的字符串
- `./data/logs/analytics.jsonl` — IP分类
```
{"timestamp":"2026-05-15T10:00:00+03:00","source_ip":"34.38.74.158",
"classification":"scanner","confidence":"high",
"reasons":["scanner_cookie","tls_direct_probe","hybrid_ex_protocol","rapid_multiconn:4x_in_17s"],
"sessions_total":4,"protocols_seen":["0x00000003","0x0000000b"],
"has_credentials":false}
```
### 分类器
| 信号 | 分类 | 分数 |
|---|---|---|
| Cookie包含 `nmap` / `masscan` / `zgrab` / `shodan` / `censys` | scanner | +5 |
| TPKT异常 — 直接TLS探测 | scanner | +3 |
| 请求协议中的 `PROTOCOL_HYBRID_EX` 位 (0x08) | scanner | +3 |
| <120秒内≥3次连接 | scanner | +2 |
| >2种不同的请求协议 | scanner | +1 |
| 捕获到凭证 | bruteforcer | +10 |
| 到达 `RDP_LEGACY` 阶段 | bruteforcer | +5 |
| NEG_FAILURE降级后重新以旧版协议连接 | bruteforcer | +3 |
| 来自同一IP的≥5个会话 | bruteforcer | +2 |
结果:`scanner` / `bruteforcer` / `accidental` / `unknown`,置信度:`low` / `medium` / `high`。
## 仓库结构
```
rdp_honeypot/
├── docker-compose.yml # production: image-only (docker compose up -d)
├── docker-compose.build.yml # dev override: сборка из исходников
├── .env.example # все переменные с описанием
├── build-push.sh # сборка и пуш multi-arch образа в registry
├── update.sh # обновление образа на ноде
├── honeypot/
│ ├── Dockerfile
│ ├── requirements.txt
│ ├── supervisord.conf # запускает honeypot + agent + log_loop
│ ├── log_loop.sh # log_processor каждые 60 сек
│ ├── honeypot.py # asyncio TCP-сервер
│ ├── rdp_protocol.py # TPKT, X.224, RDP_NEG
│ ├── rdp_legacy.py # MCS, Proprietary Cert, KDF, RC4
│ ├── ts_signing_key.py # well-known TS RSA signing key
│ └── ntlm.py # NTLMSSP + hashcat output
├── agent/
│ └── agent.py # агент Central (встроен в образ)
└── scripts/
├── log_processor.py # JSONL → публичный/приватный лог + аналитика
├── classifier.py # классификатор IP
└── download_geoip.sh # скачать базы MaxMind GeoLite2 с зеркала
```
## 免责声明
仅可用于您拥有或已获得所有者书面许可的设备。
用途:威胁狩猎、研究攻击者战术、CTF。
标签:BurpSuite集成, Docker, Docker Compose, ETW劫持, GeoIP, IP分类, NetNTLMv2, Python, RDP蜜罐, TLS, 免杀技术, 凭证捕获, 哈希捕获, 安全防御评估, 密码捕获, 快速部署, 扫描器检测, 攻击模拟, 无后门, 日志记录, 暴力破解检测, 模拟环境, 网络安全, 蜜罐, 计算机取证, 证书利用, 请求拦截, 远程桌面协议, 逆向工具, 防御工具, 隐私保护, 集中管理, 驱动签名利用