当前位置: 首页 > news >正文

一台云主机“被黑”后的 24 小时排查手记

背景

上周,运维群突然炸锅:一台放在某主流公有云上的 Ubuntu 22.04 测试机,在凌晨 3 点 CPU 飙到 100%,流量在 4 分钟内从 2 Mbps 冲到 1.7 Gbps。第一反应是“被挖矿”了,可是这台机器明明只跑了一个内部接口,连公网端口都没开多少。

现象

  1. top 里看不到异常进程,但 CPU 使用率 100%。
  2. iftop 显示对外发包的目的 IP 集中在 45.9..,端口 80/443。
  3. 安全组规则只有 22/443 对外开放,理论上不可能被扫。

排查思路

1. 先看网络
# 抓 30 秒包,只保留 TCP 80/443
timeout 30 tcpdump -i eth0 -nn 'tcp port 80 or 443' -w /tmp/pkts.pcap

把 pcap 拖下来用 Wireshark 一看:全是 HTTP POST /api/report,User-Agent 固定为 Go-http-client/1.1,体部是 64 字节随机字符串。

2. 再看进程

虽然 top 无异常,但用 ps auxf 发现:

root      1234  0.0  0.1 715452  1234 ?        Sl   Aug11   0:00 /usr/sbin/CR0N -f

注意大小写:CR0N 不是 CRON。把二进制抠出来:

cp /proc/1234/exe /tmp/cr0n && file /tmp/cr0n
# ELF 64-bit LSB executable, statically linked, stripped

上 VirusTotal 直接 58/71。

3. 溯源日志

这台机子 3 天前刚做过镜像克隆,怀疑是旧镜像留了后门。把 cloud-init 日志翻出来:

grep -i 'password' /var/log/cloud-init-output.log

结果:

ci-info: +++++Authorized keys from /home/ubuntu/.ssh/authorized_keys+++++
ci-info: ssh-rsa AAAAB3... (略)

密钥没错,但再往上看:

Aug 10 03:12:42 localhost cloud-init[795]: W: GPG error: http://mirrors.cloud.aliyuncs.com jammy InRelease: The following signatures couldn't be verified

原来是镜像源被污染,下载的 nginx-common 包被替换,安装脚本里插了一段 curl | bash,把 CR0N 拉下来装到 /usr/sbin/CR0N 并写了 systemd service。

临时止血

  1. 断网:安全组把出方向 80/443 封掉,CPU 立即降到 5%。
  2. 杀进程 & 删文件:
systemctl stop CR0N && systemctl disable CR0N
rm -f /usr/sbin/CR0N /etc/systemd/system/CR0N.service
  1. 重装 nginx:
apt-get --reinstall install nginx

长期方案

显然,靠“人肉”杀毒太累了,而且业务需要保留 443 端口。干脆上了一套「群联 AI 云防护」——其实就是一个反向代理,把域名解析切过去,再配个 高防 IP

接入步骤
  1. 在控制台把域名 api.example.com 的 A 记录指向群联给的 高防 IP
  2. 源站安全组只放行高防的回源段:
ufw allow from 203.107.0.0/16 to any port 443
  1. 在群联后台打开 “AI 行为识别”“恶意 UA 黑名单”
效果

上线 30 分钟后,后台拦截面板里出现 1.2 万次恶意 POST,全部来自同一个 ASN。CPU 再也没上过 10%。

小结

这台机器被黑,并不是云厂商“故意”,而是镜像仓库的 GPG 签名验证被绕过。攻击者用供应链污染的方式,绕过了所有人的注意力。高防 IP + AI 云防护的组合,相当于给业务多穿了一层“软猬甲”,把攻击流量挡在机房外,源站再也不用半夜爬起来杀进程了。

http://www.dtcms.com/a/327174.html

相关文章:

  • 【力扣 Hot100】刷题日记
  • 《Redis ACL验证流程:从用户认证到权限检查的完整步骤》
  • 【doris基础与进阶】3-Doris安装与部署
  • 模板打印技术——自动识别office类型 打印模板:为政务土地确权定制的替换利器—仙盟创梦IDE
  • Go 语言 里 `var`、`make`、`new`、`:=` 的区别
  • Python 标准库模块shutil
  • 当多模态大语言模型遇上视觉难题!AI视觉探索之旅
  • 基于Hadoop的全国农产品批发价格数据分析与可视化与价格预测研究
  • grpc浅入门
  • jdk升级
  • 【Redis在在线表单提交防重复机制中的应用策略】
  • 【开发环境下浏览器前后端Cookie跨域问题】
  • 实现文字在块元素中水平/垂直居中详解
  • 深度贴:前端网络基础及进阶(3)
  • Linux 常用命令大全:覆盖日常 99% 操作需求
  • 【SpringBoot】05 容器功能 - SpringBoot底层注解的应用与实战 - @Configuration + @Bean
  • WebAssembly的原理与使用
  • Day24|学习前端CSS
  • 虚拟机高级玩法-网页也能运行虚拟机——WebAssembly
  • GitHub的简单使用方法----(4)
  • Seata深度剖析:微服务分布式事务解决方案
  • 如何应对CAN总线冲突和数据丢包
  • GitHub Browser-Use 的部署失败记录:失败了,失败了。。。。
  • 在 Windows 上升级 Python 到 3.8 的步骤
  • 【微服务过度拆分的问题】
  • IEEE 2025 | 重磅开源!SLAM框架用“法向量+LRU缓存”,将三维重建效率飙升72%!
  • 学习嵌入式的第十七天——Linux编程——shell编程
  • 【图像算法 - 13】基于 YOLO12 与 OpenCV 的实时目标点击跟踪系统(系统介绍 + 源码详细)
  • centos 怎么部署 vscode 网页版
  • 如何提升需求分析能力