xbase-util 0.4.2__tar.gz → 0.4.3__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.
Files changed (34) hide show
  1. {xbase_util-0.4.2 → xbase_util-0.4.3}/PKG-INFO +1 -1
  2. {xbase_util-0.4.2 → xbase_util-0.4.3}/setup.py +1 -1
  3. xbase_util-0.4.3/xbase_util/packet_util.py +171 -0
  4. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util.egg-info/PKG-INFO +1 -1
  5. xbase_util-0.4.2/xbase_util/packet_util.py +0 -93
  6. {xbase_util-0.4.2 → xbase_util-0.4.3}/README.md +0 -0
  7. {xbase_util-0.4.2 → xbase_util-0.4.3}/setup.cfg +0 -0
  8. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/__init__.py +0 -0
  9. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/add_column_util.py +0 -0
  10. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/db/__init__.py +0 -0
  11. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/db/bean/ConfigBean.py +0 -0
  12. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/db/bean/CurrentConfigBean.py +0 -0
  13. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/db/bean/FlowBean.py +0 -0
  14. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/db/bean/TaskTemplateBean.py +0 -0
  15. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/db/bean/__init__.py +0 -0
  16. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/db/dao/ConfigDao.py +0 -0
  17. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/db/dao/CurrentConfigDao.py +0 -0
  18. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/db/dao/FlowDao.py +0 -0
  19. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/db/dao/TaskTemplateDao.py +0 -0
  20. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/db/dao/__init__.py +0 -0
  21. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/db/initsqlite3.py +0 -0
  22. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/es_db_util.py +0 -0
  23. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/esreq.py +0 -0
  24. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/geo_util.py +0 -0
  25. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/handle_features_util.py +0 -0
  26. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/pcap_util.py +0 -0
  27. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/xbase_constant.py +0 -0
  28. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util/xbase_util.py +0 -0
  29. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util.egg-info/SOURCES.txt +0 -0
  30. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util.egg-info/dependency_links.txt +0 -0
  31. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util.egg-info/not-zip-safe +0 -0
  32. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util.egg-info/top_level.txt +0 -0
  33. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util_assets/GeoLite2-City.mmdb +0 -0
  34. {xbase_util-0.4.2 → xbase_util-0.4.3}/xbase_util_assets/arkimeparse.js +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: xbase_util
3
- Version: 0.4.2
3
+ Version: 0.4.3
4
4
  Summary: 网络安全基础工具
5
5
  Home-page: https://gitee.com/jimonik/xbase_util.git
6
6
  Author: xyt
@@ -3,7 +3,7 @@ from distutils.core import setup
3
3
  from setuptools import find_packages
4
4
 
