来源:https://blog.perched.io/dns-tunneling-other-hunts-w-rocknsm-bro-elk-52a4486e44d0
在这篇文章中,我将扩展我的DNS排版检测帖子,并(重新)介绍DNS隧道检测。
为了使这篇博客文章有价值,并适用于防御者和威胁猎人,我们将涵盖以下内容:
1、与Bro一起设置RockNSM ELK实例。
2、为其余步骤的配置克隆GitHub存储库。
3、添加Elasticsearch搜索(模板)映射的额外字段。
4、Logstash配置额外的数据,使DNS隧道检测更有效。此外,DNS的丰富添加,如IDN(即:Punycode/emoji)或如果域名是IP地址,将有助于额外的威胁搜索。
5、用于检测的Kibana可视化和仪表板。
6、测试检测方法。
7、使用添加的logstash配置进行额外的搜索/检测。
在我开始之前,我必须认识一个我上周在做尽职调查时偶然发现的博客(https://www.binorassocies.com/en/blogs/2017/10/logstash-bro-dns-tunnel.html)。
虽然我上面提到的博客有一些很好的信息,但是我仍然在写这篇文章,因为我对它进行了一些扩展,提供了关于设置、Logstash配置和一些Kibana可视化/仪表板的完整演练。
一、DNS隧道/数据泄漏的介绍
虽然有许多工具可以用于植入C2和实现数据泄漏,但DNS的使用是一种有趣的方法。一般来说,它没有被适当地控制,没有被监视,在大多数网络上都是允许的,并且大量的日志导致了巨大的覆盖流量。因此,DNS隧道是C2的一个很好的选择。
为了在技术上进行级别设置,DNS请求可以包含255个字符(如果攻击者控制DNS服务器,则包含更多)。正在泄漏的数据被编码到域的其余空闲字符中。
例子:
这里我正在执行一个查找neu5ron.com,但添加I are secret data...作为编码字符串。
JEQGC4TFEBZWKY3SMV2CAZDBORQS4LRO.neu5ron.com
类似于DNS数据泄漏的工作方式,将DNS用于C2将使用空闲字符进行来回通信(C2)。此外,由于能够使用Base 64编码,很多时候隧道将使用TXT记录。
二、为什么每个人都应该监视/控制DNS
首先,我必须先说明,即使在控制DNS时,DNS隧道仍然是非常可能的。
DNS通常作为公司/网络的一个关键优先级被忽略。然而,它的用例非常广泛——安全/预防、人力资源、威胁搜索,以及可以帮助网络取证的历史数据库(被动DNS)。
在我们深入研究检测过程之前,重要的是要强调预防不是刀枪不入的。就像在安全领域的任何事情一样,你必须权衡利弊,并向你的领导传达你的安全实现是有成本效益的。
例如,如果正确设置DNS基础设施(监视和控制)需要4个小时,并且可以防止100个小时的事件响应工作或客户/用户停机,那么您就有效地为您的公司/组织提供了经济利益。
我们已经讨论了监视方面,但是控制是另一个关键的DNS进程。如果对手能够使用他们自己的DNS服务器,他们可以有效地使用他们想要的任何域。例如,下面是使用“adobe.com”作为C2的场景。想想有多少白名单,绕过……
2.1、预防措施
以下是一些你可以考虑的预防措施:
1、考虑阻塞动态DNS,是的,甚至“APT”使用免费域
2、动态DNS的其他示例可以在这里找到1、2和3(https://threatconnect.com/blog/camerashy-infrastrucutre/)
3、下面是我编译的动态DNS域列表(https://gist.githubusercontent.com/neu5ron/8dd695d4cb26b6dcd997/raw/5c31ae47887abbff76461e11a3733f26bddd5d44/dynamic-dns.txt)
4、如果可能的话,考虑屏蔽广告
5、考虑屏蔽恶意tld(https://www.spamhaus.org/statistics/tlds/)
2.2、积极影响
1、减少用户停机时间,因为不需要从感染中重新从映像中恢复他们的机器
2、使用被动DNS可以降低事件响应、帮助台以及在清理破坏过程中涉及到的任何人的成本(时间)
3、监视和控制DNS可以防止在工作时用户访问和使用某些内容时可能出现的特定HR违规/问题。成人的内容或暴力的材料
2.3注意事项
1、管理和控制DNS需要对基础设施的管理提供额外的支持
2、如果合法的域/服务被阻塞,这可能会导致用户停机或业务影响
三、尽管DoH
即使使用HTTPs上的DNS (DoH), DNS隧道检测也与管理网络相关,因为很多时候允许DNS离开管理网络,但不允许出站HTTPs。
此外,也有可能使用JA3 + JA3S散列和一些额外的数据分析,如频率/计数,来检测DoH(https://github.com/salesforce/ja3)。
我提到这个是因为最近一些主要的DNS提供者,甚至是浏览器实现,都提供了通过TLS/HTTPs执行DNS请求的能力。
如果你有任何关于DoH的额外发现,你想添加,那么我将很高兴收到你的来信,并将相应地更新帖子。
四、一些检测方法的问题
简单地说,我想指出当前DNS隧道检测方法的一些缺陷。许多“开箱即用”的检测方法比人们想象的复杂得多。
4.1域的长度
在一周的时间内,我观察到的域的长度如下,其次是看到的次数:
69 characters — 36,926,289
72 characters — 20,965,981
75 characters — 24,475,506
78 characters — 694,677
93 characters — 12,678
174 characters — 1,309
因为我见过一些SIEMs或分析是围绕域查找的长度构建的,有些甚至特别指出超过70,这将导致数百万次警告…
4.2被动DNS数据库
我强烈推荐在日志基础设施之外使用被动DNS数据库,前提是您能够负担建立和管理基础设施和(人力)资源。如果没有这个选项,您可以使用现有的SIEM/日志基础结构!
4.3机器学习
使用频率和子域唯一计数的检测方法将导致许多误报,以及使用数百个(如果不是数千个)子域的数千个广告域、内容传递网络、邮件提供者和其他合法网站。
此外,如果基于频率(时间),只是通过隧道缓慢地通信以绕过该检测机制的问题。
五、给我们看一些有用的东西
1. ELK +Bro使用RockNSM
对于这个设置,我们将使用RockNSM。下面是一些详细的演练(如果您已经熟悉span和tap,请跳到视频2)。
许多人都知道,监视基础设施是攻击者的目标,这就是为什么我选择RockNSM而不是其他ELK+Bro部署的原因,因为它的设计安全实现使用SELinux。
2. RockNSM Enrichment
git clone https://github.com/neu5ron/rocknsm-add-enrichment
现在将存储库上载到您的RockNSM服务器(如果您没有从服务器本身执行git克隆)。
3.额外Elasticsearch配置
在开始获取新数据之前,我们需要确保将这些新配置应用到Elasticsearch数据库中。
通过执行以下操作添加Elasticsearch映射模板:
curl -H 'Content-Type: application/json' -XPUT "http://localhost:9200/_template/bro-domain-names" -d @rocknsm-add-enrichment/elasticsearch/index-mappings/92-bro-domain-names.json;
4. 额外的Logstash配置
为了检测DNS隧道/exfil中的模式,我们需要为一级域(即TLD)、一级+二级域(即google.com)和一级+二级+三级域(即www.google.com)添加特定的字段。
原因是,如前所述,DNS隧道/exfil将创建大量惟一的子域。因此,我们将在域的第1 + 2级执行聚合。
此外,我们还希望添加其他元数据,如长度和总级别(即:计算每个“.”)。
# Copy logstash file to rocknsm
sudo cp rocknsm-add-enrichment/logstash/conf.d/logstash-816-domain-enrichment-filter.conf /etc/logstash/conf.d/
# Give logstash permissions for the file
sudo chown logstash:logstash /etc/logstash/conf.d/logstash-816-domain-enrichment-filter.conf
# Change permissions
sudo chmod 640 /etc/logstash/conf.d/logstash-816-domain-enrichment-filter.conf
# Restart logstash to implement new configuration
sudo systemctl restart logstash
5. Kibana可视化/仪表盘
我已经创建并共享了所有必要的Kibana可视化/仪表板,以便您自己查看和测试检测方法。
首先,我们需要导入可视化/仪表盘文件:
这可以在Kibana中执行,在登录后,进入“管理”,然后单击“保存的对象”,然后单击“导入”,并从之前收集的存储库中选择“rocknsm-add-enrichment/ Kibana /dns.json”文件。
其次,我们需要刷新索引:
这可以在Kibana中完成,登录后进入“Management”,点击“Index Patterns”,选择“bro-*”索引,点击右上角的recycle按钮(“Refresh field list”)。
6. 检测方法
我们将在第1 + 2级域上进行聚合,并寻找唯一子域的高计数。
测试是使用注入的DNS隧道PCAP在我的两个环境中执行的。我将向您展示如何在您自己的网络/设置中进行同样的操作。
执行查找的主机唯一计数的子聚合可能有助于检测。例如,一个主机在4000个子域上执行查找要比500个主机在4000个惟一子域上执行查找可疑得多。此外,域内最大总长度和最大级别上的子聚合允许我们做出更明智的决策。
7、PCAP注入实时网络
您将注意到,在这个网络中,隧道式域“chickenkiller[-]com”与具有最独特子域的域相去甚远。事实上,它的子域名少了37,424个!
结合只有1台UniqHosts执行查找和惟一子域(惟一域名)与总查找(计数)4,837 / 4,858的比率(在本例中,子域多于查找?),我们可以开始看到该域中的一些异常值。
8、PCAP注入(我的)家庭网络
显然,相同的隧道域比其他域突出得多。
另外,注意在这个仪表板中有一个domain_1n2n3_name的(数据表)可视化,它用于在co.uk之类的环境中进行隧道/exfil的域。
这样您就可以在唯一的1n2子域中过滤掉co.uk,但是类似于somedomain.co.uk这样的东西仍然会出现在这个可视化中。
六、如何将PCAP注入您的网络
# Find interface to replay the PCAP to
sudo tcpreplay --listnics
# Make sure to use one of the NICs that is listed that is the same as one of the listening NICs in /etc/rocknsm/config.yml under "rock_monifs"
grep -A5 "rock_monifs" /etc/rocknsm/config.yml
# Convert PCAP GZ to regular PCAP for replay
editcap -F pcap rocknsm-add-enrichment/testing/dnscat2.pcap.gz rocknsm-add-enrichment/testing/dnscat2.pcap
# Replay the PCAP, replacing "enp0s8" with your interface determined above
sudo tcpreplay -i enp0s8 -p 1250 rocknsm-add-enrichment/testing/dnscat2.pcap
# You should then see output similar to this
Actual: 10000 packets (1465823 bytes) sent in 7.99 seconds
Rated: 183245.6 Bps, 1.46 Mbps, 1250.12 pps
Flows: 7 flows, 0.87 fps, 9682 flow packets, 318 non-flow
Statistics for network device: enp0s8
Successful packets: 10000
Failed packets: 0
Truncated packets: 0
Retried packets (ENOBUFS): 0
Retried packets (EAGAIN): 0
将数据注入网络后,等待一分钟数据刷新,然后登录Kibana查看检测方法,然后进入Dashboard,选择“DNS隧道检测”。
完成后,您可以从Elasticsearch/ELK中删除“注入”数据(这样我们就不会从测试数据中持续得到假阳性)。这不会删除您拥有的任何其他数据。
您可以通过CLI或Kibana“开发工具”执行此操作,如下所示:
POST /bro-*/_delete_by_query
{
"query": {
"bool": {
"must": [
{ "match": { "domain_1n2n3_name": "sirknightthe.chickenkiller.com" } }
]
}
}
}
七. 额外的检测/狩猎
因为我们在Logstash管道中添加了额外的元数据/丰富,所以我们可以在DNS、HTTP和SSL日志中检测额外的可轻松实现的目标。
7.1检测IDN/Punycode/Emoji域
当IDN同质图攻击被用来在访问他们认为属于苹果的域名时欺骗用户时,引起了一些新闻。
domain.is_idn:true OR domain.has_non_ascii:true
7.2检测SSL或HTTP中的IP地址域
domain.ends_with_int:true AND domain_type:(ssl OR http)
7.3检测SSL或HTTP中无效的IP或域
domain.has_dot:false AND domain_type:(ssl OR http)
在您尝试仪表板和可视化之后,我希望听到您的任何反馈和建议。