Skip to content

Commit

Permalink
Fixed Smart Attacker Implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
jeb16157 committed Feb 16, 2021
1 parent 15fe3d7 commit 66d1cb7
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 69 deletions.
13 changes: 8 additions & 5 deletions Python/attacker.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,27 +81,30 @@ def generateSYN(self):
else:
if(self.openPort == None):
portNumber = random.randint(0, 500) #generate a random port number
npacket = packet.packet(self.ipAddress, portNumber,self.clientIP, 80, "PING", random.randint(0, 10000), 0, self.packetIDPrefix + str(self.packetsGenerated),self.packetSize, self.ipAddress)
npacket = packet.packet(self.ipAddress, 20,"2.0.0.0", portNumber, "PING", random.randint(0, 10000), 0, self.packetIDPrefix + str(self.packetsGenerated),self.packetSize, self.ipAddress)
self.fileGen.addToLog(npacket.packetID, "Generated at Attacker", npacket.sequenceNumber, npacket.ackNumber, npacket.packetType, self.curTime)
return npacket
elif(self.checkOpenPorts >= 10):
npacket = packet.packet(self.ipAddress, self.openPort,self.clientIP, 80, "PING", random.randint(0, 10000), 0, self.packetIDPrefix + str(self.packetsGenerated),self.packetSize, self.ipAddress)
npacket = packet.packet(self.ipAddress, 20,"2.0.0.0", self.openPort, "PING", random.randint(0, 10000), 0, self.packetIDPrefix + str(self.packetsGenerated),self.packetSize, self.ipAddress)
self.fileGen.addToLog(npacket.packetID, "Generated at Attacker", npacket.sequenceNumber, npacket.ackNumber, npacket.packetType, self.curTime)
self.checkOpenPorts = 0
return npacket
else:
npacket = packet.packet(sourceIP, self.openPort, destinationIP, 80, packetType, random.randint(0, 10000), 0, self.packetIDPrefix + str(self.packetsGenerated),self.packetSize, self.ipAddress) #return the packet
npacket = packet.packet(sourceIP, 20, destinationIP, self.openPort, packetType, random.randint(0, 10000), 0, self.packetIDPrefix + str(self.packetsGenerated),self.packetSize, self.ipAddress) #return the packet
self.fileGen.addToLog(npacket.packetID, "Generated at Attacker", npacket.sequenceNumber, npacket.ackNumber, npacket.packetType, self.curTime)
self.checkOpenPorts += 1
return npacket



def receivePacket(self, packet):
if(packet.packetType == "PONG" and self.openPort != None):
self.openPorts.append(packet.srcPortNumber)
if(packet.packetType == "PONG" and self.openPort == None):
self.openPort = packet.srcPortNumber
#print("One open port found: "+ str(self.openPort))
elif(packet.packetType == "PONG-RST"):
if(packet.srcPortNumber == self.openPort):
self.openPort = None




