Browse Source

most_used(winSize) query can now return lists
most_used(mssValue) can now return lists
add function that checks if SQL output is a list to Utility lib
handle lists in DDoS attack

Stefano Acquaviti 7 years ago
parent
commit
01ac914ab8
3 changed files with 23 additions and 10 deletions
  1. 8 7
      code/Attack/DDoSAttack.py
  2. 3 3
      code/ID2TLib/StatsDatabase.py
  3. 12 0
      code/ID2TLib/Utility.py

+ 8 - 7
code/Attack/DDoSAttack.py

@@ -9,7 +9,8 @@ from scapy.layers.inet import IP, Ether, TCP, RandShort
 from Attack import BaseAttack
 from Attack import BaseAttack
 from Attack.AttackParameters import Parameter as Param
 from Attack.AttackParameters import Parameter as Param
 from Attack.AttackParameters import ParameterTypes
 from Attack.AttackParameters import ParameterTypes
-from ID2TLib.Utility import update_timestamp, get_interval_pps, get_nth_random_element, index_increment
+from ID2TLib.Utility import update_timestamp, get_interval_pps, get_nth_random_element, index_increment, \
+    handle_most_used_outputs
 
 
 logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
 logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
 # noinspection PyPep8
 # noinspection PyPep8
@@ -114,9 +115,7 @@ class DDoSAttack(BaseAttack.BaseAttack):
         if num_attackers is not None:  # user supplied Param.NUMBER_ATTACKERS
         if num_attackers is not None:  # user supplied Param.NUMBER_ATTACKERS
             # The most used IP class in background traffic
             # The most used IP class in background traffic
             most_used_ip_class = self.statistics.process_db_query("most_used(ipClass)")
             most_used_ip_class = self.statistics.process_db_query("most_used(ipClass)")
-            if isinstance(most_used_ip_class, list):
-                most_used_ip_class.sort()
-                most_used_ip_class = most_used_ip_class[0]
+            most_used_ip_class = handle_most_used_outputs(most_used_ip_class)
             # Create random attackers based on user input Param.NUMBER_ATTACKERS
             # Create random attackers based on user input Param.NUMBER_ATTACKERS
             ip_source_list = self.generate_random_ipv4_address(most_used_ip_class, num_attackers)
             ip_source_list = self.generate_random_ipv4_address(most_used_ip_class, num_attackers)
             mac_source_list = self.generate_random_mac_address(num_attackers)
             mac_source_list = self.generate_random_mac_address(num_attackers)
@@ -160,9 +159,7 @@ class DDoSAttack(BaseAttack.BaseAttack):
         if not port_destination:
         if not port_destination:
             port_destination = max(1, str(RandShort()))
             port_destination = max(1, str(RandShort()))
 
 
-        if isinstance(port_destination, list):
-            port_destination.sort()
-            port_destination = port_destination[0]
+        port_destination = handle_most_used_outputs(port_destination)
 
 
         attacker_port_mapping = {}
         attacker_port_mapping = {}
         attacker_ttl_mapping = {}
         attacker_ttl_mapping = {}
@@ -190,11 +187,15 @@ class DDoSAttack(BaseAttack.BaseAttack):
         else:
         else:
             destination_win_value = self.statistics.process_db_query("most_used(winSize)")
             destination_win_value = self.statistics.process_db_query("most_used(winSize)")
 
 
+        destination_win_value = handle_most_used_outputs(destination_win_value)
+
         # MSS that was used by IP destination in background traffic
         # MSS that was used by IP destination in background traffic
         mss_dst = self.statistics.get_most_used_mss(ip_destination)
         mss_dst = self.statistics.get_most_used_mss(ip_destination)
         if mss_dst is None:
         if mss_dst is None:
             mss_dst = self.statistics.process_db_query("most_used(mssValue)")
             mss_dst = self.statistics.process_db_query("most_used(mssValue)")
 
 
+        mss_dst = handle_most_used_outputs(mss_dst)
+
         replies_count = 0
         replies_count = 0
         total_pkt_num = 0
         total_pkt_num = 0
         # For each attacker, generate his own packets, then merge all packets
         # For each attacker, generate his own packets, then merge all packets

+ 3 - 3
code/ID2TLib/StatsDatabase.py

