Sniffles 是一款用于创建数据包捕获的工具,可测试使用固定模式或正则表达式检测可疑行为的 IDS。Sniffles 的工作原理非常简单。它接受一组正则表达式或规则,随机选择其中一个正则表达式或规则,然后基于该规则或正则表达式生成内容。对于固定字符串,这意味着将字符串直接添加到数据中(可能带有偏移量或其他选项,如 Snort 规则)。对于正则表达式,过程稍显复杂。正则表达式被转换为 NFA,并从中选择一条随机路径(从开始到结束)。生成的数据将匹配该正则表达式。最后,Sniffles 可设置为完全匹配或部分匹配。在完全匹配模式下,数据包数据将绝对匹配至少一条规则或正则表达式(但某些 Snort 选项并未完全考虑)。部分匹配则会从匹配的字符序列中删除最后一个字符,变为不应匹配的序列(但也可能匹配另一条规则)。匹配规则应给 IDS 带来最大负担。因此,可以确定 IDS 在处理最坏情况流量时的表现。部分匹配流量带来的负担几乎与匹配流量相当。最后,Sniffles 还可以生成完全随机的数据流量。这种随机数据提供了最佳情况场景,因为随机数据几乎不可能匹配任何规则,从而可以以最大速度处理。因此,Sniffles 允许创建用于 IDS 深度数据包检测的最佳和最坏情况操作的数据包捕获。
除上述功能外,Sniffles 还能创建评估数据包捕获。评估数据包捕获有两种类型。第一种评估数据包捕获会按顺序为每条规则或正则表达式创建一个数据包。因此可以测试并验证每条规则是否按预期匹配。完整评估更进一步,为正则表达式中的每个可能分支创建一个数据包。单个正则表达式可能有数千个可能的分支。这用于测试正则表达式的所有分支是否都得到正确处理。评估数据包捕获应匹配所有数据包。任何未匹配的数据包很可能代表 IDS 存在失败,需要进一步调查。当然,Sniffles 也有可能没有为特定 IDS 创建正确的数据包,或者未能识别规则的某个特定选项。请查看支持的规则功能以获取更多信息。
最后,Sniffles 在生成随机网络流量方面也有很多功能。默认情况下,随机流量是 TCP、UDP 或 ICMP 且为单向。但它也可以生成包含 ACK、握手和拆除的 TCP 流量。它将生成正确的序列号和校验和。此外,MAC 地址可根据所需分布进行设置,IP 网络地址可由内部和外部地址空间定义。此外,还可以在流量捕获中模拟扫描。
要求:Python 3.3+ 和 SortedContainers 模块
Sniffles 包含以下文件:
安装方法:
python3.x setup.py install。安装说明:
python3.x setup.py build 进行本地构建,然后进入库目录,找到 lib 并使用 python3.4 -c "from sniffles import sniffles; sniffles.main()" 本地运行。Snort:Snort 告警规则(规则应以 Alert 指令开头)。内容标签被识别并正确解析。PCRE 标签同样被正确解析。HTTP 标签会连续处理,因此可能无法生成所需的数据包。内容(以及 PCRE 或 HTTP 内容)可通过 distance、within 和 offset 进行修改。规则可能使用流控制选项,但仅从中导出数据方向。nocase 选项被忽略,使用提供的字母大小写。所有其他选项被忽略。解析头部值,并生成符合这些值的数据包。如果使用了内部和外部网络地址空间,则相应的 $HOME_NET 和 $EXTERNAL_NET 变量将使用正确的地址空间。示例:
alert tcp $EXTERNAL_NET any -> $HOME_NET 8080 (msg:"SERVER-APACHE Apache Tomcat UNIX platform directory traversal"; flow:to_server; content:"/..|5C|/"; content:"/..|5C|/"; http_raw_uri;
正则表达式:每行一个原始正则表达式,写为 abc 或 /abc/i 形式。当前支持选项 i、s 和 m。其他选项被忽略。示例:
/ab*c(d|e)f/i
下文描述的 Sniffles 规则格式。
-a TCP Ack:为每个发送的数据包发送一个 TCP 确认。默认关闭。默认情况下确认包没有数据。
-b 双向数据:数据将在 TCP 流的两个方向上生成。ACK 将被开启。此功能默认关闭。
-B [后台流量协议:百分比]:设置至少一个协议,值为 1 到 100,以生成后台流量。该值表示占总流量的百分比。可用协议:FTP、HTTP、IMAP、POP 和 SMTP。例如:"http:20,ftp:30,smtp:10"。仅输入一个数字作为参数值则生成随机流量。例如:"80"。
-c 计数:要创建的流数量。每个流至少包含 1 个数据包。数据包将在规则定义或随机选择的两个端点之间发送。tcp_handshake、tcp_teardown 和 packets_per_stream 会增加每个流的数据包数量。当前,流中的数据仅朝一个方向流动。如果使用 -b 选项,数据应朝两个方向流动。此外,Sniffles 规则可以指定数据朝两个方向流动。
-C 并发流:一次打开的流数量。尽力而为:如果流数量少于指定的并发流数量,则使用所有当前流。例如,如果只剩下 1000 个流,但并发流设置为 10000,则仍只能写出 1000 个流。默认值为 1000。如果与 duration 一起使用,则 -C 流将在整个持续时间内保持,最终会忽略 -c 的任何输入。注意,目的是创建多样化的 pcap,使同一流的数包分散排放而非紧邻,并模拟许多并发流。在我们的测试中,在内存成为问题之前,我们成功管理了 200-300 万个并发流。另外,流之间的不同延迟可能导致某些流提前终止。
-d 规则目录:包含规则文件的目录路径。将读取目录中所有规则文件中的所有已启用规则。假设所有规则文件以 .rules 扩展名结尾。使用此选项或 -f,但不同时使用。# 符号用于停用(即注释掉)规则。
-D 持续时间:基于持续时间而非计数生成。持续时间以秒为单位。请记住,数据包之间的默认延迟平均为 1-200 微秒。对于低延迟,较大的持续时间可能导致数百万个数据包,构建时间可能很长。此外,持续时间是尽力而为。本质上,达到持续时间后不会创建新的流,但可能有一些流尚未完成。这些流仍会被写出,因此实际持续时间可能比指定的更长,但不应更短。最后,如果您希望在生成期间创建更少的流,请设置较大的延迟。
-e 评估:为规则集中的每条规则仅创建一个数据包。忽略除 -f 之外的所有其他输入。每个数据包的内容将匹配所选规则。
-E 完整评估:为规则集中 pcre 规则的每个可行路径创建一个数据包。换句话说,ab(c|d)e 将创建两个数据包:abce 和 abde。忽略除 -f 之外的所有其他输入。
-f 规则文件:根据提供的路径和文件名读取单个规则文件。
-F 配置文件:为 Sniffles 选项指定配置文件。配置文件是固定 Sniffles 运行参数的一种方式。
-g 时间戳:设置 pcap 时间戳的开始时间。自 1969 年 12 月 31 日以来的秒数。默认为当前时间。
-h IP 内部前缀:内部 IP 网络前缀列表。来自内部地址的 IP 地址将使用这些前缀。前缀可以指定完整的 4 字节 IPv4 地址的 xxx.xxx 格式。例如:"10.192.168,172.16"。
-H IPv6 内部前缀:与 IPv4 内部前缀相同,只是用于 IPv6。值得注意的是,分隔符是冒号,冒号之间表示两个字节。
-i IPv6 百分比:将此值设为 1 到 100 以生成带 IPv6 的数据包。这将决定 IPv6 流所占的百分比。
-I 扫描攻击强度(即每秒数据包数)。
-l 内容长度:将内容长度固定为指定的字节数。小于 1 则将长度设置为 NFA 生成的内容长度,或如果头部也是随机的,则为 10 到 1410 之间的随机数。将根据需要截断或填充数据包。
-L 延迟:平均延迟,以微秒为单位。如果未设置,则每个流确定一个 1 到 200 微秒之间的随机平均延迟。因此,给定流的数包之间将具有平均延迟时间。
-M 允许使用 MAC 分布来为流量设置自定义 MAC 地址。默认情况下,MAC 地址是随机生成的。有关 MAC 定义文件的更多信息,请参见 examples/mac_definition_file.txt。注意:您可以指定最多两个 MAC 定义文件,以便根据源 MAC 或目的 MAC 设置不同的值。如果只指定一个文件,则用于两个方向。如果使用以下表示法,您可以指定特定方向。例如:'path1:path2'。path1 是源 MAC 的 MAC 定义文件,path2 是目的 MAC 的 MAC 定义文件。您也可以使用问号 (?) 表示其中一个为随机,例如:'?:path2' 表示源 MAC 随机但使用文件作为目的。
-n 不完全匹配。将规则生成的内容设置为不完全匹配(即自动截断最后几个字符)。默认行为是完全匹配规则内容。
-o 输出文件:指定输出文件的名称。默认情况下,文件名为:sniffles.pcap。
-O 偏移量:扫描攻击开始前的偏移量。也用于在流量中插入多次扫描。这是扫描开始前的秒数。如果与 -R 一起使用,则成为开始前的平均秒数。
-p 每流数据包数:指定单个流中包含内容的数据包数量。如果参数为正整数 x,则每个流恰好包含 x 个包含内容的数据包。如果 x 为负数,则每个流包含随机数量的数据包(从 1 到 abs(x))。默认情况下,此值为 1。
注意:所有示例均假设您已安装 sniffles 包。
从包含正则表达式的单个文件生成 pcap,其中 10 个流且每个数据包匹配规则:
sniffles -c 10 -f myre.re -m
从单个 Snort 规则文件生成 pcap,其中每个数据包几乎匹配规则:
sniffles -c 10 -f myrules.rules
从单个目录中的多个 Snort 规则文件生成 pcap,其中每个数据包匹配规则:
sniffles -c 10 -d myrulesdir -m
生成与上述相同的 pcap,使用相同的规则,但内容为随机(内容是随机的,头部仍遵循规则——不适用于正则表达式或 Sniffles 规则):
sniffles -c 10 -d myrulesdir -r
生成包含 10 个流(每个流 1 个数据包)且数据为随机的 pcap:
sniffles -c 10
生成包含 10 个流的 pcap,其中 50% 的流为后台流量,其余流包含匹配规则的数据包:
sniffles -c 10 -B 50 myrules.rules
生成包含 10 个流的 pcap,每个流有 5 个数据包,包含 ACK、握手和拆除,以及每个数据包数据部分固定长度为 50:
sniffles -c 10 -p 5 -l 50 -t -T -a
生成包含 20 个随机流的 pcap,内部网络为 192.168.1-2.x:
sniffles -c 20 -h 192.168.1,192.168.2
生成包含 20 个随机流的 pcap,IPv4 内部网络为 192.168.1.x,IPv6 内部网络为 2001:8888:8888,且 50% 流量为 IPv6:
sniffles -c 20 -h 192.168.1 -H 2001:8888:8888 -i 50
生成一个 5 秒的数据包捕获,包含随机数据包,数据包之间平均间隔为 100 微秒:
sniffles -D 5 -L 100
生成 pcap,依次为规则文件(或正则表达式文件)中的每条规则创建一个匹配数据包:
sniffles -f myrules.rules -e
生成 pcap,为正则表达式集中的每个正则表达式的每个可能分支创建一个数据包,并将文件保存为 everything.pcap。但此功能可能在正则表达式具有大量最小-最大计数的指数时间内运行,因此可能需要很长时间。此外,除下方所示的两个选项外,所有其他选项均被忽略:
sniffles -f myrules.rules -o everything.pcap -E
生成随机流量,其中扫描攻击在 2 秒后开始并持续 2 秒,每秒 1000 个扫描数据包,整个捕获持续时间为 5 秒,间隔时间为 50us,起始端口为 80(从端口 80 开始顺序搜索):
sniffles -D 5 -O 2 -W 2 -I 1000 -L 50 -s 192.168.1.2 -P 80
与上述类似,但会创建多次扫描攻击,每次持续 1 秒,攻击间平均偏移量为 2 秒。此外,仅扫描指定端口。同时随机攻击 192.168.1.0-255 范围内的 IP 地址:
sniffles -D 8 -O 2 -W 1 -I 10 -L 50 -s 192.168.1 -P 80,8080,8000,8001
Sniffles 支持多种规则格式。首先,Sniffles 可以解析 Snort 规则和正则表达式(每行一个)。除此之外,Sniffles 还有自己的规则格式,可用于明确控制流量。这是通过使用描述流量的 xml 文件来实现的。使用此格式时,Sniffles 的其他选项可能不相关。示例规则文件可以在 examples 目录中找到。这些规则文件只需通过 -f 选项指定规则文件即可使用(即 sniffles -f rules.xml)
Sniffles 规则格式如下:```xml
<petabi_rules> <traffic_stream proto="tcp" src="any" dst="any" sport="any" dport="any" handshake="True" teardown="True" synch="True" ip="4"> </traffic_stream> <traffic_stream proto="tcp" src="any" dst="any" sport="any" dport="any" handshake="True" teardown="True" synch="True"> </traffic_stream> </petabi_rules>
详细来说,标签的工作方式如下:
- `<petabi_rules> </petabi_rules>`: 定义一个规则文件的所有规则。
每个规则文件应只有一对这样的标签来打开和关闭所有指定的流量流。
- `<rule > </rule>`: 定义一个单一规则。一个单一规则可以生成任意数量的流量流或数据包。一个文件中可以有任意数量的规则。
- 选项:
- name: 此规则的名称。主要用于文档说明,无实际功能。
- `<traffic_stream> </traffic_stream>`: 一个流量流定义了两个端点之间的流量。在同一个流量流内指定的所有数据包将共享相同的端点。一个给定规则可以指定任意数量的流量流。同一规则内的不同流量流可能具有不同的端点,也可能不具不同端点,具体取决于以下设置。
- 选项:
- typets: 指定用于生成数据包的流量流类型。目前有 Standard、ScanAttack 和 BackgroundTraffic。
- scantype: 1 == Syn 扫描(默认)2 == 连接扫描。与 ScanAttack 配合使用。
- target: 指定扫描攻击的目标 IP 地址。
- targetports: 用于扫描攻击。提供一个逗号分隔的端口列表,或单个起始端口。否则端口将被随机扫描。如果提供了单个起始端口,则端口将从该点开始按顺序扫描到 65535,然后回绕到起始点。此选项与 typets 为 'ScanAttack' 配合使用。
- srcport: 指定扫描攻击的源端口。默认为随机。
- duration: 扫描攻击的时间窗口或持续时间(秒),如果 typets 为 'ScanAttack'。
- intensity: 扫描攻击的强度,如果 typets 为 'ScanAttack'。
- offset: 扫描攻击开始前的偏移量。也用于在流量中插入多个扫描时使用。
- replychance: 扫描有回复的概率。换句话说,目标端口开放的概率(默认为 20%)。与 ScanAttack 配合使用。
- proto: 指定此流量流的协议。应为 TCP 或 UDP 或 ICMP(未测试)。
- src: 源 IP 地址。可以是 xxx.xxx.xxx.xxx 格式的地址、$EXTERNAL_NET(表示外部地址——假设已指定了家庭网络)、$HOME_NET 或 any(随机选择 IP 地址)。
- dst: 目标 IP 地址。与源 IP 地址相同。
- sport: 源端口(假设为 TCP 或 UDP)。可以使用 Snort 端口格式,可以是括号内的逗号分隔列表(即 [80,88,89])、范围(即 [10:1000])或 any(即从 0-65535 中随机选择)。
- dport: 目标端口,与 sport 相同。
- handshake: 是否在流开始时生成 TCP 握手。如果排除,则不会进行握手。有效值为 true 或 false。默认为 false。
- latency: 设置数据包之间的平均延迟(微秒)。
- teardown: 是否在所有流量发送完毕后关闭流,方法是在流量流的末尾附加 TCP 断开连接。有效值为 true 或 false。默认为 false。
- synch: 流量流是否为同步。当为 true 时,一个流量流必须在下一个流量流开始之前完成。当为 false 时,所有连续的为 false(即异步)的流将同时执行。
- tcp_overlap: 默认值为 false。当为 true 时,从第二个数据包开始将附加一个额外内容,并且 TCP 序列号将减少 1,以模拟 TCP 重叠序列号。
- ipv: 指定 IPv4 或 IPv6。有效选项为 4 或 6。默认为 4。
- out_of_order: 随机使数据包乱序到达。注意,此选项仅适用于使用 'times' 选项的数据包。此外,此选项还应与 ack 一起使用,以便在流量跟踪中出现适当的重复 ACK。有效值为 true 或 false。默认为 false。
- out_of_order_prob: 设置数据包乱序到达的概率。例如,10 表示每个数据包有 10% 的概率乱序。乱序数据包在所有有序数据包之后到达。此外,它们也会被随机混合。因此,如果 10 个数据包中的第 2 个和第 5 个被确定为乱序,它们将在这 10 个数据包中最后到达(位置 9 和 10),并且顺序任意(即第 5 个可能先于第 2 个,反之亦然)。此值必须在 1 到 99 之间。默认为 50。
- packet_loss: 随机丢弃数据包(即不到达)。此选项仅适用于 'times' 选项。此外,此选项还应与 ack 选项设置为 true 一起使用,以便在流量跟踪中出现重复 ACK。有效值为 1 到 99,表示数据包被丢弃的概率。注意,数据包丢失仅发生在携带数据的数据包上,而不发生在 ACK 上。
- ack: 是否让此流中的每个数据包之后都跟一个来自服务器的 ACK。有效值为 true 或 false。默认为 false。
- percentage: 仅适用于 BackgroundTraffic,一个规则文件或目录中只能有一个 BackgroundTraffic 规则。百分比表示在总流量流中创建的后台流量流所占的比例。
- http: 后台流量流中 http 应用协议的百分比分布。
- ftp: 后台流量流中 ftp 应用协议的百分比分布。
- pop: 后台流量流中 pop 应用协议的百分比分布。
- smtp: 后台流量流中 smtp 应用协议的百分比分布。
- imap: 后台流量流中 imap 应用协议的百分比分布。
- `<pkt > </pkt>`: 此指令指定单个数据包或一系列数据包。可以使用 times 特性使一个 <pkt> </pkt> 指令生成多个数据包。否则,必须明确指定每个方向上的每个数据包。
- 选项:
- dir: 数据包的方向。有效值为 to server 或 to client。初始源 IP 被视为客户端,初始目标 IP 被视为服务器。因此 'to server' 发送从客户端到服务器的数据包,'to client' 发送从服务器到客户端的数据包。默认为 to server。
- content: 指定此数据包内容的正则表达式。数据包的大小将取决于正则表达式。
- fragment: 是否对此数据包进行分片。仅适用于 ipv4。应具有大于 2 的值。将创建尽可能多的有效分片或指定数量的分片(取较小者)。默认值为 0,表示不分片。
- ack: 是否对此数据包发送 ACK。有效值为 true 或 false。默认为 false。
- split: 将内容分配到指定数量的数据包中。默认情况下,所有内容都在一个数据包中发送(分片是此规则的例外)。
- times: 发送此数据包 x 次。默认值为 1,正值将发送恰好 x 个数据包(如果 ack 为 true,可能包含 ACK),而负值将发送介于 1 和 abs(-x) 之间的随机数量的数据包。
- ttl: 设置数据包的生存时间值。默认情况下,sniffles 会生成随机的 TTL 值。
- ttl_expiry: 通过将数据包分成多个数据包,并在两个正常数据包之间插入一个恶意数据包来模拟 TTL 过期攻击。默认值为 0(无恶意数据包)。如果值非零,则会插入恶意数据包,其 ttl 等于 ttl_expiry 值。如果设置了 ttl 值,则正常数据包将使用新的 ttl 值。
最后说明:新的规则格式只是一个开始,可能存在问题。如有任何不一致或错误,请提醒我。此外,目的是根据需要扩展选项以提供更多功能。如有想要的功能,请联系我。最后,本产品按“原样”提供,不保证功能或准确性。欢迎分支此项目以满足您自己的需求。
致谢:
--------
此应用程序由 Petabi, Inc. 为您提供,我们提供可靠、真实且超高速的安全解决方案。
作者:
- Victor C. Valgenti
- Min Sik Kim
- Tu Le
- Moosuk Pyun
新特性:
-------------
- 2014年11月21日:版本 1.4.0 添加了流量分割和 traffobot 用于双向流量生成。修复了当生成的流量可以放入单个流量写入调用时抛出异常的 bug。重新格式化并启用了使用说明。最后,添加了 traffobot 和 XML 解析的单元测试。
- 2015年2月3日:版本 2.0。完全重写了流的工作方式,以减少使用特殊规则生成大型流时的内存需求。目前,在处理大约 2-300 万并发流之前性能不会下降。我添加了一些功能来帮助创建大型流。首先,使用约 200-300 万并发流进行生成。其次,不要对这些流使用 teardown。一小部分流将从捕获开始持续到结束,而其余的流将在每个批次周期结束时关闭。我将努力提高效率,但现在在 Sniffles 中管理所有复杂选项在内存中确实无法廉价实现。唯一的解决方案是使用具有更多 RAM 的更强大的机器。此版本还包含各种修复。
- 2015年2月11日:为乱序数据包添加了概率,允许调整乱序数据包的频率。
- 2015年3月5日:将 TCP 断开连接改为标准断开序列。现在允许内容分散到多个数据包中,而无需使用分片。
- 2015年4月9日:修复了扫描流量,它在之前的某次更改中部分损坏。pcap 起始时间戳现在默认为当前时间,可以通过 -g 选项设置。最后,如果客户端首先发送数据,三次 TCP 握手中的第三个数据包现在将承载数据。
- 2015年5月22日:重写了规则解析,以简化扩展规则解析器以适应更多格式的能力。将 nfa 遍历和 pcre 直接嵌入到 sniffles 中。清理了代码,为公开发布做准备。
- 2015年5月27日:更新了文档,合并了 pcre 库和 nfa 构建,使 sniffles 成为独立的包。添加了正则表达式生成器和随机规则生成器作为 Sniffles 包的一部分。版本更新至 3.0.0 并发布到 github。
- 2015年8月12日:实施了大量错误修复和新功能。从根本上改变了流和处理流的方式,以提高可扩展性。添加了每流延迟。更新了文档。
正则表达式生成器
============================
这是一个简单的正则表达式生成器。
它完全随机地创建正则表达式,或者基于一系列分布。
可以对正则表达式生成方式的控制是结构性的,而不是上下文相关的。换句话说,
不会努力使生成的字符串标记出现在正则表达式中。
然而,可以调整概率分布以影响规则中出现的特性类型,如字符类、选择、重复等。
安装
-------
将随 Sniffles 的其余部分自动安装。
选项
-------
regexgen——随机正则表达式生成器。
usage: regexgen [-C char distribution] [-c number regex]
[-D class distribution] [-f output re file]
[-l lambda for length generation] [-M maximum regex length]
[-m minimum regex length] [-n negation probability]
[-o options chance] [-R repetition chance] [-r repetition distribution]
[-t re structural type distribution] [-?] [-g]
- -C 字符分布:设置看到特定字符或字符类型的可能性。请参阅下面的分布简要说明以了解如何使用。默认情况下,此分布为均匀分布。此分布有五个槽位:ASCII 字符、\x00 格式的二进制字符、字母(大写或小写)、数字和替换类(如 \w)。此选项的输入示例为 "10,20,10,40,20",表示生成的任何字符有 10% 的概率来自 10% ASCII,20% 二进制,10% 字母等。注意:可能对正则表达式造成问题的 ASCII 字符(如 '[' 或 '{')会被转换为十六进制表示(例如 \x3b)。
- -c 要生成的正则表达式数量。默认为一个。
- -D 类分布:类分布中只有两个槽位。第一个槽位是类由一些随机生成的字符组成的概率。第二个槽位是类由范围(如 a-z)组成的概率。
- -f 输出文件名。设置存储正则表达式的文件名。默认为当前工作目录中的 rand.re 文件。
- -g 分组:所有正则表达式将有一个公共前缀,该前缀至少与一个或多个其他正则表达式共享(只要存在多个正则表达式)。公共前缀就是一组正则表达式相同的正则表达式。可能的公共前缀总数从 1 到要生成的正则表达式总数的一半。此选项的默认值为 false。此选项不带参数。
- -l 长度的 lambda:这是正则表达式长度指数分布的均值。默认值为 10。
- -M 最大正则表达式长度:使正则表达式的结构长度最多为此值或更短。默认情况下,不限制最大长度。
- -m 最小正则表达式长度:使正则表达式至少为此长度或更长。默认为 3,如果输入为零或负数,将自动使用值 1。
- -n 取反概率:字符类成为取反类([^xyz])而不是普通字符类([xyz])的概率。默认概率为 50%。
- -o 选项概率:在正则表达式后附加选项的概率。当前选项为 'i'、'm' 和 's'。选项数量随机,选项通过均匀分布选择。
- -R 重复概率:在正则表达式中添加任何结构组件后出现重复的概率。
- -r 重复分布:重复结构的分布。槽位为:零或一 (?)、零或多 (*)、一或多 (+) 和计数 ({x,y})。
- -t RE 结构类型分布:正则表达式主要结构组件的分布。由三个槽位或类别组成:字符、类和选择。注意,选择将简单地生成一个较小的正则表达式,其大小不超过正则表达式剩余长度的限制。换句话说,选择会导致多个较小的正则表达式被合并到整个正则表达式中。选择在创建这些较小正则表达式时使用完全相同的方法。
- -? 打印此帮助。
此生成器将创建随机正则表达式。可以将正则表达式中的结构调整为概率分布,但目前不能调整内容。这对于探索正则表达式可能的最大多样性是理想的(尽管不一定是现实的正则表达式)。通过为特定分布的各种可能性或槽位创建概率列表来处理分布。这些通过命令行参数添加,使用简单的字符串列表,例如 "10,30,40,20"。列表中的值数量应与槽位数量相同。列表中所有值的总和应为 100,且不应有分数。每个槽位的值是该槽位被选中的概率。例如,基本 RE 结构类型分布有三个槽位。第一个槽位是下一个结构类型为字符的概率(其中字符可以是字母、数字、二进制、ASCII 或替换类(如 \w))。第二个槽位是字符类的概率,如 [ab@%]、[^123] 或 [a-z]。最后一个槽位是出现选择的概率,如 (ab|cd)。通过这三个槽位,您可以调整希望结构中出现的频率。例如,regexgen -c 10 -t "80,10,10" 将创建 10 个正则表达式,其中 80% 的结构为字符,10% 为字符类,10% 为选择。
随机规则生成器
=====================
随机规则生成器提供了一种创建大量随机生成规则的方法,用于测试特定平台。目前,生成的规则符合 Snort 规则格式或只是文本行。要使随机规则生成器工作,您必须有一组定义的特征。示例特征可以在 example_features 文件夹中找到,并在下面进一步描述。
安装
-------
随 Sniffles 自动安装
注意:随机规则生成器使用随机正则表达式生成器来创建任何类型的内容。选项
-------
随机规则生成器
用法:rulegen -c [规则数量] -f [特征集]
-o [输出文件] [-s]
- -c 规则数量:要生成的规则数。
默认为1。
- -f 特征集:包含特征集描述的文件。
有关特征集及其描述方法的详细说明,请参阅文档。
- -o 输出文件:规则写入的输出文件。
默认为rules.txt。
- -s Snort规则格式:以snort规则格式写入规则。
无参数,默认关闭。关闭时,规则仅转换为字符串格式,具体格式取决于特征解析器。
特征集
-----------
特征用于描述IDS规则中可能出现的方面。例如,包过滤器可能使用针对IP源地址和目标地址的规则。在这种情况下,可以创建一个特征集来描述如何生成这些IP源地址和目标地址。更具体地说,我们区分了简单规则和复杂规则。这两者的区别在于是否存在歧义符号。例如,如果我们有一个歧义符号*表示任何IP地址,那么我们可以说*代表一个歧义符号。此外,我们知道规则也可以使用非歧义符号,比如192.168.1.1。这将表示一个简单的IP地址,因为它是一个固定的单个IP地址,没有任何可能的歧义表示。然后我们进一步定义特定特征的范围(例如,跨越整个40亿以上可能的IPv4地址的IP地址,或只是其子集)。
特征最终定义了任意规则的所有方面。给定一个特征集和一个有效的规则格式,就可以随机生成任意数量的使用这些特征的规则。通过这种方式,可以生成测试规则集,这些规则集将沿着经常被忽略的向量检查IDS。
特征以分号分隔的列表形式定义,每行一个特征:type=feature; 参数列表采用key=value对,列表使用Python格式(即[a, ..., z])。特征定义了目标规则格式的特定部分。特征可以扩展以增加更多功能。或者,可以通过创建新的规则格式来扩展特征的能力。
当前特征类型:
1. Feature -- 通用特征
2. Content -- 内容特征
3. IP -- IP特征
4. Protocol -- 协议特征
歧义列表应写为列表形式,如[x:y]表示范围,[x,y]表示列表,{x1,x2,x3}表示集合,或仅用*表示通配符或类似的单一选项。
歧义列表示例:```
ambiguity_list=[[2:9]]
it will generate [3:4], [5:6], etc (any [x:y] such that
x <= y and x >= 2 and y > x and y <= 9).
ambiguity_list=[[3,20]]
it will generate [3,9,10], [3,4,8,12], etc (any list [x1,x2,x3,..]
such that all values falling between 3 and 20.
ambiguity_list=[{5,6,10}]
it will generate a subset of {5,6,10} such as {5,10}, {5}.
ambiguity_list=[[2:9],[3,20],{5,6,11}]
it will pick one of [2:9], [3,20], and {5,6,11} and
generate a corresponding instance (see above)
功能文件示例:``` type=protocol; name=proto; proto_list=[TCP,UDP,ICMP]; complexity_prob=0;ambiguity_list=None; type=ip; name=sip; version=4; complexity_prob=100;
上述内容定义了两个特征:一个协议特征和一个源IP特征。协议命名为`proto`,仅对规则格式化器有意义,有效的协议包括:IP、TCP、UDP和ICMP。IP特征定义为IPv4,所有规则将是复杂的。IP复杂度已包含在类中,无需在特征定义中添加。这将使用CIDR表示法生成IP地址。
通用特征属性:
- Feature_name:信息性属性,对规则格式化器可能有用。
- lower_bound:可能取值范围的边界下限。假设特征为数字。
- upper_bound:与lower_bound相反。
- complexity_prob:规则中使用复杂特征的概率。取值范围0到100。默认为0。
使用复杂特征时,从歧义列表中随机选择一种歧义表示法;或者如果特征定义了特定的歧义(如IP地址),则使用该表示法。不使用复杂特征时,将根据边界生成值;或者对于Content特征,使用一组分布值限制生成的字符串为一系列ASCII字符。
- ambiguity_list:可能的歧义表示法列表。使用Python格式的逗号分隔列表(例如[a, b, c])。
- toString():在给定此特定特征集的情况下,打印出一个规则实例。
Content特征——继承自Feature:
- regex:True或False。若为True,将使用pcre格式处理正则表达式,并可能向正则表达式添加选项i、s或m。
- length:定义生成内容的平均长度。
- min_regex_length:定义正则表达式的最小长度。
Protocol特征——继承自Feature:
- proto_list:定义可能的协议列表,逗号分隔(例如[TCP, UDP])。
IP特征——继承自Feature:
- version:4表示IPv4,6表示IPv6。默认为4。
范围、列表、集合的歧义表示法:
范围表示法:
[x:y] 表示从x到y(包含)。
列表表示法:
[x,y] 表示随机确定数量的一系列值,每个值大于等于x且小于等于y。
集合表示法:
{x1,x2,x3,x4} 表示集合值x1、x2、x3、x4。将生成原集合的子集。
请参阅`example_features`文件夹中的示例特征集以获取更多示例。更多细节以及其背后的学术理论预计稍后添加。
-P 目标端口列表:用于扫描攻击。提供逗号分隔的端口列表,或单个起始端口。否则端口将被随机扫描。如果提供了单个起始端口,则从该端口开始按顺序扫描到 65535,然后回绕到起始点。如果提供了列表,则列表中的端口将以轮询方式扫描。
-r 随机:生成随机内容而非来自规则的内容。如果仍提供规则,则规则用于生成头部。注意:规则中的许多功能可能会覆盖随机生成的某些方面。
-R 随机扫描攻击:将使用偏移量在流量中创建扫描攻击,但仅将偏移量作为中位数使用。偏移量用于确定扫描完成与新扫描开始之间的时间量。
-s 扫描攻击:后跟逗号分隔的 IPv4 地址列表,指示要攻击的目标 IP 地址。每个 IP 范围将创建一个扫描攻击。范围应如下:192.168.1.1 将精确针对该 IP 地址,而 192.168.1 将针对 192.168.1.0 到 192.168.1.255 之间的随机 IP 地址。
-S 扫描类型:1==Syn 扫描(默认)2 == 连接扫描。
-t TCP 握手:在所有 TCP 流中包含 TCP 握手。默认关闭。
-T TCP 拆除:在所有 TCP 流中包含 TCP 拆除。默认关闭。
-v 详细模式:增加输出消息的级别。
-w 写入内容:将内容字符串写入名为 'all.re' 的文件。
-W 窗口:扫描攻击的窗口或持续时间(以秒为单位)。
-Z 回复概率:扫描得到回复的概率。换句话说,目标端口开放的概率(默认为 20%)。