【网络安全】记录一次服务器被入侵的经历

网络安全

网络安全(Cybersecurity) 是指保护网络系统、硬件、软件及其中存储的数据,使其免受网络攻击、破坏、未经授权的访问或更改。

从更广义的角度来看,网络安全不仅仅是防止黑客入侵,它涵盖了从个人隐私保护到国家基础设施安全的方方面面。

1. 核心目标:CIA 三要素

在信息安全领域,网络安全通常围绕三个核心原则(即 CIA Triad)展开:

  • 机密性 (Confidentiality): 确保敏感信息只有被授权的人才能访问。例如:使用加密技术防止数据泄露。
  • 完整性 (Integrity): 确保数据在传输或存储过程中不被非法篡改。例如:通过数字签名验证文件是否被动过。
  • 可用性 (Availability): 确保授权用户在需要时能够可靠地访问系统和数据。例如:防御 DDoS 攻击以保证网站不瘫痪。

2. 网络安全的主要范畴

为了实现上述目标,网络安全被划分为多个子领域:

  • 基础设施安全: 保护电网、供水系统、医院等关键物理设施的数字化控制系统。
  • 网络防御: 使用防火墙、入侵检测系统(IDS)和 VPN 保护内部网络免受外部威胁。
  • 端点安全: 保护直接连接到网络的设备,如个人电脑、手机和服务器。
  • 云安全: 保护存储在云端(如 AWS、阿里云)的数据、应用和基础设施。
  • 应用安全: 在软件开发阶段修补漏洞(如 SQL 注入或缓冲区溢出),防止应用被利用。

3. 常见的网络威胁

了解“敌人”是谁,有助于更好地理解安全的重要性:

威胁类型 描述
恶意软件 (Malware) 包括病毒、蠕虫、特洛伊木马和勒索软件(Ransomware)。
网络钓鱼 (Phishing) 通过伪装成可信实体(如银行邮件)诱骗用户提供账户密码。
中间人攻击 (MitM) 攻击者在通信双方之间秘密拦截并篡改信息。
拒绝服务攻击 (DDoS) 通过海量流量冲垮目标服务器,使其无法提供服务。

4. 如何构建防御体系

对于开发者或高级用户来说,网络安全往往意味着一系列的技术实践:

  1. 加密(Encryption): 使用强大的算法(如 AES-256)对静态和动态数据进行加密。
  2. 身份验证与授权: 实施多因素认证(MFA)和“最小权限原则”(POLP)。
  3. 容器与沙盒: 在隔离环境中运行应用,防止单一服务被攻破后波及整个主机。
  4. 持续监控与审计: 记录系统日志并使用自动化工具检测异常活动。

网络安全是一个不断演化的“猫鼠游戏”。随着 AI 技术的发展,攻击手段正变得更加隐蔽,而防御手段也开始向自动化和主动化转型。下面记录着一场真实的入侵事件

网站背景

服务器是24年7月购入的,一开始使用的是Windows-Server-2012,上面运行了Apache(网站)、MySQL(数据库)、Gitea(代码仓库)和Cloudreve(网盘)等核心内容

2026年1月,因为升级服务以及为了方便备份,切换成了Linux Server,并使用Docker进行底层容器(应用)的部署

Docker部署有几个很大的优势

  • 第一个是安全性docker不会污染本机环境,而是将本机的部分文件映射到特定容器中的位置;类似一个小型的虚拟机,不过这个虚拟机没有自己的内核,和主机公用同一个内核:这个虚拟机只有需要运行的命令 - 我称之为最小命令虚拟机
  • 第二个是备份和重新部署的方便,正确填写docker-compose并部署docker后,只需将个人内容复制和docker-compose复制出来,在新的服务器上重新拉取容器即可完全恢复,数据库也一样
  • 第三个是配置环境的简易性,模块化的容器可以直接拉取特定的版本并部署,只需要写docker-compose即可

** 再往下看之前,请认真阅读网站部署的服务 **

  • Nginx-Proxy-Manager
  • Nginx + php
  • Node.js => 部署了Blog和部分静态网站
  • Cloudreve网盘
  • Gitea代码仓库
  • Flarum论坛
  • Microbin代码纸篓
  • Wiki滑稽社维基
  • Legacy老静态网站

网站异常

2026年2月24日,我收到了腾讯云发给我的主机恶意文件提示,提示我在某个容器中的/tmp文件夹中存在病毒rbot.x86_64 - 提示的很详细,这是一个后门病毒:Linux.Trojan.Gafgyt.Kjgl

由于是第一次在服务器端被植入病毒,毫无应对的经验,我手忙脚乱的把相关提示和网站上记录的部分日志发给AI,然后在搜索引擎上搜索了相应内容,发现该病毒有如下特征

  • 是一种专门针对Linux平台的特洛伊木马后门程序
  • 用于将受感染的机器(常为loT设备)加入僵尸网络,执行DDOS程序

