231 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "Inspection.hpp"
 | |
| 
 | |
| #include "ConfigurationManagement/Configurator.hpp"
 | |
| #include "PacketDissection/PacketContainer.hpp"
 | |
| #include "PacketDissection/PacketInfo.hpp"
 | |
| #include "PacketDissection/PacketInfoCreator.hpp"
 | |
| #include "PacketDissection/PacketInfoIpv4Icmp.hpp"
 | |
| #include "PacketDissection/PacketInfoIpv4Tcp.hpp"
 | |
| #include "PacketDissection/PacketInfoIpv4Udp.hpp"
 | |
| #include "Threads/AttackThread.h"
 | |
| 
 | |
| #include <catch2/catch.hpp>
 | |
| #include <iostream>
 | |
| 
 | |
| TEST_CASE("init Inspection", "[]") {
 | |
|     Inspection testInspection;
 | |
|     REQUIRE_NOTHROW(testInspection.update_stats(0, 0, 0, 0, 0, 0, 0, 0, 0));
 | |
| }
 | |
| 
 | |
| // Für folgende wird eine funktionierende Packet Dissection benötigt
 | |
| TEST_CASE("check attack detection", "[]") {
 | |
|     // setup config
 | |
|     Configurator::instance()->read_config("../test/Inspection_config.json");
 | |
|     // create packet container
 | |
|     uint16_t inside_port = 0;
 | |
|     uint16_t outside_port = 1;
 | |
|     struct rte_mempool mbuf_pool_struct;
 | |
|     struct rte_mempool* mbuf_pool = &mbuf_pool_struct;
 | |
|     CHECK(mbuf_pool != nullptr);
 | |
| 
 | |
|     NetworkPacketHandler* pkt_handler = new NetworkPacketHandler(0, 0);
 | |
|     CHECK(pkt_handler != nullptr);
 | |
| 
 | |
|     PacketContainer* pkt_container =
 | |
|         new PacketContainer(pkt_handler, mbuf_pool, inside_port, outside_port);
 | |
|     CHECK(pkt_container != nullptr);
 | |
|     // inspection class
 | |
|     Inspection testInspection;
 | |
| 
 | |
|     /// test SYN-FIN attack
 | |
|     SECTION("SYN-FIN Attack", "[]") {
 | |
|         PacketInfo* pkt_info = nullptr;
 | |
|         for (int i = 0; i < 5; ++i) {
 | |
|             pkt_info = pkt_container->get_empty_packet(IPv4TCP);
 | |
|             PacketInfoIpv4Tcp* pkt_info =
 | |
|                 static_cast<PacketInfoIpv4Tcp*>(pkt_info);
 | |
|             // create packet with SYN-FIN Flag into packet container
 | |
|             pkt_info->fill_payloadless_tcp_packet(
 | |
|                 {00, 00, 00, 00, 00, 00}, {00, 00, 00, 00, 00, 00}, 0, 0, 0, 0,
 | |
|                 0, 0, 0b00000011, 100);
 | |
|         }
 | |
|         // packet container to inspection
 | |
|         testInspection.analyze_container(pkt_container);
 | |
|         // Check if packetcontainer empty
 | |
|         CHECK(pkt_container->get_total_number_of_packets() == 0);
 | |
|     }
 | |
| 
 | |
|     /// test SYN-FIN-ACK attack
 | |
|     SECTION("SYN-FIN-ACK Attack", "[]") {
 | |
|         PacketInfo* pkt_info = nullptr;
 | |
|         for (int i = 0; i < 5; ++i) {
 | |
|             pkt_info = pkt_container->get_empty_packet(IPv4TCP);
 | |
|             PacketInfoIpv4Tcp* pkt_info =
 | |
|                 static_cast<PacketInfoIpv4Tcp*>(pkt_info);
 | |
|             // create packet with SYN-FIN-ACK Flag into packet container
 | |
|             pkt_info->fill_payloadless_tcp_packet(
 | |
|                 {00, 00, 00, 00, 00, 00}, {00, 00, 00, 00, 00, 00}, 0, 0, 0, 0,
 | |
|                 0, 0, 0b00010011, 100);
 | |
|         }
 | |
|         // packet container to inspection
 | |
|         testInspection.analyze_container(pkt_container);
 | |
|         // Check if packetcontainer empty
 | |
|         CHECK(pkt_container->get_total_number_of_packets() == 0);
 | |
|     }
 | |
| 
 | |
|     /// test Zero Window attack
 | |
|     SECTION("Zero Window Attack", "[]") {
 | |
|         PacketInfo* pkt_info = nullptr;
 | |
|         for (int i = 0; i < 5; ++i) {
 | |
|             pkt_info = pkt_container->get_empty_packet(IPv4TCP);
 | |
|             PacketInfoIpv4Tcp* pkt_info =
 | |
|                 static_cast<PacketInfoIpv4Tcp*>(pkt_info);
 | |
|             // create packet with 0 window into packet container
 | |
|             pkt_info->fill_payloadless_tcp_packet({00, 00, 00, 00, 00, 00},
 | |
|                                                   {00, 00, 00, 00, 00, 00}, 0,
 | |
|                                                   0, 0, 0, 0, 0, 0, 0);
 | |
|         }
 | |
|         // packet container to inspection
 | |
|         testInspection.analyze_container(pkt_container);
 | |
|         // Check if packetcontainer empty
 | |
|         CHECK(pkt_container->get_total_number_of_packets() == 0);
 | |
|     }
 | |
| 
 | |
|     ///  test Small Window attack
 | |
|     SECTION("Small Window Attack", "[]") {
 | |
|         PacketInfo* pkt_info = nullptr;
 | |
|         for (int i = 0; i < 5; ++i) {
 | |
|             pkt_info = pkt_container->get_empty_packet(IPv4TCP);
 | |
|             PacketInfoIpv4Tcp* pkt_info =
 | |
|                 static_cast<PacketInfoIpv4Tcp*>(pkt_info);
 | |
|             // create packet with small Windows into packet container
 | |
|             pkt_info->fill_payloadless_tcp_packet({00, 00, 00, 00, 00, 00},
 | |
|                                                   {00, 00, 00, 00, 00, 00}, 0,
 | |
|                                                   0, 0, 0, 0, 0, 0, i);
 | |
|         }
 | |
|         // packet container to inspection
 | |
|         testInspection.analyze_container(pkt_container);
 | |
|         // Check if packetcontainer empty
 | |
|         CHECK(pkt_container->get_total_number_of_packets() == 0);
 | |
|     }
 | |
| 
 | |
|     /// test UDP Flood attack
 | |
|     SECTION("UDP Flood Attack", "[]") {
 | |
|         PacketInfo* pkt_info = nullptr;
 | |
|         // create udp packets into packet container
 | |
|         for (int i = 0; i < 25; ++i) {
 | |
|             pkt_info = pkt_container->get_empty_packet(IPv4UDP);
 | |
|             PacketInfoIpv4Udp* pkt_info =
 | |
|                 static_cast<PacketInfoIpv4Udp*>(pkt_info);
 | |
|         }
 | |
|         // packet container to inspection
 | |
|         testInspection.analyze_container(pkt_container);
 | |
|         // Check if packetcontainer only has threshold packets left
 | |
|         CHECK(pkt_container->get_total_number_of_packets() == 5);
 | |
|     }
 | |
| 
 | |
|     /// test TCP Flood attack
 | |
|     SECTION("TCP Flood Attack", "[]") {
 | |
|         PacketInfo* pkt_info = nullptr;
 | |
|         // create tcp packets into packet container
 | |
|         for (int i = 0; i < 25; ++i) {
 | |
|             pkt_info = pkt_container->get_empty_packet(IPv4TCP);
 | |
|             PacketInfoIpv4Tcp* pkt_info =
 | |
|                 static_cast<PacketInfoIpv4Tcp*>(pkt_info);
 | |
|             pkt_info->fill_payloadless_tcp_packet({00, 00, 00, 00, 00, 00},
 | |
|                                                   {00, 00, 00, 00, 00, 00}, 0,
 | |
|                                                   0, 0, 0, i, 0, 0, 100);
 | |
|         }
 | |
|         // packet container to inspection
 | |
|         testInspection.analyze_container(pkt_container);
 | |
|         // Check if packetcontainer only has threshold packets left
 | |
|         CHECK(pkt_container->get_total_number_of_packets() == 5);
 | |
|     }
 | |
| 
 | |
|     /// \todo test ICMP Flood attack
 | |
|     SECTION("ICMP Flood Attack", "[]") {
 | |
|         PacketInfo* pkt_info = nullptr;
 | |
|         // create icmp packets into packet container
 | |
|         for (int i = 0; i < 25; ++i) {
 | |
|             pkt_info = pkt_container->get_empty_packet(IPv4ICMP);
 | |
|             PacketInfoIpv4Icmp* pkt_info =
 | |
|                 static_cast<PacketInfoIpv4Icmp*>(pkt_info);
 | |
|         }
 | |
|         // packet container to inspection
 | |
|         testInspection.analyze_container(pkt_container);
 | |
|         // Check if packetcontainer only has threshold packets left
 | |
|         CHECK(pkt_container->get_total_number_of_packets() == 5);
 | |
|     }
 | |
| }
 | |
