LOADING
2780 words
14 minutes
我的服务器昨晚被打了:一次 SSH 弱口令爆破入侵复盘

昨晚我本来只是准备收个尾,结果打开服务器一看,发现机器不太对劲。 这次攻击没有什么花哨的 0day,也不是复杂的供应链攻击,攻击入口非常朴素:SSH 密码爆破

但真正让我警惕的,不是“它怎么进来的”,而是——攻击者在成功登录后的十几秒内,就完成了后门投放、持久化、痕迹清除和远控连接建立。

这篇文章把整个过程整理出来,既是一次复盘,也希望给还在开放 SSH 密码登录的人提个醒。

SSH 弱口令入侵时间线图


一、事件概述

先说结论:

  • 攻击者通过 SSH 弱密码爆破 成功登录了服务器上的 ubuntu 账号
  • 成功登录后,约 13 秒内 完成了恶意程序投放与启动
  • 后门具备以下能力:
    • DDoS 攻击
    • 远程 Shell 控制
    • SOCKS5 代理
    • C2 心跳通信
  • 攻击者还额外做了多层持久化:
    • Cron 定时拉起
    • /etc/profile.d/ 登录触发
    • init.d 开机自启
    • authorized_keys 植入 SSH 公钥后门
  • 当时后门仍与 C2 服务器保持活跃连接

一句话总结就是:

这不是“被扫到一下”那么简单,而是服务器已经被完整接管,并被改造成一台可远程操控的肉鸡。


二、服务器背景

本次出事的环境:

  • 系统:Ubuntu(腾讯云云服务器)
  • 公网 IP:175.24.197.166
  • 内网 IP:10.0.0.11

调查过程中主要依赖了这些工具:

  • ss
  • ps
  • lsof
  • journalctl
  • grep
  • find
  • strings
  • tcpdump
  • openssl
  • curl

三、攻击是怎么开始的

从日志来看,攻击并不是瞬间发生的,而是经历了一个明显的爆破过程。

1. 主攻击源

主攻击 IP:

  • 124.222.123.53
  • 归属:腾讯云上海节点

这个 IP 对 ubuntu 用户进行了长时间的密码尝试。 尤其在 4 月 28 日 23<30> 到 23<34> 之间,爆破节奏变得非常密集。

例如日志片段里能看到:

Apr 28 23:30:01 Failed password for ubuntu from 124.222.123.53
Apr 28 23:30:03 Failed password for ubuntu from 124.222.123.53
Apr 28 23:30:06 Failed password for ubuntu from 124.222.123.53

根据报告估算:

  • 爆破频率约为 每 2 秒 1~2 次
  • 持续约 4 分钟
  • 累计尝试大约 80~100 次

然后,在 23:34<02>,它成功了。

Accepted password for ubuntu from 124.222.123.53 port 39504 ssh2

这行日志出现的时候,事情的性质就已经变了: 从“有人在撞门”,变成了“人已经进屋了”。


四、真正可怕的部分:13 秒完成投毒

攻击者成功登录后的动作非常快,几乎可以确定是自动化脚本

根据 auth.log 中记录的 sudo 命令,整个过程大致是这样的:

23:34<05>:测试提权能力

Terminal window
sudo whoami

确认当前 ubuntu 拥有 sudo 权限。

23:34<05>:创建傀儡账号

Terminal window
useradd -m -s /bin/bash -N admin

这一步通常是为了留一个备用入口,不过后续报告显示这个账号已经被删除。

23:34<08>:清痕迹 + 写后门

Terminal window
mkdir -p /root/.ssh
rm -rf /root/.bash_history
tee /usr/bin/adb0

这里非常关键:

  • rm -rf /root/.bash_history:第一时间擦 root 历史记录
  • tee /usr/bin/adb0:直接通过标准输入把一个 5MB 的 ELF 可执行文件 写进系统里

23:34<15>:赋权并启动

Terminal window
chmod 777 /usr/bin/adb0
nohup /usr/bin/adb0 &

到这里,恶意程序已经开始后台运行。

也就是说:

从成功登录到后门启动,总共只用了 13 秒

这说明三件事:

  1. 这不是手工操作,而是成熟脚本化攻击
  2. 恶意载荷早已准备好
  3. 攻击者对这种云主机环境非常熟悉

五、这不是一个普通木马,而是一套完整的后门体系

