工控蜜罐 Conpot 的进阶玩法

本文将分享工控蜜罐Conpot的一些进阶玩法

0×01 引言 & Why Docker

之前在工控蜜罐Conpot的部署和入门指南这篇博客中介绍了 Conpot 的部署和简单配置,但是很多时候我们往往需要部署多个蜜罐形成蜜网,用虚拟机的硬件消耗不太划算,所以说这时候部署在 Docker 上就非常有必要了。我在上一篇博客中已经尝试在一台 32 核 32GB 服务器上部署了150个 Pre-Build Conpot 容器, CPU 占用微乎其微,内存占用大约在 14GB 左右。对于大规模的部署,这种资源占用程度是可以接受的。下面这幅图从实现架构上介绍了 Docker 相对于虚拟机的优势,我觉得 Docker 有一个很棒的优势就是在于较低资源占用下提供了容器间资源隔离。

工控蜜罐 Conpot 的进阶玩法_第1张图片

官方提供了一个 Pre-Build 的镜像,但是直接使用这个只能实现比较有限的功能,同时也不支持蜜罐模板的定制和日志的配置,所以这时候就需要自己撸 Dockerfile ,编译镜像了,但是不用像做官方的 Dockerfile 那么麻烦,可以基于 Pre-Build 镜像修改。

工控蜜罐 Conpot 的进阶玩法_第2张图片

这幅图展示了一个比较典型的工业生产环境(图片来自Logix),包括一些功能模块([变频]风扇单元、[变频]压缩机等)、PLC控制模块。希望能和大家一起,通过学习这个系列的文章,初步实现大型工控蜜网的自动化部署。

0×02 开始之前

  1. Linux 64bit / MacOS
  2. 安装 Docker (官方安装教程 & 国内源安装脚本
  3. 了解基本的工控协议(并非必要)
  4. 复习一遍工控蜜罐 Conpot 的部署和入门指南,列出想在容器中实现的协议( modbus 、 impi 、 http 、 snmp ······),并做出 template 。

0×03 定个小目标:先做一个能用的 Docker 镜像

先前说了,官方是有提供一个 Dockerfile 的,但是里面有点问题(比如使用国外源导致的网络中断,然后整个镜像就没法编译),官方的 Dockerfile 是基于 python:2 镜像做的,然后下载依赖、编译源码、测试,过程有点麻烦,而且因为网络问题,安装依赖需要很长时间。我把官方的 Pre-Build 镜像传到了网易蜂巢上,可以直接拉取网易源(hub.c.163.com/mapchuan/conpot:latest),也可以改成 honeynet/conpot 使用官方源。如果使用Docker的频率比较大,可以考虑在本地部署私有镜像仓库服务,提高镜像拉取的速度。最后要说明的是,在这里我是假定大家已经做好模板,如果还没做,可以先用官方的模板文件代替。

我们下载官方的repo,提取出./conpot/template/default模板文件夹,并将文件夹重命名为 mytemplate ,大家可以根据实际情况做出修改。

# 在Conpot镜像基础上修改
# 官方源: FROM honeynet/conpot
# 网易源:FROM hub.c.163.com/mapchuan/conpot:latest
FROM hub.c.163.com/mapchuan/conpot:latest

# 维护者信息
MAINTAINER mpc@besti

# 导入模板文件
RUN mkdir /opt/conpot/template  
COPY ./ /opt/conpot/template

# 切换工作目录
WORKDIR /opt/conpot/template

# 根据需要发布端口
EXPOSE 80

# 指定自定义模板,--template ./mytemplate表示以mytemplate为模板生成蜜罐
CMD ["/usr/local/bin/conpot", "--template", "./mytemplate", "--logfile", "/var/log/conpot/conpot.log"]]  

 

工控蜜罐 Conpot 的进阶玩法_第3张图片

完成Dockerfile后,在conpot文件夹中运行docker build -t conpot .编译镜像。

工控蜜罐 Conpot 的进阶玩法_第4张图片

运行docker run -it -p 80:80 conpot就OK啦。

工控蜜罐 Conpot 的进阶玩法_第5张图片

0×04 日志采集

既然考虑进行大规模的部署,像我们刚才做的镜像那样那样直接输出到屏幕显然是不合理的, Conpot 提供了多种日志收集的途径, Conpot 在 conpot.cfg 文件中配置了默认日志输出形式,用户可以通过修改 conpot.cfg 文件来自定义日志收集的配置。

[json]
enabled = False  
filename = /var/log/conpot.json

[sqlite]
enabled = False

[mysql]
enabled = False  
device = /tmp/mysql.sock  
host = localhost  
port = 3306  
db = conpot  
username = conpot  
passphrase = conpot  
socket = tcp        ; tcp (sends to host:port), dev (sends to mysql device/socket file)

[syslog]
enabled = False  
device = /dev/log  
host = localhost  
port = 514  
facility = local0  
socket = dev        ; udp (sends to host:port), dev (sends to device)

[hpfriends]
enabled = False  
host = hpfriends.honeycloud.net  
port = 20000  
ident = 3Ykf9Znv  
secret = 4nFRhpm44QkG9cvD  
channels = ["conpot.events", ]

