xbase-util 0.6.5__tar.gz → 0.6.7__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. {xbase_util-0.6.5 → xbase_util-0.6.7}/PKG-INFO +1 -1
  2. {xbase_util-0.6.5 → xbase_util-0.6.7}/setup.py +1 -1
  3. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/packet_util.py +16 -29
  4. xbase_util-0.6.7/xbase_util/segment.py +163 -0
  5. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util.egg-info/PKG-INFO +1 -1
  6. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util.egg-info/SOURCES.txt +1 -0
  7. {xbase_util-0.6.5 → xbase_util-0.6.7}/README.md +0 -0
  8. {xbase_util-0.6.5 → xbase_util-0.6.7}/setup.cfg +0 -0
  9. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/__init__.py +0 -0
  10. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/add_column_util.py +0 -0
  11. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/dangerous_util.py +0 -0
  12. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/db/__init__.py +0 -0
  13. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/db/bean/ConfigBean.py +0 -0
  14. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/db/bean/CurrentConfigBean.py +0 -0
  15. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/db/bean/FlowBean.py +0 -0
  16. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/db/bean/TaskTemplateBean.py +0 -0
  17. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/db/bean/__init__.py +0 -0
  18. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/db/dao/ConfigDao.py +0 -0
  19. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/db/dao/CurrentConfigDao.py +0 -0
  20. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/db/dao/FlowDao.py +0 -0
  21. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/db/dao/TaskTemplateDao.py +0 -0
  22. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/db/dao/__init__.py +0 -0
  23. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/db/initsqlite3.py +0 -0
  24. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/es_db_util.py +0 -0
  25. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/esreq.py +0 -0
  26. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/geo_util.py +0 -0
  27. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/handle_features_util.py +0 -0
  28. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/pcap_util.py +0 -0
  29. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/xbase_constant.py +0 -0
  30. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util/xbase_util.py +0 -0
  31. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util.egg-info/dependency_links.txt +0 -0
  32. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util.egg-info/not-zip-safe +0 -0
  33. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util.egg-info/top_level.txt +0 -0
  34. {xbase_util-0.6.5 → xbase_util-0.6.7}/xbase_util_assets/GeoLite2-City.mmdb +0 -0
  35. {xbase_util-0.6.5 → xbase_util-0.6.7}/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.6.5
3
+ Version: 0.6.7
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.6.5",
6
+ version="0.6.7",
7
7
  description="网络安全基础工具",
8
8
  long_description="包含提取,预测,训练的基础工具",
9
9
  author="xyt",
@@ -1,7 +1,7 @@
1
+ import copy
1
2
  import re
2
- import traceback
3
3
 
4
- from scapy.layers.inet import TCP, IP
4
+ from scapy.layers.inet import TCP
5
5
  from scapy.packet import Raw
6
6
 
7
7
  from xbase_util.xbase_constant import plain_content_type_columns, packetKeyname, src_dst_header, statisticHeader, \
@@ -96,14 +96,6 @@ def get_all_packets_by_reg(packets):
96
96
  return packet_list
97
97
 
98
98
 
99
- def get_body(packet):
100
- try:
101
- return "".join([item for item in packet.split("\r\n\r\n") if "HTTP/" not in item])
102
- except Exception:
103
- traceback.print_exc()
104
- return ""
105
-
106
-
107
99
  def get_header_value(header_set, value):
108
100
  result = [item for item in header_set if value in item]
109
101
  if len(result) != 0:
@@ -112,23 +104,20 @@ def get_header_value(header_set, value):
112
104
  return ""
113
105
 
114
106
 
115
- def get_detail_by_package(packets_from_pcap, publicField, use_regx):
107
+ def get_detail_by_package(publicField, req_header, req_body, res_header, res_body):
116
108
  """
117
109
  通过pcap的数量分离session并完善相关字段
118
- :param packets_from_pcap: 通过PcAp解析出的包
119
110
  :param publicField: 原始的session单条数据
111
+ :param req_header:请求头
112
+ :param req_body:请求体
113
+ :param res_header:响应头
114
+ :param res_body:响应体
120
115
  :return: 完整的单条数据
121
116
  """
122
- res_field = publicField.copy()
123
- if use_regx:
124
- req = packets_from_pcap['req_body']
125
- res = packets_from_pcap['res_body']
126
- else:
127
- res = packets_from_pcap["response"]
128
- req = packets_from_pcap["request"]
117
+ res_field = copy.deepcopy(publicField)
129
118
  res_field["initRTT"] = firstOrZero(res_field.get("initRTT", 0))
130
119
  res_field["length"] = firstOrZero(res_field.get("length", 0))
131
- request_lines = req.strip().split("\n")
120
+ request_lines = req_header.strip().split("\n")
132
121
  http_request_lines = [item for item in request_lines if "HTTP" in item]
133
122
  if len(http_request_lines) != 0:
134
123
  first_line = http_request_lines[0].split(" ")
