一个针对超市制冷控制器的蜜罐。
2026 年,攻击者利用默认密码和未打补丁的旧固件,入侵了欧洲各地面向互联网的制冷监控主机,然后强制触发除霜循环。coldframe 会伪装成其中一台控制器。它记录谁连接进来、尝试了哪些密码、使用了哪些公开漏洞利用,并且从不给他们任何真实的东西。
它是一个 Python 文件,除标准库外没有任何依赖。
角色
| 角色 | 伪装成 | 提供的内容 |
|---|---|---|
danfoss |
Danfoss AK-SM 800A 系统管理器 | StoreView 登录页、一个假的门店仪表盘、位于以下地址的 XML API/html/xml.cgi以及/xml.cgi,HTTP 和 HTTPS |
dixell |
Copeland/Dixell XWEB EVO 监控主机 | 登录页,以及公开漏洞利用所针对的 XWEB 500 CGI 路径 |
看起来像真实设备
Danfoss 角色复制了互联网扫描器对真实 AK-SM 800A 设备记录到的特征:nginx服务器响应头及其顺序、Danfoss StoreView页面标题、仅支持 TLS 1.2,以及一张有效期为 1 年、用于CN=DanfossSM800A的证书,由SelfSigned-DanfossSM800A机构签发。每次构建都会生成自己的密钥。
弱登录(例如Supervisor/12345)以及正确的 CVE-2025-41450“当日代码”会成功。攻击者会获得一个会话令牌,以及一个带有除霜按钮的假冷藏柜仪表盘。他们采取的每一个操作都会记录为一条control事件;没有任何内容是真实的。
Dixell 角色以同样的方式模仿真实的 XWEB EVO 设备:没有Server响应头、它们的安全响应头集合及顺序、相同的资源路径和页面大小。其登录使用真实的/cgi-bin/login.lua流程:文档中记录的出厂登录Admin/Admin会成功,五分钟内五次失败会锁定用户,而对 XWEB Proauth_mode绕过(CVE-2026-25085)的尝试会被标记。
两家厂商的真实设备都会提供各自的 favicon,扫描器通过其哈希来匹配设备。该图标是厂商的美术作品,因此不在本仓库中。对于私有部署,你可以将FAVICON_FILE指向一份你有权使用的副本。
Danfoss 起始页也是如此。真实设备会从固件提供一个简短的 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:AK-SM 800A 路径遍历,通过
get_file - CVE-2023-25915:AK-SM 800A 命令注入,通过
load_cert - CVE-2025-41452:AK-SM 800A nginx 头覆盖,通过
load_nginx_headers - CVE-2025-41450:AK-SM 800A “当日代码”登录绕过(
getauth配合eds_only或quantum_only),并记录攻击者是否计算出了正确的代码 - SM800 当日代码绕过:
eds_only/quantum_only作用于其他命令 - CVE-2021-45420:XWEB 500 上传和命令路径位于
/cgi-bin/ - CVE-2026-25085:XWEB Pro 登录绕过,通过一个意外的
auth_mode
快速开始
PERSONA=danfoss HTTP_PORT=8080 python3 -I honeypot.py
打开http://localhost:8080,每个请求都会以 JSON 行的形式显示在 stdout 和events.jsonl中。
运行测试(它们会在回环地址上启动蜜罐并攻击它):
python3 -I test_honeypot.py
部署
最快的方式:粘贴到“User data”
创建一个 Ubuntu 24.04 服务器(一个 $4 的 DigitalOcean droplet 就足够了)并将cloud-init.yaml粘贴到User data框中。将PERSONA=danfoss改为dixell如果你想要 XWEB 人格。启动后大约两分钟,诱饵就会监听 80 端口(Danfoss 还会监听 443),并按如下方式加固。
然后,在你的提供商的防火墙中,仅允许来自任何地方的诱饵端口,以及来自你自己地址的 SSH。使用以下命令读取日志:
ssh root@<server> 'podman logs coldframe'
手动方式
构建容器。每次构建都会生成一个新的自签名证书,因此两次部署永远不会共享同一个。
podman build -t coldframe 。使用以下命令运行它rootfulpodman 或 Docker。Rootless 端口转发会重写源地址,这会使每个攻击者看起来都像是同一个内部 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 握手(通常是扫描器用明文 HTTP 访问 443 端口) |
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会中和来自攻击者输入的终端转义码。 - 容器以非 root 用户在其自己的用户命名空间中运行,文件系统为只读且无任何能力。
- 日志字段受攻击者控制。查看或处理它们时,请将其视为不可信内容。
局限性
- 交互较浅。已登录的攻击者只能看到一个小型仪表盘和少量 XML 命令,而非完整的 StoreView 应用。
- 公开代码可被指纹识别。任何人都可以阅读此仓库并识别出其确切的响应。请为你的部署更改 persona 字符串、页面布局和证书主题。
- 细节未经确认。静态路径、完整 Web 应用以及真实设备的某些 XML 响应结构并未公开。在缺失之处,coldframe 使用了看似合理的值。
- 云 IP 看起来可疑。一些扫描器会将托管在云上的工业设备标记为可能的蜜罐。
来源
- Danfoss AK-SM 800A 用户指南(端口表、登录界面、StoreView Web):https://assets.danfoss.com/documents/latest/590332/BC337629891709en-001101.pdf
- Danfoss 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,Danfoss 控制器研究(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 记录的暴露设备(header set、title、certificate 字段),2026 年 11 月
相关工作
eppser/danfoss-ak-sm-decoy是另一个 AK-SM 诱饵,带有 SNMP 和 Service Tool 监听器以及更丰富的模拟存储。coldframe 专注于匹配真实设备的 Web 指纹、检测特定漏洞利用,并支持 Dixell XWEB。
许可证
MIT。参见LICENSE。