Expand Down
45 changes: 16 additions & 29 deletions Python/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,42 +81,29 @@ def createResponses(self):
i = 0
while (i < len(self.receiveBuffer)): #iterate over the receive buffer
curPacket = self.receiveBuffer[i]
if(curPacket.packetType == "PING"):
if ( (curPacket.srcIP, curPacket.ackNumber) in self.expectedSYNACKs):
self.packetsGenerated += 1
responsePacket = packet.packet(self.clientIP, curPacket.dstPortNumber, curPacket.srcIP, curPacket.srcPortNumber, "PONG", 0, curPacket.sequenceNumber + 1, self.packetIDPrefix + str(self.packetsGenerated),self.packetSize, self.clientIP)
responsePacket = packet.packet(self.clientIP, curPacket.dstPortNumber, curPacket.srcIP, curPacket.srcPortNumber, "ACK", 0, curPacket.sequenceNumber + 1, self.packetIDPrefix + str(self.packetsGenerated),self.packetSize, self.clientIP)
self.fileGen.addToLog(responsePacket.packetID, "Generated at Client", responsePacket.sequenceNumber, responsePacket.ackNumber, responsePacket.packetType, self.curTime)
self.currentQueueLoad += responsePacket.packetSize
if(self.currentQueueLoad <= self.queueLimit):
self.queue.append(responsePacket)
else:
self.currentQueueLoad -= responsePacket.packetSize
self.receiveBuffer.pop(i) #remove the packet from the queue
self.packetsInReceiveBuffer -= 1
self.fileGen.addToLog(curPacket.packetID, "Responded to by Client", curPacket.sequenceNumber, curPacket.ackNumber, curPacket.packetType, self.curTime)
else:
if ( (curPacket.srcIP, curPacket.ackNumber) in self.expectedSYNACKs):
self.packetsGenerated += 1
responsePacket = packet.packet(self.clientIP, curPacket.dstPortNumber, curPacket.srcIP, curPacket.srcPortNumber, "ACK", 0, curPacket.sequenceNumber + 1, self.packetIDPrefix + str(self.packetsGenerated),self.packetSize, self.clientIP)
self.fileGen.addToLog(responsePacket.packetID, "Generated at Client", responsePacket.sequenceNumber, responsePacket.ackNumber, responsePacket.packetType, self.curTime)
self.currentQueueLoad += responsePacket.packetSize
if(self.currentQueueLoad <= self.queueLimit):
self.queue.append(responsePacket)
else:
self.currentQueueLoad -= responsePacket.packetSize
#Drop Packet
else: #if the packet is not expected, send an RST ###dw - check this with Jesse since I'm not sure how the RSTs should be formatted
self.packetsGenerated += 1
responsePacket = packet.packet(self.clientIP, curPacket.dstPortNumber, curPacket.srcIP, curPacket.srcPortNumber, "RST", 0, curPacket.sequenceNumber + 1, self.packetIDPrefix + str(self.packetsGenerated),self.packetSize, self.clientIP)
self.fileGen.addToLog(responsePacket.packetID, "Generated at Client", responsePacket.sequenceNumber, responsePacket.ackNumber, responsePacket.packetType, self.curTime)
self.currentQueueLoad += responsePacket.packetSize
if(self.currentQueueLoad <= self.queueLimit):
self.queue.append(responsePacket)
else:
self.currentQueueLoad -= responsePacket.packetSize
#Drop Packet
self.receiveBuffer.pop(i) #remove the packet from the queue
self.packetsInReceiveBuffer -= 1
self.fileGen.addToLog(curPacket.packetID, "Responded to by Client", curPacket.sequenceNumber, curPacket.ackNumber, curPacket.packetType, self.curTime)
#Drop Packet
else: #if the packet is not expected, send an RST ###dw - check this with Jesse since I'm not sure how the RSTs should be formatted
self.packetsGenerated += 1
responsePacket = packet.packet(self.clientIP, curPacket.dstPortNumber, curPacket.srcIP, curPacket.srcPortNumber, "RST", 0, curPacket.sequenceNumber + 1, self.packetIDPrefix + str(self.packetsGenerated),self.packetSize, self.clientIP)
self.fileGen.addToLog(responsePacket.packetID, "Generated at Client", responsePacket.sequenceNumber, responsePacket.ackNumber, responsePacket.packetType, self.curTime)
self.currentQueueLoad += responsePacket.packetSize
if(self.currentQueueLoad <= self.queueLimit):
self.queue.append(responsePacket)
else:
self.currentQueueLoad -= responsePacket.packetSize
#Drop Packet
self.receiveBuffer.pop(i) #remove the packet from the queue
self.packetsInReceiveBuffer -= 1
self.fileGen.addToLog(curPacket.packetID, "Responded to by Client", curPacket.sequenceNumber, curPacket.ackNumber, curPacket.packetType, self.curTime)

#Simulates normal traffic by sending periodic syn requests to a normal server
def createNormalTraffic(self):
Expand Down
79 changes: 44 additions & 35 deletions Python/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ def receivePacket(self, synPacket):
self.packetsReceived += 1
self.fileGen.addToLog(synPacket.packetID, "Received at Router", synPacket.sequenceNumber, synPacket.ackNumber, synPacket.packetType, self.curTime)
else:
print("Packet is getting Dropped")
#print("Packet is getting Dropped")
self.fileGen.animateDrop(self.packetIDPrefix[0], curPacket.packetType, curPacket.sequenceNumber, curPacket.ackNumber, curPacket.dstPortNumber)
self.packetsDropped += 1
self.fileGen.addToLog(synPacket.packetID, "Dropped at Router: No space in receiveBuffer", synPacket.sequenceNumber, synPacket.ackNumber, synPacket.packetType, self.curTime)
Expand Down Expand Up @@ -106,6 +106,9 @@ def addToQueues(self):
self.currentQueueLoadClient -= i.packetSize
#Drop Packet
self.receiveBuffer.remove(i)
elif(i.dstIP == self.ipAddress):
self.filterPackets(i)
self.receiveBuffer.remove(i)
else:
self.currentQueueLoadAttacker += i.packetSize
if(self.currentQueueLoadAttacker <= self.queueLimit):
Expand All @@ -118,28 +121,38 @@ def addToQueues(self):

def filterPackets(self, packetT):
allow = False
for j in self.dddController.currentUsablePorts:
if(packetT.dstPortNumber == j):
for j in self.dddPortMapper.portMappings:
if(packetT.dstPortNumber == j[1]):
allow = True
return True
#Check if the packets dst port number is listed as a current usable port.
if(allow == False and len(self.dddController.oldPorts) != 0):
for j in self.dddController.oldPorts:
if(packetT.dstPortNumber == j):
allow = True
print("This packet got past the filter")
return True
#If the packets dst port number is not found in either list, then drop the packet
if(allow == False):
if(packetT.packetType == "PING"):
npacket = packet.packet(self.ipAddress,packetT.dstPortNumber,packetT.srcIP, packetT.srcPortNumber, "PONG-RST", random.randint(0, 10000), 0, "R" ,self.packetSize, self.ipAddress)
self.fileGen.addToLog(npacket.packetID, "Generated at Router", npacket.sequenceNumber, npacket.ackNumber, npacket.packetType, self.curTime)
self.queueAttacker.append(npacket)
print("Packet dropped at the DDD Filter")
self.fileGen.animateDrop(self.packetIDPrefix[0], packetT.packetType, packetT.sequenceNumber, packetT.ackNumber, packetT.dstPortNumber)###dw
self.fileGen.addToLog(packetT.packetID, "Dropped at DDD Filter", packetT.sequenceNumber, packetT.ackNumber, packetT.packetType, self.curTime)
self.packetsDropped += 1
if(packetT.packetType == "PING" and allow == True):
#print("Packet is a PING and found an open port: " + str(packetT.dstPortNumber))
npacket = packet.packet(self.ipAddress,packetT.dstPortNumber,packetT.srcIP, packetT.srcPortNumber, "PONG", random.randint(0, 10000), 0, "R" ,self.packetSize, self.ipAddress)
self.fileGen.addToLog(npacket.packetID, "Generated at Router", npacket.sequenceNumber, npacket.ackNumber, npacket.packetType, self.curTime)
self.queueAttacker.append(npacket)
return False
elif(packetT.packetType == "PING"):
#print("Packet is not the right port: " + str(packetT.dstPortNumber))
npacket = packet.packet(self.ipAddress,packetT.dstPortNumber,packetT.srcIP, packetT.srcPortNumber, "PONG-RST", random.randint(0, 10000), 0, "R" ,self.packetSize, self.ipAddress)
self.fileGen.addToLog(npacket.packetID, "Generated at Router", npacket.sequenceNumber, npacket.ackNumber, npacket.packetType, self.curTime)
self.queueAttacker.append(npacket)
return False
else:
#Check if the packets dst port number is listed as a current usable port.
if(allow == False and len(self.dddController.oldPorts) != 0):
for j in self.dddController.oldPorts:
if(packetT.dstPortNumber == j):
allow = True
#print("This packet got past the filter")
return True
else:
return True
#If the packets dst port number is not found in either list, then drop the packet
if(allow == False):
#print("Packet dropped at the DDD Filter")
self.fileGen.animateDrop(self.packetIDPrefix[0], packetT.packetType, packetT.sequenceNumber, packetT.ackNumber, packetT.dstPortNumber)###dw
self.fileGen.addToLog(packetT.packetID, "Dropped at DDD Filter", packetT.sequenceNumber, packetT.ackNumber, packetT.packetType, self.curTime)
self.packetsDropped += 1
return False

