0% acharam este documento útil (0 voto)
80 visualizações38 páginas

LPD Report

Este documento descreve o desenvolvimento de uma aplicação de segurança informática em Python. A aplicação realiza vários tipos de análises de segurança, incluindo a detecção de hosts e portos abertos na rede local, conexões ativas na máquina, e processamento de logs de firewall. A aplicação possui interface gráfica e de linha de comando, e gera relatórios em PDF e CSV. A informação é armazenada em uma base de dados com ORM para facilitar a produção e análise de relatórios.

Enviado por

Nelso Ventura
Direitos autorais
© Attribution Non-Commercial (BY-NC)
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
80 visualizações38 páginas

LPD Report

Este documento descreve o desenvolvimento de uma aplicação de segurança informática em Python. A aplicação realiza vários tipos de análises de segurança, incluindo a detecção de hosts e portos abertos na rede local, conexões ativas na máquina, e processamento de logs de firewall. A aplicação possui interface gráfica e de linha de comando, e gera relatórios em PDF e CSV. A informação é armazenada em uma base de dados com ORM para facilitar a produção e análise de relatórios.

Enviado por

Nelso Ventura
Direitos autorais
© Attribution Non-Commercial (BY-NC)
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 38

INSTITUTO POLITCNICO DE BEJA Escola Superior de Tecnologia e Gesto de Beja

Mestrado em Engenharia de Segurana Informtica

Aplicao de Segurana Informtica


Linguagens de Programao Dinmicas

Francisco Chainho N 12046 Jos Ramos N 12068 Nelso Ventura N 12070


Beja 18, Abril de 2013


1

INSTITUTO POLITCNICO DE BEJA Escola Superior de Tecnologia e Gesto de Beja


Mestrado em Engenharia de Segurana Informtica

Aplicao de Segurana Informtica


Linguagens de Programao Dinmicas

Elaborado por: Francisco Chainho Jos Ramos Nelso Ventura Docente: Dr. Jos Jasnau Caeiro

Beja 18, Abril de 2013


2

ndice
1 2 3 4 Introduo........................................................................................................................ 4 Anlise do Problema........................................................................................................ 5 Soluo Proposta Decises ao nvel da implementao ................................................6 Deteco de Hosts na rede local e respectivos portos abertos.........................................7 4.1 4.2 5 Bibliotecas utilizadas............................................................................................... 7 Cdigo...................................................................................................................... 7

Conexes UDP e TCP Activas na mquina local............................................................9 5.1 Cdigo...................................................................................................................... 9

Processamento do ficheiro de Logs da Firewall.............................................................10 6.1 Bibliotecas utilizadas............................................................................................. 10 Cdigo............................................................................................................ 11

6.1.1 6.2

Relatrios............................................................................................................... 14 Bibliotecas Utilizadas ..................................................................................... 14

6.2.1 6.3

Cdigo.................................................................................................................... 14 Bibliotecas Utilizadas ..................................................................................... 16 Cdigo............................................................................................................ 17

6.3.1 6.3.2 7

Base de Dados com ORM.............................................................................................. 20 7.1 7.2 7.3 Bibliotecas utilizadas............................................................................................. 20 Cdigo.................................................................................................................... 20 Produo de Relatrios.......................................................................................... 23 BibliotecasUtilizadas..................................................................................... 23 Cdigo............................................................................................................ 23

7.3.1 7.3.2 8

Autenticao e encriptao na aplicao........................................................................ 26 8.1 Bibliotecas utilizadas............................................................................................. 26

............................................................................................................. 29 InterfaceGrfica 9.1 BibliotecasUtilizadas............................................................................................. 29 Cdigo............................................................................................................ 29

9.1.1 9.2 9.3 9.4 10 11 12

Execuodaaplicaoporinterfacegrfica..........................................................32 Execuodaaplicaoporlinhadecomando.......................................................33 PrincipaisDificuldades........................................................................................... 33 Trabalho futuro.......................................................................................................... 35 Concluso................................................................................................................... 36 Bibliografia................................................................................................................ 37 3

Introduo

O principal objectivo passa pelo desenvolvimento de uma aplicao de segurana informtica que tenha como funo realizar vrias anlises de segurana. O desenvolvimento deve ser feito com recurso a uma Linguagem de Programao Dinmica, como o Python, de modo a permitir a obteno de conhecimentos de programao nesta mesma linguagem e de um modo geral, compreender melhor o funcionamento das linguagens de programao de Scripting. A estruturao da aplicao devera ter em ateno trs aspectos fundamentais: fazer um scan na rede local para detectar os hosts existentes e detectar quais os portos que esto abertos nos hosts detectados no scan; determinar as conexes activas na mquina local e fazer o processamento do ficheiro de logs de uma firewal. O funcionamento da aplicao ser dividido em duas partes: linha de comando e por interface grfica. Toda a informao produzida pela anlise de informao do ficheiro de Logs disponibilizada em ficheiros PDF e CVS. A informao tambm exportada para uma base de dados, de modo a que essa informao possa ser trabalhada de acordo com as necessidades. Como complemento para a aplicao foram includos na mesma a produo de mapas geogrficos com a localizao dos IPs, criao de grficos com estatsticas, base de dados assente em ORM. Para a autenticao na aplicao recorremos encriptao dos dados usando a cifra AES para garantir a segurana da informao.

Anlise do Problema

