1. 蜜罐的定义

首先我们要弄清楚一台蜜罐和一台没有任何防范措施的计算机的区别,虽然这两者都有可能被入侵破坏,但是本质却完全不同,蜜罐是网络管理员经过周密布置而设下的“黑匣子”,看似漏洞百出却尽在掌握之中,它收集的入侵数据十分有价值;而后者,根本就是送给入侵者的礼物,即使被入侵也不一定查得到痕迹。因此,蜜罐的定义是:“蜜罐是一个安全资源,它的价值在于被探测、攻击和损害。”

蜜罐好比是一个情报收集系统,一个诱捕攻击者的陷阱,设计蜜罐的初衷就是让黑客入侵,借此收集黑客的信息和行动证据,随时了解针对服务器发动的最新攻击和漏洞。

  1. 伪造MySQL服务端

在知道蜜罐的作用后,我们可以伪造一个MySQL服务端,甚至不需要实现MySQL的功能,诱导攻击者连接,当攻击者的客户端连接上这个虚假服务端时,我们就可以利用漏洞来读取攻击者电脑的文件。

伪造的MySQL服务端重点是在LOAD DATA INFILE这个语法上,正常的MySQL中这个语法主要是用于读取一个文件的内容并放到一个表中,通常有两种用法,分别是:

微信图片_20221213175732

一个是读服务器本地文件,另一个是读客户端的文件。而我们这次要利用的也就是LOAD DATA LOCAL INFILE这种形式。接下来我们看下如何伪造一个恶意的MySQL服务端来读取客户端文件。

(1)通信过程分析
先对正常的MySQL通信进行抓包,通过抓到的数据包,我们发现一共有:
首先是服务端回复的Server greeting包,如下图,包含服务端的基本信息,是建立连接的重要一步。

微信图片_20221213175936

接下来是客户端的登录请求包,如下图,包含登录名和密码,这一步是建立在greeting包正确的前提下,如果服务端发包不正确的话,则会报错。

微信图片_20221213180017

然后是一些初始化的查询,如下图:

微信图片_20221213180053

下一个包是关键点,由客户端发起的Request Query查询,如下图。我们可以在包中找到关键的语句LOAD DATA INFILE。在使用LOAD DATA INFILE语法的话,需要在连接MySQL的时候加上—enable-local-infile或者设置local_infile为on。

微信图片_20221213180204

紧接着,服务端回复了一个包含刚刚请求文件名的包Request TABULAR,如下图,这里把C:/1.txt给发回去了。

微信图片_20221213180242

客户端在收到服务端发送的Request TABULAR包后,立刻就向服务端发送了C:/1.txt的内容。

微信图片_20221213180321

分析通信数据包到这里时,我们可以发现,如果在客户端发送查询之后,返回一个伪造的Request TABULAR数据包,并附上我们指定查询的文件名,就可以实现读取客户端文件。

这里引用一个形象的比喻:

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

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

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

正常情况下,这个流程并没有什么问题,但是当我们伪造了一个服务端后,并且回复客户端任意一个我们想要获取的文件,情况就不一样了。

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

服务端:ok,读取你本地的 /etc/passwd 文件并发给我!

客户端:这是文件内容:balabala(/etc/passwd 文件的内容)!

这里需要说明一下,伪造的服务端可以在任何Query Package回复一个Request TABULAR,并不一定是要在LOAD DATA INFILE的时候。

(2)伪造服务端

通过上述通信过程分析,我们只需要做到三个步骤便可从客户端拿取文件,分别是:

向客户端发送Server Greeting

等待客户端发送一个Query Package

服务端回复一个file transfer请求

现在需要解决的是如何构建Server Greeting和file transfer包,可以提取上述通信包修改相关文件名和长度之类字节。MySQL官方也提供了相关参考文档,如下图,为Greeting包样例,每个字段的作用均已表明。

微信图片_20221213180532

接下来是编写PoC,可以参考https://github.com/allyshka/Rogue-MySql-Server。如下图:

微信图片_20221213180612

(3)实践

我们运行PoC,如下图。这里使用伪造的greeting包,我们成功让客户端连接上我们伪造好的服务端。

微信图片_20221213180657

如下图,可以在log里看到,我们拿到了客户端上C:/1.txt。

微信图片_20221213180728

(4)溯源

在可以拿到客户端上的文件情况下,要进行溯源时,出现一个问题,我们知道微信默认的配置文件放在C:\Users\username\Documents\WeChat Files\中,在config.data、Acclnfo.dat文件中含有微信ID、手机号等。而获取这个文件需要知道客户端的用户名,用户名一般有可能出现在一些日志文件里,如在C:\Windows\PFRO.log 中较大几率能找到用户名,如下图:

微信图片_20221213180819