Пример #1
0
 def __init__(self):
     self.stats = "resume"
     self.log = LogDeErros()
     self.nomecoletor = ""
     self.contaSemIP = 0
     self.contaUDP = 0
     self.contaTCP = 0
     self.contaPacote = 0
     self.fluxo = {}
     self.timer = {}
     self.time = 5
     self.producer = Produtor()
Пример #2
0
	def __init__(self):
		self.stats = "resume"
		self.log = LogDeErros()
		self.nomecoletor = ""
		self.contaSemIP = 0
		self.contaUDP = 0
		self.contaTCP = 0
		self.contaPacote=0
		self.fluxo={}
		self.timer={}
		self.time=5
		self.producer = Produtor()
Пример #3
0
class Captura():
	"""Classe que ira capturar pacotes"""
	def __init__(self):
		self.stats = "resume"
		self.log = LogDeErros()
		self.nomecoletor = ""
		self.contaSemIP = 0
		self.contaUDP = 0
		self.contaTCP = 0
		self.contaPacote=0
		self.fluxo={}
		self.timer={}
		self.time=5
		self.producer = Produtor()


	def nomedocoletor(self,nome):
		self.nomecoletor = nome

	def status(self, arg):
		self.stats = arg
		print "Mudou status de captura para:", arg

	def assinar(self):
		file = open('l7-pat/dns.pat').readlines()
		expr = file[0]
		dns = re.compile(expr)
		file = open('l7-pat/ftp.pat').readlines()
		expr = file[0]
		ftp = re.compile(expr)
		file = open('l7-pat/http.pat').readlines()
		expr = file[0]
		http = re.compile(expr)
		file = open('l7-pat/ssh.pat').readlines()
		expr = file[0]
		ssh = re.compile(expr)
		file = open('l7-pat/bittorrent.pat').readlines()
		expr = file[0]
		bittorrent = re.compile(expr)
		file = open('l7-pat/dhcp.pat').readlines()
		expr = file[0]
		dhcp = re.compile(expr)
		file = open('l7-pat/ssdp.pat').readlines()
		expr = file[0]
		ssdp = re.compile(expr)
		file = open('l7-pat/ssl.pat').readlines()
		expr = file[0]
		ssl = re.compile(expr)

		assinaturas = {"dns":dns,"ftp":ftp,"http":http,"ssh":ssh,"bittorrent":bittorrent,"dhcp":dhcp,"ssdp":ssdp,"ssl":ssl}
		return assinaturas

	def capturateste(self):
		try:
			for ts, pkt in pcap.pcap("test-capture.pcap"):
				if self.stats == "teste":
					eth = dpkt.ethernet.Ethernet(pkt)
					ip = eth.data
					if isinstance(ip,dpkt.ip.IP):
						ipsrc = ip.src
						ipdst = ip.dst
						protocolo = ip.p
						transp = ip.data
						if isinstance(transp,dpkt.tcp.TCP) or isinstance(transp,dpkt.udp.UDP):
							if isinstance(ip.data,dpkt.tcp.TCP):
								self.contaTCP += 1
							elif isinstance(ip.data,dpkt.udp.UDP):
								self.contaUDP += 1
							portsrc = transp.dport
							portdest = transp.sport
							key=str(ipsrc)+str(portsrc)+str(ipdst)+str(portdest)+str(protocolo)
							if not key in self.fluxo:
								self.fluxo[key] = [(ts,ip)]
								self.conta_timeout_fluxo(key)
							else:
								self.fluxo[key].append((ts,ip))
								self.conta_timeout_fluxo(key)		
					else:
						self.contaSemIP += 1
						print "Pacote sem IP"
				if self.stats == "resume":
					self.captura()
				if self.stats == "":
					print "Coletor suspenso"
					system("clear")
			self.status("stop")
		except (KeyboardInterrupt, SystemExit):
			self.log.setErro(sys.exc_info()[1],self.nomecoletor)
			print "Erro ao fazer captura de teste."
			self.status("stop")
			os._exit(0)

	def captura(self):
		try:
			for ts, pkt in pcap.pcap():
				if self.stats == "resume":
					eth = dpkt.ethernet.Ethernet(pkt)
					ip = eth.data
					if isinstance(ip,dpkt.ip.IP):
						ipsrc = ip.src
						ipdst = ip.dst
						protocolo = ip.p
						transp = ip.data
						if isinstance(transp,dpkt.tcp.TCP) or isinstance(transp,dpkt.udp.UDP):
							if isinstance(ip.data,dpkt.tcp.TCP):
								self.contaTCP += 1
							elif isinstance(ip.data,dpkt.udp.UDP):
								self.contaUDP += 1
							portsrc = transp.dport
							portdest = transp.sport
							key=str(ipsrc)+str(portsrc)+str(ipdst)+str(portdest)+str(protocolo)
							if not key in self.fluxo:
								self.fluxo[key] = [(ts,ip)]
								self.conta_timeout_fluxo(key)
							else:
								self.fluxo[key].append((ts,ip))
								self.conta_timeout_fluxo(key)
							print key		
					else:
						self.contaSemIP += 1
						print "Pacote sem IP"

				if self.stats == "teste":

					self.capturateste()

				if self.stats == "stop":
					for i in self.timer:
						self.timer[i].cancel()
					print "Coletor suspenso"
					break
		except (KeyboardInterrupt, SystemExit):
			self.log.setErro(sys.exc_info()[1],self.nomecoletor)
			print "Erro ao fazer captura."
			os._exit(0)

	def classifica_fluxo(self, fluxo): # recebe uma lista no formato: [(ts,pkt),(ts,pkt)]
		self.protocols = self.assinar()
		achou=False
		for item in fluxo:
			app = item[1].data.data.lower()
			for p in self.protocols.items():
				if p[1].search(app):
					achou = True
					protocolo = p[0]
			if achou:
				return protocolo
			else:
				return "nenhum"

	def calcula_tempo_fluxo(self, fluxo): # recebe uma lista no formato: [(ts,pkt),(ts,pkt)]
		tempo_inicial = fluxo[0][0]
		tempo_final = fluxo[-1][0]
		duracao = tempo_final - tempo_inicial
		return duracao

	def calcula_tamanho_fluxo(self, fluxo): # recebe uma lista no formato: [(ts,pkt),(ts,pkt)]
		tamanho=0
		for pacote in fluxo:
			tamanho+=pacote[1].len
			return tamanho

	def conta_timeout_fluxo(self, key): # recebe uma string que é key de um fluxo em um dicionário
		if key in self.timer:
			self.timer[key].cancel()
		self.timer[key] = Timer(self.time,self.finaliza_fluxo,args=[key])
		self.timer[key].start()
			

	def finaliza_fluxo(self, key): # recebe uma string que é key de um fluxo em um dicionário
		self.cria_tupla(self.fluxo[key])
		del(self.fluxo[key])


	def cria_tupla (self, fluxo):
		protocolo =  self.classifica_fluxo(fluxo)
		tempo = self.calcula_tempo_fluxo(fluxo)
		tempo = tempo * 0.001
		tamanho = self.calcula_tamanho_fluxo(fluxo)
		tamanho = tamanho / 1024.0
		if tempo > 0 and tamanho > 0:
			taxa = tamanho / tempo
			tupla = (protocolo,"%.6f" % tamanho,"%.6f" % tempo,"%.6f" % taxa)
			print "Tupla gerada:", tupla
			#self.enviarTupla(tupla)

	def enviarTupla(self,tupla):
            credencial = pika.PlainCredentials('luiz', '113211')
            connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.56.103', 5672, 'filas', credencial))

            channel = connection.channel()



       	    channel.queue_declare(queue='HTTP')
            channel.queue_declare(queue='DNS')
            channel.queue_declare(queue='SSH')
            channel.queue_declare(queue='FTP')
            channel.queue_declare(queue='Unknown')
            channel.queue_declare(queue='All')

            if('http' in tupla or 'HTTP' in tupla):
            	channel.basic_publish(exchange='', routing_key='HTTP', body=str(tupla))
            elif('dns' in tupla or 'DNS' in tupla):
            	channel.basic_publish(exchange='', routing_key='DNS', body=str(tupla))
            elif('ssh' in tupla or 'SSH' in tupla):
            	channel.basic_publish(exchange='', routing_key='SSH', body=str(tupla))
            elif('ftp' in tupla or 'FTP' in tupla):
            	channel.basic_publish(exchange='', routing_key='FTP', body=str(tupla))
            elif(('dns' in tupla or 'DNS' in tupla) or ('http' in tupla or 'HTTP' in tupla) or ('ssh' in tupla or 'SSH' in tupla) or ('ftp' in tupla or 'FTP' in tupla)):
            	channel.basic_publish(exchange='', routing_key='All', body=str(tupla))
            else:
            	channel.basic_publish(exchange='', routing_key='Unknown', body=str(tupla))
            	channel.basic_publish(exchange='', routing_key='All', body=str(tupla))


            print "[x] Mensagem Enviada!"