Foi proposta na cadeira de Linguagens de Programao Dinmicas a criao de uma aplicao de Segurana Informtica que responde-se s questes propostas. Analisamos cada uma das questes de forma a dividir o problema principal em pequenos problemas. Analisando as solues existentes, definimos quais as melhores bibliotecas a utilizar com base em dois critrios: facilidade de implementao e documentao disponibilizada.

Soluo Proposta Decises ao nvel da implementao

Para facilitar o desenvolvimento da aplicao, dividimos a aplicao em pequenos programas, como por exemplo a criao de mapas, criao de PDF, criao de grficos, etc. Foram construdos esses pequenos mdulos de modo serem facilmente implementados numa nica aplicao.

Para a criao dos relatrios em PDF, foi utilizada a biblioteca ReportLab e tendo como base dos exemplos encontramos, optamos por seguir as indicaes que esto no manual, fazendo alteraes de modo ir ao encontro das nossas preferncias.

Para a base de dados com ORM, a implementao recaiu na compreenso dos dados que estavam nos Logs da Firewall e criar classes que correspondam s tabelas necessrias.

A deciso de utilizar os ficheiro KML para a visualizao dos IPs, assentou em ter dois modos para visualizar essa informao. Tendo os ficheiros KML gerados, possvel visualizar pelo browser no GoogleMaps a posio relativa aos IPs. Para visualizar a posio dos IPs no mapa, optamos por abandonar a ideia inicial de enviar a informao para o servidor da Google por dificuldades de implementao, optado assim por enviar os ficheiros por FTP para outro servidor, sendo possvel ento a visualizao dos ficheiros KML atravs de um link de acesso a esses mesmos ficheiros.

Deteco de Hosts na rede local e respectivos portos abertos

Este script pretende mostrar ao utilizador quais os hosts que se encontram na sua rede, fazendo tambm uma avaliao dos portos abertos com Multithreads dos hosts encontrados. Este script encontra-se no ficheiro network_port_scan.py.

4.1

Bibliotecas utilizadas
Para realizar este script, foi necessrio recorrer utilizao de diferentes bibliotecas. So elas: Nmap Biblioteca que ajuda o programador a usar o port scanner nmap. Para instalar esta biblioteca necessrio seguir os passos listados em: http://xael.org/norman/python/python-nmap/ Socket Este mdulo permite acesso interface de sockets BSD. Sys Este mdulo permite o acesso a algumas variveis utilizadas pelo interpretador. Threading Modulo que permite a utilizao de mltiplas threads. Queue Modulo utilizado na programao com threads.

4.2

Cdigo
O ficheiro que alberga o cdigo para deteco de Hosts e respectivos portos abertos, encontra-se em network_port_scan.py. Este script ir comear por detectar quais os hosts que se encontram na rede, ficando a cargo da funo host_scann(). () def host_scann(): nm = nmap.PortScanner() ip = raw_input("\nIndique o intervalo de IPs (ex: 192.168.1.1/24): ") print "\n-- Network Host Scan --\n" nm.scan(ip) lista_hosts = [] for host in nm.all_hosts():
7

lista_hosts.append(host) str_hosts = ' '.join(lista_hosts) print("IP: %s | Status: %s" % (host, nm[host].state())) print "\nNumero de mquinas detectadas: ",len(nm.all_hosts()) print "\n-- Fim do Network Host Scan --\n" return lista_hosts () Ao correr o programa, ir ser pedido ao utilizador que insira um intervalo de IPs a serem inspeccionados pelo scanner. O scanner ir percorrer esse intervalo de IPs e os hosts detectados na rede vo ser guardados numa lista denominada lista_hosts. A funo port_scan() ir obter a lista de hosts passada por parmetro e ser nesta funo que sero detectados os portos abertos nos hosts detectados no scan efectuado rede. Ser no portscan que iro ser usadas as multithreads. O portscan ir apenas inspeccionar o intervalo de portos 1-1024 como visvel no cdigo abaixo. () for host in hosts_list: nthreads = MAX_THREADS toscan = Queue.Queue() scanned = Queue.Queue() scanners range(nthreads)] start = 1 stop = 1024 for scanner in scanners: scanner.start() hostports = [(host, port) for port in xrange(start, stop+1)] for hostport in hostports: toscan.put(hostport) ()
8

