2011-01-20 13 views
21

Soy un programador moderado que acaba de ingresar a la programación de la red.Python-Scapy o similar-¿Cómo puedo crear una solicitud HTTP GET en el paquete de nivel

Como un intento de mejorar mi comprensión de las redes en general, estoy tratando de realizar varias acciones HTTP básicas desde el nivel de paquete. Mi pregunta es esta: ¿cómo podría usar una biblioteca como SCAPY para construir una solicitud HTTP GET y elementos asociados a nivel de paquete? Me doy cuenta de que esto puede parecer extraño, pero parece que no puedo encontrar ninguna información que lo detalle, y mis propios intentos con PAROS y Ethereal han sido ... Menos que satisfactorios.

¡Gracias por cualquier ayuda ofrecida!

Trimiert

+0

sugeriría a hacer esto en un lenguaje de nivel inferior a la de Python, como C/C++. – orlp

+13

@nightcracker: Estoy totalmente en desacuerdo. Scapy te permite crear y enviar paquetes muy fácilmente sin preocuparte por ninguna de las cosas que un programador C o C++ necesita. Si le interesa cómo funcionan las redes, Scapy es el camino a seguir. Si desea escribir un servidor real, quizás un idioma diferente sea más apropiado. Y lo digo como alguien que escribe código C para dispositivos de red para ganarse la vida. – nmichaels

+3

@OP: escuche lo que dice nmichaels. Solo tengo 16 años y tengo una opinión (no basada) sobre todo. – orlp

Respuesta

34

Si usted quiere hacer un apretón de manos completa de tres vías, que tendrá que hacerlo manualmente.

de inicio con su paquete SYN:

>>> syn = IP(dst='www.google.com')/TCP(dport=80, flags='S') 
>>> syn 
<IP frag=0 proto=tcp dst=Net('www.google.com') |<TCP dport=www flags=S |>> 

continuación, recibirá el paquete SYN-ACK desde el servidor, trabajos SR1. A continuación, envíe su solicitud HTTP GET:

>>> syn_ack = sr1(syn) 
Begin emission: 
Finished to send 1 packets. 
* 
Received 1 packets, got 1 answers, remaining 0 packets 

>>> syn_ack 
<IP version=4L ihl=5L tos=0x0 len=44 id=424 flags= frag=0L ttl=55 proto=tcp chksum=0x2caa src=74.125.226.148 dst=10.20.30.40 options=[] |<TCP sport=www dport=ftp_data seq=3833491143 ack=1 dataofs=6L reserved=0L flags=SA window=5720 chksum=0xd8b6 urgptr=0 options=[('MSS', 1430)] |<Padding load='\x00\x00' |>>> 

luego establezca las secuencias y ACK números de TCP y enviar el GET:

getStr = 'GET/HTTP/1.1\r\nHost: www.google.com\r\n\r\n' 
request = IP(dst='www.google.com')/TCP(dport=80, sport=syn_ack[TCP].dport, 
      seq=syn_ack[TCP].ack, ack=syn_ack[TCP].seq + 1, flags='A')/getStr 
reply = sr1(request) 
+0

¡Muchas gracias! De lejos, la mejor información que he visto hasta ahora. Y sí, planeé hacer el batido de tres vías, pero eso era todo lo que tenía. ¡Gracias! – Trimiert

+0

¿Hay alguna manera de capturar un paquete http usando sniff y luego insertar encabezados http en él? – fayyazkl

+3

@fayyazkl: ese es el tipo de cosa que debería ser su propia pregunta. – nmichaels

1

¿Ha tenido un vistazo a the tutorial? Sólo copiar y pegar, esto parece que va a montar una petición HTTP:

>>> a=Ether()/IP(dst="www.slashdot.org")/TCP()/"GET /index.html HTTP/1.0 \n\n" 
+1

Sí, lo hice. Pero el solo hecho de enviarlo así no parecía funcionar, y no me da ninguna idea de cómo funciona a nivel de paquete. – Trimiert

+0

No funciona para mí tampoco. Solo trata de recibir para siempre. –

+0

La pregunta pregunta cómo crear una solicitud de obtención de HTTP a nivel de paquete y esta respuesta aclara esto. Se asume el hecho de que necesita hacer un apretón de manos tcp. No pienses que hay algo malo con la respuesta. Sin embargo, las personas que no conocen el apretón de manos de tcp deben consultar la respuesta correcta. –

Cuestiones relacionadas