主恶意文件是:

/usr/bin/adb0

文件特征:

  • 5MB
  • ELF 64-bit
  • x86-64
  • Go 编写
  • 静态链接
  • stripped 处理过

报告里通过字符串分析,提取到了几个核心模块名:

  • Attack_Run
  • Shell_Run
  • Proxy_Run
  • Onlineinfo_Run

这几个名字已经把能力暴露得很直白了:

  • Attack_Run:执行 DDoS 攻击
  • Shell_Run:远程命令执行 / Shell 控制
  • Proxy_Run:代理转发
  • Onlineinfo_Run:上线/心跳汇报

也就是说,它不是单纯“上线报到”的小木马,而是一个可被远程操纵的多功能后门


六、攻击者不只放了一个文件,而是放了四个副本

更麻烦的是,恶意程序并不只存在于一个位置。

MD5 相同的副本一共有四份:

  1. /usr/bin/adb0
  2. /usr/lib/libgdi.so.0.8.2
  3. /etc/profile.d/bash.cfg
  4. /boot/system.pub

这意味着即使你删掉其中一个,其他副本也可能重新把它拉起来。

这个攻击样本的思路不是“单点存活”,而是多点冗余、交叉自恢复


七、它还做了四层持久化

如果只写个后门进程,那还算初级。 真正棘手的是,这次攻击做了四层持久化

1. Cron 定时任务

/etc/crontab 中被插入了:

*/1 * * * * root /.mod

/.mod 的内容是:

#!/bin/bash
/usr/lib/libgdi.so.0.8.2

也就是说,每分钟都会尝试重新启动恶意副本。

2. 登录触发执行

/etc/profile.d/ 下放了两个文件:

  • /etc/profile.d/bash.cfg.sh
  • /etc/profile.d/bash.cfg

其中:

Terminal window
source /etc/profile.d/bash.cfg

表面上像是一个 shell 配置片段,实际上 bash.cfg 本体是一个 5MB 的 ELF 木马文件

也就是说,只要用户登录 shell,这个恶意程序就会被顺手带起来。

3. 开机自启

攻击者伪造了一个看起来很正常的服务名:

dns-udp4

相关脚本位于:

  • /etc/init.d/dns-udp4
  • /etc/rc.d/dns-udp4

真正执行的是:

Terminal window
/boot/system.pub

system.pub 其实也是那个恶意程序的副本。

这一步保证了:哪怕服务器重启,后门依旧能回来。

4. SSH 公钥后门

这是我觉得最危险的一层。

攻击者把自己的公钥植入到了:

/home/ubuntu/.ssh/authorized_keys

这意味着什么?

即使你把 ubuntu 的密码改了,只要这个公钥还在,对方依然能直接 SSH 登录。

很多人处理入侵时只改密码,但不清理 authorized_keys,等于门锁换了,备用钥匙还在贼手里。


八、它甚至还带了“简易 Rootkit”能力

更阴的是,攻击者还放了一个脚本:

/etc/profile.d/gateway.sh

这个脚本做的事情不是继续投毒,而是劫持常见系统命令,把恶意进程和连接“隐藏起来”。

被劫持的命令包括:

  • ps
  • ss
  • ls
  • find
  • netstat
  • lsof

核心思路就是: 你一查进程、查网络、查文件,它先帮你把关键字过滤掉。

比如这些关键词会被隐藏:

  • bash.cfg
  • .mod
  • libgdi.so.0.8.2
  • gateway.sh
  • adm0
  • stargate

所以如果你只是习惯性跑一句:

Terminal window
ss -tp | grep 45.150.226.78

可能什么都看不到。

但换一种绕过方式,就能看到真实连接:

Terminal window
netstat -antp | grep 45.150.226.78

这时候才会暴露出:

10.0.0.11:45502 -> 45.150.226.78:65111 ESTABLISHED

这类做法虽然称不上内核级 rootkit,但已经足够骗过很多日常排查。


九、C2 服务器是谁

报告里提取到的 C2 信息如下:

  • IP:45.150.226.78
  • 端口:65111
  • 归属:美国西雅图,Spartan Host
  • 协议:WebSocket + TLS
  • TLS 证书 CN:127.0.0.1(伪装成本地开发环境)

抓包显示它当时仍在持续心跳,说明后门没有“打完就走”,而是一直在线等指令