| 
 | |
| TEST_CASE("check update function", "[]") {
 | |
|     Inspection testInspection;
 | |
| 
 | |
|     SECTION("Null", "[]") {
 | |
|         // update statistic with given numbers
 | |
|         REQUIRE_NOTHROW(testInspection.update_stats(0, 0, 0, 0, 0, 0, 0, 0, 0));
 | |
|         // check correct formulas
 | |
|         CHECK(testInspection.get_UDP_packet_rate() == 0);  //< udp_pkt/duration
 | |
|         CHECK(testInspection.get_TCP_packet_rate() == 0);  //< tcp_pkt/duration
 | |
|         CHECK(testInspection.get_ICMP_packet_rate() == 0); //< icmp_pkt/duration
 | |
|         CHECK(testInspection.get_attack_level() == 0);     //< no attacks
 | |
|         CHECK(testInspection.get_UDP_threshold() == 5);    //< _threshold_UDP
 | |
|         CHECK(testInspection.get_TCP_threshold() == 5);    //< _threshold_TCP
 | |
|         CHECK(testInspection.get_ICMP_threshold() == 5);   //< _threshold_ICMP
 | |
|     }
 | |
| 
 | |
|     SECTION("UDP rate", "[]") {
 | |
|         REQUIRE_NOTHROW(
 | |
|             testInspection.update_stats(10, 0, 0, 0, 0, 0, 0, 0, 1));
 | |
|         CHECK(testInspection.get_UDP_packet_rate() == 10);
 | |
|     }
 | |
|     SECTION("TCP rate", "[]") {
 | |
|         REQUIRE_NOTHROW(
 | |
|             testInspection.update_stats(0, 10, 0, 0, 0, 0, 0, 0, 1));
 | |
|         CHECK(testInspection.get_TCP_packet_rate() == 10);
 | |
|     }
 | |
|     SECTION("ICMP rate", "[]") {
 | |
|         REQUIRE_NOTHROW(
 | |
|             testInspection.update_stats(0, 0, 0, 10, 0, 0, 0, 0, 1));
 | |
|         CHECK(testInspection.get_ICMP_packet_rate() == 10);
 | |
|     }
 | |
|     SECTION("UDP Flood", "[]") {
 | |
|         REQUIRE_NOTHROW(
 | |
|             testInspection.update_stats(10, 0, 0, 5, 0, 0, 0, 0, 1));
 | |
|         CHECK(testInspection.get_UDP_packet_rate() == 10);
 | |
|         CHECK(testInspection.get_attack_level() ==
 | |
|               5); //< UDP_Floods * _UDP_flood_weight
 | |
|         CHECK(testInspection.get_UDP_threshold() == 0); //< 5-1/5*5*5
 | |
|     }
 | |
|     SECTION("TCP Flood", "[]") {
 | |
|         REQUIRE_NOTHROW(
 | |
|             testInspection.update_stats(0, 10, 0, 0, 5, 0, 0, 0, 1));
 | |
|         CHECK(testInspection.get_TCP_packet_rate() == 10);
 | |
|         CHECK(testInspection.get_attack_level() == 5);
 | |
|         CHECK(testInspection.get_TCP_threshold() == 0);
 | |
|     }
 | |
|     SECTION("ICMP Flood", "[]") {
 | |
|         REQUIRE_NOTHROW(
 | |
|             testInspection.update_stats(0, 0, 10, 0, 0, 5, 0, 0, 1));
 | |
|         CHECK(testInspection.get_ICMP_packet_rate() == 10);
 | |
|         CHECK(testInspection.get_attack_level() == 5);
 | |
|         CHECK(testInspection.get_ICMP_threshold() == 0);
 | |
|     }
 | |
|     SECTION("SYN-FIN Attack", "[]") {
 | |
|         REQUIRE_NOTHROW(
 | |
|             testInspection.update_stats(0, 10, 0, 0, 0, 0, 5, 0, 1));
 | |
|         CHECK(testInspection.get_TCP_packet_rate() == 10);
 | |
|         CHECK(testInspection.get_attack_level() == 5);
 | |
|         CHECK(testInspection.get_TCP_threshold() == 0);
 | |
|     }
 | |
|     SECTION("SmallWindow Attack", "[]") {
 | |
|         REQUIRE_NOTHROW(
 | |
|             testInspection.update_stats(0, 10, 0, 0, 0, 0, 0, 5, 1));
 | |
|         CHECK(testInspection.get_TCP_packet_rate() == 10);
 | |
|         CHECK(testInspection.get_attack_level() == 5);
 | |
|         CHECK(testInspection.get_TCP_threshold() == 0);
 | |
|     }
 | |
|     SECTION("send to global Statisic", "[]") {
 | |
|         // sending to global statistic not implemented yet in main
 | |
|     }
 | |
| } |