这次取证是在一台还在跑的机器上做的——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 默认命名) |
| 内网 IP | 172.26.3.xx(私有地址) |
| 云平台 | AWS EC2 |
| 操作系统 | Ubuntu 24.04 LTS |
| 内核 | 7.0.0-1012-aws (x86_64) |
| OpenSSH | OpenSSH_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 核严重过载 |
用户账户
| 用户 | UID | Shell | 状态 |
|---|---|---|---|
root | 0 | /bin/bash | 已被攻击者控制 |
ubuntu | 1000 | /bin/bash | 未发现异常 |
liangjiang | — | — | 攻击者创建的账号 |
登录历史
| 时间 | 用户 | 来源 IP | 判定 |
|---|---|---|---|
| Oct 9 10:21 | root | 18.225.117.x | 本次响应连接 |
| Oct 8 14:08 | ubuntu | 18.225.98.x | 正常(AWS SSM) |
| Sep 24 18:07 | root | 35.221.217.x | 初始部署 |
SSH 日志里还有多条 root 成功认证的记录,但没有云端身份数据能证明这些访问是不是授权的。这是缺云控制面日志的直接后果,也是下文不少结论只能停在"疑似"的原因。
3. 入侵时间线
35.221.217.x,root 登录。此后 7 天为"正常期"——但很可能已经是爆破窗口。/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清空防火墙
xmr.crypto-pool.fr:6666。/root/.6400401235605125863/sshd启动(PID 271789,30 MB)- 监听
*:1919作为后门入口 - 同时对外发起 SSH 爆破扫描,与 work32 构成分布式爆破网络
/usr/.work/ 文件 mtime 落在同一分钟,疑似攻击者再次上线维护。mtime 为弱证据攻击者留下的 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 一个常见疑问:试这么少次,为何没触发封锁?
这个疑问很自然,但它预设了两个不成立的前提。三个关键原因:
SSH 密码认证是整串提交的:攻击者每次发送一个完整密码字符串,服务端要么接受要么拒绝,不存在"先试出第一位、再试第二位"这种逐字符推进。攻击者用的是密码字典——一份按出现频率排序的常见弱口令列表。任何像样的字典,前几千条就覆盖了绝大多数人真正在用的密码,弱口令基本在第一轮就命中。
dpkg -l | grep fail2ban → (未安装)
Ubuntu 默认不安装 fail2ban。而服务器上唯一的"防爆破"脚本 /usr/.work/auth.sh 是恶意软件自带的——它封禁的是竞争对手的扫描器,不是保护这台服务器(详见 5.6)。
Kinsing 是僵尸网络,全球数千台已沦陷机器同时扫描。攻击模式是这样的:
机器A (俄罗斯) → 你的服务器 试 "root" 失败
机器B (越南) → 你的服务器 试 "123456" 失败
机器C (巴西) → 你的服务器 试 "…" ✅ 命中!
每台机器只试 1~2 个密码就换下一个目标。从你服务器的视角看,每个来源 IP 只出现 1~2 次失败,永远达不到"同一 IP 失败 5 次"的封锁阈值。这意味着:即使当时装了 fail2ban,也挡不住这种分布式低速爆破——真正致命的还是那条密码本身。
4.3 入侵链路重建
- 攻击者此前已入侵数千台服务器,组成僵尸网络
- 某台僵尸机器扫到本机 22 端口,字典命中弱口令一次即中,直接拿到 root shell
- 执行
passwd root改成自己知道的密码顺带给自建账号liangjiang设了密码 - 注入后门 SSH 公钥(
root@u911的 RSA key) - 部署 work32 扫描器 + xmr 挖矿 + kworkers + linux_server64
- 写入 crontab 双重持久化,清空 iptables
- 注入 iptables 规则放行 C2 端口 8015
- 6 天后二次植入木马 sshd 后门(端口 1919)加固后门,防止被清理
5. 威胁一:Kinsing 家族恶意软件
5.1 恶意进程
| PID | 命令行 | CPU% | MEM% | 启动 | 累计 CPU |
|---|---|---|---|---|---|
77737 | /usr/.work/work32 -deamon root <pw> | 184% | 2.9% | Oct 2 | 18764 分钟 |
77879 | /tmp/xmr | 0.1% | 0.4% | Oct 2 | 11 分钟 |
注意 work32 的命令行里直接带着 root 密码明文——这也是凭据必须整体轮换的理由之一。
5.2 文件类型分析
| 文件 | 类型 | 大小 | 特征 |
|---|---|---|---|
work32 | ELF 32-bit, 80386 | 4.18 MB | 静态链接,无 section header |
work64 | ELF 64-bit, x86-64 | 4.45 MB | 静态链接,无 section header |
xmr | ELF 32-bit, 80386 | 1.21 MB | 静态链接,无 section header |
kworkers | ELF 64-bit, x86-64 | 3.52 MB | 静态链接,无 section header |
linux_server64 | ELF 64-bit, x86-64 | 718 KB | 动态链接,stripped |
静态链接 + 无 section header 是恶意软件的典型特征:前者避免依赖目标机器的 libc,后者让 objdump/readelf 这类工具失效,增加逆向难度。
5.3 工具箱目录 /usr/.work/ 完整清单
| 文件 | 大小 | 用途 / 定性 |
|---|---|---|
work32 | 4.18 MB | 32 位 SSH 爆破扫描器(主进程)恶意 |
work64 | 4.45 MB | 64 位 SSH 爆破扫描器恶意 |
xmr | 1.21 MB | XMRig 挖矿程序恶意 |
kworkers | 3.52 MB | Kinsing 组件(伪装内核工作线程)恶意 |
linux_server64 | 718 KB | Kinsing C2 通信组件恶意 |
config.json | 1.69 KB | XMRig 挖矿配置恶意 |
ks-script-JLpxkR | 836 B | SELinux restorecon 脚本(反取证)恶意 |
auth.sh | 419 B | SSH 爆破 IP 封禁(贼喊捉贼)意图待定 |
secure.sh | 417 B | 同上,CentOS/RHEL 路径变体意图待定 |
heartalive.lock | 0 B | 保活锁文件 |
.bash_history | 1.09 KB | 攻击者操作记录弱证据 |
.bashrc | 570 B | 攻击者 bash 配置弱证据 |
index.html | 46 B | 伪装文件 |
alert_descs.csv | 126 KB | 伪装安全数据 |
alert_descs.xlsx | 1.40 MB | 伪装安全数据 |
*.ipynb(4 个) | ≈1.3 MB | 伪装 Jupyter Notebook |
hole_descs.csv | 13.3 KB | 伪装安全数据 |
tmp.f9F5g2gAHz | 163 KB | 临时文件 |
yum.log | 0 B | 伪装日志 |
09cd09f0…bebf | 0 B | 哈希命名空文件 |
31714944_172.18…pkl | 1.65 KB | Pickle 序列化文件 |
攻击者往工具箱里塞了大量 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)
| # | 操作 | 解读 |
|---|---|---|
| 1 | passwd root | 改 root 密码,独占控制权 |
| 2 | passwd liangjiang | 给自己建的账号设密码——留一条不依赖 root 的后门入口 |
| 3 | nano sshd_config | 开启 root 密码登录 |
| 4 | ulimit -n | 提高文件描述符上限,为大规模并发扫描做准备 |
| 5 | killall -9 multics.x64 ×多次 | 杀掉上一任攻击者的恶意软件(换马) |
| 6 | iptables -F ×9~17 | 清空防火墙规则 |
| 7 | apt install gdb | 安装调试器 |
| 8 | gdb multicsr100rc20_x64 | 调试另一个恶意软件(multics 系列) |
| 9 | cp 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 后门
- 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 是 PID 271825 / 端口 22 / OpenSSH_9.6p1,木马 sshd 是 PID 271789 / 端口 1919。只杀后者,别把系统 sshd 干掉——否则你会把自己锁在门外,在只有 SSH 通道的云主机上这尤其致命。
7. 威胁三:后门 SSH 公钥
/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 篡改
UFW 状态(看起来一切正常)
| 端口 | 协议 | 方向 | 判定 |
|---|---|---|---|
| 443 / 8443 | tcp | ALLOW | 业务端口 |
| 80 / 2083 / 2053 | tcp | ALLOW | 业务端口 |
| 2096 | tcp | ALLOW | Web 服务 |
| 22 | tcp | ALLOW | SSH |
iptables 实际被注入的规则
ACCEPT udp dpt:12852 ← 攻击者注入的 UDP 放行规则
ACCEPT tcp dpt:8015 ← 攻击者注入的 C2 端口放行规则
8015 正是 work32 的 C2 通信端口。攻击者在 UFW 规则之外直接操作 iptables,为自己的 C2 通道开后门。由于这两条规则位于 ufw 链之前,即使 UFW 禁止了 8015,iptables 规则仍然生效。
8015 有攻击者主动写入的 iptables ACCEPT 规则长期放行,属于"计划内"的主 C2 端口;另观察到 8016 也曾关联到 work32,但没有对应的放行规则,更像是进程重启 / 并发拉起、或 8015 被占用时的漂移端口。
结论:8015 为主、8016 为辅,两个都纳入 IOC 与狩猎范围。iptables 规则是攻击者"意图"的证据,单次 ss 读数只是"某一瞬间状态"的证据——前者更硬。
这是本次事件里最值得记住的一课:"防火墙是开着的"不等于"防火墙是我说了算的"。UFW 只是 iptables 的一层封装,攻击者完全可以绕过封装直接改底层链。审计时要看 iptables -L -n -v 的原始输出,而不是只看 ufw status。
sshd_config 被修改
| 配置项 | 值 | 判定 |
|---|---|---|
PermitRootLogin | yes | 攻击者需要(正常应为 prohibit-password) |
PasswordAuthentication | yes | 攻击者需要(正常应为 no,仅用密钥登录) |
9. 威胁五:作为跳板攻击全球
| 状态 | 数量 | 说明 |
|---|---|---|
| SYN_SENT | 2766 ~ 2987 | 正在发起的 SSH 爆破连接(不同采样时点) |
| ESTABLISHED | 25+ | 已成功建立的连接 |
2766 是连接数,不是唯一目标 IP 数。同一个目标 IP 可能被多次连接,实际受害主机数量远少于此。对外通报时不要把这两个数字混为一谈。
已成功建立连接的目标(第三方受害者)
下列主机与本机之间曾存在 ESTABLISHED 状态连接,意味着爆破很可能已经成功——这些是被入侵的受害方,不是攻击源。如果你读到其中某个地址是自己管的机器,请立刻按失陷处理:改凭据、查后门、看日志。
| 目标地址 | 说明 |
|---|---|
5.189.163.118:2222 | ESTABLISHED |
79.250.231.176:2222 | ESTABLISHED |
93.189.3.173:2222 | ESTABLISHED |
84.247.171.127:2222 | ESTABLISHED |
175.102.18.106:2222 | ESTABLISHED |
43.155.114.185:6000 | ESTABLISHED(X11) |
95.167.7.204:2222 | ESTABLISHED |
66.165.248.130:2222 | ESTABLISHED |
51.161.34.93:2222 | ESTABLISHED |
110.45.145.125:2222 | ESTABLISHED |
185.83.155.9:2222 | ESTABLISHED |
194.87.94.224:2222 | ESTABLISHED |
196.216.64.226:222 | ESTABLISHED |
45.153.187.105:2222 | ESTABLISHED |
120.76.97.195:2222 | ESTABLISHED |
195.161.114.158:2222 | ESTABLISHED |
114.55.138.139:2223 | ESTABLISHED |
51.161.79.141:2222 | ESTABLISHED |
176.126.78.63:2222 | ESTABLISHED |
159.194.221.89:2222 | ESTABLISHED |
40.121.3.217:50000 | ESTABLISHED |
207.244.230.226:2222 | ESTABLISHED |
20.115.3.215:50000 | ESTABLISHED |
194.26.138.121:2222 | ESTABLISHED |
51.79.124.228:2222 | ESTABLISHED |
41.175.40.1:830 | ESTABLISHED |
183.13.152.89:8888 | ESTABLISHED |
110.41.84.101:2222 | ESTABLISHED |
38.87.116.51:2022 | ESTABLISHED |
端口高度集中在 2222、2223、2022 这类"备用 SSH"上——扫描器优先挑的正是那些管理员改过端口、自以为躲过爆破的机器。改端口不产生任何安全收益,只会让你从日志里消失。
这些 ESTABLISHED 连接意味着服务器可能已成功爆破入侵了其他服务器。AWS 很可能已将实例标记为滥用源,存在账号被封风险;同时可能需要向云厂商报备,以避免被受害方归责为攻击源。
攻击目标端口分布
| 端口 | 含义 | 数量级 |
|---|---|---|
| 22 | 标准 SSH | 数千(主要目标) |
| 2222 | 常见备用 SSH | 数百 |
| 22222 | 备用 SSH | 数十 |
| 2022 / 2002 / 8022 / 2223 | 备用 SSH 变体 | 少量 |
| 3389 | RDP 远程桌面 | 少量 |
| 23 / 830 | Telnet | 少量 |
| 6000 / 8888 / 50000 / 55554 | X11、Web 代理、杂项服务 | 少量 |
这台机器自己也在被别人扫描
| 时间 | 来源 IP | 尝试用户名 |
|---|---|---|
| Oct 9 03:34–03:35 | 220.243.137.204 | user, ubuntu(14 次失败) |
| Oct 9 09:13 | 66.194.199.251 | sw-admin, eortega, admin, ipfabric, root, tbr-admin |
| Oct 9 10:22 | 1.94.255.132 | root(2 次失败) |
auth.log 共 7543 行。这台机器既是加害者也是受害者——在公网上,弱口令主机从被发现到沦陷往往只有几分钟。
10. 样本的静态解剖
把样本复制到本地隔离工作区后做了静态检查:file、sha256sum、strings -a -n 6、JSON 配置键检查。样本全程未执行,未在服务器上安装任何软件,也未运行 YARA、沙箱、反汇编或威胁情报库比对——这是下文多处结论保留"待确认"的原因。
- 类型
- 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——这类细节在归因时很容易串味。
XMRIG_VERSION 不足以证明它是官方 XMRig 或某个已知家族。- 类型
- 静态链接 64 位 ELF
- SHA-256
- 2d2239acd852e43952bcb14fcdc7485fd804b54df241c077750f5447b55354b7
- strings
randomx、pools、memory-pool、xmr.crypto-pool.fr:6666、XMRIG_VERSION、UPX 标记
- 在线观察
/tmp/xmr以 root 运行;/proc/<pid>/exe在线哈希与/usr/.work/xmr一致- SHA-256
- 86f0e4c7596a7ac30af4152ce86268b109c325f62a7cfe1be0dbc72de0d9279a
- MD5
20552242cd4b5e8fa6071951e9f4bf6d(两份副本一致)- strings
- 静态链接 32 位 ELF,含
XMRfVERSION与 UPX 标记
/usr/.work 样本的哈希对应关系,支持"运行中的疑似矿工副本",置信度中高。启动机制仍待核实。- 类型
- 64 位静态链接 ELF
- SHA-256
- 26e52d1fc06b80300f2af61e3bb6856c96a2c6d786966bbf1289d2c4b633ce83
- strings
- UPX packer 标记、
github.com/buger/jsonpars;未找到足以确认矿工或 rootkit 功能的证据
kworkers 这个文件名或 UPX 标记就称其为恶意——得先离线解包、反汇编,再跟可信来源比对。前面把它归到 Kinsing,靠的是同目录其他文件和行为上下文,而不是这个文件本身。- 类型
- 动态链接 64 位 ELF,stripped
- SHA-256
- 5bae8c6b2b868be12692f6a22b30ec22a2a9a550371c956c0a53217330debe34
- strings
ptrace、调试器 / 反汇编工具相关字符串,含 Hex-Rays 字样
IDA_DBGSRV_PASSWD 及紧随其后的疑似值——可能是调试器组件的硬编码口令,也可能只是一段无效字符串。这个值值得单独保密处理,一旦确认可用且非授权,就得按暴露秘密撤销并重新评估影响范围。- auth.sh
- 442e897c78532dd4e36fa1c7fd791c4bcf19b230d9aab3d5d12ade2d98b84a83
- secure.sh
- 904f2c1bc6b48ba663b9186b7b04905a33af3d55afb9995802daadab83da2a15
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 后门
哈希
| 样本 | 算法 | 值 |
|---|---|---|
| work32 | SHA-256 | 7f28b2791ad94a202eea5e4c91d47cdeadca4723723427af574519f8aedbf15e |
| work64 | SHA-256 | 2d2239acd852e43952bcb14fcdc7485fd804b54df241c077750f5447b55354b7 |
| xmr / tmp/xmr | SHA-256 | 86f0e4c7596a7ac30af4152ce86268b109c325f62a7cfe1be0dbc72de0d9279a |
| xmr / tmp/xmr | MD5 | 20552242cd4b5e8fa6071951e9f4bf6d |
| kworkers | SHA-256 | 26e52d1fc06b80300f2af61e3bb6856c96a2c6d786966bbf1289d2c4b633ce83 |
| linux_server64 | SHA-256 | 5bae8c6b2b868be12692f6a22b30ec22a2a9a550371c956c0a53217330debe34 |
| auth.sh | SHA-256 | 442e897c78532dd4e36fa1c7fd791c4bcf19b230d9aab3d5d12ade2d98b84a83 |
| secure.sh | SHA-256 | 904f2c1bc6b48ba663b9186b7b04905a33af3d55afb9995802daadab83da2a15 |
网络指标
矿池 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 小时)
- 网络隔离修改安全组,仅保留运维访问端口,切断对外爆破
- 终止恶意进程
kill -9 77737 77879 271789—— 注意别碰 PID 271825 的系统 sshd - 不要重启重启可能触发 crontab 重新拉起恶意软件;先改 crontab 再说
阶段 2:证据保全(1–2 小时)
- 创建 EBS 快照对根卷和所有数据卷创建快照 —— 这一步决定了后面还能不能做离线取证
- 采集云控制面证据CloudTrail、VPC Flow Logs、GuardDuty
- 导出关键文件authorized_keys、crontab、sshd_config、
/usr/.work/全目录 - 保存进程 / 网络信息
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 小时)
- root 密码立即改为强密码(当前弱口令已在进程命令行中明文暴露)
- SSH 密钥对废弃现有密钥,生成新密钥——
/root/.ssh/下所有私钥应按已窃取处理 - AWS IAM 凭据轮换所有 AK/SK,检查实例角色是否被滥用
- 业务服务凭据轮换对外服务的口令与 UUID
- 证书账户密钥重新注册 ACME 账户
- 其他秘密应用 / API token、证书私钥;
linux_server64中疑似调试器口令若确认可用,按暴露秘密撤销
阶段 5:加固与监控(24–48 小时)
- SSH 加固禁用密码登录,仅允许密钥认证;禁止 root 直接登录
- 防火墙iptables / 安全组只开必要端口,限制不必要的出站(本次事件的伤害主要在出站方向)
- 入侵检测部署 AIDE、auditd、fail2ban —— 但要清楚 fail2ban 挡不住分布式低速爆破,它只是降低噪音
- 监控告警CPU 异常、异常网络连接、新增监听端口告警
- 启用 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 未确认事项
- 攻击者源 IP —— 缺 CloudTrail / VPC Flow Logs,无法确认。
- 完整入侵路径 —— 是仅通过 SSH 弱口令,还是也用了已泄露的密钥?不能排除后者。
- 数据外泄评估 —— 攻击者是否下载了敏感数据,需离线分析快照。
- AWS API 调用 —— 是否使用过 AWS CLI / API?需查 CloudTrail。
- 唯一目标 IP 数 —— 2766 条连接对应多少唯一受害主机?需进一步分析
ss输出。 - 实际挖矿收益 —— 未取得矿池侧记录与钱包流水,无法确认挖矿量与经济影响。
- kworkers / linux_server64 的真实功能 —— 静态层面未定性,需离线解包与反汇编。
- auth.sh / secure.sh 是否真的运行过 ——
/etc/hosts.deny取证时为空,倾向"未运行",但未证实。 - 上一任攻击者(
multics.x64)的残留 ——/var/etc/bin等路径是否还有后门? - 是否存在未覆盖的持久化 —— PAM、系统二进制替换、容器、内核模块等均未排查。
- C2 通信内容 —— 8015 / 8016 端口流量均未抓包,两个端口各自承担什么职能也待确认。
- root cron 条目是否真实执行成功 —— 用户 crontab 中带 root 字段的写法格式可疑,需单独验证。
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 删了,火只是被摁住。凭据全部轮换,然后从可信镜像重建。