CTF夺旗训练日记--SSH私钥泄露

环境配置:VM-Workstation 15pro
直接将镜像压缩包拖到vm虚拟机的列表中
在这里插入图片描述在这里插入图片描述
选取路径保存系统镜像
在这里插入图片描述
然后就可以启动开始渗透了
在这里插入图片描述这里用的是nat模式
在这里插入图片描述先进行主机发现
netdiscover -r 192.168.133.0/24
在这里插入图片描述成功发现一个ip地址为 192.168.133.129 的靶机
查看开放的端口
nmap -sV 192.168.133.129
在这里插入图片描述用dirb探测网站的隐藏文件
dirb是kali内置的一个爆破目录的工具用法就是
dirb http://ip:port/
在这里插入图片描述
我们访问下31337这个端口下的robots.txt这个文件
发现有些目录给我们写出来了
我们继续访问下这些目录
在这里插入图片描述然后第一个flag就到手了
在这里插入图片描述剩下的两个访问时会让你下载文件,打开是一些代码,先放在一边
在访问下.ssh这个目录
在这里插入图片描述发现是rsa有关的加密,id_rsa是私钥,authorized_keys是认证关键字,id_rsa.pub是公钥
这里就涉及到linux中不用密码登陆ssh的知识

假设由两个机器A、B
要达到的目的:A机器ssh登陆B机器不需要登陆密码
1.登陆A机器
2.ssh-keygen -t [rsa|dsa] ,将会生成公钥和私钥文件
3.将.pub复制到B机器的.ssh目录下,并 cat id_dsa.pub >> ~/.ssh/authorized_keys
这样登陆ssh登陆B机器就不需要密码了

大概原理就是这样,我们接着上面的目录,访问id_rsa和authorized_keys可以得到两个文件
下载下来,对id_rsa赋权限
chmod 600 id_rsa
查看文件权限
ls -alh id_rsa
在这里插入图片描述然后用ssh命令登陆,登陆的用户名我们可以在另一个文件中找到
在这里插入图片描述ssh -i 私钥文件 用户名@IP地址
在这里插入图片描述发现需要我们输入密码
事实上我们有了私钥文件就可以破解密码
首先用ssh2john将私钥转换成john可以识别的文件
在这里插入图片描述在这里插入图片描述再用john破解密码
在这里插入图片描述用这个密码登陆ssh
在这里插入图片描述ls 查看当前目录下有什么文件或者子目录
我们先去到根目录下看看有什么文件目录
在这里插入图片描述对于每一个系统无疑是拿到root权限最好了,所以我们看看这里面有什么
在这里插入图片描述由两个文件,看看是什么
在这里插入图片描述flag.txt没有权限,我们看看有哪些文件可以执行
输入 find / -perm -4000 2>/dev/null
find就是查找命令
/从根目录下查找
-perm权限
-4000 表示可以以root身份执行的文件
2>/dev/null 2是linux系统中输出的描述字符,表示错误的输出,这样的字符还有1,0分别表示标准输出和标准输入
/dev/null是一个特殊的设备文件,这个文件接收到的任何数据都会被丢弃
在这里插入图片描述我们发现 /usr/local/bin/read_message这个程序和我们刚刚root目录下的read_message.c出奇的相似
那么这肯定就是运行的程序了

我们看回代码
刚好发现flag2,这是一段C代码,数组没什么好说的
看到if语句,strncmp是判断buf和authorized前5个字符是不是不相等
再加个感叹号,就是相等时执行if语句中的代码
在这里插入图片描述我们去刚刚发现的程序那里执行下,从代码知道我们输入的字符串要是Simon
在这里插入图片描述确实执行了if语句的代码,但是要怎么实施攻击呢?
我们看到buf有长度限制,如果我们输入的长度比限制还长,使其溢出,在溢出的部分就能实施攻击了吧
我们输入超过20个字符

(不用数了15个a)
我们发现了#号!(在linux中#号意味着root权限)
在这里插入图片描述我们成功提权了,再去看看flag.txt文件
在这里插入图片描述找到了最后一个flag
但估计还有很多人不明白为什么刚刚输入很多小a的字符串可以攻击成功
这种攻击叫做栈溢出攻击(原理需要亿点点汇编的知识)
我们知道栈是一种后入先出的数据结构
在电脑执行过程的调用的时候就是用栈来管理的,这里的过程就是函数,方法
在执行的时候难免要调用其他过程
这时候就是执行 call 地址 来去到调用的程序
这个调用的过程执行完了就执行 ret 回到原来的程序,不需要加上地址
原因就是栈在执行call指令的时候已经自动的将call的下一条指令加入到栈中
我们把这个地址叫做返回地址
执行ret的时候自动从栈中取回返回地址,使程序继续往下执行

那么跟上面的溢出攻击有什么关系呢?我们继续看
有这么一段C代码

void main(int argc, char *argv[]) {
    char buffer[8];
    if(argc > 1) strcpy(buffer, argv[1]);
    printf("%s\n", buffer);
}

画到栈里面大概就是这样
在这里插入图片描述如果我们传递的argv[]参数超过8个长度就会破坏后面的地址
就像题目中多出来的 /bin/sh 这个字符串占的位置大概就是返回地址的位置
在这里插入图片描述我们知道linux中的每一个命令都有相应的文件存在,可以说这个文件就相当于命令
那么为什么/bin/sh就被当作命令执行了呢,为什么多出来的/bin/sh就可以执行?

这是因为,在冯·诺伊曼架构的计算机中,数据和代码是不加以区分的
也就是说,任何数据在内存中,都可以看作是一个程序的数据,或者当作一串代码来执行
因此我们将/bin/sh覆盖掉返回地址,在执行ret时来执行我们的/bin/sh,执行ret的过程也就是相当于执行一串代码的过程


如果还有不懂的地方可以关注我的公众号“沉淀Hack”,发消息向我留言,每天会更新大量干货教程,快扫下面的二维码吧
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值