YuriAvello/SnortHydraDetection

GitHub: YuriAvello/SnortHydraDetection

基于 Snort 2.9 自定义本地规则检测 Hydra 慢速 SSH 暴力破解攻击的实验性研究项目,探索了基于阈值检测的 effectiveness 与局限性。

Stars: 0 | Forks: 0

用于检测慢速 Hydra 攻击的 Snort 本地规则

概述

这是我作为网络安全理学硕士(MSc Cyber Security)学位最终项目所提交的课题。
慢速暴力破解攻击对网络入侵检测系统构成了真正的挑战:通过降低连接频率,攻击者可以在低于基于特征规则的阈值下进行操作,同时仍然能够系统地枚举凭据。本项目在受控的实验室环境中研究了这种规避技术,使用 Hydra 作为攻击工具,并使用 Snort 2.9 作为 IDS。
核心研究问题很简单:自定义的 Snort 本地规则能否可靠地检测出 Hydra 的 SSH 暴力破解攻击——以及在什么程度上,放慢攻击速率可以让其完全逃避检测?
我们配置了三台虚拟机来模拟真实场景:一台运行 SSH 和 Snort 的 Ubuntu 目标机,一台运行 Hydra 的 Kali 攻击机,以及另一台生成合法 SSH 流量的 Kali 虚拟机,用于测试误报情况。实验迭代了多种规则配置,根据攻击速度和误报率衡量检测率——最终得出了一条基于阈值的规则,在敏感度与实际可用性之间取得了平衡。
研究结果强调了静态阈值检测在面对“低速慢速”攻击时的根本局限性,并指出了为什么分层防御——将 IDS 与防火墙规则、IPS 模式和社区规则集结合使用——在生产环境中是必不可少的。

使用的语言和工具

- OpenSSH 3.0.13 - Snort 2.9.20 - Bash - Hydra Brute Force

使用的环境

- Oracle VM Virtual Box 7.0 - Ubuntu 24.04 LTS - Kali Linux 2023.1

程序演练:

在启动 Snort 之前,我需要在 etc/snort/snort.conf 文件中配置一些参数,例如网络适配器和 IP 范围地址。 Snort 启动后,任何警报都会打印到控制台。为了方便起见,我创建了一个脚本,用于启动 Snort、将输出重定向到文本文件 snortlog.txt,并且一旦我中断 Snort 的执行,命令 WC -l snortlog.txt 就会在控制台中打印出生成的行数(即检测次数)。
Script to start Snort
接着,我创建了两个文本文件,分别包含十个用户名和十个密码,供 Hydra 攻击使用
Text file with usernames
Text file with passwords
在没有启动 Snort 的情况下,我只是运行了一次 Hydra 攻击作为测试,以确保攻击能够成功。 ``` Hydra -L users.txt -P password.txt ssh://10.0.2.12 -t 8 ``` -t 8 表示尝试访问 SSH 端口 22 的并发线程数
Hydra test without Snort started
启动 Snort 后,我执行了相同的攻击,但 Snort 没有检测到任何攻击。由于不确定组合数量和攻击速度是否足以被检测到, 我将组合数量增加到了 400 个,并设置标志 -T 20 来执行 20 个并发线程。
Test Hydra with -T 20
这是我为了尝试检测该攻击而实现的本地规则:
``` alert tcp $EXTERNAL_NET any -> $HOME_NET 22 (msg: "Possible SSH brute forcing!" ;\ flags: 5+; threshold: type both, track by_src, count 5, seconds 30; sid:1000002; rev: 1;) ``` [参考](https://stackoverflow.com/questions/47742405/using-snort-suricata-i-want-to-generate-an-ssh-alert-for-every-failed-login-to) 该规则关注来自同一源端、请求与 SSH 端口 22 建立 TCP 连接的入站连接数量。如果在 30 秒内检测到超过五次连接尝试,它将发送一次警报。
Snort Local Rule
通过这条本地规则,Snort 最多每 30 秒生成一次警报,在整个暴力破解运行期间仅生成了 5 次警报。
First Snort Detection
因此,我接着去除了 threshold(阈值)参数,在 Hydra 发起的 420 次攻击中,Snort 生成了 169 次警报,占总攻击次数的 40.2%。
Snort second detection
到目前为止,我还没有考虑误报的可能性。如果没有 threshold 参数,Snort 很可能会对合法的登录尝试发送警报。
因此,我重复了该实验,并从第三台 VM 发起了三次 SSH 连接,模拟合法用户。结果是 Snort 多生成了三次警报,通过检查日志文件,我能够找到那三次合法的连接。我得出的结论是,没有 threshold 参数,该本地规则将无法在实际中使用。
Snort False Positives
为了消除误报,我重新引入了 threshold 参数:这一次,连接尝试的次数设为 3 次而不是 5 次,时间跨度设为 3 秒而不是 30 秒。这样做的目的仍然是在不产生误报的情况下接收到一定数量的警报。
由于 threshold 参数的设置,新规则生成的警报较少,为 25 次,但它对我执行的五次合法 SSH 连接并没有产生任何误报。
Snort fourth detection
### 规避检测 在实验的这个阶段,我尝试使用更慢的设置、更少的线程来测试 Hydra,以规避 Snort 的检测。 ``` hydra -L users.txt -P password.txt ssh://10.0.2.12 -t 4 ``` 失败
Test slow hydra 1
``` hydra -L users.txt -P password.txt ssh://10.0.2.12 -t 2 ```
Test Slow Hydra 2
仅被检测到一次
Snort Fifth Detection
``` hydra -L users.txt -P password.txt ssh://10.0.2.12 -t 1 ```
Test Slow Hydra 3
之前的攻击未被 Snort 检测到
**注意事项:** 使用四个线程的暴力破解攻击耗时 1 分 25 秒完成,并被检测到九次。使用两个线程时,完成时间为 3 分 8 秒,是四个线程的两倍多,但仅被检测到一次,这使得检测率降低了近 90%。而仅使用一个线程的攻击耗时 10 分 55 秒,并成功规避了检测。 Snort Failed Detection
### 调整本地规则 我测试了本地规则,将检测周期增加到 10、15、30 和 60 秒。
在 60 秒的检测周期下,Snort 能够针对该攻击发送 6 次警报。
Snort sixth detection
### 分析与评估 增加 threshold 参数的时间跨度有助于检测暴力破解攻击,但也容易产生误报。给同一源端更多的时间进行三次尝试很容易产生误报。但问题在于:暴力破解攻击的字典文件包含成千上万的条目,这些条目与少数用户名结合,可以产生数十万种组合。如果恶意攻击者想要执行暴力破解攻击,每 5 秒钟尝试一次将需要很长时间才能成功,以至于这本身就能起到一种威慑作用。
另一个考虑因素是,我只在 IDS 模式(检测)下使用了 Snort,而没有在 IPS 模式(防御)下使用。防御模式可能会有一些规则,在满足特定要求时丢弃数据包并关闭连接。此外,在一个安全的系统中,不仅只有网络入侵检测系统,还有许多其他工具相互配合、互为补充。例如防火墙,在本次实验的情况下,它本来可以在实验的第一阶段就捕获 Hydra 快速且大规模的尝试。
此外,我的印象是,Snort 的规则编写是一个非常强大的工具,在专业人士的手中,它可以真正成为抵御入侵的重要资源。关于规则的另一个方面是,在 Snort 网站上可以下载社区规则,这是一组高级规则集合,会针对新威胁不断更新。而对于大型企业,可以通过付费订阅获取另一套专属规则。

标签:PoC, 应用安全, 暴力破解, 网络安全, 防御规则, 隐私保护