这也意味着:

  • 服务器随时可能被拉去参与 DDoS
  • 也可能被当作代理中转
  • 还可能继续下发 shell 指令做横向操作

十、这次事件里最值得警惕的地方

这次入侵让我最有感触的,不是样本多高级,而是它体现出一种非常成熟的“工业化攻击流程”:

1. 入口简单,但足够有效

只要 SSH 密码登录还开着,而且密码强度不够,爆破永远有人做。

2. 成功后动作极快

13 秒完成投毒,这已经不是“试试看”,而是标准化流水线。

3. 持久化层层叠加

Cron、profile、init、authorized_keys 一起上,防的是“你只清一半”。

4. 会主动隐藏自己

它知道管理员会查 pssslsof,所以先把这些命令做了过滤。

5. 目标不是单纯驻留,而是拿去利用

从功能模块看,这台机器更像被改造成了一个:

  • DDoS 节点
  • 代理节点
  • 可远程操作的跳板

十一、如果你也遇到类似情况,优先做什么

报告里给出的处置建议非常实用,我按优先级重新整理一下。

第一优先级:先断攻击者登录能力

  1. 删除 authorized_keys 中的攻击者公钥
  2. 修改被爆破账号密码
  3. 如果条件允许,立刻关闭 SSH 密码登录,仅保留密钥认证

如果你只做“改密码”,但不删公钥,那基本等于没处理干净。

第二优先级:杀掉活跃后门

先终止恶意进程,再排查对应的网络连接和父子链路。

因为只删文件、不杀进程,恶意进程仍可能继续存活在内存里,甚至重新落盘。

第三优先级:清持久化

要一起清掉:

  • /etc/crontab
  • /.mod
  • /etc/profile.d/bash.cfg
  • /etc/profile.d/bash.cfg.sh
  • /etc/profile.d/gateway.sh
  • /etc/init.d/dns-udp4
  • /etc/rc.d/dns-udp4
  • /boot/system.pub
  • /etc/.cfg

如果漏掉其中任何一层,都可能在你下一次登录、下一分钟、下一次重启时复活。

第四优先级:把 SSH 安全面重新做一遍

这次事件背后最根本的问题,其实还是 SSH 暴露面太大。

建议至少做到:

  • 禁止密码登录
  • 只允许密钥认证
  • 使用高强度 Ed25519 密钥
  • 限制 SSH 来源 IP
  • 配 fail2ban
  • 定期审计 authorized_keyscrontab/etc/profile.d/

十二、我从这次事件里学到的教训

如果要把这次事情压缩成一句提醒,那就是:

不要把“开着 SSH 密码登录”当成一件无所谓的小事。

很多时候我们觉得:

  • “反正只是个小服务器”
  • “密码我自己知道”
  • “应该没人盯上我”

但自动化爆破根本不关心你是谁。 只要口子开着、密码不够强、没有额外防护,你就只是扫描器字典里的下一个目标。

更现实一点说:

  • 攻击者不一定冲着你的业务来
  • 他们可能只是需要一批能用的肉鸡
  • 你的服务器一旦被拿下,就可能被用去打别人

到那时,损失不只是你自己机器上的数据,还可能包括:

  • 带宽消耗
  • 云厂商封禁
  • IP 信誉受损
  • 对外攻击带来的责任风险

十三、最后

这次复盘对我来说挺有警示意义。 最开始看只是“SSH 登录异常”,往后挖才发现已经是完整后门链路 + C2 在线 + 多层持久化 + 命令隐藏

攻击手法不算新,但执行效率和自动化程度很高。 也正因为它“不新”,所以才更危险——因为说明这已经是被大量复用、很成熟的一套东西了。

如果你手里还有对公网开放 SSH 的机器,真的建议现在就去检查这几件事:

  • 有没有还开着密码登录
  • 密码是不是足够强
  • authorized_keys 里有没有陌生公钥
  • crontab/etc/profile.d/init.d 里有没有奇怪文件
  • 有没有异常外连

很多安全问题,不是因为攻击者太强,而是因为系统默认地“太好进”。

我的服务器昨晚被打了:一次 SSH 弱口令爆破入侵复盘
/posts/ssh-bruteforce-intrusion-analysis/
Author
swrited
Published at
2026-04-29
License
CC BY-NC-SA 4.0

Some information may be outdated