Hello,
in crs 2.2.1 there is a oversight in Rule 981063. It should save session.ip
but it saves tx.ip_hash.
And if the hash value should be saved then the "capture" is missing in the
chained rule. Now only the 3 octets are saved so the naming of the variables
is a little bit misunderstanding (tx.ip_hash).
So the Rules should look like this.
SecRule TX:IP "^(\d{1,3}\.\d{1,3}\.\d{1,3}\.)"
"chain,phase:1,id:'981057',capture,t:none,nolog,pass"
SecRule TX:1 ".*"
"capture,t:sha1,t:hexEncode,setvar:tx.ip_hash=%{tx.0}"
SecRule TX:IP "^(\d{1,3}\.\d{1,3}\.\d{1,3}\.)"
"chain,phase:3,id:'981063',capture,t:none,nolog,pass"
SecRule TX:1 ".*"
"capture,t:sha1,t:hexEncode,setvar:session.ip=%{tx.0}"
Michael
2011/7/17 Michael Haas <[email protected]>
> Hi,
> i have another problem with the rules in this file.
> The Rules are working as expected if i change the IP or the UA but if i
> change the sessionid to another value it's not working as expected.
> I Think the following Rule is not working if the session id is changed to
> an unknown value, because the ! operator does not work with non existent
> variables(don't know if its a bug or not).
> SecRule
> REQUEST_COOKIES:'/(j?sessionid|(php)?sessid|(asp|jserv|jw)?session[-_]?(id)?|cf(id|token)|sid)/'
> ".*" "chain,phase:1,id:'981054',t:none,block,log,msg:'Invalid SessionID
> Submitted.',setsid:%{matched_var},setvar:tx.sessionid=%{matched_var},skipAfter:END_SESSION_STARTUP"
> SecRule SESSION:VALID "!@eq 1"
> "t:none,setvar:tx.anomaly_score=+%{tx.critical_anomaly_score},setvar:tx.%{
> rule.id}-WEB_ATTACK/INVALID_SESSIONID-%{matched_var_name}=%{tx.0}"
> SESSION:VALID does not match if the SESSION.VALID Variable doesn't exist.
>
> I have verfied this with the following test.
>
> SecAction "phase:1,id:'2000',t:none,nolog,pass,setvar:tx.test=1"
> SecRule TX:TEST "@eq 1" "phase:1,t:none,id:'2001'"
> SecRule TX:TEST "!@eq 0" "phase:1,t:none,id:'2002'"
> SecRule TX:TEST "!@eq 1" "phase:1,t:none,id:'2003'"
> TEST1 doesn't exist.
> SecRule TX:TEST1 "@eq 1" "phase:1,t:none,id:'2004'"
> SecRule TX:TEST1 "!@eq 1" "phase:1,t:none,id:'2005'" Thats the Problem,
> it should match because TEST1 is not equal to 1 but it does not match.
>
> Debug Log for the test.
>
> Rule 801648: SecAction
> "phase:1,auditlog,id:2000,t:none,nolog,pass,setvar:tx.test=1"
> Setting variable: tx.test=1
> Set variable "tx.test" to "1".
> Rule returned 1.
> Match -> mode NEXT_RULE.
> Rule 809ed0: SecRule "TX:TEST" "@eq 1"
> "phase:1,pass,nolog,auditlog,t:none,id:2001"
> Executing operator "eq" with param "1" against TX:test.
> Target value: "1"
> Rule returned 1.
> Rule 80a588: SecRule "TX:TEST" "!@eq 0"
> "phase:1,pass,nolog,auditlog,t:none,id:2002"
> Executing operator "!eq" with param "0" against TX:test.
> Target value: "1"
> Rule returned 1.
> Rule 80ac50: SecRule "TX:TEST" "!@eq 1"
> "phase:1,pass,nolog,auditlog,t:none,id:2003"
> Executing operator "!eq" with param "1" against TX:test.
> Target value: "1"
> Rule returned 0.
> Rule 80b318: SecRule "TX:TEST1" "@eq 1"
> "phase:1,pass,nolog,auditlog,t:none,id:2004"
> Rule returned 0.
> Rule 80dbd0: SecRule "TX:TEST1" "!@eq 1"
> "phase:1,pass,nolog,auditlog,t:none,id:2005"
> Rule returned 0.
>
> If i change the Rule to only check if the Variable exists
> &SESSION:VALID "!@eq 1" it's working.
>
> Michael
>
> 2011/7/16 Ryan Barnett <[email protected]>
>
>> Agreed - these need to be fixed. We can simplify the IP capturing ones by
>> not using the hashed. We were using hashs initially for the User-Agent field
>> as their length could get pretty long. We would not need that for IP
>> addresses.
>>
>> I will fix these and push to the CRS SVN repo on Monday.
>>
>> Thanks.
>> Ryan
>>
>> On Jul 16, 2011, at 2:24 PM, "Michael Haas" <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>> Hi,
>>
>> i think the Rule should be changed to something like that
>>
>> SecRule TX:IP "^(\d{1,3}\.\d{1,3}\.\d{1,3}\.)"
>> "chain,phase:3,id:'981063',t:none,nolog,pass"
>> SecRule MATCHED_VARS "(.*)"
>> "capture,t:none,t:sha1,t:hexEncode,nolog,setvar:session.ip=%{tx.1}"
>>
>> then it works too.
>>
>> Michael
>>
>> 2011/7/15 Michael Haas <<mailto:[email protected]>
>> [email protected]<mailto:[email protected]>>
>> Hi,
>>
>> Yes i'm using <
>> http://mod-security.svn.sourceforge.net/viewvc/mod-security/crs/trunk/optional_rules/modsecurity_crs_16_session_hijacking.conf>
>>
>> http://mod-security.svn.sourceforge.net/viewvc/mod-security/crs/trunk/optional_rules/modsecurity_crs_16_session_hijacking.conf
>> .
>> if i look at a debug log i see that the session.ip is not saved, i think
>> it doesn't capture because it doesn't match.
>>
>> Rule 822ce0: SecRule "TX:IP" "@rx ^(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.)"
>> "phase:3,auditlog,id:981063,capture,t:none,t:sha1,t:hexEncode,nolog,pass,setvar:session.ip=%{tx.1}"
>> T (0) sha1: "\xb5O`\x10\x1bj\xed\xdf\x81J\x8f\xfb\x11\x98^K\xfc{t4"
>> T (0) hexEncode: "b54f60101b6aeddf814a8ffb11985e4bfc7b7434"
>> Transformation completed in 24 usec.
>> Executing operator "rx" with param "^(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.)"
>> against TX:ip.
>> Target value: "b54f60101b6aeddf814a8ffb11985e4bfc7b7434"
>> Operator completed in 2 usec.
>> Rule returned 0.
>> No match, not chained -> mode NEXT_RULE.
>>
>> If i use this Rule it captures because it matches.
>>
>> Rule 822cc8: SecRule "TX:IP" "@rx (.*)"
>> "phase:3,auditlog,id:981063,capture,t:none,t:sha1,t:hexEncode,nolog,pass,setvar:session.ip=%{tx.1}"
>> T (0) sha1: "\xb5O`\x10\x1bj\xed\xdf\x81J\x8f\xfb\x11\x98^K\xfc{t4"
>> T (0) hexEncode: "b54f60101b6aeddf814a8ffb11985e4bfc7b7434"
>> Transformation completed in 24 usec.
>> Executing operator "rx" with param "(.*)" against TX:ip.
>> Target value: "b54f60101b6aeddf814a8ffb11985e4bfc7b7434"
>> Added regex subexpression to TX.0:
>> b54f60101b6aeddf814a8ffb11985e4bfc7b7434
>> Added regex subexpression to TX.1:
>> b54f60101b6aeddf814a8ffb11985e4bfc7b7434
>> Operator completed in 25 usec.
>> Setting variable: session.ip=%{tx.1}
>> Resolved macro %{tx.1} to: b54f60101b6aeddf814a8ffb11985e4bfc7b7434
>> Set variable "session.ip" to "b54f60101b6aeddf814a8ffb11985e4bfc7b7434".
>> Warning. Pattern match "(.*)" at TX:ip. [file
>> "/xxx/modsecurity_crs_16_session_hijacking.conf"] [line "46"] [id "981063"]
>> Rule returned 1.
>> Match -> mode NEXT_RULE.
>>
>> The Problem is that the Target Value is already transformed with
>> "t:sha1,t:hexEncode"
>>
>> Michael
>>
>>
>> 2011/7/15 Ryan Barnett <<mailto:[email protected]>
>> [email protected]<mailto:[email protected]>>
>>
>> From: Michael Haas <<mailto:[email protected]>
>> [email protected]<mailto:[email protected]><mailto:<mailto:
>> [email protected]>[email protected]<mailto:
>> [email protected]>>>
>> Date: Fri, 15 Jul 2011 08:54:49 -0500
>> To: "<mailto:[email protected]>
>> [email protected]<mailto:
>> [email protected]><mailto:<mailto:
>> [email protected]>
>> [email protected]<mailto:
>> [email protected]>>" <<mailto:
>> [email protected]>
>> [email protected]<mailto:
>> [email protected]><mailto:<mailto:
>> [email protected]>
>> [email protected]<mailto:
>> [email protected]>>>
>> Subject: [Owasp-modsecurity-core-rule-set] Problem with
>> modsecurity_crs_16_session_hijacking.conf
>>
>> Hi,
>>
>> i'm trying to use the session hijacking protection but have some problems
>> with it.
>>
>> Are you using this file?
>> <
>> http://mod-security.svn.sourceforge.net/viewvc/mod-security/crs/trunk/optional_rules/modsecurity_crs_16_session_hijacking.conf
>> >
>> http://mod-security.svn.sourceforge.net/viewvc/mod-security/crs/trunk/optional_rules/modsecurity_crs_16_session_hijacking.conf
>>
>>
>>
>> The Rules 981057 and 981063 are never matching because they check a normal
>> IP with a encoded IP (t:sha1,t:hexEncode) so the ip is never saved in the
>> collection.
>>
>> You are misunderstanding the logic of these rules. Let's start at the end
>> of the file.
>>
>>
>> #
>> # This rule will identify the outbound Set-Cookie SessionID data and
>> capture it in a setsid
>> #
>> SecRule RESPONSE_HEADERS:/Set-Cookie2?/
>> "(?i:(j?sessionid|(php)?sessid|(asp|jserv|jw)?session[-_]?(id)?|cf(id|token)|sid)=([^\s]+)\;\s?)"
>> "chain,phase:3,id:'981062',t:none,pass,nolog,capture,setsid:%{TX.6},setvar:session.sessionid=%{TX.6},setvar:tx.ip=%{remote_addr},setvar:<
>> http://tx.ua>tx.ua<http://tx.ua
>> >=%{request_headers.user-agent},setvar:session.valid=1"
>> SecRule SESSION:SESSIONID "(.*)"
>> "t:none,t:sha1,t:hexEncode,capture,setvar:session.csrf_token=%{TX.1}"
>>
>> SecRule TX:IP "^(\d{1,3}\.\d{1,3}\.\d{1,3}\.)"
>>
>> "phase:3,id:'981063',capture,t:none,t:sha1,t:hexEncode,nolog,pass,setvar:session.ip=%{tx.1}"
>> SecRule TX:UA "(.*)"
>> "phase:3,id:'981064',capture,t:none,t:sha1,t:hexEncode,nolog,pass,setvar:<
>> http://session.ua>session.ua<http://session.ua>=%{tx.0}"
>>
>> These rules will identify if/when common SessionIDs are being sent out by
>> the app in Set-Cookie response headers. If these are found, then a few
>> things happen -
>>
>> 1. Setsid is used to initialize the Session collection
>> 2. The SessionID is marked as "valid" so that we can detect then bogus
>> SessionIDs are sent (perhaps by brute force tools)
>> 3. We then capture a hash of the network block of the client IP (first 3
>> octets). We don't use full IP address as there a too many false positives
>> where an IP will change, however the network block should not.
>> 4. We then also capture a hash of the User-Agent string.
>>
>> Now that we have saved this data when the app sent out the Set-Cookie, we
>> can now perform validation on subsequent requests. If a client sends a
>> SessionID cookie value, we can check the data we have saved. Now onto the
>> rules at the top of the rules file -
>>
>>
>> #
>> # This rule set will identify subsequent SessionIDs being submitted by
>> clients in
>> # Request Headers. First we check that the SessionID submitted is a valid
>> one
>> #
>> SecMarker BEGIN_SESSION_STARTUP
>>
>> SecRule
>> REQUEST_COOKIES:'/(j?sessionid|(php)?sessid|(asp|jserv|jw)?session[-_]?(id)?|cf(id|token)|sid)/'
>> ".*" "chain,phase:1,id:'981054',t:none,block,log,msg:'Invalid SessionID
>> Submitted.',setsid:%{matched_var},setvar:tx.sessionid=%{matched_var},skipAfter:END_SESSION_STARTUP"
>> SecRule SESSION:VALID "!@eq 1"
>> "t:none,setvar:tx.anomaly_score=+%{tx.critical_anomaly_score},setvar:tx.%{
>> rule.id<http://rule.id
>> >}-WEB_ATTACK/INVALID_SESSIONID-%{matched_var_name}=%{tx.0}"
>>
>> SecRule
>> &REQUEST_COOKIES:'/(j?sessionid|(php)?sessid|(asp|jserv|jw)?session[-_]?(id)?|cf(id|token)|sid)/'
>> "@eq 0"
>> "phase:1,id:'981055',t:none,nolog,pass,skipAfter:END_SESSION_STARTUP"
>>
>> The first rule checks to see if the client is submitting a SessionID from
>> the named list. If so, then we check the saved SessionID collection in
>> ModSecurity to see if the "valid" variable exists. If not, then it means
>> that we did not see the application hand out this SessionID and thus we can
>> flag is as bogus.
>>
>> The last SecRule checks to see if there are no SessionID cookies at all.
>> If the client didn't send one, then we can skip the other checks. Sidenote
>> – from an optimization perspective, I guess we could switch these two rules
>> around.
>>
>> Then we get to the set of rules you mentioned -
>>
>> SecAction
>> "phase:1,id:'981056',t:none,nolog,pass,setuid:%{session.username},setvar:session.sessionid=%{tx.sessionid},setvar:tx.ip=%{remote_addr},setvar:<
>> http://tx.ua>tx.ua<http://tx.ua>=%{request_headers.user-agent}"
>>
>> SecRule TX:IP "^(\d{1,3}\.\d{1,3}\.\d{1,3}\.)"
>> "phase:1,id:'981057',capture,t:none,t:sha1,t:hexEncode,nolog,pass,setvar:tx.ip_hash=%{tx.0}"
>> SecRule TX:UA "(.*)"
>> "phase:1,id:'981058',capture,t:none,t:sha1,t:hexEncode,nolog,pass,setvar:tx.ua_hash=%{tx.0}"
>>
>> These rules are meant to capture the hash of the same data mentioned above
>> but for the CURRENT transaction. Once we have these hashes capture in TX
>> variables, we can then compare them to the data we originally saved in the
>> Session collection when the Set-Cookie was issued -
>>
>>
>> SecRule TX:IP_HASH "!@streq %{SESSION.IP}"
>> "phase:1,id:'981059',t:none,block,setvar:tx.sticky_session_anomaly=+1,msg:'Warning
>> - Sticky SessionID Data Changed - IP Address
>> Mismatch.',setvar:'tx.msg=%{rule.msg}',setvar:tx.anomaly_score=+%{tx.notice_anomaly_score},setvar:tx.%{
>> rule.id<http://rule.id
>> >}-WEB_ATTACK/SESSION_HIJACK-%{matched_var_name}=%{tx.0}"
>> SecRule TX:UA_HASH "!@streq %{SESSION.UA<http://SESSION.UA>}"
>> "phase:1,id:'981060',t:none,block,setvar:tx.sticky_session_anomaly=+1,msg:'Warning
>> - Sticky SessionID Data Changed - User-Agent
>> Mismatch.',setvar:'tx.msg=%{rule.msg}',setvar:tx.anomaly_score=+%{tx.notice_anomaly_score},setvar:tx.%{
>> rule.id<http://rule.id
>> >}-WEB_ATTACK/SESSION_HIJACK-%{matched_var_name}=%{tx.0}"
>> SecRule TX:STICKY_SESSION_ANOMALY "@eq 2"
>> "phase:1,id:'981061',t:none,block,msg:'Possible Session Hijacking - IP
>> Address and User-Agent
>> Mismatch.',setvar:'tx.msg=%{rule.msg}',setvar:tx.anomaly_score=+%{tx.critical_anomaly_score},setvar:tx.%{
>> rule.id<http://rule.id
>> >}-WEB_ATTACK/SESSION_HIJACK-%{matched_var_name}=%{tx.0}"
>>
>> These rules are simply check the current hashes with the saved hashes and
>> they then increase an anomaly score.
>>
>> Hopefully this description helps to explain the logic of the Session
>> Hijacking rules.
>>
>> -Ryan
>>
>>
>> I changed "^(\d{1,3}\.\d{1,3}\.\d{1,3}\.)" to "(.*)" after that the Rules
>> are working.
>> Is this the right approach to fix this or should this be fixed in another
>> way?
>>
>> Thanks in Advance
>> Michael
>>
>>
>> ________________________________
>> This transmission may contain information that is privileged,
>> confidential, and/or exempt from disclosure under applicable law. If you are
>> not the intended recipient, you are hereby notified that any disclosure,
>> copying, distribution, or use of the information contained herein (including
>> any reliance thereon) is STRICTLY PROHIBITED. If you received this
>> transmission in error, please immediately contact the sender and destroy the
>> material in its entirety, whether in electronic or hard copy format.
>>
>>
>>
>> _______________________________________________
>> Owasp-modsecurity-core-rule-set mailing list
>> [email protected]<mailto:
>> [email protected]>
>> https://lists.owasp.org/mailman/listinfo/owasp-modsecurity-core-rule-set
>>
>> ________________________________
>> This transmission may contain information that is privileged,
>> confidential, and/or exempt from disclosure under applicable law. If you are
>> not the intended recipient, you are hereby notified that any disclosure,
>> copying, distribution, or use of the information contained herein (including
>> any reliance thereon) is STRICTLY PROHIBITED. If you received this
>> transmission in error, please immediately contact the sender and destroy the
>> material in its entirety, whether in electronic or hard copy format.
>>
>
>
_______________________________________________
Owasp-modsecurity-core-rule-set mailing list
[email protected]
https://lists.owasp.org/mailman/listinfo/owasp-modsecurity-core-rule-set