MySQL 是世界上更流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是更好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。全球很多著名公司和站点都使用Mysql作为其数据库支撑,并且很多架构都以Mysql作为数据库管理系统,例如LAMP、和WAMP等,在针对网站渗透中,很多都是跟Mysql数据库有关,各种Mysql注入,利用Mysql来getshell、Mysql提权,等等。本文,笔者我对Mysql在渗透测试中的常见的基础利用进行了详细的总结,包括利用MySQL获取webshell、MySQL提权以及几个MySQL的0day漏洞等。
不管是你渗透什么玩意儿,信息收集都是首要的一步。在行动之前,我们需要搞清楚,目标主机上是否存在MySQL、MySQL运行在默认的端口还是指定的端口、MySQL的版本信息、MySQL用户信息等等。
Mysql默认端口是3306端口,但也有自定义端口,针对默认端口扫描主要利用扫描软件进行探测。我们可以用nmap等端口扫描工具对MySQL的端口进行扫描。
如果已经获得了目标MySQL的密码,我们可以使用该用户名和密码扫描获取指定IP地址的端口信息以及mysql数据库相关信息:
Nmap还内置了多个mysql相关脚本,有审计,暴力破解,hash、空密码扫描、枚举、基本信息、查询、变量等等:
能不能用不知道,反正我是没用过。
Metasploit也有几个可用于收集MySQL信息的模块:
另外,我们还可以使用sqlmap通过注入点扫描获取目标数据库的信息。sqlmap在测试注入点时,会枚举出目标主机的数据库类型、版本等信息。
假设目标服务器开启3389端口,并且允许我们进行远程访问的话,我们可以采取爆破MySQL用户密码的 *** ,获取MySQL的权限。
在渗透测试中,获取MySql连接密码的思路大致有以下几种:
MySQL 口令爆破
当我们通过信息收集已经知道目标主机上运行有MySql服务时,我们可以对其连接密码进行爆破,但这种 *** 一般是不会成功的,爆破成功的几率近乎为零。除非管理员用的是弱口令,我们才有尝试一下爆破的必要。但为了提高爆破成功的概率,社工也是不可缺少的。我们可以通过收集一个人的各种信息,例如姓名、社交平台账号/昵称、手机号、生日、伴侣姓名/生日、职业等信息,通过这些写信息生成针对性的字典,利用该字典进行爆破。
如若你真想进行 MySQL 口令爆破,可以用以下几种 *** :
(一)通过metasploit相关模块进行爆破
Metasploit的auxiliary/scanner/mysql/mysql_login模块可用来登录mysql,亦可用来爆破mysql口令:
(二)使用nmap扫描并破解密码
(1)对某一个IP或者IP地址段进行mysql root默认密码暴力扫描并破解:
也可以自定义账号密码字典。
(2)检查mysql root空口令
MySQL 哈希值爆破
MySQL的用户名密码哈希值保存在mysql库的user表中:
直接将获取到的哈希值放到cmd5.com在线哈希破解网站上在线破解即可。
从网站泄露的源代码中寻找数据库密码
网站的配置文件中大多含有数据库的连接配置,如数据库用户名、密码等配置信息。当我们获得到了目标网站的备份文件时,首先查看一下网站的配置文件可能会有以外的收获。
需要具有以下几个条件:
存在sql注入漏洞
当前数据库用户具有写入权限
知道目标网站Web物理路径
secure_file_priv 选项支持数据导出
有时候,即使当前数据库用户有了file权限,也不能成功将数据导出至自己想要的目录。因为高版本的MYSQL添加了一个新的特性 secure_file_priv,该选项对mysql导出文件做了限制,输出目录路径应该secure_file_priv一致,否侧文件操作不成功:
该参数用于限制select...into outfile...、load_file()导出到或读取哪个指定的目录。
secure_file_priv 的值为 NULL 时,表示限制mysql不允许导入或导出。
secure_file_priv 的值为为 /tmp 时,表示限制mysql只能在/tmp目录中执行导入导出,其他目录不能执行。
secure_file_priv 没有值即值为空时,表示允许mysql在任何目录导入或导出。
因为 secure_file_priv 参数是只读参数,所以不能使用set global命令直接修改,我们应在mysql的配置文件(my.cnf或my.ini)中进行设置:
开my.cnf 或 my.ini,加入以下语句后重启mysql即可:
查看secure_file_priv修改后的值:
此时便可以在任何目录中导出或导入数据了,这也是我们利用MySql向服务器写WebShell的基础。
利用 Union select 写入WebShell
这是最常见的一种写入方式,union select 配合 select into outfile,将WebShell写入服务器,适用于sql注入点事联合注入的情况下。
mysql可以解析十六进制,我们也可以对一句话进行十六进制编码,最终效果都是一样的:
如下图,成功写入webshell:
利用分隔符写入WebShell
当sql注入点为为盲注或基于报错的注入时,Union select 写入的方式显然是利用不了的,我们可以通过分隔符写入WebShell。
同样的技巧,一共有四种形式:
如下图,成功写入webshell:
利用log日志写入WebShell
Mysql查询日志用来保存所有跟查询相关的日志,我们可以通过指定mysql日志的存放路径来往目标主机上写入webshell,但是也要对生成的日志有可读可写的权限。这种日志类型默认是关闭状态的,因为MySQL的用户有很多,如果将每个用户的查询操作都记录下来的话,对服务器的资源开销也是一件令人烦恼的事情。查询日志常见的几个配置选项:
general_log 指定日志保存状态,一共有两个值(ON/OFF)ON代表开启 OFF 代表关闭。
general_log_file 指的是日志的保存路径
当 general_log=ON 时,所执行的sql语句都会出现在/www/server/data/Ubuntu.log这个文件里。那么,如果把 general_log_file 的路径修改为 /var/www/html/shell.php,那么所执行的sql语句就会保存在shell.php中,如果我们执行查询一个一句话,就可以getshell。
利用方式如下:
如下图,成功在Web目录写入webshell:
**注意:**以上几种 *** 虽然成功在目标服务器的web目录下写入了webshell,但是所需要的条件极其严格,其中最为主要的就是当前数据库用户具有写入权限和 secure_file_priv 选项支持数据导入导出。但是,在 Linux 系统中权限分配十分严格,MySQL 用户一般情况下是无法直接往web根目录写入文件的,即便成功,写入的文件的权限也是MySQL的(上图中可见),Apache也是无法访问的,所以,以上 *** 通常是在Windows系统中适用。这个点需要记一下。
所谓通过MySQL进行权限提升就是通过MySQL执行系统命令。假如说我们发现了某个网站存在SQL注入,亦或者是我们发现了某个主机的数据库的账号密码,我们直接远程连接上了该数据库。现在我们想利用该数据库来执行系统命令,该如何去做呢?下面我们就来演示几种通过MySQL执行系统命令进行权限提升的 *** 。这里需要注意的是,执行系统命令的权限取决于数据库启动用户的权限。
MySQL UDF提权执行系统命令
UDF是MySQL的一个拓展接口,UDF(Userdefined function)可翻译为用户自定义函数,这个是用来拓展Mysql的技术手段。
使用过MySQL的人都知道,MySQL有很多内置函数提供给使用者,包括字符串函数、数值函数、日期和时间函数等,给开发人员和使用者带来了很多方便。MySQL的内置函数虽然丰富,但毕竟不能满足所有人的需要,当MySQL的内置函数不能满足需要的时候,就需要对MySQL进行一些扩展,幸运的是,MySQL给使用者提供了添加新函数的机制,这种使用者自行添加的MySQL函数就称为UDF(User Define Function)。
当我们有了数据库读取和写入权限以后,我们就可以尝试使用UDF提权的 *** ,从数据库root权限提升到系统的管理员权限。
提权原理:
UDF的使用需要调用其动态链接库文件(.dll或.so),使用UDF提权原理大概就是通过引入恶意的,引入自定义函数(如sys_eval()函数),执行系统命令。
利用条件:
掌握MySQL数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。
当前用户拥有可以将udf.dll写入相应目录的权限。
如果MySQL版本小于5.1且为Windows系统,则udf.dll文件存放在 C:\windows 或者 C:\windows\system32 目录下。
如果MySQL版本大于5.1,udf.dll文件必须放置在MySQL安装目录的lib/plugin文件夹下,该plugin目录默认不存在需要创建。
假设我的UDF文件名为 udf.dll,存放在MySQL安装目录的 lib/plugin 目录下(MySQL>5.1):
在 udf.dll 文件中,我定义了一个名为 sys_eval() 的 MySQL 函数,该函数可以执行系统任意命令。但是如果我现在就打开 MySQL 命令行,使用 select sys_eval('whoami');的话,系统会返回 sys_eval() 函数未定义。因为我们仅仅是把 udf.dll 放到了 lib/plugin 目录下,并没有引入。类似于面向对象编程时引入包一样,如果没有引入包,那么这个包里的类你是用不了的。所以,我们应该把 udf.dll 中的自定义函数引入进来。引入的 *** 如下:
sys_eval:我们要引入的函数名。
udf.dll:我们要从中引入函数的链接库文件。
成功引入该函数后,可以查看一下 mysql 函数里面新增了 sys_eval:
此时我们便可以像执行其他MySQL内置函数一样去使用该函数了。
UDF手动提权步骤
当我们通过各种 *** 获取了目标MySQL数据库的权限并满足UDF提权的条件后,我们可以按照以下步骤进行提权。
(一)查看 secure_file_priv 的值
上文说了,secure_file_priv 是用来限制 into dumpfile、into outfile、load_file() 函数能在哪个目录下导出或者读取文件的,所以该值为空是我们利用UDF提权的首要条件:
(二)查看系统架构及plugin插件目录
UDF的dll动态链接库文件需要放在该目录下:
可知目标主机plugin插件目录为/www/server/mysql/lib/plugin/。
如若该目录不存在,可以通过webshell等方式找到 MySQL 的安装目录然后手工创建 lib/plugin 文件夹
(三)将我们构造的恶意动态链接库文件写入plugin插件目录
我们应该去哪里找动态链接库文件去呢?Sqlmap 和 Metasploit 工具里面都自带了对应系统的动态链接库文件。
下面是二者的UDF动态链接库文件的存放位置:
Sqlmap:位于sqlmap/data/udf/mysql目录下,包含64位和32位Linux和Windows系统下利用的动态链接库文件:
Metasploit:位于/usr/share/metasploit-framework/data/exploits/mysql目录下,包含64位和32位Linux和Windows系统下利用的动态链接库文件:
另外需要注意,sqlmap 中 自带这些动态链接库为了防止被杀软误杀都经过编码处理,不能直接使用。使用之前需要先用 sqlmap 自带的解码工具 cloak.py (extra/cloak目录下)解码,解码的方式如下:
找到目标主机对应系统版本和位数的UDF文件后,我们需要将UDF文件写入plugin插件目录,大多数情况下我们是将.dll转化成十六进制然后再写入。这里以Linux、64位MySQL为例。
首先在攻击者本地,将lib_mysqludf_sys_64.so或lib_mysqludf_sys_32.so中的内容进行十六进制编码:
生成了 hex 文件以后我们可以将udf_32.hex文件的内容复制出来(注意前面加上0x),然后执行如下命令写入目标机的lib/plugin插件目录下:
但是由于数据过长,我们需要将其分段写入。即先创建一个表,然后将十六进制数据分段写入表中,最后将含有数据的那个字段导出到udf.so,操作如下:
还有一个巧妙的 *** 便是利用load_file()函数,该函数支持远程加载,我们可以将UDF文件放在vps上,执行如下命令让目标机远程加载该文件并下载到指定目录里:
(四)引入UDF函数并调用函数执行系统命令
引入的 *** 如下:
sys_eval:我们要引入的函数名。
udf.dll:我们要从中引入函数的链接库文件。
成功引入该函数后,我们便可以像执行其他MySQL内置函数一样去使用该函数了:
如下图所示,命令执行成功:
(5)清理痕迹
删除自定义函数:
**注意:**还是那个问题,linux系统的权限管理太严了,如果是Windows系统的话一般就是管理员权限了:
UDF提权在Metasploit下的利用
如果你觉得上面手动的 *** 麻烦的话,也可以利用metasploit中的exploit/multi/mysql/mysql_udf_payload模块实现自动化UDF函数注入,只适用于Windows系统:
使用如下:
MSF会将一个随机命名的UDF文件写入lib/plugin目录下(如果该目录不存在的话,则无法执行成功),该UDF文件中包含sys_exec()和sys_eval()这两个函数,但是默认只创建sys_exec()函数,该函数执行并不会有回显。我们可以手动引入 sys_eval() 函数,来执行有回显的命令。
MySQL启动项提权
手动利用
所谓MySQL的启动项提权,就是将自定义的脚本写入到开机自启目录下,如果管理员重启了服务器,那么就会自动调用该脚本,并执行其中的用户添加及提权命令。这种提权也常见于 Windows 环境下,写入的脚本支持 vbs 和 exe 类型,可以利用 vbs 执行一些 CMD 命令,也可以使用 exe 上线 metasploit 或 cobalt strike。
VBS脚本的话最常见的就是创建一个管理员用户:
写入的方式与上文中讲的那几种 *** 一样,即先在本地将vbs脚本用mysql的hex()函数进行十六进制编码,然后利用into outfile...或into dumpfile写入:
此时,如果管理员重启了服务器,那么就会自动调用该脚本,并执行其中的命令,如下图所示,常见管理员新用户“whoami”成功:
同样,我们也可以将exe写入到开机自启目录下,写入的方式与上文中讲的那几种 *** 一样,即先在本地将exe程序用mysql的hex()函数进行十六进制编码,然后利用into outfile...或into dumpfile写入到目标机的自启目录下。如下我们写入一个msf马“shell.exe”。
首先在攻击者本地将shell.exe进行十六进制转换:
将得到的hex文件shell.hex里的内容复制出来,利用上文中写UDF文件的 *** 分段写入目标机自启目录下即可(老长了~~~)。
带目标服务器重启后,我们便可以得到目标主机的meterpreter:
Metasploit下的利用
如果你觉得上面手动的 *** 麻烦的话,metasploit中也集成了相应的模块:exploit/windows/mysql/mysql_start_up
使用如下:
执行后,msf将在目标主机的启动项中写入一个exe的msf木马:
待目标主机重启后,便会得到目标主机的meterpreter:
2016年,一个独立的研究组织发现多处严重的Mysql漏洞,此次通报的是其中比较严重的一个漏洞CVE-2016-6662,它允许攻击者远程注入恶意配置到被攻击服务器的Mysql配置文件my.cnf中,导致可加载任意扩展库。当扩展库中存在恶意指令时就可以Getshell。
该漏洞影响的版本如下:
mysql <=5.7.15
mysql <=5.6.33
mysql <=5.5.52
漏洞原理:
在Linux系统中,一些默认的Mysql安装包自带mysql_safe脚本作为包装器,当我们使用、等命令启动MySQL时,mysqld_safe封装脚本是以root权限启动的,而主要的mysqld进程却是用权限较低的mysql用户启动的。并且mysql_safe脚本将在mysql服务启动前预加载一个扩展库,这个扩展库可以在MySQL的配置文件my.cnf中通过名为malloc_lib的配置项进行设置,该配置项写在[mysqld]下。
如果我们在my.cnf中通过malloc_lib配置项指定一个存在恶意代码的扩展库路径,那么在mysql重启的时候,这些代码将被以root权限执行,实现权限提升。
漏洞利用条件:
攻击者已经获得了目标主机MySQL的权限
目标主机的MySQL版本在漏洞影响范围内
攻击者当前获得权限的MySQL用户为root权限(否则无法修改general_log_file全局变量)
下面,我们来复现该漏洞。
实验环境:
目标机IP:192.168.1.10
攻击机IP:192.168.1.7
首先,我们下载一个C脚本,用来编译成我们恶意的扩展库,可获得目标机的shell:
http://legalhackers.com/exploits/mysql_hookandroot_lib.c
如下修改该攻击脚本:
执行如下命令编译生成恶意的扩展库文件mysql_hookandroot_lib.so:
然后通过上文所讲的各种方式将生成的mysql_hookandroot_lib.so上传到目标机的/tmp目录下即可。
接下来,我们要确定要修改的MySQL配置文件为哪个。MySQL的配置文件除了默认的 /etc/my.cnf,还有别的配置文件路径,并且是顺序读取的:
File Name | Purpose |
---|---|
/etc/my.cnf | Global options |
/etc/mysql/my.cnf | Global options |
SYSCONFDIR/my.cnf | Global options |
$MYSQL_HOME/my.cnf | Server-specific options (server only) |
defaults-extra-file | The file specified with, if any |
~/.my.cnf | User-specific options |
~/.mylogin.cnf | User-specific login path options (clients only) |
可见MySQL不仅会读取/etc/my.cnf,还会读取$MYSQL_HOME/my.cnf即msyql自身目录下的mf.cnf。那我们到底修改哪一个my.cnf呢?答案是都可以,但更好是mysql目录下的,因为msyql目录毕竟是人家mysql自己的目录,以mysql用户运行的mysql当然是有权限写的,而别的文件可就不好说了。但也无法避免管理员的错误配置情况,所以,只要mysql用户有mysql配置文件的所属权限,攻击便可以追加恶意的配置项到该文件。
其次,我们还要确定用什么 *** 写my.cnf文件。一说到写文件,我们便可以想到into outfile和into dumpfile。但是在这里,我们不能用这种方式,因为outfile和dumpfile写出来的文件的权限为-rw-rw-rw,而MySQL有一个安全规则,即如果配置文件的权限可被其他用户写,则将会忽略这个配置文件。所以outfile和dumpfile写出来的配置文件不符合该安全规则。
我们可以用上文中讲的log写文件的 *** 。并且log写文件对于已存在的文件将会自动追加,正好可以避免写入的以下banner内容对MySQL配置文件的影响,也就是说,如果要用log写配置文件的话,该配置文件必须是mysql已经创建好的。
攻击者在目标主机的MySQL里执行以下操作即可写入MySQL配置文件:
查看目标机MySQL配置文件,发现已经成功写入了恶意的配置项:
然后等待目标mysql,攻击者机器上边获得了目标主机的shell:
上述的操作要修改general_log全局变量,也就是说攻击者当前获得权限的MySQL用户必须是root权限。如果攻击者当前获得权限的MySQL用户不是root权限,则我们无法修改general_log全局变量,那么此时我们还可以利用此漏洞吗?当然可以,只需要一个具有 select、insert、create、file 权限的用户即可。
我们可以利用MySQL触发器的 *** 来成功写入修改配置文件:
当表刷新的时候就会执行触发器,比如通过insert来让表刷新:
触发器的代码会以mysql root权限执行,从而让攻击者修改general_log设置,即使此时攻击者没有数据库的管理员权限。
给出一个利用脚本:http://legalhackers.com/exploits/0ldSQL_MySQL_RCE_exploit.py
2016年11月01日,国外安全研究员Dawid Golunski在 MySQl、MariaDB 和 PerconaDB 数据库中发现条件竞争漏洞。该漏洞允许本地用户使用低权限(CREATE/INSERT/SELECT权限)的账号提升权限到数据库系统用户权限(通常是mysql用户权限)来执行任意代码,黑客成功利用此漏洞后,可以完全访问数据库。
该漏洞影响的版本如下:
MySQL:
<=5.5.51
<=5.6.32
<=5.7.14
漏洞利用条件:
攻击者已经获取到目标服务器的webshell权限
可以通过反弹shell的 *** 获得目标主机的交互环境
已经拿到了一个低权限(CREATE/INSERT/SELECT权限)的 MySQL 账户的用户名和密码
目标主机的MySQL版本在漏洞影响范围内
下面我们来复现该漏洞。
实验环境:
目标机IP:192.168.1.10
攻击机IP:192.168.1.7
假设我们已经通过蚁剑获得了目标主机的webshell权限。
首先,我们先下载一个C脚本 mysql-privesc-race.c,通过蚁剑将编译将其上传到目标主机。然后执行如下命令反弹个shell获取目标主机的交互环境:
然后执行如下命令将上传的攻击脚本编译生成我们的exp程序:
最后,在shell环境中执行的exp程序:
whoami:已经拿到了一个低权限(CREATE/INSERT/SELECT权限)的 MySQL 用户名
123456:低权限 MySQL 用户的密码
localhost:数据库地址
whoami_db:属于whoami用户的数据库
执行成功后会获得一个mysql权限,要想提升到系统root权限还需要配合CVE-2016-6664漏洞,大概如下:
但我在本地测试失败了,总是报错说“cp: cannot create regular file '/tmp/mysql_privesc_exploit/mysql_suid_shell.MYD': Permission denied”,有知道原因的大佬还请写在评论里告诉我。
该漏洞可以使mysql用户权限提升为系统root权限。
该漏洞影响的版本如下:
MySQL :
<=5.5.51
<=5.6.32
<=5.7.14
漏洞利用条件:
攻击者已经获取到目标服务器的webshell权限。
可以通过反弹shell的 *** 获得目标主机的交互环境。
已经通过CVE-2016-6663等方式获取到系统mysql用户权限。
目标主机的MySQL版本在漏洞影响范围内。
目标主机配置必须是是基于文件的日志(默认配置),也就是不能是syslog方式。执行没有任何结果既满足“基于文件的日志”要求。
该漏洞利用很简单,首先下载漏洞利用脚本 mysql-chowned.sh,将该脚本上传到目标主机并以系统mysql用户权限运行即可获取系统root权限:
**注意:**必须以mysql权限执行mysql-chowned.sh才能成功提为root,所以,该漏洞常常需要配合CVE-2016-6663。可以先利用CVE-2016-6663漏洞获取mysql权限的shell然后再执行mysql-chowned.sh。
CVE-2016-6662、CVE-2016-6663、CVE-2016-6664这几个漏洞常常是配合起来利用的。
文中定有不足之处,还请各位大佬多多指教,小生还需多多向各位前大佬们学习。
我的博客:https://whoamianony.top/?
参考:
https://www.cnblogs.com/xiaozi/p/12767050.html
https://www.sqlsec.com/2020/11/mysql.html#toc-heading-31
https://www.uedbox.com/post/58919/
https://blog.csdn.net/qq_36119192/article/details/84863268
https://www.cnblogs.com/3ichae1/p/12909952.html
https://blog.csdn.net/fly_hps/article/details/80944170
https://www.freebuf.com/vuls/243513.html
https://mp.weixin.qq.com/s?__biz=MzIyNjE4NDcyMA==&mid=2247484839&idx=1&sn=16720fb8e035c8bbe612d738839262c5&chk *** =e8751ed8df0297ce54ef5acabd5a42f66f81f66b56b168ba80a3af5d55877d546aee33dd8510&scene=0#rd
https://www.k0rz3n.com/2018/10/21/Mysql 在渗透测试中的利用
https://www.anquanke.com/post/id/84557
https://www.anquanke.com/post/id/84554
https://www.freebuf.com/vuls/243513.html
https://www.anquanke.com/post/id/84553
https://xz.aliyun.com/t/1122#toc-2
Sub404是什么?Sub404是一款基于Python开发的工具,可以帮助广大研究人员快速检测出潜在的子域名接管漏洞,该工具的运行速度非常快,并且支持异步扫描和业务处理方式。在网络侦察的过程中,我们可...
“醉”,醉人;要“入迷”。初衷是被光芒万丈的金纸迷住。用来形容奢侈、颓废、享受的生活。 来源 宋顾涛《清异录居室》:“(一一萌斧)有一间小房,窗明几净,金摆件。纸张亮白,金色醒目。演讲...
如何训练猎犬呢?我国猎人训练猎犬的经验十分丰富,总结起来,有基本训练原则、幼犬的初级训练和狩猎训练。 现分述如下: 1.猎犬训练的基本原则:在没有详细介绍幼犬的初级训练和狩猎训练之前,先淡谈训...
想要查看cpu的性能等参数,该怎么查看呢?下面我们就来看看详细的教程。 1、一手按住Ctrl和Shift,另一手点一下Esc。即可调出“义务治理器”,也可以右击义务栏,选择义务治理器。 2、选择“...
明日方舟飞翔的怪盗怎么打?在刻俄柏的灰蕈迷境中有一个比较难打的敌人叫做“飞翔的怪盗”,那么这个家伙应该怎么应对呢?下面就是优游网小编为大家带来的明日方舟飞翔的怪盗打法攻略了,一起来看看吧! 明日方...
中国北京时间7月2日信息,据海外新闻媒体,在美国联邦贸易委员会刚开始对其业务流程进行调研后,Google聘用了12家劝谏企业。 Google在一份电子邮箱中表明,该企业聘用的12家劝谏企...