Suricata规则编写5- FlowInt
FlowInt
Flowint是我们将很快添加到引擎中的全局变量任务的前身,这将允许捕获,存储和比较变量中的数据。 这将是顾名思义全局的。 因此,您可以比较不相关流中的数据包的数据。
Flowint允许使用变量进行存储和数学运算。 它的运行方式与flowbits非常类似,但增加了数学功能,并且可以存储和操作整数,而不仅仅是一个标志集。 我们可以将其用于许多非常有用的事情,例如统计事件发生次数,增加或减少事件发生次数,或者根据多个因素对流进行阈值处理。 这将很快扩展到全局范围,因此用户可以在流之间执行这些操作。
语法如下:
flowint:,;
定义一个var(不是必需的),或者检查一个是否设置。
flowint:,,;
flowint:,<+, - ,=,>,<,> =,<=,==,!=>,
比较或修改一个var。 添加,减去,比较大于或小于,大于或等于,小于或等于可用。 要比较的项目可以是整数或其他变量。
例如,如果您想要统计在特定流中看到用户名的次数,并在超过5时发出警报。
alert tcp any any -> any any (msg:"Counting Usernames"; content:"jonkman"; \
flowint: usernamecount, +, 1; noalert;)
这将统计每个事件并增加var usernamecount,而不是为每个事件生成一个警报。
现在说如果流中有五个以上的点击,我们想要生成一个警报。
alert tcp any any -> any any (msg:"More than Five Usernames!"; content:"jonkman"; \
flowint: usernamecount, +, 1; flowint:usernamecount, >, 5;)
所以如果usernamecount超过五个,我们只会收到提醒。
所以,现在让我们说,我们想要获得如上所述的警报,但不是如果有更多的用户名登出。 假设这个特定的协议表明一个注销“jonkman注销”,让我们试试:
alert tcp any any -> any any (msg:"Username Logged out"; content:"logout jonkman"; \
flowint: usernamecount, -, 1; flowint:usernamecount, >, 5;)
所以现在只有当这个特定的用户名有五个以上的活动登录时才会收到提醒。
这是一个相当简单的例子,但我相信它显示了这样一个简单的功能可以为规则写作做的力量。 我在登录跟踪,IRC状态机,恶意软件跟踪和蛮力登录检测等方面看到了很多应用。
假设我们正在跟踪通常每个连接允许五次登录失败的协议,但是我们有一个漏洞,攻击者可以在五次尝试后继续登录,我们需要知道这个漏洞。
alert tcp any any -> any any (msg:"Start a login count"; content:"login failed"; \
flowint:loginfail, notset; flowint:loginfail, =, 1; noalert;)
因此,如果变量尚未设置,我们检测到初始失败,如果是,则将其设置为1。 我们的第一击。
alert tcp any any -> any any (msg:"Counting Logins"; content:"login failed"; \
flowint:loginfail, isset; flowint:loginfail, +, 1; noalert;)
现在我们正在增加计数器,如果它被设置。
alert tcp any any -> any any (msg:"More than Five login fails in a Stream"; content:"login failed"; \
flowint:loginfail, isset; flowint:loginfail, >, 5;)
现在,如果我们在同一个流中进行五次登录失败,则会生成警报。
但是,让我们也说,如果有两个成功的登录和一个失败的登录后,我们也需要警报。
alert tcp any any -> any any (msg:"Counting Good Logins"; content:"login successful"; \
flowint:loginsuccess, +, 1; noalert;)
在这里,我们正在计算好登录,所以现在我们将计算相关的好登录失败:
alert tcp any any -> any any (msg:"Login fail after two successes"; content:"login failed"; \
flowint:loginsuccess, isset; flowint:loginsuccess, =, 2;)
以下是一些其他的一般例子:
alert tcp any any -> any any (msg:"Setting a flowint counter"; content:"GET"; \
flowint:myvar, notset; flowint:maxvar,notset; flowint:myvar,=,1; flowint: maxvar,=,6;)
alert tcp any any -> any any (msg:"Adding to flowint counter"; content:"Unauthorized"; \
flowint:myvar,isset; flowint: myvar,+,2;)
alert tcp any any -> any any (msg:"if the flowint counter is 3 create a new counter"; content:"Unauthorized"; \
flowint:myvar, isset; flowint:myvar,==,3; flowint:cntpackets,notset; flowint:cntpackets, =, 0;)
alert tcp any any -> any any (msg:"and count the rest of the packets received without generating alerts!!!"; \
flowint:cntpackets,isset; flowint:cntpackets, +, 1; noalert;)
alert tcp any any -> any any (msg:" and fire this when it reach 6"; flowint: cntpackets, isset; \
flowint: maxvar,isset; flowint: cntpackets, ==, maxvar;)