Paquetes TCP/UDP, conexiones de red, interfaces...
Hola a todos, recientemente me he puesto a estudiar las posibilidades de java como sniffer, asi que voy a poner lo que he aprendido, en unos cuantos tutoriales, y acabremos haciendo un sniffer.
Primero de todo decir que para todo esto estoy usando la libreria:
JPCAP -------> http://netresearch.ics.uci.edu/kfujii/jpcap/doc/download.html
Bien cabe comentar tambien que para ejecutar los ejemplos de los tutos, hace falta hacerlo bajo ROOT, asi que si no funciona, una psoible causa es esa.
Bien en el primer tutorial vamos a crear una mini-aplicacion tipo iwconfig-ifconfig que nos enumere todas las interfaces conectadas al equipo, bien empecemos:
Primero de todo hay que crear la lista de dispositivos, encapsulando la clase NetworkInterface a modo de array o matriz (para luego leer los interfaces usando un indice sencillo):
Código
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
Le asignamos a la matriz todos los dispositivos mediante el metodo getDEviceList() de la clase JpcapCaptor.
Una vez hecho estoy, vamos a recorrer el array con un bucle logico usando como limitador el length (longitud) del array:
Código
for (int i = 0; i < devices.length; i++)
Muy sencillo, y ahora una vez estamos recorriendo vamos a mostrar informacion de los dispositivos, usando los metodos NetworkInterface:
Código
//Metodo name para sacar el nombre la interface System.out.println("Nombre de interface: "+devices[i].name + "\n======================================\n" + devices[i].description); //Metodo datalink_name para sacar el nombre de este System.out.println("Nombre del datalink: "+devices[i].datalink_name + "\n==========================================\n" + devices[i].datalink_description+".\n"); //Esta claro no? xD for (byte b : devices[i].mac_address)
Bien con etso ultimo hemos visto de manera completa, como sacar información de todos los dispositivos de red que haya conectados al equipo, vamos a profundizarlo un poquito mas:
Código
Con eso, como es evidente, sacaremos la direcion de red, ip, mascara de red y demás.
for (NetworkInterfaceAddress a : devices[i].addresses)
Mmm esto esta muy bien, pero... yo quiero jugar con la red diran otros, pues os diré que esto lo reservo para el siguiente tuto, pero os pondre un pequeño adelanto para que vallais jugando y probando cosas si, quereis claro...
Vamos a leer 10 paquetes de red en un puerto determinado y una interface concreta:
Código
Como veis, el bucle se para en el decimo loop, y como leemos un paquete por loop, solo leemos 10 paquetes,y lo hacemos sobre la interface (hay que marcara que indice de interface con el int indice que correpsonde al indice del array).
JpcapCaptor captor=JpcapCaptor.openDevice(device[indice], 65535, false, 1); for(int i=0;i<10;i++){ //Capturamos un paquete y lo muestreamos } captor.close();
En el puerto 65535, aqui escojemos que puerto queremos sniffar, leer, o escribir en un futuro no muy lejano paquetes.
El tercer parametro no es relevante ahora, pero ma starde lo explicaré.
El cuarto parametro es el que nos indica cuantos paquetes por cada llamada a getPacket() leemos, si ponemos envezde uno, 20, leeremos 20 paquetes por cada llamada a getPacket(), y por tanto 20 paquetes por loop, lo que viene a ser 10*20 = 200 paquetes.
Bueno, ahora os dejo un ejemplo para escritura de paquetes:
Código
JpcapSender sender=JpcapSender.openDevice(devices[index]); TCPPacket p=new TCPPacket(12,34,56,78,false,false,false,false,true,true,true,true,10,10); p.setIPv4Parameter(0,false,false,false,0,false,false,false,0,1010101,100,IPPacket.IPPROTO_TCP, p.data=("data").getBytes(); EthernetPacket ether=new EthernetPacket(); ether.frametype=EthernetPacket.ETHERTYPE_IP; ether.src_mac=new byte[]{(byte)0,(byte)1,(byte)2,(byte)3,(byte)4,(byte)5}; ether.dst_mac=new byte[]{(byte)0,(byte)6,(byte)7,(byte)8,(byte)9,(byte)10}; p.datalink=ether; sender.sendPacket(p); sender.close();
El codigo anterior, lo que hace es enviar un paquete en la interfaz de red (paquete de tipo TCP/IPv4/Ethernet), usando unos puertos determinados, entre dos hosts.
En el proximo tutorial aprenderemos a:
- Envio y lectura de paquetes completo (en este casi solo he puesto code).
- Escritura de los paquetes leidos en un fichero, asi como lectura de los paquetes:
- Filtros de lectura de paquetes, para nuestro programa y tambien para wireshark y otros.
Cuando acabe todo pondre el source de mi sniffer de red, en java bajo ide netbeans para que todos se beneficien y aprendan.
Un saludo y gracias por aguantarme xD (que leer esto no es moco de pavo)