● Incident Response · Linux 取证实战

AWS EC2 沦陷全记录
从 root 弱口令到 Kinsing + 木马 sshd 双重持久化

一台公网上的 AWS EC2,被 root 弱口令一次命中,七天内长成两个恶意家族的据点:一边替 Kinsing 僵尸网络向全球扫 SSH,一边挖 Monero,还额外挂了个 30 MB 的木马 sshd 当后门。本文复盘完整入侵时间线、五份样本的静态解剖、IOC 汇总,以及为什么这种情况下必须重建而不是清理。

主机 ip-172-26-3-xx 首次入侵 2026-10-02 08:40 UTC 二次植入 2026-10-08 归属 Kinsing + XMRig 风险 严重
3
活跃恶意进程
合计 272% CPU / 21% 内存
22
恶意文件
集中在 3 个目录
2766–2987
出站 SYN_SENT 连接
向全球随机 IP 扫 SSH
2
持久化入口
crontab ×2 + 后门密钥
0
云控制面日志
本次响应未取得
⚠ 先说清楚一件事

这次取证是在一台还在跑的机器上做的——root 已经不是我们的了。这意味着 ps、ss、cat 出来的任何东西,理论上都可能被改过。而云侧的 CloudTrail、VPC Flow Logs、EBS 快照,这次一份都没拿到。

所以下文我会反复说"观察到""高度可信",而不是"确认"。这不是保守,是这台机器的真实处境。

1. 执行摘要

一台公开暴露 SSH 的 AWS EC2 实例被完全攻陷,植入了两个独立恶意软件家族,沦为 SSH 爆破僵尸节点与加密货币挖矿宿主。

项目详情
入侵入口root 密码为极弱口令,被僵尸网络字典爆破一轮命中
首次入侵2026-10-02 08:40 UTC — Kinsing 家族落地(ext4 birth timestamp)
二次植入2026-10-08 20:21 UTC — 木马 sshd 后门(监听 1919)
恶意进程3 个活跃,合计 272% CPU、21% 内存
恶意文件22 个,分布在 3 个目录
持久化crontab ×2、iptables 规则注入、后门 SSH 公钥、sshd_config 篡改
外连行为2766–2987 条 SYN_SENT 指向全球随机 IP 的 SSH 端口
已成功入侵25+ 条 ESTABLISHED 连接(目标端口多为 2222/2223/2022)
防护缺失未安装 fail2ban;root 密码强度不足,可被常见字典秒破
风险等级:严重

主机正在主动攻击全球服务器,存在 AWS 账号因滥用被封的风险,也可能需要向云厂商报备以避免被受害方归责为攻击源。凭据已完全泄露、系统完整性无法证明——结论是重建优先于清理。

2. 服务器画像

项目值
主机名ip-172-26-3-xx(AWS 默认命名)
内网 IP172.26.3.xx(私有地址)
云平台AWS EC2
操作系统Ubuntu 24.04 LTS
内核7.0.0-1012-aws (x86_64)
OpenSSHOpenSSH_9.6p1(系统 sshd 未被木马化)
内存909 MB(无 Swap)
磁盘38 GB(已用 5.1 GB)
启动时间2026-09-24 18:07 UTC,取证时已运行 14 天 16 小时
负载9.22 / 8.99 / 9.13 —— 2 核严重过载

用户账户

用户UIDShell状态
root0/bin/bash已被攻击者控制
ubuntu1000/bin/bash未发现异常
liangjiang——攻击者创建的账号

登录历史

时间用户来源 IP判定
Oct 9 10:21root18.225.117.x本次响应连接
Oct 8 14:08ubuntu18.225.98.x正常(AWS SSM)
Sep 24 18:07root35.221.217.x初始部署

SSH 日志里还有多条 root 成功认证的记录,但没有云端身份数据能证明这些访问是不是授权的。这是缺云控制面日志的直接后果,也是下文不少结论只能停在"疑似"的原因。

3. 入侵时间线

2026-09-24 18:07 UTC
服务器启动,初始部署
来源 IP 35.221.217.x,root 登录。此后 7 天为"正常期"——但很可能已经是爆破窗口。
2026-10-02 08:40:09 UTC
◀ 入侵点 1:Kinsing 家族落地
  • /usr/.work/ 目录创建(ext4 birth timestamp 精确到秒)
  • work32 启动(PID 77737,SSH 爆破扫描器)
  • xmr / /tmp/xmr 启动(PID 77879,XMRig 挖矿)
  • crontab 双重持久化写入(root crontab + /etc/crontab)
  • 注入攻击者 RSA 公钥至 /root/.ssh/authorized_keys
  • 篡改 sshd_config:PermitRootLogin yes + PasswordAuthentication yes
  • iptables -F 清空防火墙
2026-10-02 → 10-08
恶意运行 6 天:持续扫描全球 + 挖矿
work32 累计 CPU 时间达 18764 分钟(约 13 天核时),对外发起数千条 SSH 爆破连接;矿工连接 xmr.crypto-pool.fr:6666。
2026-10-08 20:21 UTC
◀ 入侵点 2:木马 sshd 后门植入
  • /root/.6400401235605125863/sshd 启动(PID 271789,30 MB)
  • 监听 *:1919 作为后门入口
  • 同时对外发起 SSH 爆破扫描,与 work32 构成分布式爆破网络
2026-10-09 08:46 UTC
恶意文件批量更新(时间戳一致)
多个 /usr/.work/ 文件 mtime 落在同一分钟,疑似攻击者再次上线维护。mtime 为弱证据
2026-10-09 09:41 起
◀ 响应开始:取证完成,清除未完成
已停止观察到的恶意进程、备份并移除两处精确匹配的 cron 行;主机上的恶意二进制、配置与后门密钥均未删除。
一个容易被忽略的信号

攻击者留下的 bash_history 里有 killall -9 multics.x64。multics 是已知挖矿木马的命名风格,这条命令说明在这台机器被 Kinsing 拿下之前,它已经被另一个攻击者入侵过了——新来的先把上一家的马杀掉。三条证据同向印证:后续还有 gdb multicsr100rc20_x64 的调试动作,以及把它复制进 /var/etc/bin 隐藏目录。攻击者没理由对一个合法程序又是杀又是 gdb 调试。

换句话说:这台机器的密码问题,不止被一个人发现。

4. 根因分析:为什么爆破必然成功

4.1 根本原因

root 用的密码弱到什么程度?低到任何一份常见字典,第一轮就能把它翻出来。看个对照:

密码类型熵 (bit)字典排名破解时间
6 位以内纯数字≈20前 10< 0.1 秒
password(常见词)≈30前 5< 0.1 秒
常见词 + 数字后缀≈40前 1000< 1 分钟
12 位随机字符串≈78不在字典数百年
16 位随机字符串≈100不在字典不可破解

结论很清楚:只要密码落在字典里,破解时间就与"试多少次"无关,而与"它在列表第几行"有关。

4.2 一个常见疑问:试这么少次,为何没触发封锁?

这个疑问很自然,但它预设了两个不成立的前提。三个关键原因:

原因 1 — 爆破不是逐字符尝试

SSH 密码认证是整串提交的:攻击者每次发送一个完整密码字符串,服务端要么接受要么拒绝,不存在"先试出第一位、再试第二位"这种逐字符推进。攻击者用的是密码字典——一份按出现频率排序的常见弱口令列表。任何像样的字典,前几千条就覆盖了绝大多数人真正在用的密码,弱口令基本在第一轮就命中。

原因 2 — 服务器根本没装 fail2ban
dpkg -l | grep fail2ban  →  (未安装)

Ubuntu 默认不安装 fail2ban。而服务器上唯一的"防爆破"脚本 /usr/.work/auth.sh 是恶意软件自带的——它封禁的是竞争对手的扫描器,不是保护这台服务器(详见 5.6)。

原因 3 — 攻击来自分布式僵尸网络

Kinsing 是僵尸网络,全球数千台已沦陷机器同时扫描。攻击模式是这样的:

机器A (俄罗斯)  →  你的服务器  试 "root"      失败
机器B (越南)    →  你的服务器  试 "123456"    失败
机器C (巴西)    →  你的服务器  试 "…"         ✅ 命中!

每台机器只试 1~2 个密码就换下一个目标。从你服务器的视角看,每个来源 IP 只出现 1~2 次失败,永远达不到"同一 IP 失败 5 次"的封锁阈值。这意味着:即使当时装了 fail2ban,也挡不住这种分布式低速爆破——真正致命的还是那条密码本身。

4.3 入侵链路重建

  1. 攻击者此前已入侵数千台服务器,组成僵尸网络
  2. 某台僵尸机器扫到本机 22 端口,字典命中弱口令
    一次即中,直接拿到 root shell
  3. 执行 passwd root 改成自己知道的密码
    顺带给自建账号 liangjiang 设了密码
  4. 注入后门 SSH 公钥(root@u911 的 RSA key)
  5. 部署 work32 扫描器 + xmr 挖矿 + kworkers + linux_server64
  6. 写入 crontab 双重持久化,清空 iptables
  7. 注入 iptables 规则放行 C2 端口 8015
  8. 6 天后二次植入木马 sshd 后门(端口 1919)
    加固后门,防止被清理

5. 威胁一:Kinsing 家族恶意软件

威胁 1SSH 爆破扫描器 + XMRig 挖矿严重 · 活跃中归属置信度:中高

5.1 恶意进程

