奇耻大辱,我的网站被挂马,服务器已沦陷三个月

0 阅读13分钟

我是野生码农,白天在项目部上班,晚上倒腾自己的小网站,最近在学网络安全课,养了一个跑在 Kali 里的 AI 军师。

8月16日这天,我打开自己网站的一个页面,浏览器直接跳到了一个带颜色的赌博界面。我关掉重开,页面又是正常的。再开,还是正常。好像刚才那一跳是我的幻觉。

不是幻觉。是我的服务器在跟我演戏,而且它已经被人占了三个月了。

那一跳,只跳给"猎物"看

我当时的第一反应是浏览器插件有问题。但直觉告诉我没这么简单,我右键打开了网页源码。

页面最底下躺着一段我看不懂的东西:eval(atob("IShmdW5jdGlvbigp...")),一长串乱码似的字符。这是 Base64 编码,一种把文本转成乱码的常见手法,本身不是病毒,但正常网页没必要把代码藏起来。

我看不懂,就把这段东西整个丢给了军师。

军师把乱码解开,又顺着里面的地址把第二段、第三段代码全拉了下来,然后告诉我:这是典型的搜索劫持黑产代码,而且藏得很讲究。它的触发条件是一串筛子:

  • 只跳手机,电脑访问一律放行
  • 只跳从百度、搜狗、360 这些搜索引擎点进来的人,直接输入网址的不跳
  • 只跳中国时区的访客
  • 同一台设备只跳一次,跳完就在浏览器里盖个章,再也不跳

看明白了吗?它不是随机发作,是在筛选猎物。我这个站长用自己的电脑、直接输网址访问,一辈子都看不到那一跳。能看到它的,全是从搜索引擎摸过来的普通访客。它在我网站里住了多久,就偷了我多久的流量。

军师还给了个判断:能在网页里塞这种东西,说明对方有网站目录的写权限,服务器大概率已经不只是"挂马"这么简单了。

上了服务器才发现,网页文件是干净的

我把服务器密码发给军师,它 SSH 登进去,先找到那个页面在硬盘上的文件。

文件是干净的。一个字都没被改过,修改时间停在 2024 年。

这就是这件事最贼的地方。恶意代码根本不在网页文件里,而是被写进了宝塔面板的 nginx 配置。nginx 是服务器上负责把网页递给访客的"传送带",它有个正经功能叫 sub_filter,可以在网页送出前替换内容。

攻击者把服务器上全部 16 个 PHP 配置文件都塞了一条恶意 sub_filter。于是每一个经过传送带的页面,都会被顺手贴上一段恶意脚本。

文件没动,杀毒扫文件扫不出来;改完还把配置文件的修改时间伪装成旧日期。但它漏了一样东西:系统里还有个"改动时间"(ctime)是伪装不了的。所有配置文件都在 8月15日早上 6 点 25 分被批量动过。时间精确到秒,一看就是脚本批量干的。

时间线拉出来,我后背有点凉

军师顺着日志往下挖,挖出来的东西比挂马严重得多:

时间发生了什么
5月22日系统里被创建了一个叫 linuxsafe 的账号,UID 0
5月25到26日一个陌生 IP 用我的 root 密码登录,还切换使用了这个后门账号
6月6日后门账号的密码被写进系统账号文件,做了加固
8月14日另一个陌生 IP 再次用 root 密码登录,连着登了 4 次
8月15日 06:2516 个 nginx 配置被批量篡改,挂马生效

UID 0 解释一下:Linux 系统里 root 的编号就是 0,把另一个账号也设成 0,等于在系统里藏了第二个 root,名字看着人畜无害,权限和我一样大。这个账号在我服务器里安安静静躺了 85 天。

也就是说,5月22日之前我的服务器就被打穿了。挂马只是顺手干的副业,人家早就在我家里配好了钥匙。

我的原话是:这是奇耻大辱!我的服务器竟然被人攻破好多次,而且5月份就沦陷了。

门到底是被怎么撬开的

这是我最关心的问题。军师给的答案有实锤的部分,也有推断的部分,我照原样说。

实锤:攻击者两次都是走 SSH 用 root 密码正大光明登录的。我的服务器 22 端口对公网开放,允许 root 密码登录,没装防爆破软件,失败登录记录里躺着全世界各地 IP 日日夜夜的尝试。

