summaryrefslogtreecommitdiff
path: root/script/symtcp_attacks.py
diff options
context:
space:
mode:
Diffstat (limited to 'script/symtcp_attacks.py')
-rw-r--r--script/symtcp_attacks.py1419
1 files changed, 1419 insertions, 0 deletions
diff --git a/script/symtcp_attacks.py b/script/symtcp_attacks.py
new file mode 100644
index 0000000..c383fa3
--- /dev/null
+++ b/script/symtcp_attacks.py
@@ -0,0 +1,1419 @@
+import copy
+
+import random
+
+
+# SEQ/ACK add/sub operations (wrap-around considered)
+def _seq_add(seq_str, val):
+ seq = (int(seq_str) + val) % 2**32
+ return '%d' % seq
+
+
+def _seq_sub(seq_str, val):
+ seq = (int(seq_str) - val) % 2**32
+ return '%d' % seq
+
+
+def _gen_rand_int(length):
+ return '%d' % random.randint(0, 2**length)
+
+
+def craft_syn_pkt(reference_pkt):
+ pkt = copy.deepcopy(reference_pkt)
+ pkt.ack = '0'
+ pkt.dataoff = '20'
+ pkt.flags = 'S'
+ pkt.urgptr = '0'
+ # remove payload
+ pkt.ip_len = str(int(pkt.ip_len) - int(pkt.payload_len))
+ pkt.payload_len = '0'
+ pkt.ip_id = _gen_rand_int(16)
+ pkt.tcp_opt_mss = '-1'
+ pkt.tcp_opt_tsval = '-1'
+ pkt.tcp_opt_tsecr = '-1'
+ pkt.tcp_opt_wscale = '-1'
+ pkt.tcp_opt_md5header = '-1'
+ # half the timestamps
+ pkt.tcp_timestamp = str(float(pkt.tcp_timestamp) / 2)
+ reference_pkt.tcp_timestamp = str(float(reference_pkt.tcp_timestamp) / 2)
+ return pkt
+
+
+def craft_fin_pkt(reference_pkt):
+ pkt = copy.deepcopy(reference_pkt)
+ pkt.ack = '0'
+ pkt.dataoff = '32'
+ pkt.flags = 'F'
+ pkt.urgptr = '0'
+ # remove payload
+ pkt.ip_len = str(int(pkt.ip_len) - int(pkt.payload_len))
+ pkt.payload_len = '0'
+ pkt.ip_id = _gen_rand_int(16)
+ pkt.tcp_opt_mss = '-1'
+ pkt.tcp_opt_wscale = '-1'
+ pkt.tcp_opt_md5header = '-1'
+ # half the timestamps
+ pkt.tcp_timestamp = str(float(pkt.tcp_timestamp) / 2)
+ reference_pkt.tcp_timestamp = str(float(reference_pkt.tcp_timestamp) / 2)
+ return pkt
+
+
+def craft_fin_ack_pkt(reference_pkt):
+ pkt = copy.deepcopy(reference_pkt)
+ pkt.dataoff = '32'
+ pkt.flags = 'FA'
+ pkt.urgptr = '0'
+ # remove payload
+ pkt.ip_len = str(int(pkt.ip_len) - int(pkt.payload_len))
+ pkt.payload_len = '0'
+ pkt.ip_id = _gen_rand_int(16)
+ pkt.tcp_opt_mss = '-1'
+ pkt.tcp_opt_wscale = '-1'
+ pkt.tcp_opt_md5header = '-1'
+ # half the timestamps
+ pkt.tcp_timestamp = str(float(pkt.tcp_timestamp) / 2)
+ reference_pkt.tcp_timestamp = str(float(reference_pkt.tcp_timestamp) / 2)
+ return pkt
+
+
+def craft_rst_pkt(reference_pkt):
+ pkt = copy.deepcopy(reference_pkt)
+ pkt.ack = '0'
+ pkt.dataoff = '20'
+ pkt.flags = 'R'
+ pkt.urgptr = '0'
+ # remove payload
+ pkt.ip_len = str(int(pkt.ip_len) - int(pkt.payload_len))
+ pkt.payload_len = '0'
+ pkt.ip_id = _gen_rand_int(16)
+ pkt.tcp_opt_mss = '-1'
+ pkt.tcp_opt_tsval = '-1'
+ pkt.tcp_opt_tsecr = '-1'
+ pkt.tcp_opt_wscale = '-1'
+ pkt.tcp_opt_md5header = '-1'
+ # half the timestamps
+ pkt.tcp_timestamp = str(float(pkt.tcp_timestamp) / 2)
+ reference_pkt.tcp_timestamp = str(float(reference_pkt.tcp_timestamp) / 2)
+ return pkt
+
+
+def craft_rst_ack_pkt(reference_pkt):
+ pkt = copy.deepcopy(reference_pkt)
+ pkt.dataoff = '20'
+ pkt.flags = 'RA'
+ pkt.urgptr = '0'
+ # remove payload
+ pkt.ip_len = str(int(pkt.ip_len) - int(pkt.payload_len))
+ pkt.payload_len = '0'
+ pkt.ip_id = _gen_rand_int(16)
+ pkt.tcp_opt_mss = '-1'
+ pkt.tcp_opt_tsval = '-1'
+ pkt.tcp_opt_tsecr = '-1'
+ pkt.tcp_opt_wscale = '-1'
+ pkt.tcp_opt_md5header = '-1'
+ # half the timestamps
+ pkt.tcp_timestamp = str(float(pkt.tcp_timestamp) / 2)
+ reference_pkt.tcp_timestamp = str(float(reference_pkt.tcp_timestamp) / 2)
+ return pkt
+
+
+def craft_data_pkt(reference_pkt):
+ pkt = copy.deepcopy(reference_pkt)
+ pkt.dataoff = '32'
+ pkt.flags = 'A'
+ pkt.urgptr = '0'
+ pkt.ip_id = _gen_rand_int(16)
+ pkt.tcp_opt_mss = '-1'
+ pkt.tcp_opt_wscale = '-1'
+ pkt.tcp_opt_md5header = '-1'
+ # half the timestamps
+ pkt.tcp_timestamp = str(float(pkt.tcp_timestamp) / 2)
+ reference_pkt.tcp_timestamp = str(float(reference_pkt.tcp_timestamp) / 2)
+ return pkt
+
+
+def calculate_epoch_time(trace, curr_idx):
+ if curr_idx == len(trace) - 1:
+ return float(trace[curr_idx].frame_time_epoch)
+ else:
+ return (float(trace[curr_idx+1].frame_time_epoch) + float(trace[curr_idx].frame_time_epoch)) / 2
+
+
+def calculate_epoch_time_prev(trace, curr_idx):
+ if curr_idx == 0:
+ return float(trace[curr_idx].frame_time_epoch)
+ else:
+ return (float(trace[curr_idx-1].frame_time_epoch) + float(trace[curr_idx].frame_time_epoch)) / 2
+
+
+###################################################################
+# Zeek
+###################################################################
+
+def inject_zeek_syn_with_data(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ if pkt.flags == 'S':
+ pkt_new = copy.deepcopy(pkt)
+ pkt_new.payload_len = str(int(pkt.payload_len) + 1000)
+ pkt_new.ip_len = str(int(pkt.ip_len) + 1000)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_len += 1000
+
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_zeek_multiple_syn_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_syn_pkt(pkt)
+ pkt_new.seq = _seq_add(pkt_new.seq, 1000000)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(k_trace, idx)
+ k_pkt_new.frame_len = 66
+
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_zeek_pure_fin(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_fin_pkt(pkt)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(k_trace, idx)
+ k_pkt_new.frame_len = 66
+
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_zeek_bad_rst_fin(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ choice = random.randint(0, 1)
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(k_trace, idx)
+
+ if choice == 0:
+ pkt_new = craft_rst_pkt(pkt)
+ k_pkt_new.frame_len = 66
+ else:
+ pkt_new = craft_fin_ack_pkt(pkt)
+
+ pkt_new.seq = _seq_add(pkt_new.seq, 1000000)
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_zeek_data_overlapping(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ direction = None
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ # only inject packets in one direction
+ if 'A' in set(pkt.flags) and int(pkt.payload_len) > 0:
+ if direction is None:
+ direction = pkt.src_ip
+ if direction == pkt.src_ip:
+ pkt_new = craft_data_pkt(pkt)
+ pkt_new.seq = _seq_add(pkt_new.seq, 1)
+ pkt_new.ip_len = str(int(pkt_new.ip_len) - 1)
+ pkt_new.payload_len = str(int(pkt_new.payload_len) - 1)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time_prev(
+ k_trace, idx)
+ k_pkt_new.frame_len = 66
+ injected_k_trace.append(k_pkt_new)
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_zeek_data_without_ack_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ direction = None
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ # only inject packets in one direction
+ if 'A' in set(pkt.flags) and int(pkt.payload_len) > 0:
+ if direction is None:
+ direction = pkt.src_ip
+ if direction == pkt.src_ip:
+ pkt_new = craft_data_pkt(pkt)
+ pkt_new.flags = ''
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time_prev(
+ k_trace, idx)
+ k_pkt_new.frame_len = 66
+ injected_k_trace.append(k_pkt_new)
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_zeek_data_bad_ack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ direction = None
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ # only inject packets in one direction
+ if 'A' in set(pkt.flags) and int(pkt.payload_len) > 0:
+ if direction is None:
+ direction = pkt.src_ip
+ if direction == pkt.src_ip:
+ pkt_new = craft_data_pkt(pkt)
+ pkt_new.ack = _seq_add(pkt_new.ack, 1000000)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time_prev(
+ k_trace, idx)
+ k_pkt_new.frame_len = 66
+ injected_k_trace.append(k_pkt_new)
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_zeek_seq_jump_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_data_pkt(pkt)
+ # an out-of-window data packet
+ pkt_new.seq = _seq_add(pkt_new.seq, 1000000)
+ pkt_new.ip_len = str(
+ int(pkt_new.ip_len) - int(pkt_new.payload_len) + 100)
+ pkt_new.payload_len = '100'
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(
+ k_trace, idx)
+ k_pkt_new.frame_len = 66 + 100
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_zeek_underflow_seq_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ k_trace = k_dataset_dict[connection_id]
+ has_seen_established = False
+ has_seen_data = False
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ # make the first data packet into an evasion packet
+ if 'A' in set(pkt.flags) and int(pkt.payload_len) > 0 and not has_seen_data:
+ has_seen_data = True
+ pkt_new = copy.deepcopy(pkt)
+ # make SEQ = ISN - 1
+ # pad the payload with 2 extra bytes on the left of the payload
+ pkt_new.seq = _seq_sub('0', 1)
+ pkt_new.ip_len = str(int(pkt_new.ip_len) + 2)
+ pkt_new.payload_len = str(int(pkt_new.payload_len) + 2)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_len += 2
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+###################################################################
+# Snort
+###################################################################
+
+def inject_snort_multiple_syn_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_syn_pkt(pkt)
+ pkt_new.seq = _seq_add(pkt_new.seq, 10)
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(
+ k_trace, idx)
+ k_pkt_new.frame_len = 66
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_snort_in_window_fin_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_fin_pkt(pkt)
+ pkt_new.seq = _seq_add(pkt_new.seq, 10)
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(
+ k_trace, idx)
+ k_pkt_new.frame_len = 66
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_snort_fin_ack_bad_ack_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_fin_ack_pkt(pkt)
+ pkt_new.ack = _seq_add(pkt_new.ack, 1000000)
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(
+ k_trace, idx)
+ k_pkt_new.frame_len = 66
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_snort_fin_ack_md5_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ idx = 0
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_fin_ack_pkt(pkt)
+ pkt_new.tcp_opt_md5header = '1'
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(
+ k_trace, idx)
+ k_pkt_new.frame_len = 66
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_snort_in_window_rst_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ idx = 0
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_rst_pkt(pkt)
+ pkt_new.seq = _seq_add(pkt_new.seq, 10)
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(
+ k_trace, idx)
+ k_pkt_new.frame_len = 66
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_snort_rst_bad_timestamp_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ idx = 0
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_rst_pkt(pkt)
+ pkt_new.tcp_opt_tsval = _seq_sub(
+ pkt_new.tcp_opt_tsval, 1000000)
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(
+ k_trace, idx)
+ k_pkt_new.frame_len = 66
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_snort_rst_md5_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ idx = 0
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_rst_pkt(pkt)
+ pkt_new.tcp_opt_md5header = '1'
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(
+ k_trace, idx)
+ k_pkt_new.frame_len = 66
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_snort_rst_ack_bad_ack_num_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ idx = 0
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_rst_ack_pkt(pkt)
+ pkt_new.ack = _seq_sub(pkt_new.ack, 100)
+ # this packet should be sent in SYN_RECV state, so it's before the ACK
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+ injected_trace.append(pkt)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time_prev(
+ k_trace, idx)
+ k_pkt_new.frame_len = 66
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_snort_partial_in_window_rst_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ idx = 0
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_rst_ack_pkt(pkt)
+ pkt_new.seq = _seq_sub(pkt_new.seq, 10)
+ pkt_new.ip_len = str(
+ int(pkt_new.ip_len) - int(pkt_new.payload_len) + 10)
+ pkt_new.payload_len = '10'
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(
+ k_trace, idx)
+ k_pkt_new.frame_len = 76
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_snort_urgent_data_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ k_trace = k_dataset_dict[connection_id]
+ has_seen_established = False
+ has_seen_data = False
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ # make the first data packet into an evasion packet
+ if 'A' in set(pkt.flags) and int(pkt.payload_len) > 0 and not has_seen_data:
+ has_seen_data = True
+ pkt_new = copy.deepcopy(pkt)
+ pkt_new.flags += 'U'
+ # make urgent pointer point to somewhere in the payload
+ pkt_new.urgptr = '8'
+ # add one-byte urgent data
+ pkt_new.ip_len = str(int(pkt_new.ip_len) + 1)
+ pkt_new.payload_len = str(int(pkt_new.payload_len) + 1)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_len += 1
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_snort_time_gap_attack(dataset_dict, k_dataset_dict):
+ def last_tsval(trace, curr_idx, direction):
+ for i in reversed(range(curr_idx)):
+ pkt = trace[i]
+ if pkt.src_ip == direction and pkt.tcp_opt_tsval != '-1':
+ return pkt.tcp_opt_tsval
+ return None
+
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ k_trace = k_dataset_dict[connection_id]
+ has_seen_established = False
+ has_seen_data = False
+ pkt_idx = 0
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ # make the first data packet into an evasion packet
+ if 'A' in set(pkt.flags) and int(pkt.payload_len) > 0 and not has_seen_data:
+ has_seen_data = True
+ pkt_new = copy.deepcopy(pkt)
+ last_ts = last_tsval(trace, pkt_idx, pkt.src_ip)
+ # this strategy only works if the connection is using TCP timstamp
+ if last_ts:
+ pkt_new.tcp_opt_tsval = _seq_add(int(last_ts), 0x7fffffff)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+ else:
+ # this connection is not applicable
+ injected_trace.append(pkt)
+ else:
+ injected_trace.append(pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+###################################################################
+# GFW
+###################################################################
+
+def inject_gfw_bad_rst_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ k_trace = k_dataset_dict[connection_id]
+ has_seen_established = False
+ choice = random.randint(0, 1)
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_rst_pkt(pkt)
+ if choice == 0:
+ pkt_new.chksum = '1'
+ else:
+ pkt_new.tcp_opt_md5header = '1'
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_len = 66
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(
+ k_trace, idx)
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_gfw_bad_data_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ k_trace = k_dataset_dict[connection_id]
+ has_seen_established = False
+ direction = None
+ choice = random.randint(0, 2)
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ # only inject packets in one direction
+ if 'A' in set(pkt.flags) and int(pkt.payload_len) > 0:
+ if direction is None:
+ direction = pkt.src_ip
+ if direction == pkt.src_ip:
+ pkt_new = craft_data_pkt(pkt)
+ if choice == 0:
+ pkt_new.chksum = '1'
+ elif choice == 1:
+ pkt_new.tcp_opt_md5header = '1'
+ else:
+ pkt_new.tcp_opt_tsval = _seq_sub(
+ pkt_new.tcp_opt_tsval, 1000000)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_gfw_data_without_ack_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ k_trace = k_dataset_dict[connection_id]
+ has_seen_established = False
+ direction = None
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ # only inject packets in one direction
+ if 'A' in set(pkt.flags) and int(pkt.payload_len) > 0:
+ if direction is None:
+ direction = pkt.src_ip
+ if direction == pkt.src_ip:
+ pkt_new = craft_data_pkt(pkt)
+ pkt_new.flags.replace('A', '')
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+ k_pkt_new = copy.deepcopy(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_gfw_underflow_seq_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ k_trace = k_dataset_dict[connection_id]
+ has_seen_established = False
+ has_seen_data = False
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ # make the first data packet into an evasion packet
+ if 'A' in set(pkt.flags) and int(pkt.payload_len) > 0 and not has_seen_data:
+ has_seen_data = True
+ pkt_new = copy.deepcopy(pkt)
+ # make SEQ = ISN - 1
+ # pad the payload with 2 extra bytes on the left of the payload
+ pkt_new.seq = _seq_sub('0', 1)
+ pkt_new.ip_len = str(int(pkt_new.ip_len) + 2)
+ pkt_new.payload_len = str(int(pkt_new.payload_len) + 2)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_gfw_small_segments_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ k_trace = k_dataset_dict[connection_id]
+ has_seen_established = False
+ has_seen_data = False
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ if 'A' in set(pkt.flags) and int(pkt.payload_len) > 8 and not has_seen_data:
+ # split the packet into 8 bytes + remaining
+ has_seen_data = True
+ pkt_new_1 = copy.deepcopy(pkt)
+ pkt_new_1.ip_len = str(
+ int(pkt_new_1.ip_len) - int(pkt_new_1.payload_len) + 8)
+ pkt_new_1.payload_len = '8'
+ pkt_new_2 = copy.deepcopy(pkt)
+ pkt_new_2.ip_len = str(int(pkt_new_2.ip_len) - 8)
+ pkt_new_2.payload_len = str(int(pkt_new_2.payload_len) - 8)
+ pkt_new_2.seq = _seq_add(pkt_new_2.seq, 8)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new_1)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new_2)
+
+ k_pkt_new1 = copy.deepcopy(k_pkt)
+ k_pkt_new2 = copy.deepcopy(k_pkt)
+ k_pkt_new1.frame_len = 66 + 8
+ k_pkt_new1.frame_len -= 8
+ k_pkt_new1.frame_time_epoch = calculate_epoch_time(
+ k_trace, idx)
+ injected_k_trace.append(k_pkt_new1)
+ injected_k_trace.append(k_pkt_new2)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_gfw_fin_with_data_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ idx = 0
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_fin_pkt(pkt)
+ pkt_new.ip_len = str(
+ int(pkt_new.ip_len) - int(pkt_new.payload_len) + 10)
+ pkt_new.payload_len = '10'
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_len = 66 + 10
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(
+ k_trace, idx)
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_gfw_bad_fin_ack_data_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ choice = random.randint(0, 2)
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_fin_ack_pkt(pkt)
+ if choice == 0:
+ pkt_new.chksum = '1'
+ elif choice == 1:
+ pkt_new.tcp_opt_md5header = '1'
+ else:
+ pkt_new.tcp_opt_tsval = _seq_sub(
+ pkt_new.tcp_opt_tsval, 1000000)
+ pkt_new.ip_len = str(
+ int(pkt_new.ip_len) - int(pkt_new.payload_len) + 10)
+ pkt_new.payload_len = '10'
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_len = 66 + 10
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(
+ k_trace, idx)
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_gfw_fin_ack_data_bad_ack_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ idx = 0
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_fin_ack_pkt(pkt)
+ pkt_new.ack = _seq_add(pkt_new.ack, 1000000)
+ pkt_new.ip_len = str(
+ int(pkt_new.ip_len) - int(pkt_new.payload_len) + 10)
+ pkt_new.payload_len = '10'
+ injected_trace.append(pkt)
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_len = 66 + 10
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(
+ k_trace, idx)
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_gfw_out_of_window_syn_data_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ idx = 0
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_syn_pkt(pkt)
+ pkt_new.seq = _seq_add(pkt_new.seq, 1000000)
+ pkt_new.ip_len = str(
+ int(pkt_new.ip_len) - int(pkt_new.payload_len) + 10)
+ pkt_new.payload_len = '10'
+ # this packet should be sent in SYN_RECV state, so it's before the ACK
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+ injected_trace.append(pkt)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_len = 66 + 10
+ k_pkt_new.frame_time_epoch = calculate_epoch_time(
+ k_trace, idx)
+ injected_k_trace.append(k_pkt)
+ injected_k_trace.append(k_pkt_new)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_gfw_retransmitted_syn_data_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ idx = 0
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_syn_pkt(pkt)
+ pkt_new.seq = '0'
+ pkt_new.ip_len = str(
+ int(pkt_new.ip_len) - int(pkt_new.payload_len) + 10)
+ pkt_new.payload_len = '10'
+ # this packet should be sent in SYN_RECV state, so it's before the ACK
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+ injected_trace.append(pkt)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_len = 66 + 10
+ k_pkt_new.frame_time_epoch = calculate_epoch_time_prev(
+ k_trace, idx)
+ injected_k_trace.append(k_pkt_new)
+ injected_k_trace.append(k_pkt)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_gfw_rst_bad_timestamp_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ idx = 0
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_rst_pkt(pkt)
+ pkt_new.tcp_opt_tsval = _seq_sub(
+ pkt_new.tcp_opt_tsval, 1000000)
+ # this packet should be sent in SYN_RECV state, so it's before the ACK
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+ injected_trace.append(pkt)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_len = 66
+ k_pkt_new.frame_time_epoch = calculate_epoch_time_prev(
+ k_trace, idx)
+ injected_k_trace.append(k_pkt_new)
+ injected_k_trace.append(k_pkt)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info
+
+
+def inject_gfw_rst_ack_bad_ack_num_attack(dataset_dict, k_dataset_dict):
+ injected_dataset_dict, valid_dataset_dict = {}, {}
+ injected_k_dataset_dict, valid_k_dataset_dict = {}, {}
+ adv_pkt_info = {}
+ for connection_id, trace in dataset_dict.items():
+ injected_trace = []
+ injected_k_trace = []
+ adv_pkt_info[connection_id] = []
+ has_seen_established = False
+ k_trace = k_dataset_dict[connection_id]
+ idx = 0
+ for idx, (pkt, k_pkt) in enumerate(zip(trace, k_trace)):
+ if 'A' in set(pkt.flags) and pkt.sk_state.startswith('ESTABLISHED') and not has_seen_established:
+ has_seen_established = True
+ pkt_new = craft_rst_ack_pkt(pkt)
+ pkt_new.ack = _seq_add(pkt_new.ack, 1000000)
+ # this packet should be sent in SYN_RECV state, so it's before the ACK
+ adv_pkt_info[connection_id].append(len(injected_trace))
+ injected_trace.append(pkt_new)
+ injected_trace.append(pkt)
+
+ k_pkt_new = copy.deepcopy(k_pkt)
+ k_pkt_new.frame_len = 66
+ k_pkt_new.frame_time_epoch = calculate_epoch_time_prev(
+ k_trace, idx)
+ injected_k_trace.append(k_pkt_new)
+ injected_k_trace.append(k_pkt)
+ else:
+ injected_trace.append(pkt)
+ injected_k_trace.append(k_pkt)
+ if has_seen_established:
+ injected_dataset_dict[connection_id] = injected_trace
+ injected_k_dataset_dict[connection_id] = injected_k_trace
+ valid_dataset_dict[connection_id] = trace
+ valid_k_dataset_dict[connection_id] = k_trace
+ return injected_dataset_dict, valid_dataset_dict, injected_k_dataset_dict, valid_k_dataset_dict, adv_pkt_info