Пример #4
0
class Captura():
    """Classe que ira capturar pacotes"""
    def __init__(self):
        self.stats = "resume"
        self.log = LogDeErros()
        self.nomecoletor = ""
        self.contaSemIP = 0
        self.contaUDP = 0
        self.contaTCP = 0
        self.contaPacote = 0
        self.fluxo = {}
        self.timer = {}
        self.time = 5
        self.producer = Produtor()

    def nomedocoletor(self, nome):
        self.nomecoletor = nome

    def status(self, arg):
        self.stats = arg
        print "Mudou status de captura para:", arg

    def assinar(self):
        file = open('l7-pat/dns.pat').readlines()
        expr = file[0]
        dns = re.compile(expr)
        file = open('l7-pat/ftp.pat').readlines()
        expr = file[0]
        ftp = re.compile(expr)
        file = open('l7-pat/http.pat').readlines()
        expr = file[0]
        http = re.compile(expr)
        file = open('l7-pat/ssh.pat').readlines()
        expr = file[0]
        ssh = re.compile(expr)
        file = open('l7-pat/bittorrent.pat').readlines()
        expr = file[0]
        bittorrent = re.compile(expr)
        file = open('l7-pat/dhcp.pat').readlines()
        expr = file[0]
        dhcp = re.compile(expr)
        file = open('l7-pat/ssdp.pat').readlines()
        expr = file[0]
        ssdp = re.compile(expr)
        file = open('l7-pat/ssl.pat').readlines()
        expr = file[0]
        ssl = re.compile(expr)

        assinaturas = {
            "dns": dns,
            "ftp": ftp,
            "http": http,
            "ssh": ssh,
            "bittorrent": bittorrent,
            "dhcp": dhcp,
            "ssdp": ssdp,
            "ssl": ssl
        }
        return assinaturas

    def capturateste(self):
        try:
            for ts, pkt in pcap.pcap("test-capture.pcap"):
                if self.stats == "teste":
                    eth = dpkt.ethernet.Ethernet(pkt)
                    ip = eth.data
                    if isinstance(ip, dpkt.ip.IP):
                        ipsrc = ip.src
                        ipdst = ip.dst
                        protocolo = ip.p
                        transp = ip.data
                        if isinstance(transp, dpkt.tcp.TCP) or isinstance(
                                transp, dpkt.udp.UDP):
                            if isinstance(ip.data, dpkt.tcp.TCP):
                                self.contaTCP += 1
                            elif isinstance(ip.data, dpkt.udp.UDP):
                                self.contaUDP += 1
                            portsrc = transp.dport
                            portdest = transp.sport
                            key = str(ipsrc) + str(portsrc) + str(ipdst) + str(
                                portdest) + str(protocolo)
                            if not key in self.fluxo:
                                self.fluxo[key] = [(ts, ip)]
                                self.conta_timeout_fluxo(key)
                            else:
                                self.fluxo[key].append((ts, ip))
                                self.conta_timeout_fluxo(key)
                    else:
                        self.contaSemIP += 1
                        print "Pacote sem IP"
                if self.stats == "resume":
                    self.captura()
                if self.stats == "":
                    print "Coletor suspenso"
                    system("clear")
            self.status("stop")
        except (KeyboardInterrupt, SystemExit):
            self.log.setErro(sys.exc_info()[1], self.nomecoletor)
            print "Erro ao fazer captura de teste."
            self.status("stop")
            os._exit(0)

    def captura(self):
        try:
            for ts, pkt in pcap.pcap():
                if self.stats == "resume":
                    eth = dpkt.ethernet.Ethernet(pkt)
                    ip = eth.data
                    if isinstance(ip, dpkt.ip.IP):
                        ipsrc = ip.src
                        ipdst = ip.dst
                        protocolo = ip.p
                        transp = ip.data
                        if isinstance(transp, dpkt.tcp.TCP) or isinstance(
                                transp, dpkt.udp.UDP):
                            if isinstance(ip.data, dpkt.tcp.TCP):
                                self.contaTCP += 1
                            elif isinstance(ip.data, dpkt.udp.UDP):
                                self.contaUDP += 1
                            portsrc = transp.dport
                            portdest = transp.sport
                            key = str(ipsrc) + str(portsrc) + str(ipdst) + str(
                                portdest) + str(protocolo)
                            if not key in self.fluxo:
                                self.fluxo[key] = [(ts, ip)]
                                self.conta_timeout_fluxo(key)
                            else:
                                self.fluxo[key].append((ts, ip))
                                self.conta_timeout_fluxo(key)
                            print key
                    else:
                        self.contaSemIP += 1
                        print "Pacote sem IP"

                if self.stats == "teste":

                    self.capturateste()

                if self.stats == "stop":
                    for i in self.timer:
                        self.timer[i].cancel()
                    print "Coletor suspenso"
                    break
        except (KeyboardInterrupt, SystemExit):
            self.log.setErro(sys.exc_info()[1], self.nomecoletor)
            print "Erro ao fazer captura."
            os._exit(0)

    def classifica_fluxo(
            self, fluxo):  # recebe uma lista no formato: [(ts,pkt),(ts,pkt)]
        self.protocols = self.assinar()
        achou = False
        for item in fluxo:
            app = item[1].data.data.lower()
            for p in self.protocols.items():
                if p[1].search(app):
                    achou = True
                    protocolo = p[0]
            if achou:
                return protocolo
            else:
                return "nenhum"

    def calcula_tempo_fluxo(
            self, fluxo):  # recebe uma lista no formato: [(ts,pkt),(ts,pkt)]
        tempo_inicial = fluxo[0][0]
        tempo_final = fluxo[-1][0]
        duracao = tempo_final - tempo_inicial
        return duracao

    def calcula_tamanho_fluxo(
            self, fluxo):  # recebe uma lista no formato: [(ts,pkt),(ts,pkt)]
        tamanho = 0
        for pacote in fluxo:
            tamanho += pacote[1].len
            return tamanho

    def conta_timeout_fluxo(
            self,
            key):  # recebe uma string que é key de um fluxo em um dicionário
        if key in self.timer:
            self.timer[key].cancel()
        self.timer[key] = Timer(self.time, self.finaliza_fluxo, args=[key])
        self.timer[key].start()

    def finaliza_fluxo(
            self,
            key):  # recebe uma string que é key de um fluxo em um dicionário
        self.cria_tupla(self.fluxo[key])
        del (self.fluxo[key])

    def cria_tupla(self, fluxo):
        protocolo = self.classifica_fluxo(fluxo)
        tempo = self.calcula_tempo_fluxo(fluxo)
        tempo = tempo * 0.001
        tamanho = self.calcula_tamanho_fluxo(fluxo)
        tamanho = tamanho / 1024.0
        if tempo > 0 and tamanho > 0:
            taxa = tamanho / tempo
            tupla = (protocolo, "%.6f" % tamanho, "%.6f" % tempo,
                     "%.6f" % taxa)
            print "Tupla gerada:", tupla
            #self.enviarTupla(tupla)

    def enviarTupla(self, tupla):
        credencial = pika.PlainCredentials('luiz', '113211')
        connection = pika.BlockingConnection(
            pika.ConnectionParameters('192.168.56.103', 5672, 'filas',
                                      credencial))

        channel = connection.channel()

        channel.queue_declare(queue='HTTP')
        channel.queue_declare(queue='DNS')
        channel.queue_declare(queue='SSH')
        channel.queue_declare(queue='FTP')
        channel.queue_declare(queue='Unknown')
        channel.queue_declare(queue='All')

        if ('http' in tupla or 'HTTP' in tupla):
            channel.basic_publish(exchange='',
                                  routing_key='HTTP',
                                  body=str(tupla))
        elif ('dns' in tupla or 'DNS' in tupla):
            channel.basic_publish(exchange='',
                                  routing_key='DNS',
                                  body=str(tupla))
        elif ('ssh' in tupla or 'SSH' in tupla):
            channel.basic_publish(exchange='',
                                  routing_key='SSH',
                                  body=str(tupla))
        elif ('ftp' in tupla or 'FTP' in tupla):
            channel.basic_publish(exchange='',
                                  routing_key='FTP',
                                  body=str(tupla))
        elif (('dns' in tupla or 'DNS' in tupla)
              or ('http' in tupla or 'HTTP' in tupla)
              or ('ssh' in tupla or 'SSH' in tupla)
              or ('ftp' in tupla or 'FTP' in tupla)):
            channel.basic_publish(exchange='',
                                  routing_key='All',
                                  body=str(tupla))
        else:
            channel.basic_publish(exchange='',
                                  routing_key='Unknown',
                                  body=str(tupla))
            channel.basic_publish(exchange='',
                                  routing_key='All',
                                  body=str(tupla))

        print "[x] Mensagem Enviada!"