PID命令行CPU%MEM%启动累计 CPU
77737/usr/.work/work32 -deamon root <pw>184%2.9%Oct 218764 分钟
77879/tmp/xmr0.1%0.4%Oct 211 分钟

注意 work32 的命令行里直接带着 root 密码明文——这也是凭据必须整体轮换的理由之一。

5.2 文件类型分析

文件类型大小特征
work32ELF 32-bit, 803864.18 MB静态链接,无 section header
work64ELF 64-bit, x86-644.45 MB静态链接,无 section header
xmrELF 32-bit, 803861.21 MB静态链接,无 section header
kworkersELF 64-bit, x86-643.52 MB静态链接,无 section header
linux_server64ELF 64-bit, x86-64718 KB动态链接,stripped

静态链接 + 无 section header 是恶意软件的典型特征:前者避免依赖目标机器的 libc,后者让 objdump/readelf 这类工具失效,增加逆向难度。

5.3 工具箱目录 /usr/.work/ 完整清单

文件大小用途 / 定性
work324.18 MB32 位 SSH 爆破扫描器(主进程)恶意
work644.45 MB64 位 SSH 爆破扫描器恶意
xmr1.21 MBXMRig 挖矿程序恶意
kworkers3.52 MBKinsing 组件(伪装内核工作线程)恶意
linux_server64718 KBKinsing C2 通信组件恶意
config.json1.69 KBXMRig 挖矿配置恶意
ks-script-JLpxkR836 BSELinux restorecon 脚本(反取证)恶意
auth.sh419 BSSH 爆破 IP 封禁(贼喊捉贼)意图待定
secure.sh417 B同上,CentOS/RHEL 路径变体意图待定
heartalive.lock0 B保活锁文件
.bash_history1.09 KB攻击者操作记录弱证据
.bashrc570 B攻击者 bash 配置弱证据
index.html46 B伪装文件
alert_descs.csv126 KB伪装安全数据
alert_descs.xlsx1.40 MB伪装安全数据
*.ipynb(4 个)≈1.3 MB伪装 Jupyter Notebook
hole_descs.csv13.3 KB伪装安全数据
tmp.f9F5g2gAHz163 KB临时文件
yum.log0 B伪装日志
09cd09f0…bebf0 B哈希命名空文件
31714944_172.18…pkl1.65 KBPickle 序列化文件

攻击者往工具箱里塞了大量 Notebook / CSV / XLSX,伪装成一个"数据分析项目"。运维第一眼看到 /usr/.work/ 时,注意力会被这些看起来人畜无害的大文件吸走——这是低成本但有效的注意力稀释。

5.4 XMRig 挖矿配置

配置项值
矿池xmr.crypto-pool.fr:6666
钱包47BD6QNfkWf8ZMQSdqp2tY1AdG8ofsEPf4mcDp1YB4AX32hUjoLjuDaNrYzXk7cQcoPBzAuQrmQTgNgpo6XPqSBLCnfsjaV
算法RandomX (Monero/XMR)
TLS未启用(明文通信)
捐赠等级0(关闭开发者捐赠,典型滥用特征)
CPU 挖矿启用,使用 huge-pages
后台模式启用

/tmp/xmr 与 /usr/.work/xmr 为同一文件的两个副本(MD5 均为 20552242cd4b5e8fa6071951e9f4bf6d),一份在隐藏目录、一份在 /tmp,互为冗余保活——杀掉一个,另一个还在。后续观察中该进程 PID 发生过变化(77879 → 38387),说明它被反复拉起过,光杀进程无法止损。

5.5 攻击者操作记录(bash_history)

#操作解读
1passwd root改 root 密码,独占控制权
2passwd liangjiang给自己建的账号设密码——留一条不依赖 root 的后门入口
3nano sshd_config开启 root 密码登录
4ulimit -n提高文件描述符上限,为大规模并发扫描做准备
5killall -9 multics.x64 ×多次杀掉上一任攻击者的恶意软件(换马)
6iptables -F ×9~17清空防火墙规则
7apt install gdb安装调试器
8gdb multicsr100rc20_x64调试另一个恶意软件(multics 系列)
9cp multicsr100rc20_x64 /var/etc/bin部署到隐藏目录
10./work64启动 64 位扫描器

5.6 auth.sh / secure.sh — 贼喊捉贼

两份脚本内容一致(仅日志路径不同:/var/log/auth.log vs /var/log/secure,后者是 CentOS/RHEL 路径,说明攻击者做了跨发行版部署)。逻辑是:统计 SSH 失败登录来源,超过 LIMIT=8 次就写进 /etc/hosts.deny,循环间隔 sleep 60。

单看脚本,它像一个正经的防爆破工具。但结合上下文就变了味——恶意软件自己就是这台机器上最大的 SSH 爆破源,这个脚本真正的作用是封禁竞争对手的扫描器,保护自己的"领地"。

