主力服务器遭遇黑客入侵勒索

主力服务器遭遇黑客入侵勒索
Longans1. 前言
- 昨天晚上10点钟(2026.05.09; 22:00;UTC+08),突然发现部署在洛杉矶服务器的所有网站网络都连接不上,部署的探针网站也挂了。赶紧通过SSH进去看一眼,发现docker都停止了。docker目录下的
compose.yml都被加了.locked后缀,打开全是乱码。 - 一开始以为是自己中午用了
docker image prune -a清理不用的镜像缓存导致的。后来发现并不是,/root目录下非compose.yml的文件也被加上了.locked后缀,打开也全是乱码。 - 难道是系统突然重启导致文件被锁?
一开始没头绪还问了AI。
2. 水落石出
- 带着疑惑用
SFTP工具一个个翻看文件,突然发现/root路径下多了一个名字为还原你的数据.txt文件。 - 注意时间戳是一个小时前的晚上
8:43PM(新加坡标准时间,UTC+08)。
赶紧远程下载txt文件到电脑本地查看(一时心急,错误示范),发现黑客留下一串加密货币BTC地址。在不确定txt文件安全性的情况下,不要乱下载别人文件,而是在服务器用
cat指令查看。
按照当时汇率,0.000002BTC相当于1人民币。
伤害不大,侮辱性极强。至此原因确定了——服务器被黑客入侵勒索了。
然而我并没有急着重装系统,而是先排查入侵的漏洞。(
最后也没完全确定原因。)
3. 查找原因
3.1 ssh入侵日志
- 在服务器终端输入
last指令,查看ssh登录记录。发现我是晚上22:19进去ssh排查原因的,多了一个陌生的ip——66.42.99.107。黑客在22:07还连进去了。 - 黑客的ip是
66.42.99.107,在20:30到22:15之间进行了多达3次的成功连接,每次连接时间都在10分钟左右。
1 | root@MEGABOX-PRO# last |
- 到公开的数据库网站查看ip的归属,发现是vultr服务商的洛杉矶ip,
ASN20473。(估计要被abuse封号)
- 紧接着用
grep "Accepted" /var/log/auth.log指令查看登录的具体方式。
1 |
|
- 我服务器配置了密钥+谷歌验证器的双重验证登录,但是看SSH记录:
1 | 20:10:35 |
- 在上面日志里面,每次成功登录都有两条记录keyboard-interactive/pam → 密码或系统认证通过;pam_google_authenticator → 二步验证通过。
- 紧接着查看
66.42.99.107的尝试记录。
1 | root@MEGABOX-PRO:~# grep "66.42.99.107" /var/log/auth.log |
| 时间戳 | 日志内容 | 解释 / 攻击行为 |
|---|---|---|
| 2026-05-09T19:51:57 | Connection closed by 66.42.99.107 port 59866 [preauth] | 攻击者首次尝试连接 SSH,未通过认证(preauth 阶段关闭连接) |
| 2026-05-09T19:52:32 | Connection closed by 66.42.99.107 port 43996 [preauth] | 攻击者继续尝试连接 SSH,仍未成功 |
| 2026-05-09T20:03:25 | Connection closed by authenticating user root 66.42.99.107 port 43244 [preauth] | 攻击者尝试以 root 登录,连接中断,PAM 或密码验证失败 |
| 2026-05-09T20:04:55 | error: PAM: Authentication failure for root from 66.42.99.107 | PAM 验证失败,攻击者未通过两步验证或系统密码 |
| 2026-05-09T20:05:01 | error: PAM: Authentication failure for root from 66.42.99.107 | 攻击者重复尝试 PAM 验证,仍未成功 |
| 2026-05-09T20:10:35 | Accepted keyboard-interactive/pam for root from 66.42.99.107 port 49414 ssh2 | 关键事件:PAM 认证成功,攻击者可能利用系统漏洞或已存在 root shell |
| 2026-05-09T20:10:35 | Accepted google_authenticator for root | PAM 模块触发 Google Authenticator 验证,也可能通过 root shell 绕过 |
| 2026-05-09T20:12:03 | Accepted keyboard-interactive/pam for root from 66.42.99.107 port 55918 ssh2 | 攻击者进行第二次成功 SSH 登录,可能已经写入自己的 authorized_keys |
| 2026-05-09T20:30:53 | error: PAM: Authentication failure for root from 66.42.99.107 | 攻击者尝试新连接失败,测试其他端口或用户 |
| 2026-05-09T20:30:54 | error: Received disconnect from 66.42.99.107 port 51380:3: com.gV … [preauth] | SSH 连接断开 |
| 2026-05-09T20:30:54 | Disconnected from authenticating user root 66.42.99.107 port 51380 [preauth] | SSH session 终止 |
| 2026-05-09T20:31:27 | Accepted keyboard-interactive/pam for root from 66.42.99.107 port 38662 ssh2 | 再次成功登录,攻击者保持持久化访问 |
| 2026-05-09T20:43:48 | Accepted keyboard-interactive/pam for root from 66.42.99.107 port 35062 ssh2 | 持续验证访问,说明 authorized_keys 已写入或 shell 持续存在 |
| 2026-05-09T22:07:05 | error: PAM: Authentication failure for root from 66.42.99.107 | 尝试失败,可能使用不同 session 或连接已被删除 |
| 2026-05-09T22:07:06 | error: Received disconnect from 66.42.99.107 port 41380:3: com.gV … [preauth] | SSH 断开 |
| 2026-05-09T22:07:06 | Disconnected from authenticating user root 66.42.99.107 port 41380 [preauth] | SSH session 终止 |
| 2026-05-09T22:07:30 | Accepted keyboard-interactive/pam for root from 66.42.99.107 port 34864 ssh2 | 攻击者成功登录,持久化访问仍然可用 |
3.2 检查本地的ssh认证配置
- 查看
SSH配置文件和google认证器配置文件:
1 | root@MEGABOX-PRO:~# cat /etc/ssh/sshd_config |
- 配置解读:
- PubkeyAuthentication yes → 支持密钥登录
- AuthenticationMethods publickey,keyboard-interactive → 理论上要求“公钥 + PAM/键盘交互认证” #AuthenticationMethods publickey,keyboard-interactive (指定登录顺序:先验证SSH密钥的密码短语,再验证TOTP验证码,顺序别搞反)
- PasswordAuthentication no → 禁止直接用密码登录
- UsePAM yes → SSH 认证会调用 PAM
- PermitRootLogin yes → root 可以登录
- Port 6902 → 自定义端口,不是默认 22
- ChallengeResponseAuthentication yes (必须打开,TOTP属于挑战响应式认证)
- SSH 理论上要求 公钥 + 谷歌动态验证码PAM(keyboard-interactive)。
- 检查谷歌两步认证的配置:
1 | root@MEGABOX-PRO:~# cat /etc/pam.d/sshd |
- @include common-auth这一行,我在前面加#注释掉了它(因为我们不需要系统密码验证,只留密钥+TOTP谷歌两步认证)
- 服务器原先安装了
Fail2Ban,但是黑客失败次数没有达到封禁的次数门槛——5次。(黑客似乎一开始就有正确的密钥+TOTP谷歌认证?) 到此,SSH的配置似乎并没有问题,给AI看了也说不出所以然来。
4.可能的漏洞。
- 攻击路径推演——他们是怎么凑齐两把钥匙的?即密钥+谷歌动态验证码TOTP。
- 既然必须同时具备“私钥”和“Google 动态码”才能登录,攻击者的入侵路径基本可以锁定在以下两种情况:
4.1 路径 A:服务器“内鬼”式入侵(概率最高)
服务器在 20:10 之前,已经通过其他非 SSH 途径(例如 Web 漏洞、宝塔面板漏洞、MySQL 弱口令等)被植入了 WebShell(网页后门)。
PS:我这段时间确实在这个服务器反复安装并卸载了一大堆新奇的“玩具”项目。
攻击者通过网页后门,读取了私钥以及/root/.google_authenticator 文件,拿到了动态密码的种子。
攻击者通过网页后门,将自己的 SSH 公钥偷偷追加到了 /root/.ssh/authorized_keys 文件中。
随后,攻击者用自己的私钥 + 算出来的 Google 验证码,正大光明地通过 SSH 客户端(如 FinalShell)登录了你的服务器。
4.2 路径 B:客户端全面失陷(魔幻推测)
平时用来连接服务器的个人电脑中了木马(例如运行了带有恶意代码的破解软件、不知名的脚本等)。
木马窃取了电脑 ~/.ssh/ 目录下的私钥文件(如 id_rsa)。
个人倾向版本A,更多证据见5.2分析。😭
5. 黑客入侵后干了什么?
- 除了第一小节说的,黑客除了把重要数据文件被加密打上了
.locked后缀,以及留下勒索的信外,还有以下操作。
5.1获取数据库等重要密码
通过查看bash的历史输入指令
1 | cat /root/.bash_history |
- 黑客输入了以下历史指令,不排除没有被服务器日志记录的。
1 | lscpu |
lscpu指令:查看 CPU 架构和性能。看性能适不适合挖矿?docker ps指令:列出当前运行的 Docker 容器,黑客用来发现应用和数据库服务。docker inspect ezbookkeeping | grep -iE 'USER|PASS|ADMIN'指令:查看 ezbookkeeping 容器配置,并筛选出用户名、密码或管理员信息。(ezbookkeeping是我用来记账的数据库。)docker exec -it ezbookkeeping-mysql mysql -uezbookkeeping -pezbookkeeping指令:进入容器内的 MySQL 数据库,使用明文用户名和密码访问数据。(记账的数据库的密码。)1pctl user-info:查看 1Panel 面板的用户信息。cat /opt/1panel/conf/settings.conf:查看 1Panel 面板的配置文件,包含数据库或管理员密码。1pctl user-info --show:显示完整用户信息,包括敏感字段。1pctl echo password:尝试直接显示面板密码。1pctl user-info | grep "面板密码" -A 1:搜索 1Panel 面板中标记为“面板密码”的字段,并显示下一行内容(密码)。find / -name "1Panel.db":搜索整个系统,查找面板数据库文件1Panel.db。sqlite3 /opt/1panel/db/1Panel.db "SELECT * FROM settings WHERE key = 'password';":使用 SQLite 读取面板数据库中密码字段的明文或加密值。python3 encrypt.py:运行黑客准备的 Python 脚本,用于解密面板或数据库加密密码。
后面的
pycryptodome加密相关内容可能是为了给我本地文件随机加密打上.locked后缀pip3 install pycryptodome:安装 Python 的加密库pycryptodome。python3 -m pip install pycryptodome:同上,通过 Python 模块方式安装pycryptodome。sudo apt install python3-pip:安装 Python 的包管理器pip,用于后续安装解密库。pip3 install pycryptodome:再次安装pycryptodome,确保环境中存在加密库。python3 -m venv .venv:创建 Python 虚拟环境.venv,隔离运行解密脚本所需的依赖。apt install python3.11-venv:安装 Python venv 模块,支持创建虚拟环境。python3 -m venv .venv:再次创建虚拟环境。source .venv/bin/activate:激活虚拟环境,确保接下来的 Python 命令在隔离环境中执行。pip install pycryptodome:在虚拟环境中安装加密库pycryptodome。python encrypt.py:运行解密脚本,将面板或数据库加密。deactivate:退出 Python 虚拟环境。export LANG="en_US";export LANGUAGE="en_US";export LC_ALL="en_US":将系统语言设置为英文,方便脚本解析命令输出。top:查看系统当前进程和资源使用情况。docker stop $(docker ps -aq):停止所有 Docker 容器,可能用于破坏服务。提醒我上号看留下的还原你的数据.txt文件,然后交赎金。
5.2 黑客给自己“配”了一把大门钥匙
- 查看本地公钥保存的路径。
1 | root@MEGABOX-PRO:~# ls -l /root/.ssh |
- 攻击者在 20:10 登录成功后,仅仅花了 4 分钟熟悉环境,在 20:14 将他们自己的 SSH 公钥写入了你的 authorized_keys 文件中,留下了持久化后门。
1 | -rw------- 1 root root 668 May 9 20:14 authorized_keys |
- 权限完全裸奔的私钥。当初在服务器生成的私钥和公钥,结果忘记删除了,**把私钥留在了服务器。
1 | -rw-r--r-- 1 root root 2602 Apr 22 11:50 id_rsa |
- 结合之前的 sshd_config(要求同时具备私钥 + Google 验证码),黑客的入侵手法已经
100%清晰了:
第一步(信息窃取):服务器上大概率存在某个 Web 服务漏洞(例如:任意文件读取漏洞、目录遍历漏洞,或者某个面板的漏洞)。因为 id_rsa 是所有人可读的,黑客通过这个 Web 漏洞,直接打包下载了 /root/.ssh/id_rsa 和 /root/.google_authenticator。
第二步(组合钥匙): 黑客在自己的电脑上,将偷来的 id_rsa 权限改为 600 绕过本地客户端限制,并将其导入;同时用偷来的 Google 密钥种子在手机上绑定了你的动态密码。
第三步(大摇大摆登录): 20:10:35,黑客使用组合好的“双重钥匙”成功登录服务器。
第四步(巩固后门): 20:14,黑客为了防止被发现后删掉旧私钥,立刻把自己的公钥塞进了你的 authorized_keys 文件里。
- 查看黑客的自己公钥:
1 | root@MEGABOX-PRO:~# cat /root/.ssh/authorized_keys |
- 黑客在 20:14 写入了这第二行公钥(ED25519算法)。
为了防止我查日志时觉得刺眼,他们故意在自己公钥的末尾伪造了root@MEGABOX-PRO 这个后缀?。
6. 后续处理
6.1 服务器处理
- 我服务器没有重要的数据,没什么好说——销毁现有数据并重装系统。
- 重置所有网站的管理员密码。
- 重置所有网站记录的api token。
- 重置一切节点UUID。
6.2 吃一堑长一智
不要乱下载。
禁止使用来路不明的一键脚本;
及时更新有漏洞的程序;
“玩具”项目别在主力服务器折腾;
服务器只允许特定ip登录。
1 | nano /etc/ssh/sshd_config |
- 粘贴如下内容
1 | AllowUsers ubuntu@1.1.1.1 root@8.8.8.8 |
ubuntu@1.1.1.1 → 允许用户名为 ubuntu 的用户从 IP 1.1.1.1 登录。
root@8.8.8.8 → 允许用户名为 root 的用户从 IP 8.8.8.8 登录。
除了1.1.1.1和8.8.8.8外,其他ip会被禁止。
我只允许自己服务器ip登录。把自己锁门外我也认了——通过服务器提供商救援模式登录
正确生成私钥和公钥。
在本地离线生成密钥对!
在本地离线生成密钥对!
在本地离线生成密钥对!
不要在服务器生成密钥。
不要在服务器生成密钥。
不要在服务器生成密钥。
密钥对生成,在本地Windows打开
CMD面板,输入:
1 | ssh-keygen -t ed25519 -C "your_email@example.com" |
- Windows提示下面内容,输入保存密钥对的路径。
1 | Enter file in which to save the key (C:\Users\XXX/.ssh/id_ed25519): |
- 输入路径后,Windows会提示输入一个密码,用于客户端解密私钥用。
1 | Enter passphrase (empty for no passphrase): |
- 只有会提示生成成功。
1 | C:\Users\abc>ssh-keygen -t ed25519 -C "your_email@example.co |
- 将公钥
public key上传到服务器/root/.ssh路径,公钥后缀一般是.pub,假如公钥名字是id_rsa.pub。 - 不要把私钥上传到服务器!不要把私钥上传到服务器!不要把私钥上传到服务器!
- 将公钥内容追加到授权文件(替换下面的公钥内容)
1 | cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys #更改成自己的公钥名字。 |
- 设置正确的权限,
600表示只有root用户能改该文件,防止被乱加公钥进去。 600权限为仅允许所有者读、写;700权限为仅允许所有者读、写、执行/进入目录。
1 | r = 4 |
1 | chmod 700 /root/.ssh/ |
1 | chmod 600 /root/.ssh/id_rsa.pub #改成自己的公钥名字 |
- 修改ssh配置,禁止密码登录。
1 | /etc/ssh/sshd_config |
- 将配置里面内容修改成如下:
1 | Port 6666 #ssh端口,改成非22 |
- 修改完后在英文输入法下,按
ctl+x,输入y回车进行保存并退出。 - 重启
SSH
1 | systemctl restart ssh |
妥善保存私钥,这是大门的”钥匙”。
禁止ping
禁PING的意思是:不允许电脑、设备或服务器使用PING功能。一般情况下电脑、防火墙、服务器都是允许PING功能的,不需要特别设置不禁止PING,但是远程的服务器(比如某个网站会禁止PING功能也是根据自己业务的属性来去选择)
服务器禁ping的好处与坏处。好处:一定程度上在互联网上隐藏自己防止一些批量扫描软件探测主机,减少被入侵的几率
坏处:无法使用常用的ping或者监控软件来检测站点是否正常,服务器是否在线,当别人PING用户的时候会耗费用户的连接资源。
永久禁Ping:
1 | nano /etc/sysctl.conf |
- 在末尾添加
1 | net.ipv4.icmp_echo_ignore_all = 1 # 0表示允许,1表示禁止 |
- 然后执行:
1 | sysctl -p |
- 安装fail2ban
- fail2ban是一款入侵防御软件,启动后会通过检测系统行为日志识别暴力破解行为,对于在短时间内多次未能通过身份验证的请求,fail2ban会自动调用系统自带的防火墙或包管理框架(如iptables或tcp wrapper等)进行封禁。
- 一行行粘贴执行下面指令:
1 | sudo apt-get update #更新软件源 |
- 用任意文本编辑器打开 /etc/fail2ban/jail.local
1 | nano /etc/fail2ban/jail.local |
- 在文件填写如下内容:
1 | [sshd] |
- 重启并查看fail2ban运行状态。
1 | sudo systemctl restart fail2ban |
- 查看当前封禁IP:
1 | sudo fail2ban-client status sshd |
- 解禁某一IP:
1 | sudo fail2ban-client set sshd unbanip 1.1.1.1 |
- 封禁某一IP:
1 | sudo fail2ban-client set sshd banip 66.42.99.107 |
安装komari等探针时,勾选禁止远程控制:
docker等compose的配置,不要把端口暴露在公网:
只允许通过本地
127.0.0.1反代访问。例如原始的
compose.yml关于端口部分:
1 | ports: |
- 上面配置,在公网可以通过
ip:端口直接访问,容易被绕过Cloudflare的域名防御。修改为下面配置:
1 | ports: |
- 通过
1panel等反代127.0.0.1:5120进行访问,ip:端口的路径被堵死。


















