ctf训练 ssh私钥泄露

本文通过CTF比赛的场景介绍了一种渗透测试的方法。首先,通过netdiscover命令找到靶机IP,接着使用nmap扫描开放服务,发现靶机开启了ssh和http服务。在http服务中未找到有用信息,然后使用dirb工具探测隐藏页面,最终在ssh目录下发现flag。接着,通过ssh连接并解密私钥,但非root权限。通过对代码审计,利用缓冲区溢出获得了root权限,从而获取flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ctf训练 ssh私钥泄露

CTF比赛中,比赛环境的两种方式

1.给予在同一局域网中的攻击机和靶场机器,以web方式可以访问攻击机,通过攻击机来渗透靶场机器,获取对应的flag值;(一般情况下给于kali linux作为攻击机,并且举办方提供计算机)

⒉给予一个网线接口,用户自备工具,直接连接网线,进行渗透靶场机器,获取对应的flag值;

这里我们做一个小练习
实验准备:一台kail(作为攻击机),一台靶机

靶机镜像:https://pan.baidu.com/s/1Up3kgpwK4Mt3McGklN6rlA 提取码:lc8q

安装打开靶机(使用Oracle VM VirtualBox打开):
在这里插入图片描述接下来发现没法登陆,也没有办法获取ip地址
所以我们在kail下
进入控制台

使用netdiscover命令 netdiscover -r ip/子网掩码 命令来探测靶机,靶机ip为192.168.43.83
在这里插入图片描述
在这里插入图片描述本机ip为192.168.43.96
在这里插入图片描述

信息探测

对于只是给定一个对应IP地址的靶场机器,我们需要用对其进行扫描,探测开放的服务。

渗透其实是针对服务的漏洞探测,然后进行对应的数据包发送,获取机器的最高权限

-nmap -sV 靶机ip 挖掘 开放服务信息

在这里插入图片描述

分析探测结果

每一个服务对应计算机的一个端口,用来进行通信。常用端0~1023端口,在扫描结果中查找特殊端口

针特殊端口进行探测,尤其对开发大端口的http服务进行排查;

我们可以看到靶场开放的端口和对应的服务,此靶场机器上开启了ssh服务和http服务,
接下来我们分析特殊端口,尤其对开放http服务的大端口(本靶机上31337端口开放了http服务)

探测大端口的信息

对于开放http服务的大端口,可以采取http://ip:port/的形式访问;

在这里访问http://192.168.43.83:31337没有任何有用的信息

查看源代码对应信息;如果没有flag信息,使用工具探测隐藏页面

-dirb http://ip:port/对这个服务的隐藏文件进行探测
在这里插入图片描述访问ssh和robots目录
在这里插入图片描述在taxe1下发现flag
在这里插入图片描述
再看ssh目录:
在这里插入图片描述然后可以试着去访问这三个文件名,发现确实是一个文件,然后下载到桌面去

在这里插入图片描述接下来我们就去尝试与靶机建立ssh连接

解密ssh秘钥信息

使用ssh2john将id_isa秘钥信息转换为john可以识别的信息。
chmod 600 id_isa
ssh2john id_isa > isacrack
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分析用户名、利用ssh登录服务器

ssh -i id_isa 用户名@ssh靶场机器IP地址

在这里插入图片描述

到这里登录到主机,但是并不是root权限?该如何获取呢?深入探测根目录

查找具有root权限的文件

-find / -perm -4000 2>/dev/null
在这里插入图片描述因为这里read_message.c也是root下的,所以可以cat一下来看看
在这里插入图片描述read_message.c的内容如下

#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);
    }

}

审计这段代码 发现

我们要执行readmessage

然后验证数组前5个字符,限定字符数为最多20个 ,前5个为Simon即可。

在这里插入图片描述
在这里插入图片描述我们试着输20多个字符使其溢出

输入超过他缓存字符长度的字符 超出的部分为root权限的目录路径

获得root权限,发现flag
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃香菜的哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值