+-
KVM高交互蜜罐 NAT网络模式下的网络配置

一、概述

蜜罐技术最近在各个安全厂商已有应用与实践,通过构建蜜罐,用户能在公网或者内网引诱攻击,同时对蜜罐中的攻击数据进行收集与分析,达到了解攻击者意图,收集威胁情报的目的,更高级的通过蜜罐能够回溯重放对攻击流程,形成攻击链,对整个攻击过程进行一个清晰的展示。

二、问题描述及处理方法

针对内网部署的蜜罐,用户现场一般拥有多个不同网段的划分,针对这种情况单蜜罐设备需要支持感知多个网段,本文重点阐述单设备多网段感知过程中的网络配置方法。先看一下蜜罐设备 网络拓扑图:

clipboard.png

上图中虚拟蜜罐通过kvm虚拟化技术构建,构建的虚拟蜜罐集群有一个属于自己的内部网络(ps:由于docker平台使用的是linux内核,不支持windows高交互操作系统的运行,所以我们使用kvm构建虚拟蜜罐环境),上图中的192.168.122.0 网段就是虚拟蜜罐内部网络对应的网段,此时是虚拟蜜罐内部网络就像是我们平时工作的一个局域网,而蜜罐服务器上的em1,em2,em3网卡对应的网络就像是一个外部网络。我们的预期是当内网渗透机或者内网失陷机器进行攻击和扩散时,当流量达到蜜罐服务器上的em1,em2,em3对应的网卡上时,我们把对应的攻击流量牵引至虚拟蜜罐内部,让虚拟蜜罐集群与攻击者进行交互,但是虚拟蜜罐内部与蜜罐服务器上的网络属于两个完全不同网段的网络,存在网络隔离,因此需要用到一项技术,NAT技术(网络地址转换)。大概的转换流程如下:

clipboard.png

当172.16.20.50的流量达到em2网卡时,通过内部的nat转换将通信的目标地址更改为蜜罐内部的地址192.168.122.100。这个过程需要使用linux下的iptables进行控制,具体指令如下:

iptables -t nat -A PREROUTING -d 172.16.20.10 -j DNAT --to-destination 192.168.122.100

这条指令配置的是当攻击者对蜜罐服务上的ip地址发起访问时,我们把访问的流量牵引到虚拟蜜罐的内部。同理当虚拟蜜罐对外发起连接时也需要做地址转换,而此时需要做的是源地址转换。

iptables -t nat -I POSTROUTING 3 -s 192.168.122.100 -j SNAT --to-source 172.16.20.10

注意:加源地址转换是用的是-I 插入方式加入,而目标地址转换时用的是-A 追加方式加入。这是由于kvm 对应的libvirtd管理kvm虚拟机网络的进程会对kvm内部创建的虚拟机进行源地址转换处理,这种源地址转换是一种特殊的源地址转换,称为ip地址伪装具体的可以查看防火墙nat表的规则,

iptables -t nat -vnL 如图:

clipboard.png

通过验证,ip地址伪装时默认会使用linux的默认网关对应的网卡上ip地址进行源地址转换,当该网卡有多个ip地址时,会优先选择第一个。如果我们使用这种默认的ip地址伪装会引发一个问题,即:所有虚拟蜜罐对外发起访问时,出口IP只有一个,这与我们预期不符,如下图:

ip地址伪装:

clipboard.png

预期效果:

clipboard.png

所以我们需要在ip地址伪装之上先使用-I 优先插入我们需要进行源地址转换的规则,确保进入的路径和出去的路径保持统一,当然地址转换也可以让流量进入和流出的出口不保持统一,这个可以根据实际需求进行调整。需要注意的用户自己添加的规则会在libvirtd(控制kvm网络配置的进程)重启后被覆盖,我们需要针对这种覆盖做一定的规则现场保护操作防覆盖,此处不展开。

根据蜜罐的交互程度不同可分为高低交互蜜罐,低交互蜜罐可以是简单的服务模拟,通过socket与访问该服务的远程地址进行一些数据的收发,仿真模拟程度有限,不便于跟踪捕获攻击者入侵后的进一步系统行为,攻击者入侵后的安装动作没办法得到有效的触发。高交互蜜罐可以仿真虚拟操作系统,能够感知入侵和后续的主机事件,在追溯和还原攻击过程高交互的优势更明显,也正是由于高交互蜜罐的高仿真,高交互蜜罐被入侵后可能成为入侵者的跳板机或者肉鸡攻击其他的内网机器,这个问题是需要解决的,因此我们需要针对高交互蜜罐进行一些通信策略的控制,限制蜜罐的对外通信。我们也可以通过iptables进行蜜罐对外访问的策略控制,根据用户现场需求,一般用户的期望是让外面的攻击流量可以访问蜜罐,不允许蜜罐对外主动发起任何连接,也就是蜜罐能够感知攻击,但是限制蜜罐被攻击后对外扩散,对流量进行限制时需要用iptables种的fitler表进行控制流量的管控。

加入如下规则进行蜜罐对外访问流量的拒绝,从外部发起的已经建立的连接需要放行,指令如下:

iptables -t filter -i virbr0 -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -t filter -i virbr0 -I FORWARD -j REJECT

上述两条指令中生效的网卡是virbr0,该网卡是libvirtd(控制kvm网络配置的进程)虚拟出来的网卡,所有虚拟蜜罐的流量均会流经此网卡,因此流量管控只需要指定该网卡即可,防止规则印象其他网卡的通信,蜜罐对部分端口主动发起的访问我们需要解除限制,可以加入如下规则,iptables 规则生效的优先级是自顶向下的,我们需要使用插入的方式,让放行规则在拒绝规则之前,否则拒绝所有规则会优先生效,放行规则将不起作用:

iptables -t filter -I FORWARD -i virbr0 -p udp --dport 放行的端口号 -j ACCEPT

iptables -t filter -I FORWARD -i virbr0 -p tcp --dport 放行的端口号 -j ACCEPT

至此,虚拟机蜜罐对外的策略已经基本完成。总结分为一下几点:

让外部的访问入口流量能够通过转发的方式进入到虚拟蜜罐内部 让虚拟蜜罐的出口流量能够与入口流量走向同的通信路径(指入口ip地址和出口ip地址 保持对应关系,从那里进,从那里出) 限制虚拟蜜罐主动对外发起的连接,必要时通过放行端口的方式,解除虚拟蜜罐对外连接的限制

虚拟蜜罐的策略已经基本完成,接下来我们处理蜜罐服务器上的路由策略,还是先抛出问题: