ssh私钥泄露靶场

靶场镜像:链接: https://pan.baidu.com/s/1xfKILyIzELi_ZgUw4aXT7w 提取码: 59g0

直接导入虚拟机

image-20250915210828581

这里我们不知道账号密码 也没办法查看ip 所以通过另一台kali虚拟机中的工具探测同网段的ip

ip addr查看ip

image-20250916081742538

1
netdiscover -r 192.168.198.0

image-20250916082117269

知道靶场的ip之后进行nmap扫描查看开放的端口

1
nmap -sV 192.168.198.135 

image-20250916082949092

可以看到在这个把厂商开放的端口和对应服务

这里开启了ssh服务和两个http服务

分析特殊端口

一个80端口一个31337端口

image-20250916083449503

直接访问无事发生

所以知道端口之后我们用drrb暴力破解目录(dirb比较快)

image-20250916083719018

可以看到有两个敏感文件 我们先尝试访问robots.txt爬虫文件

robots.txt(位于站点根目录,如 https://example.com/robots.txt)是网站给搜索引擎爬虫(robots / crawlers)的一份礼貌性指令文件,告诉爬虫哪些路径可以抓取、哪些路径请跳过。

image-20250916083924979

前面两个都是一些配置文件 所以我们把重点放在taxes

image-20250916094946214

私钥泄露

访问ssh目录

image-20250916095605962

这个是rsa的私钥和公钥信息

id_rsa

私钥:

任何持有这个文件的人都能(在配套公钥已被放到目标 authorized_keys 时)作为该用户登录目标主机。

id_rsa.pub

对应的公钥:

可以公开分发的,用来放到远程主机的 ~/.ssh/authorized_keys 中以允许对应私钥免密登录。

authorized_keys

存在于远程账号的 ~/.ssh/authorized_keys,文件内每一行是一把允许登录该账号的公钥(可以有选项限制该 key 的权限

所以我们先选择查看一下公钥

访问http://192.168.198.135:31337/.ssh/id_rsa.pub

下载

image-20250916100937405

image-20250916100850627

拿到用户名

然后我们下载私钥看一下

image-20250916101302265

发现这是被加密保护的私钥

Proc-Type: 4,ENCRYPTED表示它需要口令才能解密使用

回到kali

image-20250916105218585

记得登陆前看一下是否可以读写

image-20250916110551188

可以的

下一步我们尝试登录

1
ssh -i id_rsa用户名@主机名

ssh:安全远程登录命令。

-i id_rsa:指定要使用的私钥文件(默认是 ~/.ssh/id_rsa,这里强制用当前目录下的 id_rsa)。

用户名:你要登录远程主机的账号 这里就是我们刚刚拿到的用户名。

@主机名:远程主机的地址

1
ssh -i id_rsa simon@192.168.198.135 

image-20250916112120290

这里下一步是修改权限为600

可以看到原来的权限是这样的

1
-rw-r--r--   (= 644)

拥有者:可读写

群组:可读

其他用户:可读

我们要修改为600

1
-rw-------   (= 600)

拥有者:可读写

群组:无权限

其他用户:无权限

为什么 SSH 要求 600?

OpenSSH 在加载私钥时会检查文件的权限,如果不是“只有文件拥有者能读写”,就会拒绝使用,报错类似:

1
2
3
4
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'id_rsa' are too open.

修改私钥权限

1
chmod 600 id_rsa

image-20250916115427816

密钥信息破解

这里我们对私钥信息进行破解,首先使用ssh2john将id_isa密钥信息转换成john可识别的信息 ssh2john id_isa > isacrack 然后利用字典进行逐步解密,这时候用zcat 来将字典读取通过管道符 传入john 来解密

具体实现步骤

1
ssh2john id_rsa > isacrack

使用 ssh2john 工具将私钥文件转换为 john 可识别的格式

这个命令会读取id_isa私钥文件,将其转换为适合 john 破解的哈希格式,并保存到isacrack文件中。

1
zcat /usr/share/wordlists/rockyou.txt.gz | john --pipe isacrack

使用 zcat 读取压缩的字典文件,并通过管道传递给 john 进行破解

破解结果如图

image-20250916133937254

成功得到密码为starwars

然后我们回到靶场进行登录

image-20250916134109332

成功登录

image-20250916134528869

大概尝试一些命令寻找有用文件

可以看到root目录下有flag.txt

查看一下

image-20250916134608292

果然 没权限不让我们读

image-20250916175915089

根据这个我们可以看出来

flag.txt属主和属组都是root,且权限为 -rw-------,只有 root 用户能读。当前用户是 simon

然后这有个c语言源文件 看一下试试

image-20250916180202044

这里有flag2

gets函数的缓冲区溢出漏洞

代码中定义了char name[10];的缓冲区,却使用gets(name);读取输入 ——gets函数不会检查输入长度,当输入超过 10 个字符时,会导致缓冲区溢出,覆盖栈内存中的其他数据。

程序逻辑中存在对name的判断(比较前 5 个字符是否为 “Simon”),若满足条件会执行/usr/local/sbin/message程序。

image-20250916180826995

执行一下看看

下一步试着更多输入使其移除

(缓冲区溢出漏洞 + SUID 权限滥用)

image-20250916181142769

前二十位是我们填充的 超出的部分就是root权限的目录路径

原理:

缓冲区溢出覆盖了程序执行流程中关键的内存数据

我们输入的目录路径是可执行的 shell 路径,结合溢出覆盖的逻辑,可能发生了两种情况

1.覆盖返回地址到system函数

2.覆盖程序内的判断逻辑

得到三个flag 完成