5
5
  setup(name="xbase_util",
6
- version="0.4.2",
6
+ version="0.4.3",
7
7
  description="网络安全基础工具",
8
8
  long_description="包含提取,预测,训练的基础工具",
9
9
  author="xyt",
@@ -0,0 +1,171 @@
1
+ import re
2
+
3
+ from scapy.layers.inet import TCP
4
+
5
+ from xbase_util.xbase_constant import plain_content_type_columns, packetKeyname, src_dst_header, statisticHeader, \
6
+ features_key, plain_body_columns
7
+ from xbase_util.xbase_util import firstOrZero
8
+
9
+
10
+ def content_type_is_plain(packet):
11
+ """
12
+ 从单个包(包括header和body)中获取content-type并判断是否为可见类型
13
+ :param packet:
14
+ :return:
15
+ """
16
+ if ":" not in packet:
17
+ return False
18
+ for item in packet.replace("-", "_").replace(" ", "").lower().split("\n"):
19
+ if "content_type" in item:
20
+ if ":" not in item:
21
+ continue
22
+ content_type = item.split(":")[1].replace("\r", "").strip()
23
+ return content_type in plain_content_type_columns
24
+ return False
25
+
26
+
27
+ def filter_visible_chars(data):
28
+ """
29
+ 过滤不可见字符,仅保留可打印的ASCII字符
30
+ :param data:
31
+ :return:
32
+ """
33
+ return ''.join(chr(b) for b in data if 32 <= b <= 126 or b in (9, 10, 13))
34
+
35
+
36
+ def get_all_columns(
37
+ contains_packet_column=False,
38
+ contains_src_dst_column=False,
39
+ contains_statistic_column=False,
40
+ contains_features_column=False,
41
+ contains_plain_body_column=False,
42
+ contains_pcap_flow_text=False
43
+ ):
44
+ result_columns = []
45
+ if contains_packet_column:
46
+ result_columns += packetKeyname
47
+ if contains_src_dst_column:
48
+ result_columns += src_dst_header
49
+ if contains_statistic_column:
50
+ result_columns += statisticHeader
51
+ if contains_features_column:
52
+ result_columns += features_key
53
+ if contains_plain_body_column:
54
+ result_columns += plain_body_columns
55
+ if contains_pcap_flow_text:
56
+ result_columns.append(contains_pcap_flow_text)
57
+ return result_columns
58
+
59
+
60
+ def get_all_packets_by_regx(packets):
61
+ """
62
+ 通过正则pcap获取所有包的数据
63
+ :param packets:
64
+ :return:
65
+ """
66
+ streams = b""
67
+ for pkt in packets:
68
+ if TCP in pkt:
69
+ streams += bytes(pkt[TCP].payload)
70
+ text = filter_visible_chars(streams)
71
+ pattern = r"(GET|POST|HEAD|PUT|DELETE|OPTIONS|PATCH) \/[^\s]* HTTP\/\d\.\d"
72
+ requests = re.split(f"(?={pattern})", text, re.M)
73
+ all_packets = []
74
+ for item in requests:
75
+ if len(re.findall(pattern, item)) != 0:
76
+ request_text = ""
77
+ response_text = ""
78
+ response_text_list = re.findall(r"HTTP/\d\.\d \d{3}[\s\S]*", item)
79
+ if len(response_text_list) != 0:
80
+ # 有响应数据
81
+ response_text = response_text_list[0]
82
+ if response_text == "":
83
+ # 没有响应数据,那么全是请求数据
84
+ request_text = item
85
+ else:
86
+ # 有响应数据,用正则获取请求数据
87
+ request_re = re.search(
88
+ r"(GET|POST|HEAD|PUT|DELETE|OPTIONS|PATCH) \/[^\s]* HTTP\/\d\.\d[\s\S]*?\r\n\r\n", item)
89
+ if request_re:
90
+ request_text = request_re.group(0)
91
+ else:
92
+ request_text = ""
93
+ all_packets.append({"req": request_text, "res": response_text})
94
+ return all_packets
95
+
96
+
97
+ def get_body(param, is_src):
98
+ body = param.split("\r\n\r\n")[1].strip()
99
+ return "" if body is None else body
100
+
101
+
102
+ def get_header_value(header_set, value):
103
+ result = [item for item in header_set if value in item]
104
+ if len(result) != 0:
105
+ return result[0].replace(f"{value}:", "").strip()
106
+ else:
107
+ return ""
108
+
109
+
110
+ def get_detail_by_package(packets_from_pcap, publicField, use_regx):
111
+ """
112
+ 通过pcap的数量分离session并完善相关字段
113
+ :param packets_from_pcap: 通过PcAp解析出的包
114
+ :param publicField: 原始的session单条数据
115
+ :return: 完整的单条数据
116
+ """
117
+ res_field = publicField.copy()
118
+ if use_regx:
119
+ req = packets_from_pcap['req']
120
+ res = packets_from_pcap['res']
121
+ else:
122
+ res = packets_from_pcap["response"]
123
+ req = packets_from_pcap["request"]
124
+ res_field["initRTT"] = firstOrZero(res_field.get("initRTT", 0))
125
+ res_field["length"] = firstOrZero(res_field.get("length", 0))
126
+ request_lines = req.strip().split("\n")
127
+ http_request_lines = [item for item in request_lines if "HTTP" in item]
128
+ if len(http_request_lines) != 0:
129
+ first_line = http_request_lines[0].split(" ")
130
+ res_field['http.clientVersion'] = str(first_line[2]).replace("\n", "").replace("\r", "")
131
+ res_field['http.path'] = first_line[1]
132
+ res_field['http.method'] = first_line[0]
133
+ else:
134
+ res_field['http.clientVersion'] = ''
135
+ res_field['http.path'] = ''
136
+ res_field['http.method'] = ''
137
+ res_field['http.request-referer'] = get_header_value(header_set=request_lines, value="Referer")
138
+ res_field['http.request-content-type'] = get_header_value(header_set=request_lines,
139
+ value="Content-Type")
140
+ res_field['http.hostTokens'] = get_header_value(header_set=request_lines, value="Host")
141
+
142
+ if use_regx:
143
+ res_field['plain_body_src'] = ""
144
+ res_field['plain_body_dst'] = ""
145
+ if content_type_is_plain(req):
146
+ res_field['plain_body_src'] = get_body(req, is_src=True)
147
+ if content_type_is_plain(res):
148
+ res_field['plain_body_dst'] = get_body(res, is_src=False)
149
+
150
+ response_lines = res.strip().split("\n")
151
+ http_response_lines = [item for item in response_lines if "HTTP" in item]
152
+ if len(http_response_lines) != 0:
153
+ first_line = http_response_lines[0].strip().split(" ")
154
+ res_field['http.statuscode'] = first_line[1]
155
+ res_field['http.serverVersion'] = first_line[0].split("/")[1]
156
+ else:
157
+ res_field['http.statuscode'] = ""
158
+ res_field['http.serverVersion'] = ""
159
+ res_field['http.response-server'] = get_header_value(header_set=response_lines, value="Server")
160
+ res_field['http.response-content-type'] = get_header_value(header_set=response_lines,
161
+ value="Content-Type")
162
+ for response in list(set(response_lines + request_lines)):
163
+ key_value = response.replace("\r", "").split(":")
164
+ if len(key_value) == 2:
165
+ key = key_value[0].replace(" ", "").replace("-", "_").lower()
166
+ value = key_value[1].replace(" ", "")
167
+ if f"src_{key}" in src_dst_header:
168
+ res_field[f"src_{key}"] = value
169
+ if f"dst_{key}" in src_dst_header:
170
+ res_field[f"dst_{key}"] = value
171
+ return res_field
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: xbase-util
3
- Version: 0.4.2
3
+ Version: 0.4.3
4
4
  Summary: 网络安全基础工具
5
5
  Home-page: https://gitee.com/jimonik/xbase_util.git
6
6
  Author: xyt
@@ -1,93 +0,0 @@
1
- import re
2
-
3
- from scapy.layers.inet import TCP
4
-
5
- from xbase_util.xbase_constant import plain_content_type_columns, packetKeyname, src_dst_header, statisticHeader, \
6
- features_key, plain_body_columns
7
-
8
-
9
- def content_type_is_plain(packet):
10
- """
11
- 从单个包(包括header和body)中获取content-type并判断是否为可见类型
12
- :param packet:
13
- :return:
14
- """
15
- if ":" not in packet:
16
- return False
17
- for item in packet.replace("-", "_").replace(" ", "").lower().split("\n"):
18
- if "content_type" in item:
19
- if ":" not in item:
20
- continue
21
- content_type = item.split(":")[1].replace("\r", "").strip()
22
- return content_type in plain_content_type_columns
23
- return False
24
-
25
-
26
- def filter_visible_chars(data):
27
- """
28
- 过滤不可见字符,仅保留可打印的ASCII字符
29
- :param data:
30
- :return:
31
- """
32
- return ''.join(chr(b) for b in data if 32 <= b <= 126 or b in (9, 10, 13))
33
-
34
-
35
- def get_all_columns(
36
- contains_packet_column=False,
37
- contains_src_dst_column=False,
38
- contains_statistic_column=False,
39
- contains_features_column=False,
40
- contains_plain_body_column=False,
41
- contains_pcap_flow_text=False
42
- ):
43
- result_columns = []
44
- if contains_packet_column:
45
- result_columns += packetKeyname
46
- if contains_src_dst_column:
47
- result_columns += src_dst_header
48
- if contains_statistic_column:
49
- result_columns += statisticHeader
50
- if contains_features_column:
51
- result_columns += features_key
52
- if contains_plain_body_column:
53
- result_columns += plain_body_columns
54
- if contains_pcap_flow_text:
55
- result_columns.append(contains_pcap_flow_text)
56
- return result_columns
57
-
58
-
59
- def get_all_packets_by_regx(packets):
60
- """
61
- 通过正则pcap获取所有包的数据
62
- :param packets:
63
- :return:
64
- """
65
- streams = b""
66
- for pkt in packets:
67
- if TCP in pkt:
68
- streams += bytes(pkt[TCP].payload)
69
- text = filter_visible_chars(streams)
70
- pattern = r"(GET|POST|HEAD|PUT|DELETE|OPTIONS|PATCH) \/[^\s]* HTTP\/\d\.\d"
71
- requests = re.split(f"(?={pattern})", text, re.M)
72
- all_packets = []
73
- for item in requests:
74
- if len(re.findall(pattern, item)) != 0:
75
- request_text = ""
76
- response_text = ""
77
- response_text_list = re.findall(r"HTTP/\d\.\d \d{3}[\s\S]*", item)
78
- if len(response_text_list) != 0:
79
- # 有响应数据
80
- response_text = response_text_list[0]
81
- if response_text == "":
82
- # 没有响应数据,那么全是请求数据
83
- request_text = item
84
- else:
85
- # 有响应数据,用正则获取请求数据
86
- request_re = re.search(
87
- r"(GET|POST|HEAD|PUT|DELETE|OPTIONS|PATCH) \/[^\s]* HTTP\/\d\.\d[\s\S]*?\r\n\r\n", item)
88
- if request_re:
89
- request_text = request_re.group(0)
90
- else:
91
- request_text = ""
92
- all_packets.append({"req": request_text, "res": response_text})
93
- return all_packets
File without changes
File without changes