[Python-es] ayuda con scapy

David Villa dvilla en gmx.net
Mie Feb 24 11:48:01 CET 2010


2010/2/23 Boris Perez Canedo <inf200523 en ucf.edu.cu>:
>> El 23 de febrero de 2010 17:38, Boris Perez Canedo
>> <inf200523 en ucf.edu.cu> escribió:
>>
>>> Hace pocos dias escribi sobre la instalacion de scapy en Windows. En ese
>>> momento
>>> trataba de instalar scapy  usando python2.6. Me daba un error de sintaxis
>>> con la
>>> palabra "with" que es reservada para python2.6 en adelante y que
>>> aparentemente scapy
>>> usa como variable. Hice algo que no se si esta del todo bien, borre la
>>> variable with
>>> que se pasaba como argumento en dos funciones de la siquiente manera:
>>>
>>> tr = map(lambda x: Gnuplot.Data(x,"lines"), trt.values())# with = "lines"
>>>
>>> world = Gnuplot.File(conf.gnuplot_world,"lines")# with = "lines"
>>>
>>> donde ahora esta "lines" antes estuvo with = "lines" pero esto en
>>> python2.6 da el
>>> error ya mencionado.
>>
>> Es posible que el truco funcione.
>>
>> Hacerte notar que el fallo está en Gnuplot, más que en scapy. Aunque
>> el proyecto python-gnuplot hace tiempo que no se actualiza,
>> distribuciones como ubuntu han sustituído en gnuplot 'with' por
>> 'with_' (con subrayado), cambiando la API que usan otros paquetes como
>> scapy:
>>
>> <http://trac.secdev.org/scapy/changeset/852:055a9be0f2d3>
>>
>>
>>> Todo parecia funcionar bien hasta que corro este script y me da el
>>> siguiente error que
>>> me parece no tiene nada que ver con lo que hice ya que el paquete para
>>> graficos no lo
>>> instale pq no lo necesitaba.
>>>
>>> Obtener todos los ip usados en una subred.
>>> mi subnet mask es 255.255.252.0
>>> mi direccion ip 10.14.19.12
>>> por si me equivoque al determinar la direccion de red.(10.14.16.0/22)
>>>
>>> from scapy import *
>>>
>>> ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="10.14.16.0/22"),timeout=2)
>>> ans.summary(lambda (s,r): r.sprintf("%Ether.src% %ARP.psrc%") )
>>>
>>> El error:
>>>
>>> Begin emission:
>>> Finished to send 1024 packets.(aqui todo parece bien)
>>>
>>> Traceback (most recent call last):
>>>   File "D:\Trabajo\scripts\arping.py", line 2, in <module>
>>>
>>> ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="10.14.16.0/22"),timeout=2)
>>>   File "C:\Python26\lib\site-packages\scapy.py", line 11295, in srp
>>>     a,b,c=sndrcv(s ,x,*args,**kargs)
>>>   File "C:\Python26\lib\site-packages\scapy.py", line 11113, in sndrcv
>>>     os.write(1, ".")
>>> OSError: [Errno 9] Bad file descriptor
>>
> Hola y disculpen haber tenido que escribir tanto sobre mi problema.
>
>
> Acabo de correr el script en Windows y funciona, lo que sucedia era que
> antes lo corri desde el IDLE de python2.6 y por eso daba el error, pero
> cuando lei tu comentario
>
>> Da error al intentar escribir en el fichero con id=1, probablemente
>> stdout/stdin en sistemas linux.
>>
>
> se me ocurrio correrlo desde la consola. Voy a ver si en Ubuntu obtengo el
> mismo resultado.
>
> Muchas gracias.
>
> Otra cosa, estoy utilizando el scapy para obtener entre otras cosas los ips
> utilizados en una subred dada.
>
> Mientras me rompia la cabeza pensando que era lo que salia mal con
> scapy, pense en hacer algo como esto:
>
> import os,re
> from multiprocessing import Process, Lock
>
> def ping(lck, host):
>     options = '-n 1 -w 2 '
>     f = os.popen('ping ' + options + host)
>     data = f.read()
>     match = re.search(r"\b(?:\d{1,3}\.){3}\d{1,3}\b(?=.+TTL)", data) #
> machea una direccion ip utilizada
>     if match:
>         ip = match.group()
>         lck.acquire()
>         print ip
>         lck.release()
>
>
> if __name__ == '__main__':
>     lock = Lock()
>
>     for host in ['10.14.16.5','10.14.19.12']:
>         Process(target=ping, args=(lock, host)).start()
>
> Que parece funcionar bien. Pero aqui el problema es como a partir de una
> direccion de red (10.14.16.0/22) generar una lista de ip similar a la que
> utilizo arriba (pero con todos).
>
> Saludos.
> Boris
>
>
>
> ________________________________
>
> La mejor vacuna contra el virus A(H1N1) es la higiene personal
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>

También puedes usar scapy para eso. En el propio manual de scapy
tienes un ejemplo [1]

>>> net = IP(dst="10.14.16.0/22")
>>> [pkt for pkt in net]
[<IP  dst=10.14.16.0 |>, <IP  dst=10.14.17.0 |>, <IP  dst=10.14.18.0
|>, <IP  dst=10.14.19.0 |>, <IP  dst=10.14.16.1 |>, <IP
dst=10.14.17.1 |>, <IP  dst=10.14.18.1 |>, <IP  dst=10.14.19.1 |>, <IP
 dst=10.14.16.2 |>, <IP  dst=10.14.17.2 |>, <IP  dst=10.14.18.2 |>,
<IP  dst=10.14.19.2 |>,...

Intenta hacer funcionar scapy porque él ya implementa todo lo que
puedas necesitar.

Esto sería más o menos lo que buscas. Lista las IP de los host que
respondan a "ping".

ans, unans = sr(IP(dst="10.14.18.0/22")/ICMP(), timeout=10)
for pkt in ans:
    print pkt[0].dst


Saludos

[1] http://www.secdev.org/projects/scapy/doc/usage.html



Más información sobre la lista de distribución Python-es