Descubrir equipos en una Red Local con Python (ipcalc y scapy).

Posted on lun 22 abril 2013 in Tutorial Python • 2 min read

Si se tiene una red con asignación abierta de IPs, la administración se hace algo complicada, así que se necesita tener un registro de la asignación de IPs a los equipos de la red local.

Una amiga administradora hizo un registro con una herramienta propietaria en Windows. Recordé la librería de python ipcalc que facilita el cálculo de direcciones IP y redes (un artículo de su uso acá).

Además existe la librería o herramienta scapy, el cual permite capturar y modificar paquetes de red (la documentación se puede revisar en el siguiente enlace).

Una alternativa es usar los comandos ping y arp por medio de python con el módulo commands; es preferible usar scapy que permite descubrir la dirección MAC de los equipos que tienen asignado las IPs.

Así que por un lado se usa ipcalc para definir el rango de la red según la mascara y luego con scapy se descubre las direcciones MAC.

A continuación el código que devuelve la dirección MAC de cada IP utilizada en la red:

#!/usr/bin/env python

#Se importa los modulos necesarios.

from ipcalc import IP, Network

from scapy.all import srp,Ether,ARP,conf

#Se desactiva el verbose de la captura y envio de paquetes.

conf.verb=0

#Se genera un ciclo con el rango de IPs dando la RED y la mascara

for ip in Network('192.168.12.128/25'):

    #Se realiza un broadcast de MAC pasando cada IP el cual devuelve la 

    #direccion MAC de la IP consultada.

    ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=str(ip)),timeout=2)

    for snd,rcv in ans:

        #Se muestra en pantalla la direccion MAC y la direccion IP

        print rcv.sprintf(r"%Ether.src% y %ARP.psrc%")

Al ejecutar el programa se tiene lo siguiente:

ernesto@jewel:~/bin/python$ sudo ./descubrir.py

WARNING: No route found for IPv6 destination :: (no default route?)

00:26:35:c6:93:0d y 192.168.12.130

00:2e:0b:c5:70:3c y 192.168.12.132

00:2e:90:c2:ec:51 y 192.168.12.134

00:50:ca:c1:71:8a y 192.168.12.136

00:32:57:ce:81:e7 y 192.168.12.138

00:2e:90:c4:58:7c y 192.168.12.139

00:2c:25:ce:ae:be y 192.168.12.140

d0:37:88:c4:11:ed y 192.168.12.141

00:2e:90:cc:f5:16 y 192.168.12.142

00:2c:c4:c4:26:28 y 192.168.12.148

40:7a:ab:ce:11:c0 y 192.168.12.150

3c:53:8e:cc:4d:89 y 192.168.12.161

1c:5b:d6:c9:6d:a9 y 192.168.12.169

00:2e:7f:c4:8d:d7 y 192.168.12.170

00:24:c2:c8:23:8d y 192.168.12.172

68:19:ed:c75:44:31 y 192.168.12.174

74:3f:68:c2:91:d6 y 192.168.12.196

00:30:aa:c2:6d:3c y 192.168.12.201

c8:3c:dc:c8:a9:53 y 192.168.12.208

00:34:f2:c5:2f:21 y 192.168.12.211

00:34:f2:cc:2e:d0 y 192.168.12.212

00:34:f2:c5:35:70 y 192.168.12.214

00:34:f2:c3:1a:ee y 192.168.12.215

00:34:f2:c3:1b:4c y 192.168.12.216

00:34:f2:c5:33:49 y 192.168.12.224

00:3c:02:c6:b5:3f y 192.168.12.225

00:3e:90:c8:bb:d6 y 192.168.12.251

Así pues desde Linux y con Python se puede capturar la información de las direcciones MAC de las IPs asignadas con pocas líneas de código.

¡Haz tu donativo! Si te gustó el artículo puedes realizar un donativo con Bitcoin (BTC) usando la billetera digital de tu preferencia a la siguiente dirección: 17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV

O Escaneando el código QR desde la billetera:

17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV