超市冷柜蜜罐Coldframe
Show HN: Coldframe, a honeypot that poses as a supermarket fridge controller
超市制冷控制器蜜罐
2026年,攻击者利用默认密码和过时未打补丁的固件,攻入了欧洲各地的互联网连接制冷监管器,然后强制执行除霜周期。coldframe伪装成其中一个控制器。它记录了谁连接,他们尝试了什么密码以及使用了哪些公共漏洞利用程序,并且它永远不会给他们任何真实的东西
它是一个Python文件,除了标准库之外没有其他依赖项
角色
| 角色 | 伪装成 | 用途 |
|---|---|---|
danfoss |
丹佛斯AK-SM 800A系统管理器 | StoreView登录,一个假的商店仪表板,/html/xml.cgi和/xml.cgi的XML API,HTTP和HTTPS |
dixell |
科帕兰/迪塞尔XWEB EVO监管器 | 登录页面和公共漏洞利用程序针对的XWEB 500 CGI路径 |
看起来像真正的设备
丹佛斯角色复制了互联网扫描器对真实AK-SM 800A设备记录的内容:nginx服务器头和头顺序,Danfoss StoreView页面标题,仅TLS 1.2,以及由SelfSigned-DanfossSM800A机构为CN=DanfossSM800A签发的1年证书。每次构建都会生成自己的密钥
弱登录(例如Supervisor / 12345)和正确的CVE-2025-41450 "每日代码" 成功。攻击者获得会话令牌和一个带有除霜按钮的假冷藏柜仪表板。他们采取的每个操作都被记录为control事件;没有什么是真实的
迪塞尔角色以同样的方式遵循真实的XWEB EVO设备:没有Server头,他们的安全头设置和顺序,相同的资产路径和页面大小。它的登录使用真实的/cgi-bin/login.lua流程:文档中提到的工厂登录Admin / Admin成功,五分钟内失败五次锁定用户,尝试XWEB Proauth_mode绕过(CVE-2026-25085)被标记
两个供应商的真实设备都提供自己的favicon,扫描器通过它的哈希值匹配设备。该图标是供应商的艺术品,因此它不在这个存储库中。对于私有部署,你可以将FAVICON_FILE指向你有权使用的副本
丹佛斯启动页面也是如此。真实设备从固件中提供一个小Angular加载器页面,数千个设备共享其确切的哈希值。将INDEX_FILE指向index.html(来自公共固件包),诱饵按字节逐字节地提供它,其日期在Last-Modified和ETag中保持原样。加载器的main.*.js然后显示诱饵自己的登录页面,布局与固件的远程登录类似。如果固件的assets/images/Danfoss-logo.png位于index.html旁边,页面将使用它
两个角色还可以运行可选的Modbus TCP服务,提供假的冷藏柜温度、设定点和除霜寄存器。真实的AK-SM 800A设备仅使用Modbus与其自己的冷藏柜控制器通信,因此Modbus默认关闭。打开它以捕获通用工业扫描器
它识别的漏洞
匹配公共漏洞的请求在日志中获得exploit字段:
- CVE-2023-25914:通过
get_file的AK-SM 800A路径遍历 - CVE-2023-25915:通过
load_cert的AK-SM 800A命令注入 - CVE-2025-41452:通过
load_nginx_headers的AK-SM 800A nginx头覆盖 - CVE-2025-41450:AK-SM 800A "每日代码"登录绕过(
getauth与eds_only或quantum_only一起使用),注明攻击者是否计算了正确的代码 - SM800代码绕过:
eds_only/quantum_only在其他命令上 - CVE-2021-45420:
/cgi-bin/下的XWEB 500上传和命令路径 - CVE-2026-25085:通过意外的
auth_mode的XWEB Pro登录绕过
快速入门
PERSONA=danfoss HTTP_PORT=8080 python3 -I honeypot.py
打开 http://localhost:8080,每个请求都会作为JSON行显示在stdout和events.jsonl中
运行测试(它们在回环上启动蜜罐并攻击它):
python3 -I test_honeypot.py
部署
最快:粘贴到 "用户数据"
创建一个 Ubuntu 24.04 服务器(一个 $4 的 DigitalOcean 云实例就足够了),并将 cloud-init.yaml 粘贴到 用户数据 框中。如果你想要 XWEB 人设,将 PERSONA=danfoss 更改为 dixell。启动大约两分钟后,诱饵将在端口 80(Danfoss 使用端口 443)上监听,并根据如下方式加固。
然后,在你的提供商的防火墙中,仅允许诱饵的端口从任何地方访问,并允许从你自己的地址进行 SSH 连接。使用以下方式读取日志:
ssh root@<server> 'podman logs coldframe'
手动
构建容器。每次构建都会生成一个新的自签名证书,因此两次部署不会共享同一个证书。
podman build -t coldframe .使用 rootful podman 或 Docker 运行它。无根端口转发会重写源地址,这使得每个攻击者看起来都像同一个内部 IP。
--userns=auto 将容器映射到未使用的宿主机 UID 范围,因此即使容器用户在宿主机上也是 nobody。Podman 需要对每个宿主机分配一个范围,一次一个:
echo "containers:2147483647:2147483648" | sudo tee -a /etc/subuid /etc/subgid
sudo podman run -d --name coldframe --restart=always \ --read-only --cap-drop=ALL --security-opt no-new-privileges --userns=auto \ --memory 128m --pids-limit 512 --log-opt max-size=10m \ -p 80:8080 -p 443:8443 \ -v coldframe-logs:/logs:U \ -e PERSONA=danfoss \ coldframe
对于 Modbus,添加 -e MODBUS_PORT=5020 -p 502:5020。
在宿主机上,仅暴露人设真正会有的端口,并阻止除 DNS 和软件更新之外的所有出站流量:诱饵永远不需要连接外部。仅从你自己的地址保持 SSH 可达:一个 SSH 对全世界开放的冰箱控制器看起来是不正常的。
配置
| 变量 | 默认值 | 含义 |
|---|---|---|
PERSONA |
danfoss |
danfoss 或 dixell |
HTTP_PORT |
8080 |
HTTP 监听器 |
HTTPS_PORT |
0 (关闭) |
HTTPS 监听器,需要 CERT_FILE 和 KEY_FILE |
MODBUS_PORT |
0 (关闭) |
Modbus TCP 监听器 |
LOG_PATH |
events.jsonl |
事件追加位置 |
FAVICON_FILE |
无 | 可选的用于提供 favicon(仅限私有部署) |
INDEX_FILE |
无 | 可选的 Danfoss 固件 index.html,用作启动页面(仅限私有部署) |
读取日志
每一行是一个事件:
{"ts": "2026-11-05T10:57:21.158+00:00", "persona": "danfoss", "proto": "http",
"src_ip": "203.0.113.7", "src_port": 6782, "event": "login_attempt",
"username": "admin", "password": "admin"}event |
时间 |
|---|---|
request |
任何 HTTP(S) 请求,包括方法、路径、Host、User-Agent、Authorization 和正文 |
login_attempt |
通过登录页面或 XML API 提交的凭证,包括 granted |
control |
来自已登录会话的操作,例如启动解冻 |
xml_cmd |
Danfoss XML API 命令,包括其属性和任何 exploit 匹配 |
tls_error |
失败的 TLS 握手(通常是扫描器对 443 端口讲明文的 HTTP) |
connect, read, write, device_id, unsupported, malformed |
Modbus 活动记录;写入解冻寄存器的操作包含 "defrost": true |
summary.py 将日志转换为简短报告:
python3 -I summary.py --hours 24 --ignore <your-own-ip> < events.jsonl
安全
- 它从不运行命令、读取文件或转发流量。利用载荷会被记录并丢弃。
- 请求正文、记录字段和连接都有上限,包括每个源的上限,以防止一个攻击者挤占其他人。空闲套接字超时,当事件日志过大时,日志会轮转。
- 缓慢传输数据的连接在 30 秒后被切断,拒绝连接会被记录。
- 过长的日志行会被截断,
summary.py会中和攻击者输入中的终端转义码。 - 容器以非根用户身份在其自己的用户命名空间中运行,在只读文件系统中运行,且没有能力。
- 日志字段受攻击者控制。在查看或处理时,将它们视为不可信。
限制
- 浅层交互。 已登录的攻击者只能看到一个小的仪表板和一些 XML 命令,而不是完整的 StoreView 应用。
- 公共代码可以被指纹识别。 任何人都可以读取这个仓库并发现其确切的响应。更改部署的人设字符串、页面布局和证书主题。
- 未经确认的细节。 静态路径、完整 Web 应用和真实设备的一些 XML 响应形状不公开。在这些缺失的地方,coldframe 使用合理的值。
- 云 IP 看起来可疑。 一些扫描器将云托管中的工业设备标记为可能的蜜罐。
来源
- 丹佛斯 AK-SM 800A 用户指南(端口表、登录界面、StoreView Web):https://assets.danfoss.com/documents/latest/590332/BC337629891709en-001101.pdf
- 丹佛斯 AK-SM XML 接口指南:https://assets.danfoss.com/documents/latest/376199/AU342138209420en-000501.pdf
- Synacktiv, AK-SM 800A 漏洞(CVE-2023-25914, CVE-2023-25915):https://www.synacktiv.com/sites/default/files/2023-10/synacktiv-danfoss-sm800a-multiple-vulnerabilities.pdf
- Synacktiv, SM800 认证绕过:https://www.synacktiv.com/sites/default/files/2023-10/synacktiv-danfoss-sm800-sc255-sc355-auth-bypass.pdf
- Claroty Team82, 丹佛斯控制器研究(CVE-2025-41450 至 41452):https://blog.claroty.com/team82/research/freeze-the-controller-defrost-the-food-uncovering-vulnerabilities-in-danfoss-refrigeration-controllers
- Exploit-DB 50639, XWEB 500(CVE-2021-45420):https://www.exploit-db.com/exploits/50639
- Copeland XWEB EVO 操作手册 r5.4.1(默认登录、锁定):https://webapps.copeland.com/Dixell/Content/Pages/Manuals/XWEBEVO/XWEBEVOV5.4.1OPERATION/XWEB-EVO-r5.4.1-OPR-EN.pdf
- CISA ICSA-26-057-10 和 Claroty Team82, XWEB Pro 漏洞:https://claroty.com/team82/research/chilling-discoveries-unpacking-vulnerabilities-in-copeland-xweb-pro-controllers
- Ironhackers, CVE-2025-41450 每日漏洞分析:https://ironhackers.es/en/danfoss-ak-sm-800a-cve-2025-41450/
- Shodan 记录暴露的设备(设置头部、标题、证书字段),2026年11月
相关工作
eppser/danfoss-ak-sm-decoy 是另一个 AK-SM 诱捕器,具有 SNMP 和服务工具监听器以及更丰富的模拟商店。coldframe 专注于匹配真实设备的网络指纹、检测特定漏洞以及 Dixell XWEB 支持.
许可证
MIT。参见 LICENSE.
来源:Hacker News · github.com