跳到正文
Hacker News· hedgerow-dev·· 3 小时前AI 评分38

Show HN:Coldframe——伪装成超市冷柜控制器的蜜罐

Show HN: Coldframe, a honeypot that poses as a supermarket fridge controller

AI 导读

Coldframe 是一个伪装成超市制冷控制器的蜜罐,用单个 Python 文件实现、仅依赖标准库,可模拟 Danfoss AK-SM 800A 与 Copeland/Dixell XWEB EVO 两种设备。

正文 · AI 翻译

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

2026 年,攻击者利用默认密码和未修补的旧固件,入侵了欧洲各地暴露在互联网上的制冷监控器,然后强制触发除霜循环。coldframe 会伪装成这些控制器之一。它记录谁连接、尝试了哪些密码以及使用了哪些公开漏洞利用,并且从不给他们任何真实的东西。

它是一个 Python 文件,除标准库外没有其他依赖。

角色

角色 伪装成 提供的内容
danfoss Danfoss AK-SM 800A 系统管理器 StoreView 登录页、一个伪造的门店仪表盘、位于 /html/xml.cgi 和 /xml.cgi 的 XML API、HTTP 和 HTTPS
dixell Copeland/Dixell XWEB EVO 监控器 登录页以及公开漏洞利用所针对的 XWEB 500 CGI 路径

看起来像真实设备

Danfoss 角色复制了互联网扫描器对真实 AK-SM 800A 设备记录到的特征:nginx 服务器头和头部顺序、Danfoss StoreView 页面标题、仅支持 TLS 1.2,以及由 SelfSigned-DanfossSM800A 机构为 CN=DanfossSM800A 签发的 1 年期证书。每次构建都会生成自己的密钥。

弱登录凭据(例如 Supervisor / 12345)以及正确的 CVE-2025-41450“当日代码”会成功。攻击者会获得一个会话令牌和一个带有除霜按钮的伪造冷藏柜仪表盘。他们的每一个操作都会记录为 control 事件;没有任何真实内容。

Dixell 角色以同样的方式模仿真实的 XWEB EVO 设备:没有 Server 头、采用它们的安全头集合和顺序、相同的资源路径和页面大小。其登录使用真实的 /cgi-bin/login.lua 流程:文档中记载的出厂登录 Admin / Admin 会成功,五分钟内五次失败会锁定用户,而尝试 XWEB Pro auth_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 通过 load_nginx_headers 的 nginx 头覆盖
  • CVE-2025-41450:AK-SM 800A“当日代码”登录绕过(使用 eds_only 或 quantum_only 的 getauth),并记录攻击者是否计算出正确的代码
  • 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

部署

最快的方法:粘贴到“User data”中

创建一台 Ubuntu 24.04 服务器(一台 4 美元的 DigitalOcean droplet 就足够了),然后把 cloud-init.yaml 粘贴到 User data 框中。如果你想要 XWEB 人设,请把 PERSONA=danfoss 改为 dixell。启动约两分钟后,诱饵就会在 80 端口(Danfoss 还会在 443 端口)监听,并按如下方式加固。

然后,在你的服务商防火墙中,只允许来自任何地方的诱饵端口,以及来自你自己地址的 SSH。用以下命令读取日志:

ssh root@<server> 'podman logs coldframe'

手动

构建容器。每次构建都会生成一份新的自签名证书,因此两次部署绝不会共用同一份证书。

podman build -t coldframe .

用 rootful podman 或 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 应用。
  • 公开代码可被指纹识别。 任何人都可以阅读此仓库并识别出其精确响应。请为你的部署更改人设字符串、页面布局和证书主题。
  • 细节未经确认。 真实设备的静态路径、完整 Web 应用和部分 XML 响应结构并未公开。在缺失之处,coldframe 使用了看似合理的值。
  • 云 IP 看起来可疑。 一些扫描器会将云托管上的工业设备标记为可能的蜜罐。

来源

相关工作

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

许可证

MIT。参见 LICENSE。

来源:Hacker News · github.com