@@ -144,15 +133,13 @@ def get_detail_by_package(packets_from_pcap, publicField, use_regx):
144
133
  value="Content-Type")
145
134
  res_field['http.hostTokens'] = get_header_value(header_set=request_lines, value="Host")
146
135
 
147
- if use_regx:
148
- res_field['plain_body_src'] = ""
149
- res_field['plain_body_dst'] = ""
150
- if content_type_is_plain(req):
151
- res_field['plain_body_src'] = get_body(req)
152
- if content_type_is_plain(res):
153
- res_field['plain_body_dst'] = get_body(res)
154
-
155
- response_lines = res.strip().split("\n")
136
+ res_field['plain_body_src'] = ""
137
+ res_field['plain_body_dst'] = ""
138
+ if content_type_is_plain(req_header):
139
+ res_field['plain_body_src'] = req_body
140
+ if content_type_is_plain(res_header):
141
+ res_field['plain_body_dst'] = res_body
142
+ response_lines = res_body.strip().split("\n")
156
143
  http_response_lines = [item for item in response_lines if "HTTP" in item]
157
144
  if len(http_response_lines) != 0:
158
145
  first_line = http_response_lines[0].strip().split(" ")
@@ -0,0 +1,163 @@
1
+ import copy
2
+ import re
3
+
4
+ import numpy as np
5
+ from scapy.all import *
6
+ from scapy.layers.inet import TCP
7
+
8
+ REQUEST_LINE_RE = re.compile(rb"^(GET|POST|PUT|DELETE|OPTIONS|HEAD|PATCH)\s[^\r\n]+\r\n", re.MULTILINE)
9
+ RESPONSE_LINE_RE = re.compile(rb"^HTTP/\d\.\d\s+\d{3}\s?[^\r\n]*", re.IGNORECASE)
10
+
11
+
12
+ def read_packets(packets):
13
+ last_seq_len = -1
14
+ last_ack = -1
15
+ packet_list = []
16
+ tmp_data = b''
17
+ tmp_packets = []
18
+ for index, pkt in enumerate(packets):
19
+ data = pkt[Raw].load if Raw in pkt else b''
20
+ ack = pkt[TCP].ack
21
+ seq = pkt[TCP].seq
22
+ if seq == last_seq_len:
23
+ # print(f"检测到连续包 数据长度:{len(data)} + seq:{seq}={len(data) + seq} ack:{ack}")
24
+ tmp_data += data
25
+ tmp_packets.append(pkt)
26
+ elif seq == last_ack:
27
+ if tmp_data != b'':
28
+ if REQUEST_LINE_RE.match(tmp_data) or RESPONSE_LINE_RE.match(tmp_data):
29
+ packet_list.append({'data': copy.deepcopy(tmp_data), 'pkts': copy.deepcopy(tmp_packets)})
30
+ else:
31
+ # print("没有新的请求或者响应,就把数据加到上一个里面")
32
+ if len(packet_list) > 0:
33
+ # 之前找到过有请求,可以添加到之前的数据,否则说明一开始就没找到请求
34
+ packet_list[-1]['pkts'].extend(copy.deepcopy(tmp_packets))
35
+ packet_list[-1]['data'] += tmp_data
36
+
37
+ tmp_data = data
38
+ tmp_packets = [pkt]
39
+ # print(f"顺序正确 数据长度:{len(data)} + seq:{seq}={len(data) + seq} ack:{ack}")
40
+ else:
41
+ # print(f"顺序错误 数据长度:{len(data)} + seq:{seq}={len(data) + seq} ack:{ack}")
42
+ if len(data) > 0:
43
+ # 但是有数据
44
+ tmp_data += data
45
+ tmp_packets.append(pkt)
46
+ last_ack = ack
47
+ last_seq_len = seq + len(data)
48
+ if tmp_data != b'':
49
+ packet_list.append({'data': copy.deepcopy(tmp_data), 'pkts': copy.deepcopy(tmp_packets)})
50
+ tmp_packets.clear()
51
+ return packet_list
52
+
53
+
54
+ def parse_req_or_res(data, pkts):
55
+ if data.find(b"\r\n\r\n") != -1:
56
+ res = data.split(b"\r\n\r\n", 1)
57
+ header = res[0]
58
+ body = res[1]
59
+ else:
60
+ header = data
61
+ body = b''
62
+ pattern_chuncked = re.compile(rb"Transfer-Encoding:\s*chunked", re.IGNORECASE)
63
+ pattern_gzip = re.compile(rb"Content-Encoding:\s*gzip", re.IGNORECASE)
64
+ chuncked_pattern = pattern_chuncked.search(header)
65
+ gzip_pattern = pattern_gzip.search(header)
66
+ if chuncked_pattern and b'chunked' in chuncked_pattern.group():
67
+ chunk_lines = [item for item in body.split(b"\r\n") if item != b'']
68
+ data = b''
69
+ next_chunk_size = 0
70
+ for chunk in chunk_lines:
71
+ try:
72
+ next_chunk_size = int(chunk, 16)
73
+ if next_chunk_size == 0:
74
+ break
75
+ # print(f"接下来的分段大小:{next_chunk_size}")
76
+ except:
77
+ if next_chunk_size > 0:
78
+ data += chunk
79
+ # print(f"分段数据大小:{len(data)}")
80
+ result_body = data
81
+ else:
82
+ # print("虽然没有指定chunked,但是我猜出来他就是chunked")
83
+ if body.endswith(b"0\r\n"):
84
+ chunk_lines = [item for item in body.split(b"\r\n") if item != b'']
85
+ data = b''
86
+ next_chunk_size = 0
87
+ for chunk in chunk_lines:
88
+ try:
89
+ next_chunk_size = int(chunk, 16)
90
+ if next_chunk_size == 0:
91
+ break
92
+ # print(f"接下来的分段大小:{next_chunk_size}")
93
+ except:
94
+ if next_chunk_size > 0:
95
+ data += chunk
96
+ # print(f"分段数据大小:{len(data)}")
97
+ result_body = data
98
+ else:
99
+ result_body = body
100
+ if gzip_pattern and b'gzip' in gzip_pattern.group():
101
+ try:
102
+ decompressed = gzip.decompress(result_body)
103
+ result_body_str = "\n".join(
104
+ [line.strip() for line in decompressed.decode("utf-8", errors="replace").splitlines() if
105
+ line.strip() != ""])
106
+ except Exception as e:
107
+ result_body_str = result_body.decode("utf-8", errors="replace")
108
+ else:
109
+ result_body_str = result_body.decode("utf-8", errors="replace")
110
+ return header.decode("utf-8", errors="replace"), result_body_str, [float(pkt.time) for pkt in pkts]
111
+
112
+
113
+ def get_all_packets_by_segment(packets):
114
+ res = read_packets(packets)
115
+ request_packets = [item for item in res if REQUEST_LINE_RE.match(item['data'])]
116
+ response_packets = [
117
+ {'first_seq': item['pkts'][0][TCP].seq, 'pkts': item['pkts'], 'first_ack': item['pkts'][0][TCP].ack,
118
+ 'data': item['data']} for item in
119
+ res if RESPONSE_LINE_RE.match(item['data'])]
120
+ packet_list = []
121
+ for request in request_packets:
122
+ pkt_list = request['pkts']
123
+ last_pkt = pkt_list[-1]
124
+ # seq = last_pkt[TCP].seq
125
+ ack = last_pkt[TCP].ack
126
+ response = [item for item in response_packets if item['first_seq'] == ack]
127
+ # print(f"找到对应的响应:{len(response)}")
128
+ # print(f"请求:{request['data'].decode('utf-8', errors='replace')}")
129
+ if len(response) > 0:
130
+ res_header, res_body, res_times = parse_req_or_res(response[0]['data'], response[0]['pkts'])
131
+ req_header, req_body, req_times = parse_req_or_res(request['data'], request['pkts'])
132
+ packet_list.append({
133
+ "req_header": req_header,
134
+ "req_body": req_body,
135
+ "req_time": req_times,
136
+ "req_packets": len(request['pkts']),
137
+ "res_header": res_header,
138
+ "res_body": res_body,
139
+ "res_time": res_times,
140
+ "res_packets": len(response[0]['pkts']),
141
+ })
142
+ else:
143
+ # print("没响应")
144
+ req_header, req_body, req_times = parse_req_or_res(request['data'], request['pkts'])
145
+ packet_list.append({
146
+ "req_header": req_header,
147
+ "req_body": req_body,
148
+ "req_time": req_times,
149
+ "req_packets": len(request['pkts']),
150
+ "res_header": '',
151
+ "res_body": '',
152
+ "res_time": [],
153
+ "res_packets": 0,
154
+ })
155
+ return packet_list
156
+
157
+
158
+ # if __name__ == '__main__':
159
+ # all_packets = get_all_packets_by_segment(rdpcap("../out/3post.pcap"))
160
+ # res=[
161
+ # get_detail_by_package({}, package['req_header'], package['req_body'], package['res_header'],
162
+ # package['req_body']) for package in all_packets]
163
+ # print(res)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: xbase-util
3
- Version: 0.6.5
3
+ Version: 0.6.7
4
4
  Summary: 网络安全基础工具
5
5
  Home-page: https://gitee.com/jimonik/xbase_util.git
6
6
  Author: xyt
@@ -9,6 +9,7 @@ xbase_util/geo_util.py
9
9
  xbase_util/handle_features_util.py
10
10
  xbase_util/packet_util.py
11
11
  xbase_util/pcap_util.py
12
+ xbase_util/segment.py
12
13
  xbase_util/xbase_constant.py
13
14
  xbase_util/xbase_util.py
14
15
  xbase_util.egg-info/PKG-INFO
File without changes
File without changes