Пример #5
0
def main():
	nomecoletor = "aluizio" #Para cada máquina virtual esse nome deve mudar
	log = LogDeErros()
	try:	
		coletor = Coletor()
		serverPort = 12000
		clientSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
		clientSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
		clientSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
		clientSocket.settimeout(3)
		errorSocket = socketerror.socketError(socket.AF_INET,socket.SOCK_DGRAM)
		errorSocket.setErrorProb(0.1)
		errorSocket.settimeout(1)

		serverAddress = ""
		serverName = '<broadcast>'
		message= ""

		while True:
			message = "adicionar"
			clientSocket.sendto(message,(serverName, serverPort))
			message = nomecoletor
			clientSocket.sendto(message,(serverName, serverPort))
			try:
				returnMessage, serverAddress = clientSocket.recvfrom(2048) #Aguarda receber de retorno
				if returnMessage.upper() == "ADICIONADO":
					print "O coletor foi adicionado\n"
					break
			except socket.timeout:
				print "Sem resposta, enviando nova solicitação."			

		#coletor.start()
		while True:
			print "Aguandando ordens do Monitor\n"
			clientSocket.settimeout(None)
			returnMessage, serverAddress = clientSocket.recvfrom(2048)
			print returnMessage
			if returnMessage.upper() == "COLETAR":
				if coletor.stoprequest.isSet():
					coletor.resume()
				else:
					coletor.start()
			if returnMessage.upper() == "COLETARTESTE":
				coletor.teste()
			if returnMessage.upper() == "PARAR":
				coletor.stop()
				print coletor.isAlive()
			if returnMessage.upper() == "LOG":
	########################################## Transferência Confiável - Client ###########################################	
				numero_do_pacote = 0
				errorSocket.connect((serverAddress))
				nome_do_arquivo, serverAddress = clientSocket.recvfrom(2048) # recebe nome do arquivo de log que deve enviar
				nome_do_arquivo = open(nome_do_arquivo,'r+b') # abre o Arquivo
				lendo_arquivo = nome_do_arquivo.read(40) # lê um pedaço do arquivo e salva numa variável
				while lendo_arquivo: # loop enquanto ainda estiver lendo o arquivo
					receber = '' # inicializando valor padrão
					while (receber != 'ACK'): # loop enquanto não recebe ack
						enviar = lendo_arquivo+"&"+str(numero_do_pacote) # pedaço do arquivo + sequencia do pacote
						errorSocket.sendWithError(enviar) # envia a variável com chance de erro
						print "enviou pedaço do arquivo"
						try:
							print "esperando receber ack"
							msg = errorSocket.recvWithError(1024) # espera 5s para receber ack, se estourar entra no except
							print msg
							dados = msg.split('&') # separa o ack e o número de sequência
							receber = dados[0] # carrega o ack para disparar loop
							if (str(numero_do_pacote) == dados[1]):
								lendo_arquivo = nome_do_arquivo.read(40) # lê próxima parte do arquivo
								numero_do_pacote += 1 # incrementa o número de sequência do pacote
						except (socket.timeout): # tempo de resposta estourou
							print "estourou o tempo"
							break
				nome_do_arquivo.close() # fechando arquivo
				print "fechou o arquivo"
				while True:
					errorSocket.sendWithError("fim&*") # envia pacote final
					try:
						msg = errorSocket.recvWithError(1024) # espera 5s para receber ack, se estourar entra no except
						break
					except socket.timeout: # tempo de resposta estourou
						print "estourou o tempo"
				print "Enviou o fim"
	##################################### ########################################### ######################################	

		clientSocket.close()

	except (KeyboardInterrupt, SystemExit):
		coletor.stoprequest.set()
		log.setErro(sys.exc_info()[1],nomecoletor)
		print "Um erro ocorreu!"
		os._exit(0)
