一个针对超市制冷控制器的蜜罐。

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 看起来可疑。一些扫描器会将托管在云上的工业设备标记为可能的蜜罐。

来源

相关工作

eppser/danfoss-ak-sm-decoy是另一个 AK-SM 诱饵,带有 SNMP 和 Service Tool 监听器以及更丰富的模拟存储。coldframe 专注于匹配真实设备的 Web 指纹、检测特定漏洞利用,并支持 Dixell XWEB。

许可证

MIT。参见LICENSE。