取证时 /etc/hosts.deny 为空(默认状态),说明它可能并未真正运行过。是否执行、是否有副作用均未确认

5.7 ks-script-JLpxkR — Kinsing 的反取证指纹

这是 Kinsing 家族的标志性文件:执行 restorecon 恢复 SELinux 安全标签,用来清除入侵痕迹。文件名里的 "ks" 即 Kinsing。在 Ubuntu 上它其实没有实际效果(Ubuntu 用 AppArmor 而非 SELinux),但保留它说明攻击者的工具包是跨发行版通用的。

连同 kworkers、linux_server64、heartalive.lock 一起,这几个文件名构成了归属判断的文件侧线索;行为侧的旁证是 /usr/.work 隐藏目录、双 crontab 持久化,以及"杀掉上一任木马"的换马动作。两条独立线索同向,因此家族归属置信度判为中高——但仍缺可信威胁情报库与离线样本的最终确认。

6. 威胁二:木马 sshd 后门

威胁 230 MB 的木马 sshd,监听 1919严重 · 活跃中
PID
271789
路径
/root/.6400401235605125863/sshd
工作目录
/root
CPU / 内存
88.2% / 17.7%(RSS 165 MB,VSZ 1.83 GB)
启动时间
Oct 8 20:21 UTC(sshd 文件 mtime 20:22,互相印证)
累计 CPU
747 分钟
文件大小
30,304,472 bytes(30 MB)
文件类型
ELF 64-bit, x86-64, dynamically linked, stripped

正常系统 sshd 约 1 MB,这个 30 MB——一个重度修改的木马版本,很可能内嵌了扫描器和代理功能。

隐藏目录

/root/.6400401235605125863/
  └── sshd  (30 MB, rwxr-xr-x, Oct 8 20:22)

目录名是一串 19 位纯数字,混在 /root 下极不显眼。

后门入口

监听 *:1919,绑定所有接口。攻击者可直接通过后门密码或密钥登录,完全绕开系统 sshd 的任何认证策略改动——就算你把系统 sshd 改成只允许密钥登录,这个后门照样能用。

木马 sshd 不只是被动监听,它同时对外发起大量 SSH 爆破连接(SYN_SENT 到全球随机 IP 的 :22/:2222),与 work32 共同构成分布式 SSH 爆破网络。

清除时务必区分两个 sshd

系统 sshd 是 PID 271825 / 端口 22 / OpenSSH_9.6p1,木马 sshd 是 PID 271789 / 端口 1919。只杀后者,别把系统 sshd 干掉——否则你会把自己锁在门外,在只有 SSH 通道的云主机上这尤其致命。

7. 威胁三:后门 SSH 公钥

威胁 3authorized_keys 里的陌生 RSA 密钥严重 · 存在

/root/.ssh/authorized_keys 中被注入了一把来源标识为 root@u911 的 RSA 公钥:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDc3BlbiQaznPT8TScrs9YIzmrpI9Lpa4LtCjB5z0LuQ4o6XwvzomxAixn2F1jaUl175Cxcg3PmUsPOLE+WeWicKqL2YZ46SotjZgnS6JjXpuZVi7V0DSiXu0itlwWDC9m8huBvUBSIsDCsgb9OeG6rlrCyZgTW+qZciK+KZ8rwlFp3CFyxoF2122ueOnl5pAUCy1iHqGun03dMdUxA1d3KnxSZ3NQrYiH69dc8/YhV4SriOW9psc0pv9KeBLF0OXHtEAdbnSlwfk2uTjjBMK0nDidl7wS52Ygi/H4+P+4EXkSzf4Jj4/L6P3c5rLC3/l3RFdo1T7EQ8fH6NsTYJNZ7 root@u911

同一份文件里另有一把用户自己的 ed25519 密钥,属于正常业务凭据。/home/ubuntu/.ssh/authorized_keys 中未发现攻击者密钥。

为什么删文件不够

authorized_keys 后门是最容易被忽略的持久化——它不涉及任何进程、端口或定时任务,杀进程、清 crontab 都碰不到它。只要这把公钥还在,攻击者随时能回来。反过来说,也不排除入侵本就是通过某把已泄露的密钥完成的,而非弱口令——这正是缺少云控制面日志时无法排除的另一种可能。

8. 威胁四:UFW 之下的 iptables 篡改

威胁 4防火墙看起来正常,iptables 里却开了两道口子高 · 已发生

UFW 状态(看起来一切正常)

端口协议方向判定
443 / 8443tcpALLOW业务端口
80 / 2083 / 2053tcpALLOW业务端口
2096tcpALLOWWeb 服务
22tcpALLOWSSH

iptables 实际被注入的规则

