xbase-util 0.9.5__tar.gz → 0.9.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {xbase_util-0.9.5 → xbase_util-0.9.7}/PKG-INFO +1 -1
- {xbase_util-0.9.5 → xbase_util-0.9.7}/setup.py +1 -1
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/common_util.py +2 -2
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/packet_util.py +46 -3
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/pcap_util.py +1 -1
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/xbase_constant.py +6 -2
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util.egg-info/PKG-INFO +2 -2
- {xbase_util-0.9.5 → xbase_util-0.9.7}/README.md +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/setup.cfg +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/__init__.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/add_column_util.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/dangerous_util.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/db/__init__.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/db/bean/ConfigBean.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/db/bean/CurrentConfigBean.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/db/bean/FlowBean.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/db/bean/TaskTemplateBean.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/db/bean/__init__.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/db/dao/ConfigDao.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/db/dao/CurrentConfigDao.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/db/dao/FlowDao.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/db/dao/TaskTemplateDao.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/db/dao/__init__.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/db/initsqlite3.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/es_db_util.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/esreq.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/geo_util.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util/handle_features_util.py +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util.egg-info/SOURCES.txt +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util.egg-info/dependency_links.txt +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util.egg-info/not-zip-safe +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util.egg-info/top_level.txt +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util_assets/GeoLite2-City.mmdb +0 -0
- {xbase_util-0.9.5 → xbase_util-0.9.7}/xbase_util_assets/arkimeparse.js +0 -0
@@ -230,8 +230,8 @@ def get_statistic_fields(packets):
|
|
230
230
|
packet_len_rate = round((packet_len_total_count / total_time) / 1000, 5) if total_time > 0 else 0
|
231
231
|
packet_size = [len(p) for p in packets]
|
232
232
|
field_map = {
|
233
|
-
"packet_size_mean": float(round(np.mean(packet_size), 5)),
|
234
|
-
"packet_size_variance": float(round(np.var(packet_size), 5)),
|
233
|
+
"packet_size_mean": float(round(np.mean(packet_size), 5)) if len(packet_size) > 0 else -1,
|
234
|
+
"packet_size_variance": float(round(np.var(packet_size), 5)) if len(packet_size) > 0 else -1,
|
235
235
|
'packet_len_total_count': packet_len_total_count,
|
236
236
|
'packet_len_total_average': packet_len_average,
|
237
237
|
'packet_len_total_min': packet_len_min,
|
@@ -1,8 +1,9 @@
|
|
1
1
|
import copy
|
2
|
+
import re
|
2
3
|
|
3
4
|
from xbase_util.xbase_constant import plain_content_type_columns, packetKeyname, src_dst_header, statisticHeader, \
|
4
5
|
features_key, plain_body_columns, http_version_pattern, http_req_method_pattern, http_req_path_pattern, \
|
5
|
-
res_status_code_pattern
|
6
|
+
res_status_code_pattern, pcap_flow_text_column, abnormal_features_column
|
6
7
|
|
7
8
|
|
8
9
|
def content_type_is_plain(packet):
|
@@ -28,7 +29,8 @@ def get_all_columns(
|
|
28
29
|
contains_statistic_column=False,
|
29
30
|
contains_features_column=False,
|
30
31
|
contains_plain_body_column=False,
|
31
|
-
contains_pcap_flow_text=False
|
32
|
+
contains_pcap_flow_text=False,
|
33
|
+
contains_abnormal_features_column=False,
|
32
34
|
):
|
33
35
|
result_columns = []
|
34
36
|
if contains_packet_column:
|
@@ -42,7 +44,9 @@ def get_all_columns(
|
|
42
44
|
if contains_plain_body_column:
|
43
45
|
result_columns += plain_body_columns
|
44
46
|
if contains_pcap_flow_text:
|
45
|
-
result_columns.append(
|
47
|
+
result_columns.append(pcap_flow_text_column)
|
48
|
+
if contains_abnormal_features_column:
|
49
|
+
result_columns.append(abnormal_features_column)
|
46
50
|
return result_columns
|
47
51
|
|
48
52
|
|
@@ -123,3 +127,42 @@ def get_detail_by_package(publicField, req_header, req_body, res_header, res_bod
|
|
123
127
|
if f"dst_{key}" in src_dst_header:
|
124
128
|
res_field[f"dst_{key}"] = value
|
125
129
|
return res_field
|
130
|
+
|
131
|
+
|
132
|
+
def str_list_in_list(str_list, features_list):
|
133
|
+
for str_item in str_list:
|
134
|
+
if len([item for item in features_list if item in str_item]):
|
135
|
+
return True
|
136
|
+
return False
|
137
|
+
|
138
|
+
|
139
|
+
def has_dir_penetration(str_list):
|
140
|
+
return str_list_in_list(str_list, features_list=["../", "/..", "..", "%2e%2e", "%2F.."])
|
141
|
+
|
142
|
+
|
143
|
+
def has_sql_injection(str_list):
|
144
|
+
return str_list_in_list(str_list, features_list=['%20union%20select', '--'])
|
145
|
+
|
146
|
+
|
147
|
+
def has_xss_injection(str_list):
|
148
|
+
pattern = re.compile(r"<script>alert.*?onerror=alert.*?<script>prompt.*?alert\(")
|
149
|
+
for str_item in str_list:
|
150
|
+
if pattern.search(str_item):
|
151
|
+
return True
|
152
|
+
return False
|
153
|
+
|
154
|
+
|
155
|
+
def has_templates_injection(str_list):
|
156
|
+
return str_list_in_list(str_list, features_list=["{{", "}}"])
|
157
|
+
|
158
|
+
|
159
|
+
def has_crlf_injection(str_list):
|
160
|
+
return str_list_in_list(str_list, features_list=["%0D%0A"])
|
161
|
+
|
162
|
+
|
163
|
+
def has_xxe_attack(str_list):
|
164
|
+
return str_list_in_list(str_list, features_list=['"SYSTEM "'])
|
165
|
+
|
166
|
+
|
167
|
+
def has_code_injection_or_execute(str_list):
|
168
|
+
return str_list_in_list(str_list, features_list=['command', 'var_dump', 'execute(', 'md5('])
|
@@ -334,7 +334,7 @@ def reassemble_session_pcap(reassemble_tcp_res, skey, session_id='none'):
|
|
334
334
|
|
335
335
|
|
336
336
|
def reassemble_tcp_pcap(p):
|
337
|
-
packets = [{'pkt': item} for item in p if TCP in item and Raw in item]
|
337
|
+
packets = [{'pkt': item} for item in p if TCP in item and Raw in item and IP in item]
|
338
338
|
packets2 = []
|
339
339
|
info = {}
|
340
340
|
keys = []
|
@@ -223,7 +223,7 @@ regex_patterns = {
|
|
223
223
|
re.IGNORECASE)
|
224
224
|
}
|
225
225
|
# 可见的content-type值
|
226
|
-
plain_content_type_columns = ['text/json;charset=gbk','text/javascript','text/css','text/html;charset=gb2312',
|
226
|
+
plain_content_type_columns = ['text/json;charset=gbk', 'text/javascript', 'text/css', 'text/html;charset=gb2312',
|
227
227
|
'application/xml;charset=gbk', 'application/xml;charset=utf_8', 'application/tlt_notify',
|
228
228
|
'application/json;charset=gbk', 'text/xml;charset=utf_8', 'application/json',
|
229
229
|
'text/csv;charset=utf_8', 'application/json;charse=utf_8',
|
@@ -285,6 +285,10 @@ packetKeyname = ['id', 'segmentCnt', 'tcpflags.rst', 'tcpflags.ack', 'tcpflags.s
|
|
285
285
|
"ua_duplicate_count"]
|
286
286
|
plain_body_columns = ["plain_body_src",
|
287
287
|
"plain_body_dst"]
|
288
|
+
abnormal_features_column = ['abnormal_has_xff', 'abnormal_has_dir_penetration', 'abnormal_has_templates_injection',
|
289
|
+
'abnormal_has_crlf_injection', 'abnormal_has_xxe_attack',
|
290
|
+
'abnormal_has_code_injection_or_execute', 'abnormal_has_sql_injection']
|
291
|
+
pcap_flow_text_column = ['pcap_flow_text']
|
288
292
|
|
289
293
|
pattern_chuncked = re.compile(rb"Transfer-Encoding:\s*chunked", re.IGNORECASE)
|
290
294
|
pattern_gzip = re.compile(rb"Content-Encoding:\s*gzip", re.IGNORECASE)
|
@@ -292,4 +296,4 @@ pattern_gzip = re.compile(rb"Content-Encoding:\s*gzip", re.IGNORECASE)
|
|
292
296
|
http_version_pattern = re.compile(r"HTTP\/(\d\.\d)")
|
293
297
|
http_req_method_pattern = re.compile(r"(GET|POST|HEAD|PUT|DELETE|OPTIONS|PATCH) \/[^\s]* HTTP\/\d\.\d")
|
294
298
|
http_req_path_pattern = re.compile(r"(?:GET|POST|HEAD|PUT|DELETE|OPTIONS|PATCH)\s+(\/[^\s]*)\s+HTTP\/\d\.\d")
|
295
|
-
res_status_code_pattern = re.compile(r"HTTP\/\d\.\d\s+(\d{3})\s+.*")
|
299
|
+
res_status_code_pattern = re.compile(r"HTTP\/\d\.\d\s+(\d{3})\s+.*")
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|