@@ -174,9 +174,9 @@ class StatsDatabase:
             "most_used.portnumber": "SELECT portNumber, COUNT(portNumber) as cntPort FROM ip_ports GROUP BY portNumber HAVING cntPort=(SELECT MAX(cntPort) from (SELECT portNumber, COUNT(portNumber) as cntPort FROM ip_ports GROUP BY portNumber))",
             "most_used.portnumber": "SELECT portNumber, COUNT(portNumber) as cntPort FROM ip_ports GROUP BY portNumber HAVING cntPort=(SELECT MAX(cntPort) from (SELECT portNumber, COUNT(portNumber) as cntPort FROM ip_ports GROUP BY portNumber))",
             "most_used.protocolname": "SELECT protocolName, COUNT(protocolCount) as countProtocols FROM ip_protocols GROUP BY protocolName HAVING countProtocols=(SELECT COUNT(protocolCount) as cnt FROM ip_protocols GROUP BY protocolName ORDER BY cnt DESC LIMIT 1)",
             "most_used.protocolname": "SELECT protocolName, COUNT(protocolCount) as countProtocols FROM ip_protocols GROUP BY protocolName HAVING countProtocols=(SELECT COUNT(protocolCount) as cnt FROM ip_protocols GROUP BY protocolName ORDER BY cnt DESC LIMIT 1)",
             "most_used.ttlvalue": "SELECT ttlValue FROM ip_ttl GROUP BY ttlValue ORDER BY SUM(ttlCount) DESC LIMIT 1",
             "most_used.ttlvalue": "SELECT ttlValue FROM ip_ttl GROUP BY ttlValue ORDER BY SUM(ttlCount) DESC LIMIT 1",
-            "most_used.mssvalue": "SELECT mssValue FROM tcp_mss GROUP BY mssValue ORDER BY SUM(mssCount) DESC LIMIT 1",
-            "most_used.winsize": "SELECT winSize FROM tcp_win GROUP BY winSize ORDER BY SUM(winCount) DESC LIMIT 1",
-            "most_used.ipclass": "SELECT ipClass FROM (SELECT ipClass, COUNT(*) as occ from ip_statistics GROUP BY ipClass ORDER BY occ DESC) WHERE occ=(SELECT COUNT(*) as occ from ip_statistics GROUP BY ipClass ORDER BY occ DESC LIMIT 1)",
+            "most_used.mssvalue": "SELECT mssValue FROM (SELECT mssValue, SUM(mssCount) as occ FROM tcp_mss GROUP BY mssValue ORDER BY SUM(mssCount) DESC) WHERE occ=(SELECT SUM(mssCount) as occ FROM tcp_mss GROUP BY mssValue ORDER BY occ DESC LIMIT 1) ORDER BY mssValue ASC",
+            "most_used.winsize": "SELECT winSize FROM (SELECT winSize, SUM(winCount) as occ FROM tcp_win GROUP BY winSize ORDER BY SUM(winCount) DESC) WHERE occ=(SELECT SUM(winCount) as occ FROM tcp_win GROUP BY winSize ORDER BY occ DESC LIMIT 1) ORDER BY winSize ASC",
+            "most_used.ipclass": "SELECT ipClass FROM (SELECT ipClass, COUNT(*) as occ from ip_statistics GROUP BY ipClass ORDER BY occ DESC) WHERE occ=(SELECT COUNT(*) as occ from ip_statistics GROUP BY ipClass ORDER BY occ DESC LIMIT 1) ORDER BY ipClass ASC",
             #FIXME ORDER BY ASC ? check queries for os dependency!!
             #FIXME ORDER BY ASC ? check queries for os dependency!!
             "least_used.ipaddress": "SELECT ipAddress FROM ip_statistics WHERE (pktsSent+pktsReceived) == (SELECT MIN(pktsSent+pktsReceived) from ip_statistics)",
             "least_used.ipaddress": "SELECT ipAddress FROM ip_statistics WHERE (pktsSent+pktsReceived) == (SELECT MIN(pktsSent+pktsReceived) from ip_statistics)",
             "least_used.macaddress": "SELECT * FROM (SELECT macAddress, COUNT(*) as occ from ip_mac GROUP BY macAddress ORDER BY occ ASC) WHERE occ=(SELECT COUNT(*) as occ from ip_mac GROUP BY macAddress ORDER BY occ ASC LIMIT 1)",
             "least_used.macaddress": "SELECT * FROM (SELECT macAddress, COUNT(*) as occ from ip_mac GROUP BY macAddress ORDER BY occ ASC) WHERE occ=(SELECT COUNT(*) as occ from ip_mac GROUP BY macAddress ORDER BY occ ASC LIMIT 1)",

+ 12 - 0
code/ID2TLib/Utility.py

@@ -281,3 +281,15 @@ def get_bytes_from_file(filepath):
     except FileNotFoundError:
     except FileNotFoundError:
         print("\nERROR: File not found: ", filepath)
         print("\nERROR: File not found: ", filepath)
         exit(1)
         exit(1)
+
+
+def handle_most_used_outputs(most_used_x):
+    """
+    :param most_used_x: Element or list (e.g. from SQL-query output) which should only be one element
+    :return: most_used_x if it's not a list. The first element of most_used_x after being sorted if it's a list
+    """
+    if isinstance(most_used_x, list):
+        most_used_x.sort()
+        return most_used_x[0]
+    else:
+        return most_used_x