让我们开始追踪!如何利用Bro IDS和RITA狩猎命令与控制通道
Logan Lembke //
在BHIS,我们热爱Bro IDS。
想象一下……Bro IDS无处不在!
如果你之前没有接触过Bro IDS,可以查看John的YouTube频道上的这个网络研讨会,讨论Bro IDS的必要性以及它能为你本地蓝队提供的功能。
准备你的武器:安装Bro IDS
Bro IDS需要一个类UNIX操作系统,如Linux、Mac OS或BSD。
Bro安装通常根据环境定制。有几种方式可以开始使用Bro。官方安装说明建议从源码编译Bro。虽然这种方法会提供额外功能,但打包的二进制文件对于离线数据包捕获分析也足够。
要安装打包版本的Bro IDS:
- 访问 https://www.bro.org/download/packages.html
- 找到并运行适用于你操作系统的说明
- 同时安装
bro-aux
包 - 将
/opt/bro/bin
添加到你的$PATH
另外,我为基于Debian的系统准备了一个安装脚本,可以从源码编译Bro IDS及其所有可选依赖项。
理解痕迹
我们甚至能抓住忍者
Bro IDS可用于直接分析被窃听的网络;然而,Bro也能分析原始pcap文件。下面包含三个示例数据包捕获。每个捕获包含受感染机器(10.200.201.29)与攻击服务器通信产生的流量。在继续之前,下载以下文件:
下载每个单独的数据包捕获后,打开终端,将每个文件移动到各自的目录中。Bro IDS将其分析结果写入当前工作目录,我们不希望混淆不同数据包捕获的结果。最后,使用 gunzip [sample.pcap.gz]
解压每个文件。
从顶级目录运行“find”应该会产生类似这样的结果:
一旦文件放入各自的文件夹,我们需要运行Bro。在每个单独的文件夹中,运行:
bro -C -r [sample.pcap] local "Site::local_nets += { 10.0.0.0/8 }"
这将在每个目录中生成多个日志。-C
标志告诉Bro忽略数据包校验和,-r
标志告诉Bro读取pcap文件,其余部分让Bro知道10.x.x.x/8子网是我们的本地网络。
在真实场景中,Bro产生大量需要筛选的数据。虽然官方文档积极维护,但分布在多个网页上。或者,Critical Stack整理了一份有用的手册,解释了每个日志。
简单游戏:Dnscat2(DNS隧道C2)
原始DNSCat标志:他很可爱吧?
Dnscat2之前在BHIS博客中提到过几次。我们展示了该工具可以绕过Cylance,Luke展示了他使用Powershell重写该工具。如果你不熟悉dnscat2,我鼓励你在继续之前查看我们之前的文章。
Conn.log
连接日志是审查最重要的Bro日志。根据Bro IDS网站,“[连接日志]管理TCP、UDP和ICMP流量的一般信息的跟踪/记录。对于UDP和ICMP,‘连接’应使用流语义解释(从源主机/端口到目标主机/端口的数据包序列)。”
这些“流语义”当场抓住了dnscat2。通常,查看数据包捕获时,UDP流量被视为通过网络发送的单个数据报流。然而,Bro IDS将这些连接分组,只要它们以合理的速率在唯一的套接字对上发生。这意味着Bro IDS可以轻松指出长时间的UDP“会话”。
在分析dnscat2.pcap产生的conn.log中,你应该看到以下行:
1503528301.909886 CoPfoo4LI4g4NNUFOe 10.200.201.29 33733 10.200.201.2 53 udp dns 2467.745404 402129 639484 SF T T 0 Dd 4837 537565 4837 774920 (empty)
这一行显示我们的受感染主机10.200.201.29在2,467.7分钟(41小时)内发出了数千次连续的DNS查询!任何长时间运行的连接应立即引起怀疑,尤其是它们恰好通过DNS运行。
Dns.log
DNS日志是识别用户行为最有用的日志之一。虽然大多数流量通过TLS保护并隐藏于分析,我们仍然可以通过DNS查询找出单个主机连接了哪些站点。
Dnscat2产生的DNS日志尤其棘手。我建议使用 less -S dns.log
查看文件。-S
选项防止自动换行。
打开文件后,你会注意到所有请求共享一个共同的“超级”域:sirknightthe.chickenkiller.com
我的命令与控制服务器是该域的权威名称服务器。因此,任何对 sirknightthe.chickenkiller.com
子域的DNS查询都将发送到它。最终子域由dnscat2客户端生成,以将数据发送回C2服务器。由于dnscat2客户端需要将其所有数据编码在这些子域中,它需要产生大量子域。为了捕获这种DNS隧道行为,我们需要统计给定“超级”域下看到的子域数量。 收集这些数据后,我们寻找异常高的排名计数。然而,可能有另一种方法捕获Dnscat2。
默认情况下,Dnscat2客户端发送MX、CNAME和TXT记录查询。虽然CNAME查询几乎出现在每个网络环境中,但MX和TXT查询有些罕见。MX、CNAME或TXT记录的异常流入可能表明DNS隧道在你的网络上运行。
提高难度:Powershell Empire(反向HTTPS C2)
Powershell Empire是最常用的后期利用工具包之一。在上面链接的示例中,一个基于Python的植入程序在Linux机器上运行。然后,这台受感染机器通过HTTPS回调到Powershell Empire C2服务器。
Conn.log
不幸的是,Powershell Empire不保持单个TCP会话活动,因此我们不能使用之前用于dnscat2的相同长连接分析。相反,它“信标”。打开Powershell Empire捕获产生的连接日志后,查看记录的时间戳。如果仔细观察,你会看到植入程序每5秒回调到C2服务器。使用频率分析,我们可以清楚地发现这种信标行为。 或者,我们可以简单地寻找在一天内与单个外部主机建立大量连接的主机。
不幸的是,这种信标行为在真实世界的数据包捕获中并不那么明显。来自其他系统的连接使连接日志混乱,难以直接检查时间戳。除了“大海捞针”问题外,“抖动”可能被引入连接。抖动随机添加信标之间的延迟,打乱我们之前注意到的“每5秒”关系。然而,高级频率分析已被证明即使在存在抖动的情况下也能检测信标行为。
或者,查看标记为 orig_bytes
和 resp_bytes
的字段。这些非常规律。这些字段测量每个TCP连接中发送到和从受感染主机的字节数。 不幸的是,这些字段在感染过程中可能略有变化。当黑客在系统中枢转或渗出数据时,可能发送更多或更少的数据。
Ssl.log
虽然SSL和TLS保护我们的大部分数据,但Bro IDS能够通过收集未加密的连接元数据并将其记录到SSL日志中来绕过这一点。
在此捕获中,几乎每个连接都是通过TLS建立的。你可以通过比较连接和SSL日志来证明这一点。事实上,你可以使用它们的第二个字段 uid
关联日志条目。Bro以几种不同方式分析每个连接,并使用这些UID关联分析结果。
在SSL日志中,我们看到相同的信标行为;然而,我们看到更有趣的东西。每个连接都使用自签名证书加密。默认情况下,大多数黑客工具使用自签名证书。这使得捕捉懒惰的黑客变得容易。
如果你对了解每个连接使用的证书感兴趣,请查看x509和files日志中的相应条目。
看穿伪装:Meterpreter(反向TCP C2)
连迷彩都是数字化的
Meterpreter连接可以使用反向TCP传输或反向HTTP(S)传输建立,意味着Meterpreter有几种不同的方式回调。HTTPS传输类似于Powershell Empire。然而,TCP传输在整个感染过程中保持活动的TCP连接。在此捕获中,我选择使用反向TCP传输。我故意让Meterpreter数据包捕获混乱,希望你能筛选数据以找到感染。
Bro-Cut
学习使用grep、cut和awk等工具使这个问题变得可处理。然而,Bro IDS还包括一个名为bro-cut的Python工具。与dnscat2类似,我们寻找长连接。Bro-cut允许我们丢弃不感兴趣的字段。
cat conn.log | bro-cut uid id.orig_h id.resp_h duration | sort -nr -k4 | head -n 5
将显示按持续时间排序的前5个连接。从这里,我们获取顶部连接的UID并grep出完整的连接详情。对我来说,顶部连接标记为 CFRuW5gJrBirOIYZ4
,我运行 grep CFRuW5gJrBirOIYZ4 conn.log
。
你的UID可能不同。
在目标上运行whois搜索后,我们看到IP地址是Amazon EC2云的一部分。虽然我在EC2中进行了此捕获,但应清楚对云服务的长时间连接应立即引起怀疑。
Grep、cut、awk、bro-cut、sort、head、tail和其余标准*nix实用程序对于在现实世界中利用Bro IDS产生的日志至关重要。
其他日志
Meterpreter数据包捕获有点混乱。虽然这使得找到讨论的感染更加困难,但它展示了Bro的一些更高级功能。http日志显示了升级主机APT包管理器和安装Elinks(基于控制台的Web浏览器)的结果。software日志将这些信息浓缩,并告诉我们10.200.201.29运行了多个版本的APT以及ELinks Web浏览器。随着时间的推移,known_hosts日志和known_services日志可以与software日志结合使用,以建立被窃听网络的清单。除了这些文件,Bro IDS提供多种有趣的监控功能,包括完整文件捕获、黑名单分析等。
用机器人狩猎:RITA
手动筛选日志需要时间和练习。然而,已经开发了软件来解决这个问题。与其在一堆终端中串联各种*nix命令,我们可以使用软件指导搜索。进入RITA,真实智能威胁分析。
我们不都这样吗?
RITA读取Bro IDS产生的日志,并从数据集中提取尽可能多的有趣特征。RITA通过发现持久连接以及统计子域来找到dnscat2。此外,RITA有一个特殊的信标模块,使用频率分析中的先进技术来找到信标主机。运行RITA后,Powershell Empire和其他信标软件很容易被发现。Meterpreter也不例外。RITA能够看穿伪装并显示目标。
要开始使用RITA,前往我们的项目页面,并与John一起安装程序。或者,访问GitHub页面并遵循那里列出的说明。
简而言之:
- 启动一个Ubuntu 16.04(或类似)实例
- 如果未安装git,安装git:
sudo apt install git
- 克隆RITA:
git clone https://github.com/ocmdev/rita.git
- 运行安装程序:
chmod +x install.sh; sudo ./install.sh
- 源你的.bashrc:
source ~/.bashrc
- 如果不在那里,将之前的Bro日志移动到你的RITA系统
- 启动MongoDB:
sudo systemctl start mongod
- 在包含三个示例文件夹的顶级目录中,运行:
rita import -i [meterpreter folder] -d Meterpreter
rita import -i [ps-empire folder] -d Powershell-Empire
rita import -i [dnscat2 folder] -d DNSCat2
- 分析摄取的数据:
rita analyze
- 创建报告:
rita html-report
- 最后,在Web浏览器中打开文件:
rita-html-report/index.html
你应该看到以下显示:
首先,打开Meterpreter,并点击顶部的长连接。
在这里,你将看到我们之前用bro-cut找到的结果。接下来,打开Powershell-Empire并点击信标标签。
RITA清楚地显示了信标。字段“TS score”代表时间戳分数,意味着基于连接时间戳,从10.200.201.29到18.220.208.40有一个完美的信标。此信标最频繁地以5秒间隔发生,并信标了652次。最后,转到dnscat2结果并点击DNS。
在这里,我们可以看到有4,850个 sirknightthe.chickenkiller.com
的子域被查询。此外,如果你转到长连接标签,你将看到与之前相同的结果。
目前,RITA不会对任何内容发出警报。相反,它被用作助手——一种战术工具。除了我们之前讨论的分析外,RITA执行黑名单检查、网络扫描检测、长URL分析以及用户代理字符串分析。未来,RITA将成为多种其他分析的测试平台,取代我们通常手动进行的搜索。
黑客留下痕迹。现在我们可以跟踪它们。
黑客可能试图掩盖他们的痕迹,但不可避免地Bro IDS将记录他们的行动。Bro IDS的美妙之处在于它只需要一个网络窃听。它可以运行在完全独立的网络上。除非黑客获得系统的物理控制,否则他们不会击败Bro。然而,Bro不是万能药。它只是产生太多数据。任何黑客迹象都与日常流量混合和混淆。
Bro IDS能够产生太字节的数据。然而,为了从中提取价值,我们需要投入数百人小时进行手动分析或自动化。我们的希望是RITA将解决这个问题,并帮助你在未来的狩猎中。
Dropbox链接: