NETWORK ATTACKS FRAMEWORK
1.0.0
A NETwork Attacks framework. Making network attacks impact evaluation easier!
|
00001 // 00002 // Copyright (C) 2013, NESG (Network Engineering and Security Group), http://nesg.ugr.es, 00003 // - Gabriel Maciá Fernández (gmacia@ugr.es) 00004 // - Leovigildo Sánchez Casado (sancale@ugr.es) 00005 // - Rafael A. Rodríguez Gómez (rodgom@ugr.es) 00006 // - Roberto Magán Carrión (rmagan@ugr.es) 00007 // - Pedro García Teodoro (pgteodor@ugr.es) 00008 // - José Camacho Páez (josecamacho@ugr.es) 00009 // - Jesús E. Díaz Verdejo (jedv@ugr.es) 00010 // 00011 // This file is part of NETA. 00012 // 00013 // NETA is free software: you can redistribute it and/or modify 00014 // it under the terms of the GNU General Public License as published by 00015 // the Free Software Foundation, either version 3 of the License, or 00016 // (at your option) any later version. 00017 // 00018 // NETA is distributed in the hope that it will be useful, 00019 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00020 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00021 // GNU General Public License for more details. 00022 // 00023 // You should have received a copy of the GNU General Public License 00024 // along with NETA. If not, see <http://www.gnu.org/licenses/>. 00025 // 00026 00027 #include "NA_IPv4.h" 00028 #include <iostream> 00029 #include <string.h> 00030 #include "IPv4Datagram.h" 00031 00032 using std::cout; 00033 00034 simsignal_t NA_IPv4::dropSignal = SIMSIGNAL_NULL; 00035 simsignal_t NA_IPv4::rcvdPktSignal = SIMSIGNAL_NULL; 00036 simsignal_t NA_IPv4::delaySignal = SIMSIGNAL_NULL; 00037 00038 Define_Module(NA_IPv4); 00039 00040 void NA_IPv4::initialize() { 00041 00042 // Dropping attack initialization 00043 numDrops = 0; 00044 dropSignal = registerSignal("droppings"); 00045 droppingAttackProbability = 0; 00046 droppingAttackIsActive = false; 00047 00048 // Delay attack initialization 00049 delayAttackIsActive = false; 00050 delayAttackProbability = 0; 00051 numDelays = 0; 00052 delaySignal = registerSignal("delayed"); 00053 totalDelayTime = 0; 00054 delayAttackValue = NULL; 00055 00056 // Number of data packet received 00057 numRecvPacket = 0; 00058 rcvdPktSignal = registerSignal("rcvdPkt"); 00059 00060 IPv4::initialize(); 00061 } 00062 00063 void NA_IPv4::handleMessageFromAttackController(cMessage *msg) { 00064 00065 // It is necessary to call Enter_Method for doing context switching (4.10 of User Manual) 00066 Enter_Method("NA_IPv4: handle message from attack controller"); 00067 00068 LOG << "NA_IPv4: Received message: " << msg->getFullName() << "\n"; 00069 00070 /*-------------------------- DROPPING ATTACK -------------------------*/ 00071 if (not strcmp(msg->getFullName(), "droppingActivate")) { 00072 NA_DroppingMessage *dmsg; 00073 dmsg = check_and_cast<NA_DroppingMessage *>(msg); 00074 LOG << "--> Activating module NA_IPv4 for Dropping Attack...\n"; 00075 LOG << " Dropping Attack Probability received: " 00076 << dmsg->getDroppingAttackProbability() << "\n"; 00077 //Now dropping attack is activated in this module 00078 droppingAttackIsActive = true; 00079 droppingAttackProbability = dmsg->getDroppingAttackProbability(); 00080 delete (msg); 00081 00082 } else if (not strcmp(msg->getFullName(), "droppingDeactivate")) { 00083 NA_DroppingMessage *dmsg; 00084 dmsg = check_and_cast<NA_DroppingMessage *>(msg); 00085 LOG << "Deactivating module NA_IPv4 for Dropping Attack...\n"; 00086 //Now dropping attack is deactivated 00087 droppingAttackIsActive = false; 00088 delete (msg); 00089 00090 /*-------------------------- DELAY ATTACK -------------------------*/ 00091 00092 } else if (not strcmp(msg->getFullName(), "delayActivate")) { 00093 NA_DelayMessage *dmsg; 00094 dmsg = check_and_cast<NA_DelayMessage *>(msg); 00095 LOG << "--> Activating module NA_IPv4 for Delay Attack...\n"; 00096 LOG << " Delay Attack Probability received: " 00097 << dmsg->getDelayAttackProbability() << "\n"; 00098 LOG << " Delay Attack Value received: " 00099 << dmsg->getDelayAttackValue() << "\n"; 00100 delayAttackIsActive = true; 00101 delayAttackProbability = dmsg->getDelayAttackProbability(); 00102 delayAttackValue = dmsg->getDelayAttackValue(); 00103 delete (msg); 00104 00105 } else if (not strcmp(msg->getFullName(), "delayDeactivate")) { 00106 NA_DelayMessage *dmsg; 00107 dmsg = check_and_cast<NA_DelayMessage *>(msg); 00108 LOG << "Deactivating module NA_IPv4 for Delay Attack...\n"; 00109 delayAttackIsActive = false; 00110 delayAttackValue = NULL; 00111 delete (msg); 00112 00113 } else { 00114 LOG 00115 << "ERROR: Message unknown in NA_IPv4::handleMessageFromAttackController. Msg: " 00116 << msg->getFullName() << "\n"; 00117 } 00118 } 00119 00120 void NA_IPv4::handlePacketFromNetwork(IPv4Datagram *datagram, 00121 InterfaceEntry *fromIE) { 00122 00123 ASSERT(datagram); 00124 00125 //cout << simTime() << ": Incoming packet: " << datagram->getFullPath() << endl; 00126 //cout << simTime() << ": Source address: " << datagram->getSrcAddress().str() << endl; 00127 //cout << simTime() << ": Destination address: " << datagram->getDestAddress().str() << endl; 00128 00129 // Count the number of total data packet received, for statistics. 00130 if (!strncmp(datagram->getName(), PING_DATA, 4) 00131 || !strncmp(datagram->getName(), UDP_DATA, 3) 00132 || !strncmp(datagram->getName(), TCP_DATA, 3)) { 00133 numRecvPacket++; // The number of packets is updated 00134 emit(rcvdPktSignal, numRecvPacket); // Sending of the signal indicating that we have received a new data packet. 00135 } 00136 00137 //Packet is a ping/UDP/TCP (data packet) 00138 if (droppingAttackIsActive) { 00139 LOG << "Received packet after activating dropping attack ... " << "\n"; 00140 if (!strncmp(datagram->getName(), PING_DATA, 4) 00141 || !strncmp(datagram->getName(), UDP_DATA, 3) 00142 || !strncmp(datagram->getName(), TCP_DATA, 3)) { 00143 LOG << "Is a valid packet for dropping ..." << "\n"; 00144 if (uniform(0, 1) < droppingAttackProbability) { 00145 numDrops++; // The number of droppings is updated 00146 emit(dropSignal, numDrops); // Sending of the signal indicating a drop 00147 LOG << "Discarding packet: " << datagram->getName() << ": " 00148 << numDrops << " dropping times." << endl; 00149 cout << simTime() << ": Discarding packet: " 00150 << datagram->getName() << endl; 00151 delete datagram; //Deletes the datagram thus calling its destructor 00152 } else { 00153 IPv4::handlePacketFromNetwork(datagram, fromIE); 00154 } 00155 } else { //Packet is not a data packet --> normal behavior 00156 IPv4::handlePacketFromNetwork(datagram, fromIE); 00157 00158 } 00159 00160 } else { // --> Normal behavior. 00161 IPv4::handlePacketFromNetwork(datagram, fromIE); 00162 } 00163 } 00164 00165 simtime_t NA_IPv4::startService(cPacket *msg) { 00166 00167 // The value for the variable "delay" is obtained in QueueBase::initialize from the .ned parameter "procDelay". 00168 // Here, the delay attack add a new delay. 00169 00170 double delayAttack = 0; 00171 00172 if (delayAttackIsActive) { 00173 if (delayAttackValue != NULL) { 00174 if (!strncmp(msg->getName(), PING_DATA, 4) 00175 || !strncmp(msg->getName(), UDP_DATA, 3) 00176 || !strncmp(msg->getName(), TCP_DATA, 3)) { 00177 if (uniform(0, 1) < delayAttackProbability) { 00178 delayAttack = delayAttackValue->doubleValue(); 00179 if (delayAttack < 0) 00180 delayAttack = 0; //Avoid negative delays from a random distribution 00181 numDelays++; // The number of packets delayed is updated 00182 emit(delaySignal, numDelays); // Sending of the signal indicating a drop 00183 LOG << "(NA_IPv4) Applied delay of: " << delayAttack 00184 << "s. Packet name: " << msg->getFullName() << endl; 00185 //cout << simTime() << ": (NA_IPv4) Applied delay of: " << delayAttack << "s. Packet name: " << msg->getFullName() << "\n"; 00186 } 00187 } 00188 } 00189 } 00190 return delayAttack + delay; 00191 } 00192