0x00 前言

上篇文章说到了docker的remote api未授权访问漏洞,于是想借着docker做个什么东西。
之前也做了一个基于docker的漏洞环境复现系统,但是由于种种原因做了一半就弃坑了。
经过一番思考,我决定利用docker container的快速开启与销毁,做一个蜜罐系统。在网上找了些文章,发现已经有人实现了这个系统了
但我还是决定自己做一个,取名为Kokkuri,出自《Urara》中的占卜术,寓意着访问者访问这个系统,是否丢进蜜罐全由神明决定。

0x01 整体架构

Kokkuri

思路是比较简单的:

  • 每台主机中装有agent,这个agent负责收集各个应用的日志,例如MySQL、Redis、SSH等,RSYSLOG的方式获取优先。
  • agent负责接收server端下发的策略,下发的策略通常是将来自某个IP的某些请求,转发到后端的蜜罐中,这个转发使用iptables来实现。例如将来源是1.1.1.1,访问当前机器的22端口的流量,转发到蜜罐2.2.2.2的2222端口。
  • server端负责收集各个agent上报来的日志,并进行分析,然后制定相应的策略并下发给agent。
  • HoneyPot Server暂时还没有实现,使用了一台主机来代替,考虑后期如果开启的蜜罐数量过多,可以搞一个蜜罐集群,由HoneyPot Server维护整个蜜罐集群。

现在只是实现了一个demo,很多功能还没有完善,如果后面有额外精力的话会稍微写一点代码的,代码开源在github:这里

0x02 Server端实现

前面已经说过了,server端的主要工作就是收集各个agent传来的日志并进行分析,rsyslog方式优先。

首先通过修改/etc/rsyslog.conf文件,开启rsyslog的接收端口,修改以下行:

# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="10514")

# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="10514")

这里只是简单的把端口开到了UDP和TCP的10514端口上。

然后还有一件要做的事情就是接收指定的syslog,添加一个文件/etc/rsyslog.d/kokkuri-server.conf,内容如下:

local6.* /path/to/rsyslog/received/log.log

其中local6是agent端使用的syslog的facility name,agent的具体配置后面再讨论。

现在的server端demo代码中要做的就是,不停的tail log文件(utils/watch_log.py),然后将日志送到解析器中(core/sshd_parser)解析出有用的信息,然后将信息送到guard(core/sshd_guard)中生成规则。demo中只实现了SSH的部分,规则也是很简单的,即在过去两分钟内,如果某个账户对同一台主机登录失败5次以上,则决定将这个IP访问SSH的流量送到蜜罐中去。

下面这图是解析器的部分代码:
kokkuri-sshd-parser

确定出一个恶意IP后,还需要为该IP开启一个蜜罐。如果将所有攻击者的流量都送到同一个蜜罐中,会对后期的数据分析造成困扰,也不易提取攻击者的特征,所以尽量给每个攻击者一个独立的蜜罐环境,最大可能的获取攻击者的攻击手法、攻击技术等内容,以后还能交给威胁情报使用。下面这段代码是简单的开启了一个蜜罐,并记录到数据库中。
kokkuri-create-docker

就我的demo来讲,server端只干了这么点事情。

0x03 Agent端实现

这部分其实连demo都没写完,就厚脸皮的拿出来写了。
Agent端其实也需要配置一些syslog相关的功能,这里还是用SSHD举例。

修改/etc/ssh/sshd_config文件中的SyslogFacility [Facility_name],刚刚server端指定的local6,这里也写local6,反正两边统一就行了。有一点要注意的是,这个facility name只有规定的几种,并不是自己随便写的。

接着新建一个文件/etc/rsyslog.d/kokkuri-agent.conf,目的是把agent端的syslog发送到server去。

:syslogtag,contains, "sshd" @@192.168.198.130:10514

这个写法就比较多了,这里采用的是检查tag中是不是包含sshd的,如果包含就发送到server去。

agent这边的代码写的就比较暴力了,主要有三个部分:接收策略、修改iptables、转换syslog。
其中转换syslog的部分还没有考虑,主要是为了把那些没法写syslog的应用的日志收集起来,再转换成syslog通过rsyslog发送给server,据说MySQL好像就不能直接支持syslog(XD

接收策略这部分代码,我直接写了个socket监听本地的12666端口,暴力直接。
kokkuri-receive-policy

然后就是执行命令修改iptables的部分了,这部分依然在开发中XD

0x04 后续

毕竟这只是个demo,纯粹是提出了个思路,很多坑这里面其实都没有考虑到。具体可行性如何、能用在多大范围的机器上都是不确定的,只能等我有空的时候慢慢研究了233333。