ACCEPT  udp dpt:12852     ← 攻击者注入的 UDP 放行规则
ACCEPT  tcp dpt:8015      ← 攻击者注入的 C2 端口放行规则

8015 正是 work32 的 C2 通信端口。攻击者在 UFW 规则之外直接操作 iptables,为自己的 C2 通道开后门。由于这两条规则位于 ufw 链之前,即使 UFW 禁止了 8015,iptables 规则仍然生效。

8015 与 8016:两个端口都存在,但证据性质不同

8015 有攻击者主动写入的 iptables ACCEPT 规则长期放行,属于"计划内"的主 C2 端口;另观察到 8016 也曾关联到 work32,但没有对应的放行规则,更像是进程重启 / 并发拉起、或 8015 被占用时的漂移端口。

结论:8015 为主、8016 为辅,两个都纳入 IOC 与狩猎范围。iptables 规则是攻击者"意图"的证据,单次 ss 读数只是"某一瞬间状态"的证据——前者更硬。

这是本次事件里最值得记住的一课:"防火墙是开着的"不等于"防火墙是我说了算的"。UFW 只是 iptables 的一层封装,攻击者完全可以绕过封装直接改底层链。审计时要看 iptables -L -n -v 的原始输出,而不是只看 ufw status。

sshd_config 被修改

配置项值判定
PermitRootLoginyes攻击者需要(正常应为 prohibit-password)
PasswordAuthenticationyes攻击者需要(正常应为 no,仅用密钥登录)

9. 威胁五:作为跳板攻击全球

威胁 52766–2987 条出站 SSH 爆破连接严重 · 活跃中
状态数量说明
SYN_SENT2766 ~ 2987正在发起的 SSH 爆破连接(不同采样时点)
ESTABLISHED25+已成功建立的连接
别把这两个数字搞混

2766 是连接数,不是唯一目标 IP 数。同一个目标 IP 可能被多次连接,实际受害主机数量远少于此。对外通报时不要把这两个数字混为一谈。

已成功建立连接的目标(第三方受害者)

下列主机与本机之间曾存在 ESTABLISHED 状态连接,意味着爆破很可能已经成功——这些是被入侵的受害方,不是攻击源。如果你读到其中某个地址是自己管的机器,请立刻按失陷处理:改凭据、查后门、看日志。

目标地址说明
5.189.163.118:2222ESTABLISHED
79.250.231.176:2222ESTABLISHED
93.189.3.173:2222ESTABLISHED
84.247.171.127:2222ESTABLISHED
175.102.18.106:2222ESTABLISHED
43.155.114.185:6000ESTABLISHED(X11)
95.167.7.204:2222ESTABLISHED
66.165.248.130:2222ESTABLISHED
51.161.34.93:2222ESTABLISHED
110.45.145.125:2222ESTABLISHED
185.83.155.9:2222ESTABLISHED
194.87.94.224:2222ESTABLISHED
196.216.64.226:222ESTABLISHED
45.153.187.105:2222ESTABLISHED
120.76.97.195:2222ESTABLISHED
195.161.114.158:2222ESTABLISHED
114.55.138.139:2223ESTABLISHED
51.161.79.141:2222ESTABLISHED
176.126.78.63:2222ESTABLISHED
159.194.221.89:2222ESTABLISHED
40.121.3.217:50000ESTABLISHED
207.244.230.226:2222ESTABLISHED
20.115.3.215:50000ESTABLISHED
194.26.138.121:2222ESTABLISHED
51.79.124.228:2222ESTABLISHED
41.175.40.1:830ESTABLISHED
183.13.152.89:8888ESTABLISHED
110.41.84.101:2222ESTABLISHED
38.87.116.51:2022ESTABLISHED

端口高度集中在 2222、2223、2022 这类"备用 SSH"上——扫描器优先挑的正是那些管理员改过端口、自以为躲过爆破的机器。改端口不产生任何安全收益,只会让你从日志里消失。

严重警告

这些 ESTABLISHED 连接意味着服务器可能已成功爆破入侵了其他服务器。AWS 很可能已将实例标记为滥用源,存在账号被封风险;同时可能需要向云厂商报备,以避免被受害方归责为攻击源。

攻击目标端口分布

端口含义数量级
22标准 SSH数千(主要目标)
2222常见备用 SSH数百
22222备用 SSH数十
2022 / 2002 / 8022 / 2223备用 SSH 变体少量
3389RDP 远程桌面少量
23 / 830Telnet少量
6000 / 8888 / 50000 / 55554X11、Web 代理、杂项服务少量

这台机器自己也在被别人扫描

时间来源 IP尝试用户名
Oct 9 03:34–03:35220.243.137.204user, ubuntu(14 次失败)
Oct 9 09:1366.194.199.251sw-admin, eortega, admin, ipfabric, root, tbr-admin
Oct 9 10:221.94.255.132root(2 次失败)