按照网上的步骤操作并且经过我个人检查后,我自认为把病毒清除了(检查了所有进程、容器文件、ssh密钥和密码),于是我就没有多想,也没再管这个服务器,毕竟病毒都被清除了

值得注意的是,我在博客blog文件夹中发现了入侵者留下的一个rbot.x86_64,同时检查了一下docker-compose,发现我给了装博客的容器运行的权限,便推测入侵者是通过博客blog容器的某个CVE漏洞进行入侵。于是我停止了博客容器并删除了相关文件。这下总没有病毒了吧?

本想着能消停一会,结果没过几天就收到了腾讯云的主机恶意文件提示,这次是2026年2月28日,提示我在某个容器中的/tmp中存在normanmangusin - 提示该文件是另一个后门病毒:Linux.Backdoor.Agent.lcnw

变本加厉?忍不了。我果断停止了该服务器,使用之前备份过的数据进行了还原,重装了服务器系统,并为博客容器添加了只读限制,在28号当天重新上线了包括博客在内的所有容器。同时我为我的服务器添加了强力的防火墙,仅允许白名单IP访问NPM以及SSH的登陆端口。

梅开二度

2026年3月2日凌晨,我又双叒叕收到了来自腾讯云的主机安全警告,早上一睁眼就看到腾讯云给我发来的消息。由于没法及时处理,我只能先关闭服务器来防止病毒对服务器造成更大的损伤。

这次我打算仔细处理一遍。先把防火墙打开,仅允许本机的ip访问特定端口,然后将文件保存到本地

  • 先找日志。仔细过了一遍Nginx-Proxy-Manager的日志信息,发现了几个很可疑的ip访问,重点是giteacloudreve两个容器。
  • 排查容器。先排查的Gitea,立刻发现了问题。

注意到我的Gitea开放了用户注册,并未关闭GIT_HOOKS以及Webhooks。关注重点时间,2月24日第一次感染,3月2日第二次感染,而第一次和第二次感染前,我的Gitea内都有神秘用户注册

次数 注册时间 用户名 仓库内容
第一次 2.19 melbabaley884 4518bussiness-and-technology-consult:空仓库
第二次 3.1 yongp551981629 bussiness-and-technology-consult:空仓库

感染的时间也耐人寻味

  • 第一次感染是2月24日凌晨,而2月19日晚上19点入侵者最后一次修改仓库。我在2月23日晚上22点左右推送了一次hguard仓库的更新,随即24号凌晨被感染;
  • 第二次感染是3月2日凌晨2点,而3月1日入侵者注册了新的用户,并在3月2日凌晨3点最后一次修改仓库。还有一个发现:第二次感染的时候博客容器blog中并没有相应的病毒

看来确实是Gitea的问题。查阅资料发现GiteaHooks在某些情况下会触发反弹Shell的攻击。Hooks会关联如push等动作,在出现相应动作的时候触发入侵者设定的Hook关联脚本进行入侵。不过并不能确定入侵的具体链条,经过分析最大的可能性如下:

步骤 方式 目的
第一步 Gitea中注册新账号,推送恶意代码到Git 恶意代码中含有从某特定服务器下载二进制文件并执行的脚本
第二步 等待人为触发或通过主账户push指令触发 通过GitHooks执行下载脚本并运行
第三步 脚本自动运行,设置定时任务/etc/cron.d并自动寻找局域网,感染其他机器 后门病毒,感染局域网内其他机器,实现自我繁殖

至于之前所说的在blog博客容器中的那个病毒,因为第一次感染的时候查了运行rbot的父进程,显示是Docker-Blog,大概率是因为我一开始的Blog容器没有限制写入和运行权限(即没给:ro - ReadOnly),这样入侵者(或其脚本)检测到有更容易部署和调用恶意文件的容器,就直接在该容器中部署了。这就是为什么第一次检查进程的时候会推测是博客容器的问题。毕竟博客容器只是静态展示页面,没有交互,不需要写入以及执行,所以直接给:ro是最合理的处理方式。

再看看呢

就在我以为完美解决了问题的时候,腾讯云官网的一个CVE报告突然映入眼帘,是React的CVE漏洞

具体链接请点击此处

重点影响React 19.0, 19.1.0, 19.1.1, 19.2.0, Next.js 14, 15, 16; 以及部分组件react-server-dom-webpack, react-server-dom-parcel,react-server-dom-turbopack