[port_Scanner(toscan,

scanned)

for

in

Conexes UDP e TCP Activas na mquina local

Este script pretende mostrar ao utilizador quais as conexes UDP e TCP que se encontram activas na sua mquina. 1

5.1 Cdigo
O ficheiro que alberga o cdigo para detectar as conexes UDP e TCP activas, encontra-se em conexes_activas.py. Este script ir mostrar ao utilizador quais as conexes UDP e TCP activas na sua mquina local atravs da consulta s imagens de duas tabelas relativas aos dois tipos de comunicaes. Estes ficheiros esto localizados em /proc/net/udp para UDP e /proc/net/tcp para TCP. () def _load(self): with open(self.PROC_TCP,'r') as f: content_tcp = f.readlines() content_tcp.pop(0) with open(self.PROC_UDP,'r') as f: content_udp = f.readlines() content_udp.pop(0) ()

https://github.com/stalexan/netstat-monitor/blob/master/netstat.py

6 Processamento do ficheiro de Logs da Firewall


Este script ir processar o ficheiro de Logs de uma Firewall para que possa gerar e mostrar vrios tipos de informao para o utilizador. O script ir comear por abrir o ficheiro de logs (firewall_logs.csv) e identificar os IPs de entrada e de sada recorrendo a expresses regulares. Esses IPs iro para duas listas para poderem ser tratados e analisados. Sero criados vrios tipos de ficheiros para que o utilizador possa analisar a informao relativa origem dos IPs, destino dos IPs, portos, datas, horas e protocolos. Os endereos IP sero posicionados no Google Maps atravs de ficheiros kml. O programa ir ainda gerar os seguintes documentos com informao: Csv_info_ips.csv Ficheiro csv que guarda a informao relativa lista que contm a relao IP de origem IP de destino, data, hora, protocolo e porto de destino. Csv_ip_entrada.csv Ficheiro csv que guarda a informao relativa lista que contm a origem dos IPs de entrada. Csv_ip_saida.csv Ficheiro csv que guarda a informao relativa lista que contm a origem dos IPs de destino. Info_acessos.pdf Ficheiro pdf que guarda a informao relativa lista que contm a relao IP de origem IP de destino, data, hora, protocolo e porto de destino. Num_ips.pdf Ficheiro pdf que contm um grfico com o nmero de vezes que determinado IP surge no registo de logs. Num_protocolos.pdf Ficheiro pdf que contm um grfico com os protocolos mais utilizados. Origem_ip_entrada.pdf Ficheiro pdf que contm informao relativa lista que contm os dados dos IPs de entrada, nomeadamente o IP, pas, latitude e longitude.

6.1 Bibliotecas utilizadas


Para realizar este script, foi necessrio recorrer utilizao de diferentes bibliotecas. So elas:

10


6.1.1

Re Expresses regulares para encontrar os padres de informao pretendidos. Pygeoip API para fornecer informaes relativas aos IPs, como por exemplo, pases, regies, cidades, organizaes, entre outras. Csv Mdulo para ler e criar ficheiros CSV.

Cdigo

O ficheiro que alberga o cdigo para processamento dos Logs da Firewall encontra-se no ficheiro firewall_logs.py. Este script comea por fazer uma pesquisa com expresses regulares do padro src=ip e dst=ip para se obterem os IPs de source e de destino respectivamente. Esta pesquisa acontece dentro da funo pesquisa_ip(). A informao recolhida inserida em duas listas distintas. J com as listas contendo os diferentes IPs, so criadas duas funes:

trata_lista_ip_entrada() e trata_lista_ip_saida() que vo receber por parmetro as listas anteriormente criadas. Dentro destas funes, vo ser filtrados os IPs para que sejam criadas duas listas em no se repitam e apenas aparea um registo de cada IP. Estas duas listas vo ser utilizadas para gerar os ficheiros KML e informao relativa origem de cada IP. () def pesquisa_ip(): for linha in logs: pesquisa_ip_saida = re.search("dst=(.+?) ", linha) if pesquisa_ip_saida: ips_saida = pesquisa_ip_saida.group(1) lista_ip_saida.append(ips_saida) ()

() def trata_lista_ip_entrada(lista_ip_saida): pesquisa_ip_entrada_set = str(set(lista_ip_entrada))


11

lista_ip_entrada_set pesquisa_ip_entrada_set) ip_base = "192.168.36."