Пример #6
0
def main():
    nomecoletor = "aluizio"  #Para cada máquina virtual esse nome deve mudar
    log = LogDeErros()
    try:
        coletor = Coletor()
        serverPort = 12000
        clientSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        clientSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        clientSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        clientSocket.settimeout(3)
        errorSocket = socketerror.socketError(socket.AF_INET,
                                              socket.SOCK_DGRAM)
        errorSocket.setErrorProb(0.1)
        errorSocket.settimeout(1)

        serverAddress = ""
        serverName = '<broadcast>'
        message = ""

        while True:
            message = "adicionar"
            clientSocket.sendto(message, (serverName, serverPort))
            message = nomecoletor
            clientSocket.sendto(message, (serverName, serverPort))
            try:
                returnMessage, serverAddress = clientSocket.recvfrom(
                    2048)  #Aguarda receber de retorno
                if returnMessage.upper() == "ADICIONADO":
                    print "O coletor foi adicionado\n"
                    break
            except socket.timeout:
                print "Sem resposta, enviando nova solicitação."

        #coletor.start()
        while True:
            print "Aguandando ordens do Monitor\n"
            clientSocket.settimeout(None)
            returnMessage, serverAddress = clientSocket.recvfrom(2048)
            print returnMessage
            if returnMessage.upper() == "COLETAR":
                if coletor.stoprequest.isSet():
                    coletor.resume()
                else:
                    coletor.start()
            if returnMessage.upper() == "COLETARTESTE":
                coletor.teste()
            if returnMessage.upper() == "PARAR":
                coletor.stop()
                print coletor.isAlive()
            if returnMessage.upper() == "LOG":
                ########################################## Transferência Confiável - Client ###########################################
                numero_do_pacote = 0
                errorSocket.connect((serverAddress))
                nome_do_arquivo, serverAddress = clientSocket.recvfrom(
                    2048)  # recebe nome do arquivo de log que deve enviar
                nome_do_arquivo = open(nome_do_arquivo,
                                       'r+b')  # abre o Arquivo
                lendo_arquivo = nome_do_arquivo.read(
                    40)  # lê um pedaço do arquivo e salva numa variável
                while lendo_arquivo:  # loop enquanto ainda estiver lendo o arquivo
                    receber = ''  # inicializando valor padrão
                    while (receber != 'ACK'):  # loop enquanto não recebe ack
                        enviar = lendo_arquivo + "&" + str(
                            numero_do_pacote
                        )  # pedaço do arquivo + sequencia do pacote
                        errorSocket.sendWithError(
                            enviar)  # envia a variável com chance de erro
                        print "enviou pedaço do arquivo"
                        try:
                            print "esperando receber ack"
                            msg = errorSocket.recvWithError(
                                1024
                            )  # espera 5s para receber ack, se estourar entra no except
                            print msg
                            dados = msg.split(
                                '&')  # separa o ack e o número de sequência
                            receber = dados[
                                0]  # carrega o ack para disparar loop
                            if (str(numero_do_pacote) == dados[1]):
                                lendo_arquivo = nome_do_arquivo.read(
                                    40)  # lê próxima parte do arquivo
                                numero_do_pacote += 1  # incrementa o número de sequência do pacote
                        except (socket.timeout):  # tempo de resposta estourou
                            print "estourou o tempo"
                            break
                nome_do_arquivo.close()  # fechando arquivo
                print "fechou o arquivo"
                while True:
                    errorSocket.sendWithError("fim&*")  # envia pacote final
                    try:
                        msg = errorSocket.recvWithError(
                            1024
                        )  # espera 5s para receber ack, se estourar entra no except
                        break
                    except socket.timeout:  # tempo de resposta estourou
                        print "estourou o tempo"
                print "Enviou o fim"
    ##################################### ########################################### ######################################

        clientSocket.close()

    except (KeyboardInterrupt, SystemExit):
        coletor.stoprequest.set()
        log.setErro(sys.exc_info()[1], nomecoletor)
        print "Um erro ocorreu!"
        os._exit(0)