auth.log 共 7543 行。这台机器既是加害者也是受害者——在公网上,弱口令主机从被发现到沦陷往往只有几分钟。

10. 样本的静态解剖

把样本复制到本地隔离工作区后做了静态检查:file、sha256sum、strings -a -n 6、JSON 配置键检查。样本全程未执行,未在服务器上安装任何软件,也未运行 YARA、沙箱、反汇编或威胁情报库比对——这是下文多处结论保留"待确认"的原因。

/usr/.work/work32恶意 · 主进程
类型
ELF 32-bit LSB executable, Intel 80386, statically linked, no section header
SHA-256
7f28b2791ad94a202eea5e4c91d47cdeadca4723723427af574519f8aedbf15e
strings
xmr.crypto-pool.fr:6666、"pools"、"cpu"、"memory-pool"、"access-token"、UPX packer 标记

注意 XMRIG_VERSION 字符串是在 work64 中观察到的,不应归到 work32——这类细节在归因时很容易串味。

判断XMR 矿池端点 + 开启的 CPU 挖矿配置 + 矿工字段共同强烈支持"被配置为 XMR/RandomX 类 CPU 挖矿",置信度高(功能意图层面)。但出现 XMRIG_VERSION 不足以证明它是官方 XMRig 或某个已知家族。
若判断为假仍可能是合法挖矿软件、测试样本、仿冒 / 重新打包矿工或含无效配置的程序;须用可信发布物、离线静态 / 动态分析及云端网络 / 矿池证据区分。
/usr/.work/work64恶意
类型
静态链接 64 位 ELF
SHA-256
2d2239acd852e43952bcb14fcdc7485fd804b54df241c077750f5447b55354b7
strings
randomx、pools、memory-pool、xmr.crypto-pool.fr:6666、XMRIG_VERSION、UPX 标记
判断与 work32 相似,强烈支持 XMR CPU 挖矿用途意图;是否实际运行或挖矿未确认。无版本信息与可信二进制比对,样本层面的家族归属仍为未识别。
/usr/.work/xmr · /tmp/xmr恶意 · 运行副本
在线观察
/tmp/xmr 以 root 运行;/proc/<pid>/exe 在线哈希与 /usr/.work/xmr 一致
SHA-256
86f0e4c7596a7ac30af4152ce86268b109c325f62a7cfe1be0dbc72de0d9279a
MD5
20552242cd4b5e8fa6071951e9f4bf6d(两份副本一致)
strings
静态链接 32 位 ELF,含 XMRfVERSION 与 UPX 标记
判断进程名、文件名、矿工版本标记及与 /usr/.work 样本的哈希对应关系,支持"运行中的疑似矿工副本",置信度中高。启动机制仍待核实。
/usr/.work/kworkers性质待分析
类型
64 位静态链接 ELF
SHA-256
26e52d1fc06b80300f2af61e3bb6856c96a2c6d786966bbf1289d2c4b633ce83
strings
UPX packer 标记、github.com/buger/jsonpars;未找到足以确认矿工或 rootkit 功能的证据
判断静态层面性质未知。不得仅凭 kworkers 这个文件名或 UPX 标记就称其为恶意——得先离线解包、反汇编,再跟可信来源比对。前面把它归到 Kinsing,靠的是同目录其他文件和行为上下文,而不是这个文件本身。
/usr/.work/linux_server64性质待分析
类型
动态链接 64 位 ELF,stripped
SHA-256
5bae8c6b2b868be12692f6a22b30ec22a2a9a550371c956c0a53217330debe34
strings
ptrace、调试器 / 反汇编工具相关字符串,含 Hex-Rays 字样
判断无法确认功能、来源或是否被执行。这些字符串可能是调试器组件或捆绑内容,不能单独作为恶意行为证据。另外这里还翻出一个 IDA_DBGSRV_PASSWD 及紧随其后的疑似值——可能是调试器组件的硬编码口令,也可能只是一段无效字符串。这个值值得单独保密处理,一旦确认可用且非授权,就得按暴露秘密撤销并重新评估影响范围。
/usr/.work/auth.sh · /usr/.work/secure.sh意图待定
auth.sh
442e897c78532dd4e36fa1c7fd791c4bcf19b230d9aab3d5d12ade2d98b84a83
secure.sh
904f2c1bc6b48ba663b9186b7b04905a33af3d55afb9995802daadab83da2a15
判断从文本看设计意图像 SSH 爆破来源阻断脚本,不能据此认定为木马或安全防护工具;也未证明曾运行或运行有效。若"防护脚本"的定性不成立,它仍可能是伪装、过时或存在逻辑缺陷的脚本。处置建议无论定性如何都先离线保全,并检查 service / cron 引用;未确认来源前不要运行。