推断:我的 root 密码 12 位混合字符,靠暴力破解命中的概率极低。更可能的路径是我这台 Win11 本机出了问题,浏览器或者文本文件里保存的密码被窃密木马摸走了。这类木马专门干这个,偷浏览器存的所有密码、SSH 配置、剪贴板。我前几天刚上完网络安全课,算是用自己的服务器交了一次学费。

另外还顺手查出一个我根本不知道的暴露面:数据库 root 账号允许任意 IP 远程连接,密码是多年前设的一个弱口令,3306 端口一直对公网敞开。就算 SSH 没丢,数据库这扇门也早就是虚掩的。

一份不带感情的处置报告

以下内容为本次应急处置的客观记录,按执行顺序排列,凭据类信息已脱敏。

恶意代码清除。 对 16 个被篡改的 nginx 配置文件先行备份取证,随后移除全部恶意 sub_filter 指令,配置语法校验通过后重载服务。经服务器本机与外部网络双重验证,全站响应已无任何注入内容。

后门清除。 删除 UID 0 后门账号 linuxsafe,清理范围覆盖系统账号文件、密码影子文件、用户组文件及其 home 目录。排查未发现 webshell、恶意进程、恶意系统服务及异常 SSH 公钥。

凭据轮换。 服务器 root 密码、MySQL root 密码、mcms 数据库账号密码、宝塔面板密码全部更换为强随机密码。网站三个应用的数据库配置同步更新,业务功能经逐项验证正常。

暴露面收敛。 防火墙移除 MySQL 3306 端口的外网放行规则;部署 fail2ban 入侵防御软件,SSH 防爆破规则启用后数分钟内自动封禁 3 个爆破源 IP;宝塔面板升级至最新 LTS 版本。

入侵途径结论。 已确认通道为 SSH root 密码登录。首次得手时间早于 5月22日,具体途径因早期日志已轮转无法完全定论。综合判断,本机凭据泄露(窃密木马)可能性高于暴力破解。

残留风险声明。 root 级别沦陷持续近三个月,常规位置排查未见异常,但无法完全排除更深层的隐藏后门。标准处置建议是重装系统并迁移数据。同时,因怀疑本机存在窃密木马,全部新凭据须在本机确认干净后,于可信设备上再次轮换。

如果你也有台裸奔的服务器,照这个单子查一遍

这次踩坑最大的产出是这张自查清单,十条,每条都能直接抄:

  1. 用手机 UA 加百度 referrer 访问自己的网站,看会不会跳转(搜索劫持最常见的自检法)
  2. 宝塔用户直接搜:grep -r "sub_filter" /www/server/nginx/conf/,有结果又不是你加的,就是中招
  3. 查隐形 root:awk -F: '$3==0{print $1}' /etc/passwd,结果应该只有 root
  4. 查登录痕迹:last -i | head 和 lastlog,认一认里面的 IP 是不是你的
  5. 查 SSH 后门:cat /root/.ssh/authorized_keys,里面的公钥你认识几个
  6. 查定时任务:crontab -l 加上 /etc/cron.d/ 目录
  7. 查异常连接:ss -antp | grep ESTAB,看你认不认识的远程地址
  8. 数据库账号别用 root 直连业务,更不允许 root@'%' 这种任意来源登录
  9. 装个 fail2ban,SSH 裸奔在公网上,爆破是 24 小时不停的
  10. 发现中招先备份取证再清理,一上来就删文件,等于帮对方毁灭证据

最后一条单独说:密码不要存在浏览器里,尤其是服务器 root 密码。我这次最大的嫌疑就栽在这上面。

攻击者是谁?我把它的家底扒出来了

清完毒只是第一步。军师顺着恶意代码里的地址往下追,把这条黑产链完整跑了一遍,每一层都拿到了实锤。这条链分四层,层层分离,是专业团伙的打法:

  • 控制层:C2 域名 cdn.511a.co 和 api.511a.co,解析到香港 Dimension Network 机房的 103.68.175.59。注意这个地址:5月份攻破我服务器的攻击 IP 是 103.68.175.58,同一个网段,门牌号挨着。挂马的和远程控制的,是同一伙人,实锤。
  • 跳转层:pucdpqit.top:7878,负责筛选猎物、执行跳转。
  • 落地层:uasxjts.top 指向香港的 202.79.175.57,是最终的博彩站;备用域名 ndfvkylquutop.xyz 挂在捷克的 46.8.9.222/225/228,主域名一死就换备胎。
  • 客服层:博彩品牌 ssa17.com 和 kee96.com,接着一套在线客服系统,专门接待被劫持过去的"客户"。

