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,日志在本地写入随后进行轮转 | ![EC2 实例](https://static.pigsec.cn/wp-content/uploads/repos/cas/16/1664a0f19aa6e6fc808575f26b9fb5466664c051de2bf2bd33536840e47e091b.png) ![安全组规则](https://static.pigsec.cn/wp-content/uploads/repos/cas/86/86460538c7acdfb2e7326297bf9eb2e337ebb756b003cd9c901ac7b253a199df.png) ![VPC 资源映射图](https://static.pigsec.cn/wp-content/uploads/repos/cas/d2/d20becc5925e213062d4e3c6d8041e463d628c4b7c922fff25abde87293df1f7.png) ## 为什么选择这 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 秒内即捕获。无广告,无公开发布。 ![Honeypot 运行中](https://static.pigsec.cn/wp-content/uploads/repos/cas/d4/d4ded76068e7cc1bb2e6c9c6449d8559f3e01deb8916976e49a06798585c15fb.png) ![实时命中](https://static.pigsec.cn/wp-content/uploads/repos/cas/d0/d0c321ecb72a5585bd370daf8fcdd3b2bc5df36103e66c2f0feb484d95d08514.png) ![日志输出](https://static.pigsec.cn/wp-content/uploads/repos/cas/36/366cdb15a37bb14a3b475e1f673488c089dfc35dc871cfc28dff6e73e46066dc.png) ### 捕获的连接(首次会话) | # | 时间 (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, 威胁情报, 开发者工具, 无后门, 网络流量分析, 蜜罐, 证书利用