11. IOC 汇总

使用限制

以下 IOC 均采集自被控主机的在线运行状态,未经可信威胁情报库比对,也未与离线只读挂载的样本交叉验证。用于内部狩猎可以;对外通报或接入自动化封禁前,请先做二次确认。

文件路径

/usr/.work/                           # 整个目录(22 个文件)
/usr/.work/work32                     # 爆破扫描器(主进程)
/usr/.work/work64                     # 64 位扫描器
/usr/.work/xmr                        # XMRig 矿工
/usr/.work/kworkers                   # Kinsing 组件
/usr/.work/linux_server64             # C2 通信组件
/usr/.work/config.json                # XMRig 配置
/usr/.work/ks-script-JLpxkR           # 反取证脚本
/usr/.work/heartalive.lock            # 保活锁文件
/tmp/xmr                              # 矿工运行副本
/root/.6400401235605125863/sshd       # 木马 sshd 后门

哈希

样本算法值
work32SHA-2567f28b2791ad94a202eea5e4c91d47cdeadca4723723427af574519f8aedbf15e
work64SHA-2562d2239acd852e43952bcb14fcdc7485fd804b54df241c077750f5447b55354b7
xmr / tmp/xmrSHA-25686f0e4c7596a7ac30af4152ce86268b109c325f62a7cfe1be0dbc72de0d9279a
xmr / tmp/xmrMD520552242cd4b5e8fa6071951e9f4bf6d
kworkersSHA-25626e52d1fc06b80300f2af61e3bb6856c96a2c6d786966bbf1289d2c4b633ce83
linux_server64SHA-2565bae8c6b2b868be12692f6a22b30ec22a2a9a550371c956c0a53217330debe34
auth.shSHA-256442e897c78532dd4e36fa1c7fd791c4bcf19b230d9aab3d5d12ade2d98b84a83
secure.shSHA-256904f2c1bc6b48ba663b9186b7b04905a33af3d55afb9995802daadab83da2a15

网络指标

矿池      xmr.crypto-pool.fr:6666
C2 端口    8015/tcp(0.0.0.0)    ← 主端口,有 iptables ACCEPT 规则佐证
           8016/tcp               ← 亦曾关联 work32,无放行规则,疑为重启漂移
本地控制   14747/tcp(127.0.0.1)
后门端口   1919/tcp(木马 sshd)
异常放行   udp 12852 / tcp 8015(iptables 注入)

持久化与凭据

crontab          0 * * * * root /usr/.work/work32(root crontab + /etc/crontab 双写)
后门公钥          ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDc3Bl… root@u911
sshd_config      PermitRootLogin=yes + PasswordAuthentication=yes
XMR 钱包          47BD6QNfkWf8ZMQSdqp2tY1AdG8ofsEPf4mcDp1YB4AX32hUjoLjuDaNrYzXk7cQcoPBzAuQrmQTgNgpo6XPqSBLCnfsjaV
进程名            work32 / work64 / xmr / kworkers / linux_server64 / multics.x64 / multicsr100rc20_x64
异常账号          liangjiang(攻击者创建,非业务账号)
家族特征文件      ks-script-JLpxkR / kworkers / linux_server64 / heartalive.lock

12. 处置:五阶段,以及重建 vs 清理

阶段 1:立即隔离(0–1 小时)

  1. 网络隔离
    修改安全组,仅保留运维访问端口,切断对外爆破
  2. 终止恶意进程
    kill -9 77737 77879 271789 —— 注意别碰 PID 271825 的系统 sshd
  3. 不要重启
    重启可能触发 crontab 重新拉起恶意软件;先改 crontab 再说

阶段 2:证据保全(1–2 小时)

  1. 创建 EBS 快照
    对根卷和所有数据卷创建快照 —— 这一步决定了后面还能不能做离线取证
  2. 采集云控制面证据
    CloudTrail、VPC Flow Logs、GuardDuty
  3. 导出关键文件
    authorized_keys、crontab、sshd_config、/usr/.work/ 全目录
  4. 保存进程 / 网络信息
    ps、ss、netstat 输出

阶段 3:清除与重建(2–4 小时)

判定:重建优先于清理

理由是 root 凭据完全暴露、root 登录授权性未核实、存在 root cron 调度的恶意程序与服务级持久化,且所有证据均来自在线主机,无法证明系统完整性。杀进程只完成短时止损,未移除持久化,也不能排除其它后门。

首选方案:全新重建主机,从快照离线分析后,仅迁移核验过的数据与配置。

次选方案(若必须在线清除):