妈的,破案了。查了一下,我用的博客完整的包含了上面的内容,哈哈。又查了一下,第二次感染的时候病毒也是出现在Blog容器中的/tmp文件夹(

于是果断换成了现在的这个静态博客。只能说Next.js有很便捷的地方,但是要承担更多的风险,静态网站的安全性是最高的。

解决方式

服务器

  • 1、重装服务器、设置新的密码或使用密钥
  • 2、只保留必要应用,重新编辑Docker-compose
  • 3、重置各种应用的容器映射文件夹,不采用备份文件
  • 4、重新设置数据库以及其他容器的账户、密码(与之前的不同)

防火墙

  • 1、根据日志记录设置黑名单、白名单,限制不同IP访问端口
  • 2、开放访问权限后,定时查看访问日志,将恶意扫描IP归入黑名单

容器

  • 1、缩紧容器权限,根据需求,对于不需要写入、执行的容器仅给予只读权限
  • 2、对部分容器进行“取消注册权限”的操作,防止恶意写入或执行
  • 3、针对日志问题,禁止黑客爬取commitblameGit相关的历史文件

事后复盘

部分异常

2025年9月份以来,就陆陆续续有人在我的Git中注册账号并创建类似这两次入侵的仓库,只不过当时因为我的服务器还是Windows-Server,所以这些仓库并未能够成功入侵。

处理方式

在遇到未知原因引起的服务器主机安全提示时,应该首先关闭所有IP地址的访问权限,仅开放本机的SSH登录权限(或者直接在服务器运营商的终端进行操作)。然后对于特定的进程,首先调查进程的父进程,其次找到所有有病毒的位置完整清理。

当然最好肯定是重置系统。保存好所有的文件内容并重置系统,注意这里保存文件内容并非是为了备份,而是为了分析入侵者的进攻方式,真正的备份应该随时进行,而不应该等到被进攻之后再进行。牢记备份的重要性。重置完系统记得修改所有相关密码,并且重新拉取容器,不要复用被入侵后的文件,而是复用提前备份过的数据。

日志展示

主要展示部分IP对我的服务器进行的扫描日志:未处理IP地址

[05/Mar/2026:02:39:15 +0000] - 200 200 - GET https huajishe.fun "/git/e2hang/Data-Structure/src/commit/b84c3ba78354def6002ec52905a42c247ba3f676/Data-Structure/Matrix/main.cpp" [Client 119.1.188.251] [Length 12390] [Gzip -] [Sent-to huajishe] "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36" "https://huajishe.fun/git/e2hang/Data-Structure/src/commit/b84c3ba78354def6002ec52905a42c247ba3f676/Data-Structure/Matrix"
[05/Mar/2026:02:39:15 +0000] - 200 200 - GET https huajishe.fun "/git/e2hang/Data-Structure/src/commit/721e46be6c1f9865a7bb055b01098247622bef9d/Algorithm/Bit" [Client 115.204.164.170] [Length 9207] [Gzip -] [Sent-to huajishe] "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36" "https://huajishe.fun/"
[05/Mar/2026:02:40:18 +0000] - 200 200 - GET https huajishe.fun "/git/e2hang/Data-Structure/raw/commit/023973b5a10ba8fdf74de19af120ba06e69e0b5e/LinearList/skipList/skipList%E8%B7%B3%E8%A1%A8" [Client 49.69.135.226] [Length 0] [Gzip -] [Sent-to huajishe] "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36" "https://huajishe.fun/git/e2hang/Data-Structure/src/commit/023973b5a10ba8fdf74de19af120ba06e69e0b5e/LinearList/skipList/skipList%E8%B7%B3%E8%A1%A8"

这是某些扫描引擎在对我的Git里面的更改记录进行扫描,主要是/commit/blame,特点就是短期大量访问,且访问内容不正常。

[05/Mar/2026:02:24:59 +0000] - 200 200 - GET https huajishe.fun "/git/e2hang/Literature/src/commit/5efdb0d85eca21396636e70aaeb1be5836b3f9b0/%E7%94%9F%E6%88%90%E5%BC%8FAI/Ho%20et%20al.,%202020.%20Denoising%20Diffusion%20Probabilistic%20Models.pdf" [Client 52.230.164.189] [Length 9909] [Gzip -] [Sent-to huajishe] "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot" "-"
[05/Mar/2026:02:41:42 +0000] - - 502 - GET https huajishe.fun "/robots.txt" [Client 66.249.77.102] [Length 154] [Gzip -] [Sent-to huajishe] "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" "-"
[05/Mar/2026:02:47:14 +0000] - - 502 - GET https huajishe.fun "/robots.txt" [Client 54.36.60.45] [Length 154] [Gzip -] [Sent-to huajishe] "Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)" "-"

这是Google和OpenAI的扫描引擎,Google扫的是/robot.txt,OpenAI扫的是我Git里面存的文献 ()

经验教训

  • 1、及时备份,及时备份,及时备份
  • 2、日志至关重要,它可以记录完整的访问、操作信息,可以让维护者简单快捷地定位错误
  • 3、防火墙可以有效阻止入侵和恶意扫描
  • 4、Git中只应放置代码相关内容,统一清理Git中带有可执行文件,隐私信息的内容
  • 5、容器只给予必要的权限,不给任何多余权限