#If no packet is sending from each interface, then it will start sending a packet on that interface from the queue.
def processPackets(self):
Expand Down Expand Up @@ -316,18 +329,14 @@ def sendPackets(self):
self.packetsSent += 1
self.sendClient = None
else:
print("Packet Dropped at the Port Mapper")
if(self.sendClient[0].packetType == "PING"):
npacket = packet.packet(self.ipAddress,self.sendClient[0].dstPortNumber,self.sendClient[0].srcIP, self.sendClient[0].srcPortNumber, "PONG-RST", random.randint(0, 10000), 0, "R" ,self.packetSize, self.ipAddress)
self.fileGen.addToLog(npacket.packetID, "Generated at Router", npacket.sequenceNumber, npacket.ackNumber, npacket.packetType, self.curTime)
self.queueAttacker.append(npacket)
#print("Packet Dropped at the Port Mapper")
self.fileGen.animateDrop(self.packetIDPrefix[0], self.sendClient[0].packetType, self.sendClient[0].sequenceNumber, self.sendClient[0].ackNumber, self.sendClient[0].dstPortNumber)
self.fileGen.addToLog(self.sendClient[0].packetID, "Dropped at Port Mapper", self.sendClient[0].sequenceNumber, self.sendClient[0].ackNumber, self.sendClient[0].packetType, self.curTime)
self.sendClient = None
self.packetsDropped += 1
if(self.sendNServer != None):
if((self.sendNServer[1] - self.curTime) < 1):
print("Mapping Ports----------------------------------------------------------------------------------------------------------------")
#print("Mapping Ports----------------------------------------------------------------------------------------------------------------")
#Check if packet's src port is already mapped.
packetAlreadyMapped = False
for j in self.dddPortMapper.portMappings:
Expand All @@ -341,7 +350,7 @@ def sendPackets(self):
if(packetAlreadyMapped == False):
openPort = self.dddPortMapper.getAvailableOpenPort()
if(openPort == 0):
print("No more ports open")
#print("No more ports open")
pass
else:
originalSrcPort = self.sendNServer[0].srcPortNumber
Expand All @@ -355,24 +364,24 @@ def sendPackets(self):
self.sendNServer = None
if(self.sendMServer != None):
if((self.sendMServer[1] - self.curTime) < 1):
print("Packet getting Mapped to go to M Server")
#print("Packet getting Mapped to go to M Server")
#Check if packet's src port is already mapped.
packetAlreadyMapped = False
for j in self.dddPortMapper.portMappings:
if(j[0] == self.sendMServer[0].srcPortNumber):
print("Port is already mapped")
#print("Port is already mapped")
packetAlreadyMapped = True
self.sendMServer[0].srcPortNumber = j[1]
if(self.sendMServer[0].packetType == "ACK" or self.sendMServer[0].packetType == "RST"):
self.dddPortMapper.updateMappings(0, self.sendMServer[0].srcPortNumber)
break
#If src port isn't already mapped, find open port to map and set that equal to the packets src port
if(packetAlreadyMapped == False):
print("Port was not mapped.")
#print("Port was not mapped.")
openPort = self.dddPortMapper.getAvailableOpenPort()
print("Mapping to port " + str(openPort))
#print("Mapping to port " + str(openPort))
if(openPort == 0):
print("No more ports open")
#print("No more ports open")
pass
else:
originalSrcPort = self.sendMServer[0].srcPortNumber
Expand All @@ -386,7 +395,7 @@ def sendPackets(self):
self.sendMServer = None
if(self.sendAttacker != None):
if((self.sendAttacker[1] - self.curTime) < 1):
print("Mapping Ports----------------------------------------------------------------------------------------------------------------")
#print("Mapping Ports----------------------------------------------------------------------------------------------------------------")
#Check if packet's src port is already mapped.
packetAlreadyMapped = False
for j in self.dddPortMapper.portMappings:
Expand All @@ -400,7 +409,7 @@ def sendPackets(self):
if(packetAlreadyMapped == False):
openPort = self.dddPortMapper.getAvailableOpenPort()
if(openPort == 0):
print("No more ports open")
#print("No more ports open")
pass
else:
originalSrcPort = self.sendAttacker[0].srcPortNumber
Expand Down

0 comments on commit 66d1cb7

Please sign in to comment.