rm -rf /usr/.work/
rm -rf /root/.6400401235605125863/
rm -f  /tmp/xmr
# 清理 crontab 恶意条目(root crontab + /etc/crontab 双处)
# 删除 /root/.ssh/authorized_keys 中 root@u911 的 RSA 公钥
# 恢复 sshd_config:PermitRootLogin prohibit-password / PasswordAuthentication no
# 清理 iptables 注入规则:udp 12852 / tcp 8015(并复查是否另有 8016 相关规则)
# 删除攻击者创建的账号:userdel -r liangjiang
# 重置 root 密码为强密码
# 检查 /var/etc/bin 下是否残留 multicsr100rc20_x64

到这里为止做完的是:停掉 work32 和 /tmp/xmr 进程,备份并移除两处精确匹配 work32 的 cron 行。主机上的恶意二进制、配置和后门密钥一个都没删——根除没完成。原 cron 内容备份在 /root/ir-etc-crontab.bak 与 /root/ir-root-crontab.bak,注意这两份备份里仍包含原恶意调用行,不要直接拿来恢复。

阶段 4:凭据轮换(4–24 小时)

  1. root 密码
    立即改为强密码(当前弱口令已在进程命令行中明文暴露)
  2. SSH 密钥对
    废弃现有密钥,生成新密钥——/root/.ssh/ 下所有私钥应按已窃取处理
  3. AWS IAM 凭据
    轮换所有 AK/SK,检查实例角色是否被滥用
  4. 业务服务凭据
    轮换对外服务的口令与 UUID
  5. 证书账户密钥
    重新注册 ACME 账户
  6. 其他秘密
    应用 / API token、证书私钥;linux_server64 中疑似调试器口令若确认可用,按暴露秘密撤销

阶段 5:加固与监控(24–48 小时)

  1. SSH 加固
    禁用密码登录,仅允许密钥认证;禁止 root 直接登录
  2. 防火墙
    iptables / 安全组只开必要端口,限制不必要的出站(本次事件的伤害主要在出站方向)
  3. 入侵检测
    部署 AIDE、auditd、fail2ban —— 但要清楚 fail2ban 挡不住分布式低速爆破,它只是降低噪音
  4. 监控告警
    CPU 异常、异常网络连接、新增监听端口告警
  5. 启用 GuardDuty
    持续监控;同时向 AWS 报备滥用情况,降低封号风险

一个运维细节:若升级过程仍处在 dpkg 锁定 / 未配置状态,不要并行启动另一套 apt/dpkg 修复。先取证,再由维护者决定继续升级或重建。

13. 证据边界与未确认事项

13.1 这些证据能撑多重的结论

结论能走多远,取决于证据站得多稳。这次用到的证据按强度分三档:

等级定义本文使用情况
强云控制面日志、带外快照、离线只读挂载取得的文件内容;能撑起定性结论。一份都没有。这是整个响应最大的短板。
中在线命令输出、运行进程、监听端口、在线文件读取与哈希、主机日志、ext4 birth timestamp;理论上可以被已经沦陷的 root 改掉。绝大多数证据在这档,撑得起"在线观察到""疑似""高度可信"。
弱没交叉验证过的 bash history、文件 mtime / atime、wtmp / btmp / lastlog 之类。.bash_history 和那批时间戳在这档——当线索用,不当结论用。
说白了

上面所有判断,都来自一台 root 已经沦陷的机器上跑出来的命令输出。想让任何一条变成板上钉钉,先拿 EBS 快照和云控制面日志来。在那之前,进程杀掉了、cron 删掉了,都只是把火摁住而已。

13.2 未确认事项

13.3 待补齐的云侧证据

缺失证据影响建议动作
AWS CloudTrail 日志无法确认攻击者源 IP、API 调用记录立即查询 CloudTrail
VPC Flow Logs无法确认网络流量详情与唯一目标 IP 数查询 Flow Logs
AWS GuardDuty 告警无法确认 AWS 是否已检测并标记滥用检查 GuardDuty
EBS 磁盘快照无法进行离线取证,无法证明系统完整性清除前立即创建快照
AWS IAM 凭据使用记录无法确认 AK/SK 是否泄露查询 IAM 凭据报告
写在最后

复盘这起事件,技术上有意思的点不少——iptables 绕过 UFW、"贼喊捉贼"的封禁脚本、两份互为备份的矿工副本、19 位数字命名的隐藏目录、以及攻击者进去第一件事是杀掉上一家的马。但真正致命的只有一件事:root 用一个能在字典里排到前排的弱口令,直接暴露在公网上。

攻击者没有使用任何高级技术,他们只是比你的运维更早扫到这台机器。而 fail2ban 也救不了你——分布式僵尸网络让每个 IP 只错一两次。能救你的只有:禁密码登录、禁 root 直登、以及别在公网上留一个能被字典命中的密码。

至于现在这台机器:进程停了、cron 删了,火只是被摁住。凭据全部轮换,然后从可信镜像重建。