文章总结: 文章描述CARBONATO僵尸网络利用未认证的Docker守护进程端口入侵主机,通过特权容器挂载宿主机根目录获取控制权,建立持久化机制并自动扩散。建议检查2375端口暴露面、容器配置和宿主机启动钩子,确认被接管后应保留证据、隔离设备并重建主机。 综合评分: 85 文章分类: 恶意软件,渗透测试,红队,内网渗透,应急响应
服务器的Docker端口没设密码,整台主机被人接管
原创
tcode tcode
字节脉搏实验室
2026年9月29日 11:10 北京
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
先看这份被动收集出来的证据
2026年9月22日,一家安全厂商公布了一个名为CARBONATO的僵尸网络分析。他们找到入口的方式不是等受害者报案,而是在扫描互联网时先撞上一个没有认证的容器镜像仓库,这个仓库从2026年5月起就允许匿名访问。研究人员只用只读请求采集了一天,就取回59个仓库、234个镜像标签、605个通过校验的镜像层、约4.3吉字节数据和约94.5万个索引文件,镜像时间戳从2024年10月一直跨到2026年8月。
这些镜像里装着两条产线:一条是把加密货币钱包伪装成正常软件的钓鱼程序,另一条就是本文要讲的僵尸网络。对运维读者来说,这份材料真正有用的地方不是攻击者是谁,而是它把从端口暴露到整台主机被接管之间的每一步都留下了配置记录,可以逐条比对。
一条未认证的接口请求,为什么等于交出主机
这个僵尸网络挑选的目标非常单一:接受未认证连接的容器守护进程,默认监听端口是2375。一旦扫到,它不需要猜密码,直接调用接口创建一个特权容器,把宿主机根目录挂进容器,并让容器进入宿主机的进程和网络命名空间。
整条链路靠三项配置撑起来。第一项是特权标记,容器因此拿到接近完整的能力;第二项是把宿主机根目录挂载进容器;第三项是让容器与宿主机共用进程和网络命名空间。配置到位之后,它在容器里执行一段切换命名空间的命令,命令最终落在宿主机上。
这里有一个值得记住的判断口径:主机是否被接管,不看容器叫什么名字,而看容器配置里这三项是否同时成立。名字可疑但配置没成立,还不能判定主机已经交出去。
端口暴露往往不是被攻破的结果,而是一次次图方便放开的后果。最常见的改法有两种:为了让另一台机器上的构建任务直接连过来,把守护进程的监听地址从本地套接字改成对所有网卡开放;为了让脚本少写一步认证,干脆不做访问控制。这类改动在内网里很少遇到反对意见,因为只有内网能访问听起来足够安全。但攻击者并不需要这台机器有公网地址,只要内网里已经有一台主机被拿下,就可以从内部扫到它。所以判断的依据不是内网还是公网,而是这个守护进程端口有没有对不受信任的来源开放过,并且开放了多久。
主机是怎么被留住的
拿到命令执行权之后,脚本做的第一件事是建立一条从受害者到哥斯达黎加中继的反向安全外壳隧道。隧道远端端口由受害者地址算出,攻击者随时可以重新连上。脚本还会在主机上安装远程登录服务、写入自己的公钥,并通过即时通讯应用汇报容器编号、主机名、地址和国家。
为了让主机扛得住清理和重启,它同时铺开四类持久化:定时任务、系统定时器、传统启动脚本和另一套发行版的启动脚本,并把相关文件标记成不可修改的属性。再配一对守护脚本互相监视,一旦植入物被删除,就从那个镜像仓库重新拉取。这解释了一个常见误判:把一个可疑容器删掉并不等于事件结束,恢复的钩子留在宿主机上。
伪装与自动扩散
植入物的伪装相当具体:容器名借用了系统解析服务的名字,启动后显示伪造的版本横幅,进程参数模仿内核线程。宿主机上还留下两个可核对的落点:一个藏在系统命令目录里的网络监视脚本,一个伪装成系统登录服务的挖矿进程。这些都可以直接在资产和进程清单里比对,不必依赖特征库。
扩散是自动的。每台被感染的主机每五分钟枚举自己和容器网桥所属的网段,逐个探测该网段内的目标端口,发现新的守护进程就重复整套部署。一个内网里只要有多台机器开着这个端口,感染数量就会在无人值守的情况下继续增长。
这里要留一个反例:主机上出现同名的系统解析服务容器,并不等于已经被入侵,很多发行版本来就运行着类似组件。反过来,排查时没有看到可疑容器,也不等于事件没有发生过,因为容器可能已经被清理,只剩下宿主机上的启动钩子和守护脚本。判断依据要落在配置项和文件属性上,而不是容器的名字或数量上。
如果主机已经被植入,网络日志里通常能看到两类痕迹:一是持续的出站连接指向境外地址并使用高位端口,二是每隔五分钟出现的固定间隔扫描行为。这两类痕迹都不依赖特征库,靠连接频率和目标的准时性就能识别出来。
还有一个容易被忽略的细节:植入物把大模型服务商的接口密钥排在远程登录凭据、访问令牌和数据库之前,作为收集的最高优先级,并点名了十几家服务商。对正在接入大模型接口的团队来说,密钥存放在哪里、多久轮换一次,已经从开发环境的小事变成资产管理的一部分。
十分钟里的三项检查
第一项,先确认暴露面。从外部网络确认2375端口是否可达,同时检查容器守护进程是否把监听地址改成了对所有网卡开放。适用条件很直接:只要这台主机有公网地址,就先按已暴露处理,再谈其他。
第二项,查配置而不是查名字。列出全部容器后逐个读取配置,重点看是否开启特权、是否挂载了宿主机根目录、是否共用进程和网络命名空间。任何一个把宿主机交出去的容器,都要查清它是谁创建的、镜像从哪里来。检测线索是容器创建时间与镜像拉取时间是否集中在某几个时间点。
第三项,查宿主机上的启动钩子。依次核对定时任务、系统定时器、传统启动脚本和另一套发行版的启动脚本,看有没有新增条目指向不认识的程序;再检查是否存在不可修改属性被加在普通人不会锁的文件上。这一项的检测线索是文件属性和修改时间,而不是文件内容像不像恶意程序。
这道题怎么算查完
查完不是删掉容器就结束,而是能回答三个问题:这台主机的容器端口是否曾经对不可信网络可达;主机上是否出现过把根目录和命名空间交出去的特权容器;宿主机层面是否留下了重启后能重新拉取的持久化钩子。三个问题都有记录,才算闭环。
如果确认被接管,处置顺序建议是:先保留现场与镜像证据,再隔离设备;随后轮换主机上的远程登录密钥、本地账号口令,以及所有可能与这台主机共享过的接口密钥;最后选择重建而不是修补,并把容器守护进程改成只监听本地套接字,需要远程管理时走带认证的通道。
证据边界
本文事实来自2026年9月22日发布的厂商分析报告,以及9月28日一家安全媒体的报道。报告描述的攻击链、文件路径和伪装进程都属于该厂商的取证结论;攻击者归属指向哥斯达黎加的判断建立在语言习惯、时区、电话号码和网络归属四类间接信号之上,属于厂商评估,不是司法认定。公开材料中没有中国境内受害者的证据,因此本文不描述国内受害情况。具体命令、地址和哈希以原始报告为准,本文只保留可核对的结构性事实。
来源
-
ThreatDown CARBONATO 僵尸网络分析报告;发布时间:2026-09-22;时区:页面未列时刻与时区;按页面标注日期记录;https://www.threatdown.com/blog/carbonato/;一手厂商取证报告:镜像仓库采集数量、攻击链、持久化、伪装落点、扩散行为与归属评估均出自本文。
-
Docker 官方 dockerd 参考文档;发布时间:动态文档未显示首发时间;2026-09-29 实读;时区:核验采取 UTC+8;https://docs.docker.com/reference/cli/dockerd/;明确 2375 为未加密通信惯用端口,并说明开放到 0.0.0.0 可能让他人取得宿主机 root 权限。
-
Docker 官方 Protect the Docker daemon socket;发布时间:动态文档未显示首发时间;2026-09-29 实读;时区:核验采取 UTC+8;https://docs.docker.com/engine/security/protect-access/;加固与认证通道的官方依据。
-
The Hacker News 对 CARBONATO 的报道;发布时间:2026-09-28;时区:站点未列时区;按页面标注日期记录;https://thehackernews.com/2026/09/carbonato-botnet-compromises-docker.html;二手报道,用于交叉核对时间线,不作为唯一依据。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:字节脉搏实验室 tcode tcode《服务器的Docker端口没设密码,整台主机被人接管》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论