[Snort-users] Protected content
alext at ...492...
Tue Dec 16 01:13:26 EST 2014
Ok I tested the situation where my "content" keyword matches the FIRST
instance of the content in the packet however when the protected_content
keyword checks the entire string this does not match the hash. The
question is will Snort look further in the packet for the NEXT content
match of the same word - "over" - in my example above?
Key behaviors to remember about Snort:
1. Process each of the detection keywords in order
2. All rule keywords are joined by logical AND (all keywords must be true
for the rule to trigger)
3. Stop process on first "no match"
I discovered that the rule will fail to trigger if the
content/protected_content is found after the first instance in the packet.
I believe this has to do with the fact that for a rule to trigger every
keyword in the rule must evaluate to true. For the first "over" in the
packet, the protected_content check of the entire string length returns
false. As soon as Snort encounters a keyword that does not evaluate to
true it stops processing the packet. This is pretty much how the content
keyword works too, it will find the first instance of the string (assuming
no offset or depth modifiers) and proceed from there. Snort will not
process keywords in the rule repeatedly for a single packet.
So my "disadvantages" above still stand. We could miss the
protected_content string if it came after we located the "content" at an
earlier location in the packet.
Thanks for bringing that up Russ!
alext at ...492...
Not sent from my iPad - just thought you should know
On Mon, Dec 15, 2014 at 11:48 AM, Russ Combs (rucombs) <rucombs at ...589...>
> Alex, that's a pretty good write up. See below for a comment.
> *From:* Alex Tatistcheff [alext at ...492...]
> *Sent:* Monday, December 15, 2014 10:40 AM
> *To:* Snort Users List
> *Subject:* [Snort-users] Protected content
> I’ve been fiddling with some new options in Snort 2.9.7 rules.
> Specifically the new protected_content rule option. I discovered some
> things that are not clear in the Snort Manual so I thought I would share.
> The protected_content option is designed to allow searching for content in
> a packet without having to spell out the content in the rule. That way if
> your rule is looking for something sensitive, you can hide this from anyone
> with access to the rule. It’s helpful if you’re looking for things like
> passwords you have used. In my case I have some content rules looking for
> my wife’s common passwords leaving the network. (I, of course would never
> re-use a password) ;-)
> My old rules had the password clearly shown in the content match. So I
> thought this would be a perfect match for the new keyword. However, there
> are some differences between the two. The content keyword looks through the
> entire packet (or whatever is entered in offset,depth,distance and within)
> for the string. Protected_content is different, it only looks in a specific
> spot. When using protected_content you search for a hash of the string
> instead of the string itself. So Snort has to hash whatever bytes you want
> to check. Because of this, we can’t really check an entire packet because
> it would mean calculating hundreds of hashes - way too slow.
> The protected_content keyword comes with several parameters:
> The hash itself
> The hash type (md5, sha256, sha512)
> The length of the original string
> Optional - offset or distance
> *protected_content:"131848a7d09b05b96ea105fe238619e3"; hash:md5; length:8;*
> This would look in the packet at byte offset zero for an 8 byte string
> matching the md5 shown. It would ONLY look in the first 8 bytes. In this
> case the length parameter works much like distance or within in a normal
> content match.
> So, you need to look in a specific location. But how then do I find my
> wife’s password? I have no idea how far into the packet it might be.
> There’s another consideration, the protected_content keyword is
> “computationally expensive” according to the Snort Manual. So we should
> precede it with a content match to take advantage of the fast pattern
> matcher. Turns out I can kill two birds here, I can search the entire
> packet and make the rule more efficient by using a content keyword prior.
> The answer is to search for a small subset of my protected content to
> determine what part of the packet to hash. Yes this does somewhat
> compromise my secret string but it’s a tradeoff to get detection.
> Here is the rule:
> *alert tcp $HOME_NET any -> any any (sid:**1000000 <1000000>**;
> content:"over"; protected_content:"ef87dbd48fed4bcaf02cfc9e8c534344";
> hash:md5; length:11; distance:-6; metadata:service http, service smtp,
> service imap, service pop3, impact_flag red; msg:"Sensitive data 1
> ...over..."; classtype:sdf; rev:6; )*
> I start out looking for a portion of the secret word. Hopefully this is as
> specific as possible without giving away too much. This is followed by the
> protected content option which backs up far enough to get to the start of
> my secret word and hash the required bytes.
> Disadvantages of this technique are:
> - If the word “over” occurs more than once I will only check for my wife’s
> password the first time it’s seen in a packet. So it’s possible the
> password could still be hiding later in a packet with “over" somewhere
> * This should not be the case. Specifically, Snort should move on to
> the next matching "over", if any, after the prior fails on the protected
> content. Have you tried that?
> - It’s not as fast as pure “content” but we knew that going in
> - It requires that I put part of my secret word into a regular content
> - Possibly other factors I haven’t discovered yet
> Well I hope that makes you think a bit. Reply if you have any thoughts on
> additional ways to improve rules using this new keyword.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Snort-users