zachwenger/honeypot
GitHub: zachwenger/honeypot
一个轻量级多端口 TCP 蜜罐,部署于 AWS EC2 上用于被动捕获互联网攻击流量并生成 Sigma 检测规则。
Stars: 0 | Forks: 0
# ● ZW Honeypot
**部署在 AWS EC2 上的多端口 TCP honeypot —— 上线 60 秒内即捕获到实时互联网攻击流量。**
构建它的目的是为了研究真实攻击者的行为,编写 SOC 团队真正会使用的检测逻辑,并了解像 Mirai 这样的 IoT 僵尸网络在 2026 年是如何继续寻找目标的。
作者:Zach Wenger · [github.com/zachwenger](https://github.com/zachwenger)
## 场景
我想看看在真实环境中,究竟是什么在攻击一台暴露的服务器——不是在教科书上,也不是在课堂实验室里。因此,我编写了一个多线程的 Python honeypot,伪装运行 FTP、SSH、Telnet、HTTP、HTTPS 和 RDP,将其部署到一个公网 AWS EC2 实例上,并记录了每一次连接。
没有进行 IP 宣传,没有配置 DNS,也没有出现在任何威胁情报源中。只有一个 Elastic IP 和开放的安全组。不到一分钟,第一个 bot 就发现了我。
## 架构
```
┌──────────────────────────────────────────────────┐
│ Public internet │
│ │
│ (Botnets · Mirai variants · vuln scanners) │
└──────────────────────────────────┬───────────────┘
│ unsolicited TCP
▼
┌────────────────────────────┐
│ AWS EC2 t2.micro │
│ Ubuntu Server 22.04 │
│ Elastic IP 3.93.125.65 │
│ Region us-east-1 │
│ ┌──────────────────────┐ │
│ │ honeypot.py │ │
│ │ 6 threaded listeners │ │
│ │ 21 22 23 80 443 3389│ │
│ └──────────┬───────────┘ │
│ │ │
│ ▼ │
│ logs/honeypot_*.log │
└────────────────────────────┘
```
| 组件 | 详情 |
|---|---|
| 云平台 | AWS EC2 |
| 实例 | t2.micro (免费套餐) |
| 操作系统 | Ubuntu Server 22.04 LTS |
| 区域 | `us-east-1` (弗吉尼亚北部) |
| 公网 IP | `3.93.125.65` |
| 监听器 | 6 (FTP / SSH / Telnet / HTTP / HTTPS / RDP) |
| 存储 | EBS gp3,日志在本地写入随后进行轮转 |



## 为什么选择这 6 个端口
| 端口 | 服务 | 攻击者攻击它的原因 | MITRE ATT&CK |
|---|---|---|---|
| 21 | FTP | 遗留系统,通常配置错误并允许匿名访问 | T1078 Valid Accounts |
| 22 | SSH | 凭证填充 + 暴力破解的头号目标 | T1110.001 Brute Force: Password Guessing |
| 23 | Telnet | 数百万 IoT 设备的默认凭证 —— Mirai 的攻击媒介 | T1110.001 + T1078.001 Default Accounts |
| 80 | HTTP | Web 漏洞扫描器、Log4Shell 探针、CMS 漏洞利用 | T1190 Exploit Public-Facing App |
| 443 | HTTPS | SSL/TLS 漏洞利用、特制握手漏洞利用 | T1190 |
| 3389 | RDP | 勒索软件的初始访问入口 —— Conti / BlackCat / LockBit 最喜欢这个 | T1133 External Remote Services |
## 实时捕获结果
上线约 60 秒内即捕获。无广告,无公开发布。



### 捕获的连接(首次会话)
| # | 时间 (UTC) | 端口 | 服务 | 源 IP | Payload | MITRE | 严重程度 |
|---|---|---|---|---|---|---|---|
| 1 | 2026-05-16 01:18:58 | 23 | Telnet | `177.245.231.248` | — | T1110.001 | 信息 |
| 2 | 2026-05-16 01:19:16 | 23 | Telnet | `77.236.93.44` | — | T1110.001 | 信息 |
| 3 | 2026-05-16 01:30:17 | 443 | HTTPS | `106.54.27.68` | 特制二进制数据,非握手包 | T1190 | 中危 |
| 4 | 2026-05-16 01:39:40 | 23 | Telnet | `37.214.9.175` | — | T1110.001 | 信息 |
### IOC (原始数据,可直接导入 SIEM)
```
# Telnet scanner 集群
177.245.231.248 - Mexico, residential, Telmex AS8151
77.236.93.44 - Belarus, hosting (Active.by)
37.214.9.175 - Belarus, residential (Beltelecom)
# HTTPS exploit payload 发送器
106.54.27.68 - China, Tencent Cloud AS45090
```
四个 IP 中有三个可追溯到出现在公开僵尸网络源
(AbuseIPDB、Spamhaus DROP)中的家庭宽带/托管 IP 段。
那个腾讯云的 IP 更有意思——这类 IP 往往是廉价租用的 VPS,
被用作一次性的扫描器节点。
## 分析
### 集群 1 — Telnet 暴力破解扫描 `(命中 1, 2, 4)`
在最初的 21 分钟内,三个不同的 IP 命中了端口 23。
它们都没有发送 payload 数据——仅仅是建立连接,
这是更广泛的扫描/暴力破解模式在 TCP 握手阶段的表现。这**正是
Mirai 家族的行为**:扫描开放的 Telnet → 一旦识别到 banner 就转而尝试
硬编码的凭证列表。
Mirai 源码泄露 (2016) 硬编码了约 60 个默认凭证,
包括 `root/root`、`admin/admin`、`root/xc3511` (Xiongmai DVR)。
八年过去了,衍生的僵尸网络 (Mozi、Hajime、BotenaGo) 依然
在使用相同的攻击媒介,因为 IoT 厂商出厂时仍然带着这些默认配置。
**SOC 团队针对此事的处理方式:** 对任何来自互联网源、
访问内部 IP 上端口 23 的 TCP SYN 包进行告警,因为在 2026 年,
任何合法的网络行为都不应该从互联网访问内部的 Telnet。
### 集群 2 — 特制的 HTTPS payload `(命中 3)`
`106.54.27.68` 连接到 443 端口并立即发送了原始二进制数据——
不是有效的 TLS ClientHello。包含不可打印字符,没有可识别的握手
头部。这是漏洞扫描器正在探测以下目标的典型特征:
- Heartbleed 级别的内存泄漏
- 配置错误的 TLS (例如 SSL v2/v3 回退)
- 针对响应 banner 的特定 CVE 检查
这比 Telnet bot 更高级——目的明确、携带 payload,
而不仅仅是连接探测。
## 检测规则
针对观察到的模式编写的真实 Sigma 规则。可直接导入 Splunk / Elastic / Sentinel。
### `detections/sigma/telnet-bot-probe.yml`
```
title: Inbound Telnet Connection from Internet (Mirai-class)
id: 7b1f3c5d-4a8e-4d92-8b21-9c2f6d8a1e4b
status: experimental
description: >
Any inbound TCP connection to port 23 from a non-RFC1918 source is
suspicious in 2026 — legitimate Telnet usage is functionally extinct.
Correlates with Mirai/Hajime/Mozi botnet scanning behavior.
author: Zach Wenger
date: 2026/05/16
references:
- https://attack.mitre.org/techniques/T1110/001/
- https://krebsonsecurity.com/tag/mirai-botnet/
logsource:
category: firewall
detection:
selection:
dst_port: 23
src_ip|cidr|not:
- '10.0.0.0/8'
- '172.16.0.0/12'
- '192.168.0.0/16'
condition: selection
falsepositives:
- Internal admins using Telnet for legacy hardware (rare, document the exception)
level: medium
tags:
- attack.initial_access
- attack.t1110.001
- attack.t1078.001
```
### `detections/sigma/https-non-handshake-payload.yml`
```
title: HTTPS Port Receives Non-TLS Binary Payload
id: 9a4d2e8f-1c7b-4f6a-b3e5-2d9f8c1a7e6b
status: experimental
description: >
TCP traffic to 443 that doesn't begin with a TLS ClientHello (first
byte 0x16 record type) on a server expecting TLS is consistent with
vulnerability scanners probing for non-TLS responses.
author: Zach Wenger
date: 2026/05/16
logsource:
category: network_connection
detection:
selection:
dst_port: 443
payload_first_byte|not: '0x16'
payload_bytes|gte: 4
condition: selection
falsepositives:
- Misconfigured clients sending HTTP to HTTPS port (rare, will show 0x47 'GET')
level: medium
tags:
- attack.reconnaissance
- attack.t1595.002
```
## 补救措施 —— 作为防御者我会怎么做
1. **在边界彻底关闭 Telnet。** 在边缘防火墙丢弃入站的 TCP/23。在 2026 年这没有任何业务需求。
2. **在每一台面向互联网的主机上仅使用 SSH 密钥认证。** 在 `sshd_config` 中禁用密码认证。暴力破解在数学上就失去了意义。
3. **在边缘进行地理封锁**,针对任何不需要全球访问的服务——RDP、内部管理面板等。
4. **在面向 SSH 的主机上部署 Fail2Ban / CrowdSec**,自动封禁暴力破解 IP。
5. **将 AbuseIPDB + Spamhaus DROP 的数据聚合**到每小时刷新的 blocklist 中。几乎所有僵尸网络 IP 都会在一天内出现在那里。
6. **出站过滤**同样重要——即使一台机器被攻破,如果出站流量受限,它也无法进行命令控制 (Phone home) 或向外扫描。
## 我的收获
速度是关键。我曾读到过互联网是如何被不断扫描的,但是阅读“不断扫描”这个词,与看着真实的 packet 在 `python3 honeypot.py` 返回后 47 秒就落在我伪装的 Telnet 监听器上,完全是两码事。Mirai 从一个教科书上的概念,变成了我现在一眼就能认出的具体模式。
HTTPS payload 是最有趣的捕获。它不是连接探测——而是真实的漏洞利用尝试数据。这就是好奇流量与威胁行为者工具之间的区别,也是 SOC 分析师在入职第一个月就会学会分诊的事情。
云计算网络也终于变得合理了。从头开始设置 VPC、子网、Internet 网关、Elastic IP 和安全组,迫使这些抽象概念不再那么晦涩难懂。现在当我读到“通过子网配置不当进行横向移动”时,我能真正把它映射到我亲手构建过的事物上。
## 自己运行它
```
git clone https://github.com/zachwenger/honeypot.git
cd honeypot
pip3 install colorama
sudo python3 honeypot.py
```
需要使用 `sudo` —— 1024 以下的端口 (21, 22, 23, 80, 443) 需要 root 权限。
## 技术栈
| | |
|---|---|
| 编程语言 | Python 3 |
| 并发 | `threading` (每个端口一个监听器) |
| 日志记录 | 标准库 `logging` + 轮转文件输出 |
| 云平台 | AWS EC2 (免费套餐) |
| 网络 | 标准库 `socket`,纯 TCP,无 SSL termination |
| 依赖项 | 仅 `colorama` |
## 文件结构
```
honeypot/
├── honeypot.py — the listener
├── README.md — this file
├── logs/ — session logs (gitignored in real use)
├── screenshots/ — deployment + capture evidence
└── detections/sigma/ — Sigma rules for the patterns observed
├── telnet-bot-probe.yml
└── https-non-handshake-payload.yml
```
*所有捕获的流量均为未经请求的恶意访问。该实例部署在我个人的 AWS 账户中,位于隔离的 VPC 内,仅出于教育目的。没有为了欺诈而伪造任何服务,没有进行任何数据中继,也没有发送任何响应——该 honeypot 是完全被动的。*
标签:AWS EC2, PE 加载器, Python, 威胁情报, 开发者工具, 无后门, 网络流量分析, 蜜罐, 证书利用