8月份的攻击 IP 154.89.151.143 来自马来西亚 Cloudvalley,廉价 VPS,典型的一次性跳板。

还有两个价值极高的线索:这条链上埋着两个百度统计 ID(36783bbed18dfe5e6429f1dbfbedfaa4 和 60b9eff27f66975f19c6102404a3b350)。统计 ID 是团伙的资产指纹,拿去检索,能把这伙人挂过马的其他受害站关联出来。

最后说一个让人不安的细节:落地层域名全是挂马发生前 10 天内新注册的。这不是僵尸网络在吃老本,这是一个正在活跃运营、随时准备换壳的团伙。

还手:5 封举报信已经发出去了

扒完这一切,我的原话就两个字:干他。

军师当场把我拉住了。反打对方服务器,是刑法 285 条、286 条管的事,非法侵入、破坏计算机信息系统,那是把自己送进去的操作;就算不碰法律,平台审核也会先把这篇文章毙掉。被欺负了要还手,但手必须还得合法,还得比对方更疼。

合法的打法是打它的基础设施。域名是它花钱买的,服务器是它花钱租的,封掉一个,它就得掏钱重买一个。8月16日当天,5 封 abuse 举报邮件已经发出去了:

收件方举报对象诉求
NameSilo(域名注册商)域名 pucdpqit.top、uasxjts.top封停域名
NameCheap(域名注册商)域名 domenecentosl.xyz封停域名
GoDaddy(域名注册商)C2 域名 511a.co封停域名
Dimension Network(香港机房)IP 103.68.175.58/59,攻击源兼 C2 托管调查并关停服务
CTG Server(香港机房)IP 202.79.175.57,博彩落地站调查并关停服务

举报信附了完整的入侵时间线和取证记录。回执一般要 1 到 3 个工作日,域名封停后用 dig 复查解析状态,确认处置生效。这套四级链路只要被封掉一环,整条线就得报废重建。这才是还手的正招:用它唯一听得懂的语言,成本。

结尾

被欺负了,光生气没用。这次我的还手是三件事:

一是举报。5 封举报信直发注册商和机房,让它的域名和服务器一件件报废。 二是公开。攻击 IP、C2、跳转链、百度统计 ID 全部写在上面,见光就死,逼着它不断烧钱换壳。 三是成文。完整的排查处置过程写成这篇文章,让每个裸奔的站长都能照着自查,认出这伙人的手法。

然后是对三种读者说的话:

如果你是小白,服务器从来没查过:现在就去,照前面那张十条清单跑一遍,十分钟的事。 如果你是站长,在自己站里发现了上面任何一个 IOC:一起举报,举报到它换域名换到手软。 如果你是搞安全的大佬:两个百度统计 ID 和四级链路都给你了,欢迎继续挖这条链,也欢迎指正我溯源取证的不足,评论区或技术社区见。

搞安全的同行有句话:世界上只有两种服务器,被攻破过的,和还不知道自己被攻破过的。我的服务器当了 85 天第二种,现在它还手了。你的服务器,多久没查过了?

FAQ

问:怎么判断网站有没有被搜索劫持? 答:劫持代码一般只跳移动端加搜索引擎来源的访客。用浏览器开发者工具把手机 UA 和百度 referrer 都模拟上再访问,或者直接抓网页源码搜 eval、atob、iframe 这些关键词。文件干净不代表没事,这次恶意代码就藏在 nginx 配置里。

问:发现服务器被入侵,第一步做什么? 答:不是删文件,是取证。先把被篡改的文件、日志、账号列表原样备份下来,再动手清理。清理顺序是断入口(改密码、封端口)、清后门(账号、公钥、定时任务、配置)、验业务。顺序反了,证据没了,人还可能再进来。

问:密码全都改过了,为什么还建议重装系统? 答:root 权限在对方手里待了将近三个月,常规位置能查的都查了,但内核级的隐藏手段从系统内部是查不净的。这是应急响应的通行原则:被拿过 root 的机器不再可信。不重装是权衡之下的选择,不是风险清零。

我是野生码农,AI 实战派。自研 AI 本地知识库系统、AI 数字员工团队、软考 AI 备考系统、量化交易系统,全程公开复盘。

这个"AI 解密攻防"系列,从微信、钉钉、印象笔记、OPPO 便签、待办 App 一路拆过来,这是第七战:战场从本机软件换到了我自己的服务器,对手从"厂家藏的钥匙"换成了真正的黑产入侵者。

关注我,看真的。

野生码农 · 全网同名 · AI 数字员工实战复盘,数据只报实测