Mysql溯源-任意文件读取👻

前言

读了《MySQL蜜罐获取攻击者微信ID》的文章,文中说明了通过mysql蜜罐读取攻击者微信ID的过程,抱着学习的态度尝试了一下

原理

mysql中有一个load data local infile函数能够读取本地文件到mysql数据库中。当攻击者用爆破mysql密码的扫描器扫描到我们的mysql并连接上的时候,客户端(攻击者)会自动发起一个查询,我们(服务端)会给与一个回应,我们在回应的数据包中加入load data local infile读取攻击者的本地文件到我们数据库中,达到反制的目的。

Mysql溯源-任意文件读取👻-LMLPHP

具体过程

LOAD DATA INFILE

LOAD DATA INFILE语句用于高速地从一个文本文件中读取行,并写入一个表中。文件名称必须为一个文字字符串。
LOAD DATA INFILE 是 SELECT ... INTO OUTFILE 的相对语句。把表的数据备份到文件使用SELECT ... INTO OUTFILE,从备份文件恢复表数据,使用 LOAD DATA INFILE。基本语法如下:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [FIELDS
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char' ]
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number LINES]
    [(col_name_or_user_var,...)]
    [SET col_name = expr,...)]

这个功能默认是关闭的,当我们本地mysql服务器没有开启这个功能执行时会报错:

Mysql溯源-任意文件读取👻-LMLPHP

我们可以通过如下命令查看功能状态

show global variables like 'local_infile';

Mysql溯源-任意文件读取👻-LMLPHP

我们通过如下命令开启这个功能:

set global local_infile=1;

然后我们通过如下命令尝试读取本地的C盘目录下的1.txt文件

Mysql溯源-任意文件读取👻-LMLPHP

load data local infile 'C:/1.txt' into table test fields terminated by '\n';

Mysql溯源-任意文件读取👻-LMLPHP

通信过程

我们模拟一下攻击者通过扫描器连接MySQL数据库的通信过程
工具:Wireshark

首先我们通过Wireshark抓取通信流量查看一下通信过程

注意:
当自己电脑既是客户端又是服务器时,互相访问时流量并没有经过网卡,windows系统又没有提供本地回环网络的接口,
wireshark在windows系统上默认使用的是WinPcap来抓包的,用它监控网络的话只能看到经过网卡的流量,看不到访问
localhost的流量,所以才会出现第一次连接始终没有数据包的状况。解决这个问题的两种办法是:要么服务器和客户端
不要在同一台机器上,要么用Npcap来替换掉WinPcap,Npcap提供环回接口

1. 首先是Greeting包,返回了服务端的版本信息

Mysql溯源-任意文件读取👻-LMLPHP

2. 接着是客户端发起连接请求

Mysql溯源-任意文件读取👻-LMLPHP

3. 然后经过TCP的三次握手之后,客户端会自动发起一次查询,服务端会给予一个回应

Mysql溯源-任意文件读取👻-LMLPHP

我们就是在上面的最后一步回应中插入读取客户端本地文件的语句,从而读取客户端的本地文件到数据库表中。

漏洞复现

下载地址:https://github.com/allyshka/Rogue-MySql-Server

1. 解压压缩包

然后编辑rogue_mysql_server.py这个文件,修改里面的读取文件的路径(windows或者linux的路径都行)

Mysql溯源-任意文件读取👻-LMLPHP

2. 用python启动rogue_mysql_server.py

3. 查看数据库端口是否开启nmap -sS -p- 192.168.33.222

Mysql溯源-任意文件读取👻-LMLPHP

4. 我们用自己的数据库连接软件(例如Navicat)去连接我们刚刚创建的恶意mysql服务器

  • IP:192.168.33.222
  • PORT:3306
  • USERNAME:root
  • PASSWORD:(空的就行)

Mysql溯源-任意文件读取👻-LMLPHP

5. 然后我们会看到当前目录下面多了一个mysql.log文件,我们发现本地的C:/1.txt文件被读取到了mysql.log文件中

Mysql溯源-任意文件读取👻-LMLPHP

6. 我们通过Wireshark看看这个实验过程通信的数据包

  • 首先Greeting包,服务器返回版本信息
  • 然后就是客户端请求连接的登录包
  • 接着就是服务器回应的一个数据包(ok)

Mysql溯源-任意文件读取👻-LMLPHP

  • 接下来我们重点分析后面分析后面三个数据包

这个数据包是像形如Navicat这种数据库连接软件在连接之前都会自动发送的一个请求查询的。从查阅资料来看,大多数MySQL客户端以及程序库都会在握手之后至少发送一次请求,以探测目标平台的指纹信息

SET NAMES utf8mb4

Mysql溯源-任意文件读取👻-LMLPHP

接下来就是服务器端给出的回应包,但是这个数据包里面大有文章,包含了读取本地C:/1.txt文件的命令

Mysql溯源-任意文件读取👻-LMLPHP

然后我们就发现接下来客户端就把服务器请求的1.txt文件传输到了服务器。

Mysql溯源-任意文件读取👻-LMLPHP

实验结束

参考文章

  1. https://blog.csdn.net/weixin_46164380/article/details/105230747
  2. https://blog.csdn.net/Java0258/article/details/112332367
12-31 05:49