Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/topic/awelzel/27-search-substrin…
Browse files Browse the repository at this point in the history
…g-filter'

* origin/topic/awelzel/27-search-substring-filter:
  ldap: Fix substring filter parsing and rendering
  • Loading branch information
awelzel committed Jan 5, 2024
2 parents 9dc0535 + 73b915a commit a435263
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 7 deletions.
43 changes: 36 additions & 7 deletions analyzer/ldap.spicy
Original file line number Diff line number Diff line change
Expand Up @@ -601,8 +601,14 @@ public function string_representation(search_filter: SearchFilter): string {
search_filter.FILTER_LE.assertionValueDecoded);
}
case FilterType::FILTER_SUBSTR: {
repr = "(%s=*%s*)" % (search_filter.FILTER_SUBSTR.attributeDesc.decode(),
search_filter.FILTER_SUBSTR.assertionValueDecoded);
local anys: string = "";
if ( |search_filter.FILTER_SUBSTR.anys| > 0 )
anys = b"*".join(search_filter.FILTER_SUBSTR.anys).decode() + "*";

repr = "(%s=%s*%s%s)" % (search_filter.FILTER_SUBSTR.attributeDesc.decode(),
search_filter.FILTER_SUBSTR.initial,
anys,
search_filter.FILTER_SUBSTR.final);
}
case FilterType::FILTER_PRESENT: {
repr = "(%s=*)" % search_filter.FILTER_PRESENT;
Expand All @@ -620,10 +626,6 @@ type DecodedAttributeValue = unit(fType: FilterType) {
attributeDesc_len: uint8;
attributeDesc: bytes &size=self.attributeDesc_len;

# For some reason, two intermediate uint8 values are present in the FILTER_SUBSTR type.
: uint8 if ( fType == FilterType::FILTER_SUBSTR );
: uint8 if ( fType == FilterType::FILTER_SUBSTR );

: uint8;
assertionValue_len: uint8;
assertionValue: bytes &size=self.assertionValue_len;
Expand Down Expand Up @@ -662,6 +664,33 @@ type DecodedAttributeValue = unit(fType: FilterType) {
}
};

type SubstringFilter = unit {
var initial: string;
var final: string;
var anys: vector<string>;

: uint8; # filter tag
attributeDesc_len: uint8;
attributeDesc: bytes &size=self.attributeDesc_len;

# Crunch through the sequence/choice of substrings.
#
# https://datatracker.ietf.org/doc/html/rfc4511#section-4.5.1
header: ASN1::ASN1Header;
: ASN1::ASN1Message(False)[] &size=self.header.len.len foreach {
local data = $$.application_data.decode();
if ( $$.application_id == 0 ) {
self.initial = data;
} else if ( $$.application_id == 1 ) {
self.anys.push_back(data);
} else if ( $$.application_id == 2 ) {
self.final = data;
} else {
throw "invalid substring choice %s" % $$.application_id;
}
}
};

type SearchFilter = unit {
var filterType: FilterType = FilterType::Undef;
var filterBytes: bytes = b"";
Expand Down Expand Up @@ -693,7 +722,7 @@ type SearchFilter = unit {

FilterType::FILTER_EQ -> FILTER_EQ: DecodedAttributeValue(FilterType::FILTER_EQ)
&parse-from=self.filterBytes;
FilterType::FILTER_SUBSTR -> FILTER_SUBSTR: DecodedAttributeValue(FilterType::FILTER_SUBSTR)
FilterType::FILTER_SUBSTR -> FILTER_SUBSTR: SubstringFilter
&parse-from=self.filterBytes;
FilterType::FILTER_GE -> FILTER_GE: DecodedAttributeValue(FilterType::FILTER_GE)
&parse-from=self.filterBytes;
Expand Down
12 changes: 12 additions & 0 deletions tests/analyzer/ldap_substring_search.zeek
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Copyright (c) 2024 by the Zeek Project. See LICENSE for details.

# @TEST-EXEC: zeek -C -r ${TRACES}/ldap_star_single.pcap %INPUT >output 2>&1
# @TEST-EXEC: btest-diff output
# @TEST-EXEC: cat conn.log | zeek-cut -m ts uid history service > conn.log2 && mv conn.log2 conn.log
# @TEST-EXEC: btest-diff conn.log
# @TEST-EXEC: btest-diff ldap_search.log
#
# @TEST-DOC: Test substring filter parsed and rendered properly when initial and final are present, but no anys.

@load base/protocols/conn
@load analyzer
4 changes: 4 additions & 0 deletions tests/baseline/analyzer.ldap_substring_search/conn.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
### NOTE: This file has been sorted with diff-sort.
XXXXXXXXXX.XXXXXX CHhAvVGS1DHFjwGM9 D spicy_ldap_tcp
ts uid history service
12 changes: 12 additions & 0 deletions tests/baseline/analyzer.ldap_substring_search/ldap_search.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
### NOTE: This file has been sorted with diff-sort.
#separator \x09
#set_separator ,
#empty_field (empty)
#unset_field -
#path ldap_search
#open XXXX-XX-XX-XX-XX-XX
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto message_id scope deref base_object result_count result diagnostic_message filter attributes
#types time string addr port addr port string int set[string] set[string] vector[string] count set[string] vector[string] string vector[string]
#close XXXX-XX-XX-XX-XX-XX
XXXXXXXXXX.XXXXXX CHhAvVGS1DHFjwGM9 192.168.10.152 34581 192.168.10.186 389 tcp 6 tree always DC=matrix\x2cDC=local 0 - - (gPCUserExtensionNames=[*]) -
2 changes: 2 additions & 0 deletions tests/baseline/analyzer.ldap_substring_search/output
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
### NOTE: This file has been sorted with diff-sort.
Binary file added tests/traces/ldap_star_single.pcap
Binary file not shown.

0 comments on commit a435263

Please sign in to comment.