Пример #7
0
class Captura:
    """Classe que ira capturar pacotes"""

    def __init__(self):
        self.stats = "resume"
        self.log = LogDeErros()
        self.nomecoletor = ""
        self.contaSemIP = 0
        self.contaUDP = 0
        self.contaTCP = 0
        self.contaPacote = 0
        self.fluxo = {}
        self.timer = {}
        self.time = 5
        self.producer = Produtor()

    def nomedocoletor(self, nome):
        self.nomecoletor = nome

    def status(self, arg):
        self.stats = arg
        print "Mudou status de captura para:", arg

    def assinar(self):
        file = open("l7-pat/dns.pat").readlines()
        expr = file[0]
        dns = re.compile(expr)
        file = open("l7-pat/ftp.pat").readlines()
        expr = file[0]
        ftp = re.compile(expr)
        file = open("l7-pat/http.pat").readlines()
        expr = file[0]
        http = re.compile(expr)
        file = open("l7-pat/ssh.pat").readlines()
        expr = file[0]
        ssh = re.compile(expr)
        file = open("l7-pat/bittorrent.pat").readlines()
        expr = file[0]
        bittorrent = re.compile(expr)
        file = open("l7-pat/dhcp.pat").readlines()
        expr = file[0]
        dhcp = re.compile(expr)
        file = open("l7-pat/ssdp.pat").readlines()
        expr = file[0]
        ssdp = re.compile(expr)
        file = open("l7-pat/ssl.pat").readlines()
        expr = file[0]
        ssl = re.compile(expr)

        assinaturas = {
            "dns": dns,
            "ftp": ftp,
            "http": http,
            "ssh": ssh,
            "bittorrent": bittorrent,
            "dhcp": dhcp,
            "ssdp": ssdp,
            "ssl": ssl,
        }
        return assinaturas

    def capturateste(self):
        try:
            for ts, pkt in pcap.pcap("test-capture.pcap"):
                if self.stats == "teste":
                    eth = dpkt.ethernet.Ethernet(pkt)
                    ip = eth.data
                    if isinstance(ip, dpkt.ip.IP):
                        ipsrc = ip.src
                        ipdst = ip.dst
                        protocolo = ip.p
                        transp = ip.data
                        if isinstance(transp, dpkt.tcp.TCP) or isinstance(transp, dpkt.udp.UDP):
                            if isinstance(ip.data, dpkt.tcp.TCP):
                                self.contaTCP += 1
                            elif isinstance(ip.data, dpkt.udp.UDP):
                                self.contaUDP += 1
                            portsrc = transp.dport
                            portdest = transp.sport
                            key = str(ipsrc) + str(portsrc) + str(ipdst) + str(portdest) + str(protocolo)
                            if not key in self.fluxo:
                                self.fluxo[key] = [(ts, ip)]
                                self.conta_timeout_fluxo(key)
                            else:
                                self.fluxo[key].append((ts, ip))
                                self.conta_timeout_fluxo(key)
                    else:
                        self.contaSemIP += 1
                        print "Pacote sem IP"
                if self.stats == "resume":
                    self.captura()
                if self.stats == "":
                    print "Coletor suspenso"
                    system("clear")
            self.status("stop")
        except (KeyboardInterrupt, SystemExit):
            self.log.setErro(sys.exc_info()[1], self.nomecoletor)
            print "Erro ao fazer captura de teste."
            self.status("stop")
            os._exit(0)

    def captura(self):
        try:
            for ts, pkt in pcap.pcap():
                if self.stats == "resume":
                    eth = dpkt.ethernet.Ethernet(pkt)
                    ip = eth.data
                    if isinstance(ip, dpkt.ip.IP):
                        ipsrc = ip.src
                        ipdst = ip.dst
                        protocolo = ip.p
                        transp = ip.data
                        if isinstance(transp, dpkt.tcp.TCP) or isinstance(transp, dpkt.udp.UDP):
                            if isinstance(ip.data, dpkt.tcp.TCP):
                                self.contaTCP += 1
                            elif isinstance(ip.data, dpkt.udp.UDP):
                                self.contaUDP += 1
                            portsrc = transp.dport
                            portdest = transp.sport
                            key = str(ipsrc) + str(portsrc) + str(ipdst) + str(portdest) + str(protocolo)
                            if not key in self.fluxo:
                                self.fluxo[key] = [(ts, ip)]
                                self.conta_timeout_fluxo(key)
                            else:
                                self.fluxo[key].append((ts, ip))
                                self.conta_timeout_fluxo(key)
                            print key
                    else:
                        self.contaSemIP += 1
                        print "Pacote sem IP"

                if self.stats == "teste":

                    self.capturateste()

                if self.stats == "stop":
                    for i in self.timer:
                        self.timer[i].cancel()
                    print "Coletor suspenso"
                    break
        except (KeyboardInterrupt, SystemExit):
            self.log.setErro(sys.exc_info()[1], self.nomecoletor)
            print "Erro ao fazer captura."
            os._exit(0)

    def classifica_fluxo(self, fluxo):  # recebe uma lista no formato: [(ts,pkt),(ts,pkt)]
        self.protocols = self.assinar()
        achou = False
        for item in fluxo:
            app = item[1].data.data.lower()
            for p in self.protocols.items():
                if p[1].search(app):
                    achou = True
                    protocolo = p[0]
            if achou:
                return protocolo
            else:
                return "nenhum"

    def calcula_tempo_fluxo(self, fluxo):  # recebe uma lista no formato: [(ts,pkt),(ts,pkt)]
        tempo_inicial = fluxo[0][0]
        tempo_final = fluxo[-1][0]
        duracao = tempo_final - tempo_inicial
        return duracao

    def calcula_tamanho_fluxo(self, fluxo):  # recebe uma lista no formato: [(ts,pkt),(ts,pkt)]
        tamanho = 0
        for pacote in fluxo:
            tamanho += pacote[1].len
            return tamanho

    def conta_timeout_fluxo(self, key):  # recebe uma string que é key de um fluxo em um dicionário
        if key in self.timer:
            self.timer[key].cancel()
        self.timer[key] = Timer(self.time, self.finaliza_fluxo, args=[key])
        self.timer[key].start()

    def finaliza_fluxo(self, key):  # recebe uma string que é key de um fluxo em um dicionário
        self.cria_tupla(self.fluxo[key])
        del (self.fluxo[key])

    def cria_tupla(self, fluxo):
        protocolo = self.classifica_fluxo(fluxo)
        tempo = self.calcula_tempo_fluxo(fluxo)
        tempo = tempo * 0.001
        tamanho = self.calcula_tamanho_fluxo(fluxo)
        tamanho = tamanho / 1024.0
        if tempo > 0 and tamanho > 0:
            taxa = tamanho / tempo
            tupla = (protocolo, "%.6f" % tamanho, "%.6f" % tempo, "%.6f" % taxa)
            print "Tupla gerada:", tupla
            self.envia_tupla(tupla)

    def envia_tupla(self, tupla):
        try:
            self.producer.enviatupla(tupla)
        except:
            print "servidor de filas indisponivel"
            self.log.setErro(sys.exc_info()[1], self.nomecoletor)