re.findall(r"[0-9]+(?:\.[0-9]+){3}",

lista_ips = [ip_base + str(k) for k in range(256)] for x in lista_ips: while x in lista_ip_entrada_set: lista_ip_entrada_set.remove(x) return lista_ip_entrada_set () Nesta ltima funo, definiu-se uma varivel ip_base para que se retirasse os IPs locais das listas de dados, ficando apenas registo de IPs externos rede.

As listas com os IPs e pases de origem so criadas recorrendo ao Pygeoip. Os ficheiros CSV so criados com listas de informao, criado um ficheiro CSV com esta lista de informao. () lista_paises_saida = [] for x in lista_ip_saida_set: lista_paises_saida.append(gi.country_code_by_name(x))

csv_ip_saida = open("csv_ip_saida.csv", "wb") csv_ip_saida_write = csv.writer(csv_ip_saida) csv_ip_saida_write.writerow(["IPs de sada", "Paises de destino"]) for rows in zip(lista_ip_saida_set, lista_paises_saida): csv_ip_saida_write.writerow(rows) () Estas listas de informao tambm vo servir para gerar PDFs com a informao recolhida.
12

Outro dos objectivos pretendidos era o de criar grficos com estatsticas com o objectivo de se ter uma percepo visual de alguns parmetros importantes. Foram criados dois grficos e guardados em ficheiros PDF relativos ao numero de registos dos IPs e protocolos mais utilizados. () lista_ips_num_src = [] for ip_src in lista_ip_entrada: numero_ips_src = lista_ip_entrada.count(ip_src) while ip_src not in lista_ips_num_src: lista_ips_num_src.append(ip_src) lista_ips_num_src.append(numero_ips_src)

lista_conjunto_ips_src = [] lista_conjunto_num_src = [] contador = 0 for i in lista_ips_num_src: if contador==1: lista_conjunto_ips_src.append(i) contador = 0 else: lista_conjunto_num_src.append(i) contador = 1

g = Grafico('Numero de IPs','IPs de Origem','Numero de IPs registados') g.desenhaGrafico_num_ips(lista_conjunto_ips_src,lista_conjunto_num_s rc,1) ()

13

Como referido anteriormente, o script ir recolher informaes como IPs de origem, IPs de destino, datas, horas, portos e protocolos de acesso. Essa informao capturada dentro da funo info_ip_local(). Dentro desta funo ser gerado um ficheiro CSV e PDF com as informao pretendidas. Na funo anterior eliminamos os IPs locais da rede, nesta caso iremos apenas restringir a informao aos IPs locais.

6.2 Relatrios
6.2.1 Bibliotecas Utilizadas

Para a elaborao dos relatrios em formato PDF recorremos a uma biblioteca em Python chamada de ReportLab, a escolha recaiu nesta biblioteca devido a sua flexibilidade e facilidade para a criao e a automatizao na criao de documentos em PDF desde os mais simples aos mais complexos.

O Funcionamento do ReportLab consiste em desenhar as paginas em PDF com recurso a um motor de criao de Layout de paginas, o Platyplus Page Layout and TYPography Using Scripts, que constri os documentos a partir de componentes como ttulos, pargrafos, fontes, tabelas, imagens e grficos.

A biblioteca implementa trs camadas principais:

- uma API grfica que permite desenhar paginas em PDF e adicionar ao documento muitas caractersticas dos documentos em PDF; - Grficos e uma biblioteca widgets para a criao de grficos; - Um motor para criar layouts flexveis Platyplus.

6.3

Cdigo
O objectivo passa pela criao de 3 ficheiros PDF, info_acessos.pdf, origem_ip_entrada.pdf e origem_ip_saida.pdf. O primeiro passo a

14

construo da estrutura do documento PDF definindo um template, onde ser desenhado os titulo, linhas imagens. ... canvas.drawImage(self.logo, 12.5*cm,23.5*cm,width=6*cm,height=4*cm) canvas.setFont("Times-Roman", 20) canvas.drawString(2.7*cm,22.3*cm,"Informao da Rede") canvas.rect(2*cm,2*cm,17.1*cm,26*cm, fill=0) ... doc = BaseDocTemplate("info_acessos.pdf", pagesize=A4) exemplo

Ao template vamos adicionar uma Frame, que tem como funo ser a zona do documento onde escrita a informao que vem da Lista. A particularidade desta Frame a seguinte, ao escrever a informao na Frame ao fim da zona que esta definida para ser escrito a informao automaticamente cria um novo PDF onde escrita a restante informao contida na lista. ... frame = Frame(

2.5*cm,3*cm,16*cm,15.5*cm,id='frame',showBoundary=1 ) template = PageTemplate(id='test', frames=frame,

onPage=self.Pagina) doc.addPageTemplates(template) ... O processo de escrita da informao bastante simples, passa por percorrer a lista e adicionar o seu contedo a uma lista que adicionada a uma lista que compilada para ser inserida na Frame ... for i in lista: bogustext = (i)
15

p = Paragraph(bogustext, style) Story.append(p) Story.append(Spacer(2,0.2*cm)) doc.build(Story) . O processo numa viso mais simplificada, passa por receber a informao que pretendemos por uma lista e adicionar essa informao ao PDF.2

6.3.1

Bibliotecas Utilizadas

Para a elaborao dos Mapas Geogrficos utilizamos varias bibliotecas para cada um dos procedimentos que necessrio realizar. Vamos separar por procedimentos para melhor explicar todo o processo de elaborao dos Mapas.

Criao dos ficheiro KML Para a criao dos ficheiros KML com a informao dos IP utilizamos a biblioteca pygeoip e a simplekml. A biblioteca pygeoip permite atravs do cruzamento do IP com a a informao da base de dados e identificar o local de acesso do IP. Fornece informao sobre o pais, cidade, regio, latitude e longitude. A biblioteca simplekml uma biblioteca em python que permite gerar ficheiro kml, a grande vantagem e que Evita ter de perceber o funcionamento dos ficheiros KML o que resulta numa poupana de tempo. Apresenta uma grande variedade de funes que permitem configurar o ficheiro KML.

Upload de ficheiro KML Para o envio de ficheiros para o servidor utilizamos o biblioteca de python ftplib. Esta biblioteca implementa a ligao entre do cliente e o servidor pelo protocolo FTP, automatizando o processo de envio de ficheiros para o servidor

Visualizao dos ficheiros KML no GoogleMaps


2 A base de desenvolvimento foi o ReportLab PDF Library - User Guide - ReportLab Version 2.6
e as paginas da web

16

Para abrir o link que corresponde endereo vamos recorrer a uma biblioteca em Python designada por webbrowser. A biblioteca webbrowser fornece uma interface de alto nvel para exibir documentos na web, o que a torna fcil de utilizar bastando passar por argumento o endereo que se pretende abrir

6.3.2

Cdigo

O procedimento para gerar os ficheiros KML, consiste em passar como paramento o endereo IP para dentro da funo gip.record_by_name(p) de biblioteca pygeoip que retorna uma lista com a informao referente ao IP. Para solucionar o problema dos IP que no esto na base de dados e feito uma validao a dimenso do retorno da lista ou seja quando o retorno tiver uma dimenso 0 esse IP e descartado no sendo includo no ficheiro KML. No ficheiro KML vai ser inserir o IP com a longitude e latitude atravs da funo newpoint() da biblioteca simplekml. Como vamos ter dois ficheiros kml um para os IP de entrada outro para os IP de Sada e feita uma validao com base no tipo de lista que passada por parmetro. Cada ficheiro que gerado tem um nome nico para solucionar o problema encontrado no refresch do GoogleMaps. ... kml = simplekml.Kml() for p in listaIP: rec = gip.record_by_name(p) if len(rec) == 0: print p, " - IP Desconhecido" else: longitude = rec['longitude'] latitude = rec['latitude'] location = [rec['city'],rec['region_name'], rec['country_name']] long_lat = [rec['longitude'],rec['latitude']] p = kml.newpoint(name = p, coords=[(rec['longitude'], rec['latitude'])])
17

now = datetime.datetime.now() if a == 0: fileName="in_ip_%s%s%s.kml" now.second) else: fileName="out_ip_%s%s%s.kml" now.second) kml.save(fileName) return fileName ... Para o ulpoad dos ficheiros para o servidor seguimos o seguinte procedimento: - fazemos o login ao servidor - abrir o ficheiro KML com os ip de entrada - enviamos em formato binrio o contedo do ficheiro - abrir o ficheiro KML com os ip de sada - enviamos em formato binrio o contedo do ficheiro - fechamos a ligao ao servidor - fechamos os ficheiro. ... try: ftp = ftplib.FTP('ftp.mapas.freeserver.me') ftp.login('u970507521','melides007') f = open(fileName_entrada,'rb') % (now.month,now.minute, % (now.month,now.minute,

ftp.storbinary('STOR '+fileName_entrada,f,1024) f = open(fileName_saida,'rb') ftp.storbinary('STOR '+fileName_saida,f,1024) except ftplib.all_errors: print 'Erro no Login para o Servidor FTP'
18

except IOError: print 'Erro na abertura do Ficheiro' else: ftp.quit() f.close() print "Ficheiro enviado para o servidor" ...

Para abrir o endereo corresponde-te da cada ficheiro KML utilizamos a passagem por parmetro do nome do ficheiro ao qual e adicionado o endereo do GoogleMaps e do servidor que contem os ficheiros KML. webbrowser.open_new('https://maps.google.com/maps?q=http://map as.freeserver.me/'+fileName_entrada)

webbrowser.open_new('https://maps.google.com/maps?q=http://map as.freeserver.me/'+fileName_saida)

...

19

Base de Dados com ORM

7.1 Bibliotecas utilizadas


Para o mdulo de Base de Dados com Object Relational Mapper (ORM) utilizamos o SQLAlchemy. A escolha recaiu por ser o que tinha melhor documentao e facilidade de utilizao.

A utilizao de ORM vem simplificar a utilizao de comandos SQL, atravs da utilizao de uma interface de programao que faz essa parte. Sendo as tabelas criadas atravs da definio de Classes e os registos de cada tabela atravs de instancias de cada classe correspondente.

O SQLAlchemy considera a base de dados de uma forma diferente, e vista como um sistema relacional e no um coleco de tabelas, apresentado um mtodo de relacionar atravs de classes em Python com as tabelas da Base de Dados. Inclui um sistema que sincroniza todas as alteraes entre os objectos e as colunas, para as consultas a base de dados existe um sistema de expresses em funo das classe definidas pelo programador.

7.2 Cdigo
O procedimento inicial passa por efectuar a ligao a uma base de dados que suporte ORM, foi escolhida o SQLite. Sendo o processo simplificado atravs da indicao do nome da base de dados e com a criao de sesso de ligao. try: """ Testa a ligao a Base Dados """ print "\n-- Ligao ao SQLLite -- \n" engine = create_engine('sqlite:///database') Session = sessionmaker(bind=engine)
20

session = Session() except: print "ERRO - Falhou na ligao ao SQLite - " exit(0)

Para criao das tabelas definiu-se as classes ... class IPSaida(Base): """ Constroi a tabela InSaida @author: Francisco Chainho, Nelso Ventura,Jose Ramos @version: 0.1 @file DataBase.py @date: 15-04-2013 """ __tablename__ = 'IPSaida' id = Column(Integer, Sequence("IPSaida_id_seq"),primary_key=True) ip_destino = Column(String) paises = Column(String) def __init__(self,ip_destino,paises): self.ip_destino = ip_destino self.paises = paises

def __repr__(self): return "<InfoIP(%s,%s, %s, %s,%s, %s)>" %

(self.ip_destino,self.paises)

21

Para criar as tabelas ... Base.metadata.create_all(engine) ... Como exemplo de um acesso a base de dados temos so seguinte codigo. Uma forma simples de apagar toda a informao da tabela sem recorer a comandos SQL. ... def apaga_ip_saida(): """ Apaga a Informao da tabela IPSaida """ # Apagar dados for all in session.query(IPSaida).all(): session.delete(all) session.commit() ... O processo de introduo de informao nas tabelas semelhante, recebendo por parmetro as variveis que so introduzidas. A facilidade com se faz todas as operaes facilita a programao porque.... def insere_info_ip(ip_origem,ip_destino,data,hora,protocolo,porto): """ Insere informao na tabela InfoIP

@param ip_origem: IP de origem @param ip_destino: IP de destino @param data: Data @param hora: Hora
22

@param protocolo: Protocolo @param porto: Porto """ session.add(InfoIP(ip_origem,ip_destino,data,hora,protocolo,porto)) session.commit() ...

7.3 Produo de Relatrios


7.3.1 Bibliotecas Utilizadas

Para a elaborao dos relatrios em formato PDF recorremos a uma biblioteca em Python chamada de ReportLab, a escolha recaiu nesta biblioteca devido a sua flexibilidade e facilidade para a criao e a automatizao na criao de documentos em PDF desde os mais simples aos mais complexos. O Funcionamento do ReportLab consiste em desenhar as paginas em PDF com recurso a um motor de criao de Layout de paginas, o Platyplus Page Layout and TYPography Using Scripts, que constri os documentos a partir de componentes como ttulos, pargrafos, fontes, tabelas, imagens e grficos. A biblioteca implementa trs camadas principais: - uma API grfica que permite desenhar paginas em PDF e adicionar ao documento muitas caractersticas dos documentos em PDF; - Grficos e uma biblioteca widgets para a criao de grficos; - Um motor para criar layout flexiveis Platyplus.

7.3.2

Cdigo

objectivo

passa

pela

criao

de

ficheiros

PDF,

info_acessos.pdf,

origem_ip_entrada.pdf e origem_ip_saida.pdf. O primeiro passo a construo da

23

estrutura do documento PDF definindo um template, onde ser desenhado os titulo, linhas imagens.
...

canvas.drawImage(self.logo, 12.5*cm,23.5*cm,width=6*cm,height=4*cm) canvas.setFont("Times-Roman", 20) canvas.drawString(2.7*cm,22.3*cm,"Informao da Rede") canvas.rect(2*cm,2*cm,17.1*cm,26*cm, fill=0) ... doc = BaseDocTemplate("info_acessos.pdf", pagesize=A4)
exemplo

Ao template vamos adicionar uma Frame, que tem como funo ser a zona do documento onde escrita a informao que vem da Lista. A particularidade desta Frame a seguinte, ao escrever a informao na Frame ao fim da zona que esta definida para ser escrito a informao automaticamente cria um novo PDF onde escrita a restante informao contida na lista. ... frame = Frame( 2.5*cm,3*cm,16*cm,15.5*cm,id='frame',showBoundary=1 ) template = PageTemplate(id='test', frames=frame, onPage=self.Pagina) doc.addPageTemplates(template)
...

24

O processo de escrita da informao bastante simples, passa por percorrer a lista e adicionar o seu contedo a uma lista que adicionada a uma lista que compilada para ser inserida na Frame ... for i in lista: bogustext = (i) p = Paragraph(bogustext, style) Story.append(p) Story.append(Spacer(2,0.2*cm)) doc.build(Story) . O processo numa viso mais simplificada, passa por receber a informao que pretendemos por uma lista e adicionar essa informao ao PDF.

25

Autenticao e encriptao na aplicao

8.1 Bibliotecas utilizadas


Para uma maior segurana na aplicao, decidiu-se encriptar os registos de login na base de dados, nomeadamente o campo da Password dos utilizadores utilizando a cifra AES.3 AES (Advanced Encryptation Standard) uma metodologia de criptografia de chave simtrica. Este tipo de criptografia utiliza chaves criptogrficas relacionadas com as operaes de cifragem e decifragem dos dados. Na prtica, a chave serve como um segredo partilhado entre as partes que necessitam dela para ter acesso informao. Neste caso, ser guardada uma chave na base de dados para que seja possvel cifrar e decifrar os dados (password). possvel ao utilizador escolher se quer eliminar as chaves j existentes na tabela. possvel inserir a mesma password, com chaves diferentes, para que as hash finais sejam diferentes umas das outras, mesmo sendo o valor das passwords o mesmo, isto porque as chaves sero diferentes. Para ser possvel a cifragem dos dados, foram utilizados os seguintes mdulos: Crypto.Cipher Modulo de criptografia para Python Base64 Modulo especifico de codificao e descodificao.

criada dentro do ficheiro aes_cript.py uma classe Cifra que contm duas funes: encode() e decode(). class cifra: def __init__(self,chave): tamanho_bloco = 32 padding = '{' pad = lambda s: s + (tamanho_bloco - len(s) % tamanho_bloco) * padding self.EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) self.DecodeAES = lambda c, e:

http://www.codekoala.com/blog/2009/aes-encryption-python-using-pycrypto/

26

c.decrypt(base64.b64decode(e)).rstrip(padding) self.secret = chave self.cipher = AES.new(self.secret) def encode(self,string): encoded = self.EncodeAES(self.cipher, string) return encoded def decode(self,encoded): decoded = self.DecodeAES(self.cipher, encoded) return decoded

Na funo encode(), passado por parmetro a string a encriptar, enquanto que na funo decode() passado por parmetro a varivel com a password cifrada a ser decifrada. A adicionar a esta seco do programa, junta-se a parte de login da aplicao situada no ficheiro sql_login_encript.py. Neste ficheiro usado o seguinte mdulo: Sqlite3 Gestor de Base de Dados

Este ficheiro ir gerir toda a base de dados relativa ao Login. O utilizador no menu da aplicao, tem a possibilidade de apagar toda a base de dados, bem como inserir novos valores. def createBLOB(self): connection = sqlite3.connect(self.database) cursor = connection.cursor() stmt = ('''CREATE TABLE if not exists "chave_aes"(id INTEGER PRIMARY KEY AUTOINCREMENT, chave BLOB)''') cursor.execute(stmt) connection.commit() connection.close()

27

O exemplo de cdigo acima transcrito mostra a funo createBLOB() que ir criar a tabela chave_aes. Nesta tabela, o campo que vai guardar a chave do tipo BLOB.

28

9 Interface Grfica
Para criar a interface grfica utilizamos a ferramenta Glade4, associada ao Quikly5, quenospermitiucriaratravsdeumaAPI(ApplicationProgrammingInterface)toda aestruturacomoobjectivodetornaraaplicaomaisfcildeutilizar.

9.1 Bibliotecas Utilizadas


Tanto o Glade como o Quikly geram automaticamente toda a estrutura de bibliotecas ou seja baseia se na biblioteca GTK, que uma biblioteca grfica do GNOME, ambiente grfico do Ubuntu e Debian, mas que tambm est disponvel paraoutrosambientescomoporexemplooKDE,outrasbibliotecasinstaladasneste trabalho foram o libglade20, libglade2dev, libgtk2.00, libgtk2.0dev, python glade2,pythongtk2eopythongtk2dev.
9.1.1 Cdigo

No excerto de cdigo abaixo transcrito podese ver a funo que permite inicializar ainterfaceassimcomocriarainteracodaaplicaocomoutilizador. def finish_initializing(self, builder): # pylint: disable=E1002 super(LpdinterfaceWindow, self).finish_initializing(builder) self.AboutDialog = AboutLpdinterfaceDialog self.PreferencesDialog = PreferencesLpdinterfaceDialog

Dentro da funo so inicializados os objectos da interface e as suas respectivas aces.

4 5

http://wingware.com/doc/howtos/pygtk?gclid=CM3Zwr3r1LYCFfQetAodGEcANg https://wiki.ubuntu.com/Quickly#Installation

29

self.entry_ip = self.builder.get_object("entry_ip") self.bt_detect_hosts_ports = self.builder.get_object("bt_detect_hosts_ports") self.ger_bd = self.builder.get_object("ger_bd") self.bt_detect_conect_act = self.builder.get_object("bt_detect_conect_act") Socriadasasfunescomosatributosrecebidosporparmetro,

def on_refreshbutton_clicked(self, widget): self.ip_label.set_text(self.entry_ip.get_text()) ip = self.entry_ip.get_text() print ip Com o intuito de facilitar na utilizao da aplicao, um dos nossos objectivos passou por mostrar automaticamente e no incio da aplicao, toda a informao disponveldaredeemqueaferramentaestligada. O prximo excerto de cdigo permite mostrar ao utilizador, na linha de comando, essainformao; def header(): call('reset') print "[*] Aguarde ........\n" print "############Dados_Ligacao_Actual###################\n"
30

cod

urllib2.urlopen('http://www.yougetsignal.com/tools/network-

location/php/get-network-location-json.php').read() # captura o codigo fonte dados = json.loads(cod) # carregamos no json dic = {'status':'Status', 'ipAddress':'Endereco IP', 'hostname':'Nome do host', 'baseDomain':'Dominio', 'countryCode':'Codigo', 'countryName':'Pais', 'city':'Cidade', 'latitude':'Latitude', 'longitude':'Longitude', 'areaCode':'Codigo de area', 'postalCode':'Codigo postal'} for i in dic: print dic[i], json.dumps(dados[i]) # lengenda+informacao print "###################################################\n" header() def getNetworkIp(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

31

s.connect(('google.com', 0)) print s.getsockname()[0] getNetworkIp()

Recorremos ao site you get signal6 que uma ferramenta de localizao de rede, e umutilitrioqueseaproximaemostraalocalizaogeofsicadonossoendereode redenummapadoGoogle.

9.2 Execuo da aplicao por interface grfica


Para tirar o mximo partido da ferramentaexiste uma sequncia de procedimentos que o utilizador tem de efectuar. Com o IP da mquina em que est a correr a aplicao, o utilizador tem de inserir no campo de pesquisa de IP a gama de IP que desejapesquisar.SenoexistirumIPnacaixadepesquisaaaplicaonoavanae avisanalinhadecomandoparainserirumIP.Nocasodaanalisedoslogsdafirewall desde que exista um ficheiro com dados a aplicao avana, caso contrario informa outilizadordoinsucessodopedido. A manuteno da base de dados feita em linha de comando e o suporte um menudeopes. Todas as exportaes, CSV, PDF e estatsticas so directamente activadas pelos respectivosbotes. Ter em ateno que sem existir uma primeira anlise vlida, estes ficheiros no existem. Existeummanualdoutilizadornoprojectoqueapoiaautilizaodaferramenta

http://www.yougetsignal.com/tools/network-location/

32

9.3 Execuo da aplicao por linha de comando


A aplicao inicializada na pasta onde residem os ficheiros .py (/SRC), pelo comando $ python programa.py. Quando a ferramenta inicia, o utilizador tem ao seu dispor um menu de opes que pode escolher. Na primeira utilizao o utilizador deve fazer login com o username root e a password toor, credenciaispordefeito.Deseguidadevecriarumnovoutilizador. Aps estes passos j tem permisses para efectuar todas as anlises a rede que desejar. Autilizaointuitivaeemcasodedvidadeveleromanualdeutilizao.

9.4 Principais Dificuldades


As principais dificuldades foram encontradas na utilizao das ferramentas na criao da interface, embora intuitivas, foram difceis de juntar ao cdigo criado em Python. Estas dificuldadesforamcolmatadascommuitapesquisa ecomoelevadoaumentodeinteresse, que se ia adquirindo na evoluo positiva dos resultados. A definio da forma como a informao ia ser escrita em varias pginas, mantendo o mesmo layout nas vrias paginas ondeseinseriaainformao.ParasolucionaresseproblemaadicionamosumaFrameonde escrita a informao. Outra dificuldade passou por definir a forma como se ia construir o cdigo, porque nas pesquisas que realizamos encontramos varias forma de fazer os mesmos procedimentos para a criar o PDF. Dificuldades A compreenso do modo de funcionamento do ORM, quanto a utilizao SQLAlchemy no existiram muitos problemas visto existir muito documentao e as operaes que pretendiamos realizar no apresentaremgrandecomplexidade.AmelhorformadevisualizarosIPnummapa.Existem vriasformasdegerarosmapasgeogrficosdaitersidonecessrioobterconhecimentodo seu funcionamento. A ideia inicial passou por criar um ficheiro kml com os ip que seria enviado para o servidor da GoogleMaps que o ia abrir no browser. Esta ideia foi afastada devido a dificuldade ao enviar ficheiro KML para o servidor. Para isso optamos por enviar para um servidor ftp e abrir o ficheiro KML de outra forma. Encontramos outro problema no GoogleMaps que diz respeito ao refresh dos mapas, sem justificao esse refresh no era feito, ou seja cada vez que crivamos um ficheiro KML e o enviavamos para o servidor com nova informao ela no ser actualizado pelo GoogleMaps, para solucionar esse problema criamos um ficheiro KML sempre com um nome diferente que enviado para o 33

servidor. A definio da forma como a informao ia ser escrita em varias pginas, mantendoomesmolayoutnasvriaspaginasondeseinseriaainformao.Parasolucionar esse problema adicionamos uma Frame onde escrita a informao. Outra dificuldade passou por definir a forma como se ia construir o cdigo, porque nas pesquisas que realizamos encontramos varias forma de fazer os mesmos procedimentos para a criar o PDF.

34

10 Trabalho futuro
Rever algumas classes e funes da aplicao assim como adicionar novas classes para tornar o cdigo mais estruturado. Melhorar a interaco da aplicao grfica com os dados do ficheiro de logs da firewall, assim como dos mapas de IPs.

35

11 Concluso
A elaborao deste projecto permitiu-nos aumentar os conhecimentos no que respeitante as linguagens de programao dinmicas nomeadamente a linguagem de programao python. No decorrer da elaborao do projecto e do relatrio foram verificadas algumas dificuldades, que acabaram por ser ultrapassadas sem grandes constrangimentos. A aplicao desenvolvida foi construda na linguagem Python, destina-se a detectar portos de rede de vrias mquinas, que se encontram disponveis numa determinada rede local, determinar que conexes se encontrem activas numa determinada mquina, processar os ficheiros de log das firewall locais tentando obter informao sobre tentativas de acesso, nomeadamente listas de origem por pas, data e horas de tentativas de acesso, assim como outras informaes. A ferramenta foi projectada para uso em linha de comando apoiada por uma interface grfica. A aplicao esta apta a gerar relatrios em PDF, CSV, grficos com estatsticas e mapas geogrficos, tem a vantagem de processar informao baseada em ORM de e para uma base de dados SQL, assim como uma autentificao personalizada com encriptao de dados. Acreditamos ter cumprido todos os objectivos inicialmente propostos.

36

12 Bibliografia
http://docs.sqlalchemy.org/en/rel_0_8/index.html Release: 0.8.0 | Release Date: March 9,2013 http://www.slideshare.net/brunogamacatao/python05 Python 05 by Bruno Cato on Sep 26,2012 http://jucacrispim.wordpress.com/2009/12/07/pequenaintroducaoaosqlalchemy/ PequenaintroduoaosqlalchemyJucaCrispimdezembro7,2009 http://www.slideshare.net/ramiroluz/sqlalchemyamagiadomapeamentoobjeto relacionalpresentation SQLAlchemy A magia do mapeamento objeto relacional. by RamiroBatistadaLuzonOct23,2008 http://mapfish.org/doc/tutorials/sqlalchemy.htmlSQLAlchemytutorial http://www.rmunn.com/sqlalchemytutorial/tutorial.html A stepbystep SQLAlchemy tutorial http://pt.wikipedia.org/wiki/Mapeamento_objetorelacional relacionalde23demarode2013 http://code.google.com/p/pygeoip/wiki/UsagepygeoipUpdatedSep22,2011 http://dev.maxmind.com/geoip/install/city#Step_3__Query_database2 GeoIP City DatabaseInstallationInstructions https://pypi.python.org/pypi/pygeoip/pygeoip0.2.6 http://simplekml.readthedocs.org/en/latest/genindex.html# simplekml documentation 2012,KyleLancaster http://code.google.com/p/simplekml/ A python package for creating basic KML 16 December2012 http://docs.python.org/2/library/webbrowser.html webbrowser Convenient Web browsercontroller http://effbot.org/librarybook/ftplib.htmTheftplibmoduleIainDuncan(20070111) Mapeamento objeto

37

http://docs.python.org/2/library/ftplib.html#ftptlsobjectsftplibFTPprotocolcliente http://mail.python.org/pipermail/tutor/2006November/050895.html paulino1 at sapo.pt paulino1atsapo.ptMonNov1320:40:55CET2006 http://www.reportlab.com/docs/reportlabuserguide.pdf ReportLab PDF Library User GuideReportLabVersion2.6 git.alucinados.com/?p=openticket.git;a=patch;h=3a9384ee38dd18287c48a05660bfdaaa622 b24a7From:MarceloJorgeVieira(metal)[email protected]:Thu,16Apr2009 00:47:480300 Violent Python A Cookbook for Hackers, Forensic Analysts, Penetration Testers and SecurityEngineers,TJ.OConnor

38

Você também pode gostar