昨晚我本来只是准备收个尾,结果打开服务器一看,发现机器不太对劲。 这次攻击没有什么花哨的 0day,也不是复杂的供应链攻击,攻击入口非常朴素: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
调查过程中主要依赖了这些工具:
sspslsofjournalctlgrepfindstringstcpdumpopensslcurl
三、攻击是怎么开始的
从日志来看,攻击并不是瞬间发生的,而是经历了一个明显的爆破过程。
1. 主攻击源
主攻击 IP:
124.222.123.53- 归属:腾讯云上海节点
这个 IP 对 ubuntu 用户进行了长时间的密码尝试。
尤其在 4 月 28 日 23<30>30> 到 23<34>34> 之间,爆破节奏变得非常密集。
例如日志片段里能看到:
1Apr 28 23:30:01 Failed password for ubuntu from 124.222.123.532Apr 28 23:30:03 Failed password for ubuntu from 124.222.123.533Apr 28 23:30:06 Failed password for ubuntu from 124.222.123.53根据报告估算:
- 爆破频率约为 每 2 秒 1~2 次
- 持续约 4 分钟
- 累计尝试大约 80~100 次
然后,在 23:34<02>02>,它成功了。
1Accepted password for ubuntu from 124.222.123.53 port 39504 ssh2这行日志出现的时候,事情的性质就已经变了: 从“有人在撞门”,变成了“人已经进屋了”。
四、真正可怕的部分:13 秒完成投毒
攻击者成功登录后的动作非常快,几乎可以确定是自动化脚本。
根据 auth.log 中记录的 sudo 命令,整个过程大致是这样的:
23:34<05>05>:测试提权能力
1sudo whoami确认当前 ubuntu 拥有 sudo 权限。
23:34<05>05>:创建傀儡账号
1useradd -m -s /bin/bash -N admin这一步通常是为了留一个备用入口,不过后续报告显示这个账号已经被删除。
23:34<08>08>:清痕迹 + 写后门
1mkdir -p /root/.ssh2rm -rf /root/.bash_history3tee /usr/bin/adb0这里非常关键:
rm -rf /root/.bash_history:第一时间擦 root 历史记录tee /usr/bin/adb0:直接通过标准输入把一个 5MB 的 ELF 可执行文件 写进系统里
23:34<15>15>:赋权并启动
1chmod 777 /usr/bin/adb02nohup /usr/bin/adb0 &到这里,恶意程序已经开始后台运行。
也就是说:
从成功登录到后门启动,总共只用了 13 秒。
这说明三件事:
- 这不是手工操作,而是成熟脚本化攻击
- 恶意载荷早已准备好
- 攻击者对这种云主机环境非常熟悉
五、这不是一个普通木马,而是一套完整的后门体系
主恶意文件是:
1/usr/bin/adb0文件特征:
- 5MB
- ELF 64-bit
- x86-64
- Go 编写
- 静态链接
- stripped 处理过
报告里通过字符串分析,提取到了几个核心模块名:
Attack_RunShell_RunProxy_RunOnlineinfo_Run
这几个名字已经把能力暴露得很直白了:
Attack_Run:执行 DDoS 攻击Shell_Run:远程命令执行 / Shell 控制Proxy_Run:代理转发Onlineinfo_Run:上线/心跳汇报
也就是说,它不是单纯“上线报到”的小木马,而是一个可被远程操纵的多功能后门。
六、攻击者不只放了一个文件,而是放了四个副本
更麻烦的是,恶意程序并不只存在于一个位置。
MD5 相同的副本一共有四份:
/usr/bin/adb0/usr/lib/libgdi.so.0.8.2/etc/profile.d/bash.cfg/boot/system.pub
这意味着即使你删掉其中一个,其他副本也可能重新把它拉起来。
这个攻击样本的思路不是“单点存活”,而是多点冗余、交叉自恢复。
七、它还做了四层持久化
如果只写个后门进程,那还算初级。 真正棘手的是,这次攻击做了四层持久化。
1. Cron 定时任务
在 /etc/crontab 中被插入了:
1*/1 * * * * root /.mod而 /.mod 的内容是:
1#!/bin/bash2/usr/lib/libgdi.so.0.8.2也就是说,每分钟都会尝试重新启动恶意副本。
2. 登录触发执行
在 /etc/profile.d/ 下放了两个文件:
/etc/profile.d/bash.cfg.sh/etc/profile.d/bash.cfg
其中:
1source /etc/profile.d/bash.cfg表面上像是一个 shell 配置片段,实际上 bash.cfg 本体是一个 5MB 的 ELF 木马文件。
也就是说,只要用户登录 shell,这个恶意程序就会被顺手带起来。
3. 开机自启
攻击者伪造了一个看起来很正常的服务名:
1dns-udp4相关脚本位于:
/etc/init.d/dns-udp4/etc/rc.d/dns-udp4
真正执行的是:
1/boot/system.pub而 system.pub 其实也是那个恶意程序的副本。
这一步保证了:哪怕服务器重启,后门依旧能回来。
4. SSH 公钥后门
这是我觉得最危险的一层。
攻击者把自己的公钥植入到了:
1/home/ubuntu/.ssh/authorized_keys这意味着什么?
即使你把
ubuntu的密码改了,只要这个公钥还在,对方依然能直接 SSH 登录。
很多人处理入侵时只改密码,但不清理 authorized_keys,等于门锁换了,备用钥匙还在贼手里。
八、它甚至还带了“简易 Rootkit”能力
更阴的是,攻击者还放了一个脚本:
1/etc/profile.d/gateway.sh这个脚本做的事情不是继续投毒,而是劫持常见系统命令,把恶意进程和连接“隐藏起来”。
被劫持的命令包括:
pssslsfindnetstatlsof
核心思路就是: 你一查进程、查网络、查文件,它先帮你把关键字过滤掉。
比如这些关键词会被隐藏:
bash.cfg.modlibgdi.so.0.8.2gateway.shadm0stargate
所以如果你只是习惯性跑一句:
1ss -tp | grep 45.150.226.78可能什么都看不到。
但换一种绕过方式,就能看到真实连接:
1netstat -antp | grep 45.150.226.78这时候才会暴露出:
110.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. 会主动隐藏自己
它知道管理员会查 ps、ss、lsof,所以先把这些命令做了过滤。
5. 目标不是单纯驻留,而是拿去利用
从功能模块看,这台机器更像被改造成了一个:
- DDoS 节点
- 代理节点
- 可远程操作的跳板
十一、如果你也遇到类似情况,优先做什么
报告里给出的处置建议非常实用,我按优先级重新整理一下。
第一优先级:先断攻击者登录能力
- 删除
authorized_keys中的攻击者公钥 - 修改被爆破账号密码
- 如果条件允许,立刻关闭 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_keys、crontab、/etc/profile.d/
十二、我从这次事件里学到的教训
如果要把这次事情压缩成一句提醒,那就是:
不要把“开着 SSH 密码登录”当成一件无所谓的小事。
很多时候我们觉得:
- “反正只是个小服务器”
- “密码我自己知道”
- “应该没人盯上我”
但自动化爆破根本不关心你是谁。 只要口子开着、密码不够强、没有额外防护,你就只是扫描器字典里的下一个目标。
更现实一点说:
- 攻击者不一定冲着你的业务来
- 他们可能只是需要一批能用的肉鸡
- 你的服务器一旦被拿下,就可能被用去打别人
到那时,损失不只是你自己机器上的数据,还可能包括:
- 带宽消耗
- 云厂商封禁
- IP 信誉受损
- 对外攻击带来的责任风险
十三、最后
这次复盘对我来说挺有警示意义。 最开始看只是“SSH 登录异常”,往后挖才发现已经是完整后门链路 + C2 在线 + 多层持久化 + 命令隐藏。
攻击手法不算新,但执行效率和自动化程度很高。 也正因为它“不新”,所以才更危险——因为说明这已经是被大量复用、很成熟的一套东西了。
如果你手里还有对公网开放 SSH 的机器,真的建议现在就去检查这几件事:
- 有没有还开着密码登录
- 密码是不是足够强
authorized_keys里有没有陌生公钥crontab、/etc/profile.d/、init.d里有没有奇怪文件- 有没有异常外连
很多安全问题,不是因为攻击者太强,而是因为系统默认地“太好进”。
Some information may be outdated