[taxii]
enabled = False  
host = taxiitest.mitre.org  
port = 80  
inbox_path = /services/inbox/default/  
use_https = False  

可以看到,在 Conpot 中,我们可以使用 json 、 sqlite 、 mysql 、 syslog 、 hpfriends 和 taxii 等几种方式输出访问日志。

你可以在 honeynet 注册一个hpfriends账号,成为一名志愿者,将蜜罐日志上传到 honeynet ,为安全研究人员提供最新的威胁信息。

现在这个网页已经挂了,如果有需要可以自行搭建中心 hpfriends server ,收集来自设备的日志。

sqlite 文件存储在 ./logs/conpot.db ,MySQL 和 syslog 的 
device 变量是从设备中获取连接,但是在容器中,一般不会用到这个feature,注意把socket设为udp/tcp即可。

如果有什么不清楚的,可以在 Conpot 的 logger 文件夹中看看日志输出的具体实现,源码的可读性比较高。这个项目整体上耦合度不高,所以能够比较容易地基于源代码二次开发,对接自己的日志收集系统。

0×05 进阶!改进我们的 Docker image

虽然刚才我们已经初步写出了自己的 Docker image ,但是现在仍然是一个玩具,距离真正的部署还有一定距离,我们可以尝试着进一步改进刚才的 Dockerfile 。

先要修改 conpot 运行的 cfg 文件

[common]
sensorid = default

[session]
timeout = 30

[daemon]
;user = conpot
;group = conpot

[json]
enabled = False  
filename = /var/log/conpot.json

[sqlite]
enabled = False

[mysql]
enabled = True  
device = /tmp/mysql.sock  
host = 172.16.43.116  
port = 30005  
db = conpot  
username = root  
passphrase = root  
socket = tcp        ; tcp (sends to host:port), dev (sends to mysql device/socket file)

[syslog]
enabled = False  
device = /dev/log  
host = localhost  
port = 514  
facility = local0  
socket = dev        ; udp (sends to host:port), dev (sends to device)

[hpfriends]
enabled = False  
host = hpfriends.honeycloud.net  
port = 20000  
ident = 3Ykf9Znv  
secret = 4nFRhpm44QkG9cvD  
channels = ["conpot.events", ]

[taxii]
enabled = False  
host = taxiitest.mitre.org  
port = 80  
inbox_path = /services/inbox/default/  
use_https = False

[fetch_public_ip]
enabled = True  
urls = ["http://whatismyip.akamai.com/", "http://wgetip.com/"]

[change_mac_addr]
enabled = False  
iface = eth0  
addr = 00:de:ad:be:ef:00  

我在这里是让 conpot 把数据存储在 MySQL 容器中,将 enabled 改为 True ,并根据实际情况填写数据库的 IP 、端口、用户名、密码等信息,如果有多个节点,还需要修改 sensorid ,下图展示了当前文件夹中的文件。

工控蜜罐 Conpot 的进阶玩法_第6张图片

我们现在开始写 Dockerfile ,基本上还是在前面的 Dockerfile 里面加一些功能。

# 在Conpot镜像基础上修改
# 官方源: FROM honeynet/conpot
# 网易源:FROM hub.c.163.com/mapchuan/conpot:latest
FROM hub.c.163.com/mapchuan/conpot:latest

# 维护者信息
MAINTAINER mpc@besti

# 导入模板文件
RUN mkdir /opt/conpot/template  
COPY ./ /opt/conpot/template

# 切换工作目录
WORKDIR /opt/conpot/template

# 根据需要发布端口
EXPOSE 80

# 指定自定义模板,--template ./mytemplate表示以mytemplate为模板生成蜜罐,加入--config,指定配置文件
CMD ["/usr/local/bin/conpot", "--template", "./mytemplate", "--logfile", "/var/log/conpot/conpot.log","--config","conpot.cfg"]]  

运行 conpot ,访问容器的80端口,用 Navicat 连接 MySQL ,可以看到, conpot 已经在 conpot 数据库新建了 events 表,并添加了我们刚才的访问记录。

工控蜜罐 Conpot 的进阶玩法_第7张图片

0×06 更多玩法?

Now this is not the end. It is not even the beginning of the end. But it is, perhaps, the end of the beginning. ——Churchill

刚才已经基本上完成了 Conpot 蜜罐的部署和日志收集工作,但是现在很多操作比如 conpot.cfg 和 Dockerfile 的编写都需要手动一个个操作,距离大规模的部署仍然还有些距离,我们希望程序能够帮助我们完成 sensorid 、 conpot.cfg 和蜜罐模板的自动分发,在收集到攻击数据后如何挖掘,怎样与其他的安全系统产生联动······如果不出意外的话,我将在下一篇博客和大家进行更深入的研究。

我的博客是 https://pingch.top ,上面可以找到我的信息和联系方式,欢迎交流

参考文献

  • https://github.com/mushorg/conpot
  • Conpot’s documentation
  • http://plcscan.org/blog/tools/conpot/

你可能感兴趣的:(安全)