1. 题目描述 If snort see two packets in a TCP flow with first packet has login or Initial in payload, destination port is 3399;and second packet has a IPv4Address:Portstring(E.g. 123.45.6.7:8080) in payload. destination port is 3399;out
1. 题目描述If snort see two packets in a TCP flow with first packet has “login” or “Initial” in payload, destination port is 3399;and second packet has a “IPv4Address:Port”string(E.g. 123.45.6.7:8080) in payload. destination port is 3399;output an alert with msg “bot founded” and sid 1000001 2. 解决方案题目要求检测包含两个包的特定流,需要通过设置标记位,即flowbits来实现。另外,题目中均要求检测特定的字符串或模式,所以还需要在pcre字段中通过正则表达式实现。 2.1 第一条检测规则匹配特定字符串
正则表达式的两端需要加上限界符/。 设置标志位,同时不发出警报。
2.2 第二条检测规则2.2.1 匹配模式IPv4Address:Port IPv4Address IPv4地址使用点分十进制表示时,分为4组,每组的范围均为[0,255]。即从0.0.0.0到255.255.255.255。 我们先分析单独一组的特点:
可以发现表格中前两种情况可以合并为1?\d{1,2},所以可以用25[0-5]|2[0-4]\d|1?\d{1,2}来匹配0~255; 将其作为一个分组,再考虑到.,我们可以写出如下正则表达式匹配IPv4地址:
值得说明的是: 这里我们认为数字前出现填充0的情况与非填充状态等价: 如:192.01.00.1等价于192.1.0.1。 这种情况下才能使用\d{1,2},因为可能会出现00的情况。 正则表达式的短路性质: 当|运算符分隔的多个表达式有一个匹配成功时,该表达式之后的表达式将不会继续匹配。 如:A|B|C|D,B匹配成功了,将不会再看C和D。 所以上面匹配IPv4地址时,我们单独一个分组写成25[0-5]|2[0-4]\d|1?\d{1,2}而不是1?\d{1,2}|2[0-4]\d|25[0-5]。 后者匹配255时,只会匹配到25和5,而不会匹配到255: 同样后者构造的正则表达式去匹配255.255.255.255,只会匹配到255.255.255.25,缺少最后一个5: 因为它匹配到最后一组的25时就判定匹配成功,直接跳到末尾,结束匹配。而前面几组255正确匹配的原因是:如果只匹配25,发现剩下的5和.不匹配,之后会进行回溯,继续检查后面的条件,发现255匹配成功且.也匹配成功,不再回溯。
端口号的范围是0~65535,我们同样可以分成不同的区间来匹配端口号。
同样,我们可以将表格前两种情况合并为[1-5]?\d{1,4}。结合上面提到的短路性质,我们可以写出最终用于匹配端口号的正则表达式:
2.2.2 检查标志位
3. 检测规则通过上述分析,我们可以写出如下检测规则:
|
2021-06-04
2019-05-27
2022-10-12
2022-10-12
2019-06-26