OK, então você usa linux e conhece o ‘top‘, item básico no repertório de qualquer sysadmin, que permite acompanhar algumas informações sobre a carga do sistema e processos. Essa ferramenta antiga e poderosa, é de uma idéia tão simples porem tão prática, que ganhou um termo para designar ferramentas semelhantes, ferramentas “top-like“.
Para se enquadrar em uma ferramenta top-like o candidato tem que:
Fiz uma lista com 16 ferramentas top-like disponíveis no Ubuntu 9.04. Enquanto fazia a pesquisa, encontrei pelo menos mais meia dúzia sem pacotes para o ubuntu, e se for considerar as que eu não encontrei esse número deve subir consideravelmente.
Na tarde de sábado eu precisava pegar as portas abertas no servidor, da forma mais Real Time possível. Primeira idéia? Naturalmente, foi parsear o resultado do netstat e ‘grepar’ o LISTEN ou OUÇA, mas depois imaginei que beber diretamente da fonte pudesse fazer o negócio andar mais rápido. Pesquisa daqui, pesquisa dali, aparentemente o netstat pega suas informações dos arquivos em /proc/net.
Após umas horinhas consegui o protótipo inicial do código que preciso. Mas durante a caminhada perdi o foco e acabei brincando um pouco mais com o /proc/net/tcp, no fim tinha um netstat simplificado feito em Python.
Então se alguém algum dia precisar recuperar informações de conexões ao estilo netstat aí está o código:
#!/usr/bin/python # Criado por Ricardo Pascal, qualquer dúvida ou # contribuição mande para 'pascal.linux' no gmail! # Pode usar a vontade só lembre-se de citar a autoria ;) # Agradecimento ao pessoal do #python-br na freenode. # A galera lá sempre ajuda. PROC_TCP = "/proc/net/tcp" STATE = { '01':'ESTABLISHED', '02':'SYN_SENT', '03':'SYN_RECV', '04':'FIN_WAIT1', '05':'FIN_WAIT2', '06':'TIME_WAIT', '07':'CLOSE', '08':'CLOSE_WAIT', '09':'LAST_ACK', '0A':'LISTEN', '0B':'CLOSING' } tcp_FH = open(PROC_TCP,'r') content = tcp_FH.readlines() content.pop(0) # remove header tcp_FH.close() def hex2dec(s): return int(s,16) def ip(s): return str(hex2dec(s[6:8])) +"."+ str(hex2dec(s[4:6])) +"."+ \ str(hex2dec(s[2:4])) +"."+ str(hex2dec(s[0:2])) def remove_empty(list): return [x for x in list if x !=''] def get_list(c): result = [] result.append(['ID','IP','PORT','rIP','rPORT','STATS']) for lines in content: line_array = remove_empty(lines.split(' ')) line = [line_array[0], line_array[1].split(':'), \ line_array[2].split(":"),line_array[3]] line = [line[0], ip(line[1][0]), hex2dec(line[1][1]), \ ip(line[2][0]), hex2dec(line[2][1]), STATE[(line[3])]] result.append(line) return result if __name__ == '__main__': for lines in get_list(content): print lines |
PS. Quando eu tiver tempo eu refaço a cama de gato que ta ali na função get_list() e ip().
Em 2007 eu fiz uma experiência com modens/routers. A pesquisa englobou links estáticos e dinâmicos de uma fornecedora de internet aqui do Sul. Eu escaniei 65.025 possíveis hosts, procurando por equipamentos com as portas 23/80 (que pode caracterizar um router) e testei uma amostra dos resultados utilizando as senhas padrões dos dispositivos.
O trabalho foi bem manual e me tomou aproximadamente 2 semanas porem trouxe algumas conclusões interessantes, como por exemplo:
dentre o pessoal que usa 3com o habito de trocar a senha padrão é bem maior se comparado ao pessoal que usa dlink. Mas isso é bem óbvio né? E dentre os dlinks somente 30%~40% trocava as senhas dos equipamentos. Isso significa que 6 ou 7 em cada 10 pessoas com dlinks mantinham a senha default.
Nos últimos 2 meses tem se falado muito a respeito de uma botnet de modens/routers, segundo as informações disponíveis ela compreende um grupo de equipamentos que permite ao atacante instalar um ‘novos software’ com alguma facilidade. Depois de instalado, esse worm se conecta a canais de mirc a espera de comandos do dono da botnet. Alem é claro de procurar novos equipamentos para infectar, inclusive testando as senhas default.
Eu resolvi repetir a experiência em menor escala. Como da ultima vez, escrevi um código que busca por routes/modens, e em seguida tenta logar no equipamento e me retornar o DNS usado. Fiz o script baseado em um Router DL-500B. E qual a surpresa?
Em 255 hosts estáticos escaniados encontrei 16 possíveis roteadores, 8 deles eram DL-500B e 5 deles logaram com a senha default e me retornaram o DNS. Pois é, nos últimos 2 anos as coisas não mudaram muito.
Você percebe a gravidade dessa situação? Só para citar como exemplo a questão do DNS, alguém mal intencionado poderia trocar os servidores DNS do equipamento, por um DNS próprio que aponte para sites falsos. Dessa forma seria bem fácil roubar usuários e senhas de serviços populares como o gmail, hotmail, ou até mesmo dados bancários. Considerando ainda que os links estáticos dessa fornecedora são para uso empresarial a situação fica ainda pior.
Para quem ficou curioso, a base do script que faz o scan é essa:
#!/usr/bin/python import os import re rede = 'x.x.x.' for i in range(255): final = str(i) tmp = os.popen("nmap -PN -p80,23 " +rede+final).read() if (re.search("open telnet",tmp)!=None) and (re.search("open http",tmp)!=None): print "Provavelmente um router: ",rede+final |
Já o resto do script eu não vou postar, para evitar que os kids façam bobagem!
* Achado em algum site por aí !
O Servidor
cat perl-srv.pl
use IO::Socket;
my $sock = new IO::Socket::INET (
LocalHost => ‘localhost’,
LocalPort => ‘7070′,
Proto => ‘tcp’,
Listen => 1,
Reuse => 1,
);
die ” Nao foi possivel criar um socket” unless $sock;my $new_sock = $sock->accept();
while (<$new_sock>) {
print $_;
#$new_sock = $sock->accept()
}
close($sock);
O Cliente
cat perl-cli.pl
use IO::Socket;
my $sock = new IO::Socket::INET (
PeerAddr => ‘localhost’,
PeerPort => ‘7070′,
Proto => ‘tcp’,
);
die “Nao foi possivel criar o socketn” unless $sock;print $sock “1 2 3 testandon”;
close($sock);
A algum tempo atrás precisei escrever um pequeno script em perl para envio de e-mails, o objetivo era criar um sistema de alerta personalizado para uma empresa em que trabalhava.
Vasculhando a internet encontrei dúzias de código que se propunham a resolver meu problema, grande parte era falho, ou tinha alguma limitação.
O c-kermit é um software que faz conexões dos mais diversos tipos, tanto conexões de rede quanto conexões seriais e além disso ainda lhe permite escrever macros(scripts) que realizam virtualmente qualquer ação humana de forma automatizada. O slogan do projeto é: Portable Scriptable Network and Serial Communication Software for Unix and OpenVMS.

