Mysql溯源反制-任意文件读取👻
Mysql溯源-任意文件读取👻
前言
读了《MySQL蜜罐获取攻击者微信ID》的文章,文中说明了通过mysql蜜罐读取攻击者微信ID的过程,抱着学习的态度尝试了一下
原理
mysql中有一个load data local infile
函数能够读取本地文件到mysql数据库中。当攻击者用爆破mysql密码的扫描器扫描到我们的mysql并连接上的时候,客户端(攻击者)会自动发起一个查询,我们(服务端)会给与一个回应,我们在回应的数据包中加入load data local infile
读取攻击者的本地文件到我们数据库中,达到反制的目的。
具体过程
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服务器没有开启这个功能执行时会报错:
我们可以通过如下命令查看功能状态
show global variables like 'local_infile';
我们通过如下命令开启这个功能:
set global local_infile=1;
然后我们通过如下命令尝试读取本地的C盘目录下的1.txt文件
load data local infile 'C:/1.txt' into table test fields terminated by '\n';
通信过程
我们模拟一下攻击者通过扫描器连接MySQL数据库的通信过程
工具:Wireshark
首先我们通过Wireshark抓取通信流量查看一下通信过程
注意:
当自己电脑既是客户端又是服务器时,互相访问时流量并没有经过网卡,windows系统又没有提供本地回环网络的接口,
wireshark在windows系统上默认使用的是WinPcap来抓包的,用它监控网络的话只能看到经过网卡的流量,看不到访问
localhost的流量,所以才会出现第一次连接始终没有数据包的状况。解决这个问题的两种办法是:要么服务器和客户端
不要在同一台机器上,要么用Npcap来替换掉WinPcap,Npcap提供环回接口
1. 首先是Greeting包,返回了服务端的版本信息
2. 接着是客户端发起连接请求
3. 然后经过TCP的三次握手之后,客户端会自动发起一次查询,服务端会给予一个回应
我们就是在上面的最后一步回应中插入读取客户端本地文件的语句,从而读取客户端的本地文件到数据库表中。
漏洞复现
下载地址:https://github.com/allyshka/Rogue-MySql-Server
1. 解压压缩包
然后编辑rogue_mysql_server.py
这个文件,修改里面的读取文件的路径(windows或者linux的路径都行)
2. 用python启动rogue_mysql_server.py
3. 查看数据库端口是否开启nmap -sS -p- 192.168.33.222
4. 我们用自己的数据库连接软件(例如Navicat)去连接我们刚刚创建的恶意mysql服务器
- IP:192.168.33.222
- PORT:3306
- USERNAME:root
- PASSWORD:(空的就行)
5. 然后我们会看到当前目录下面多了一个mysql.log文件,我们发现本地的C:/1.txt文件被读取到了mysql.log文件中
6. 我们通过Wireshark看看这个实验过程通信的数据包
- 首先Greeting包,服务器返回版本信息
- 然后就是客户端请求连接的登录包
- 接着就是服务器回应的一个数据包(ok)
- 接下来我们重点分析后面分析后面三个数据包
这个数据包是像形如Navicat这种数据库连接软件在连接之前都会自动发送的一个请求查询的。从查阅资料来看,大多数MySQL客户端以及程序库都会在握手之后至少发送一次请求,以探测目标平台的指纹信息
SET NAMES utf8mb4
接下来就是服务器端给出的回应包,但是这个数据包里面大有文章,包含了读取本地C:/1.txt
文件的命令
然后我们就发现接下来客户端就把服务器请求的1.txt
文件传输到了服务器。