web-dev-qa-db-fra.com

Python-Scapy ou similaire-Comment puis-je créer une requête HTTP GET au niveau du paquet

Je suis un programmeur modéré, je me lance dans la programmation réseau.

Pour tenter d'améliorer ma compréhension des réseaux en général, j'essaie d'effectuer plusieurs actions HTTP de base à partir du niveau des paquets. Ma question est la suivante: comment utiliser une bibliothèque telle que SCAPY pour créer une requête HTTP GET et des éléments associés au niveau du paquet? Je me rends compte que cela peut sembler étrange, mais je n'arrive pas à trouver d'informations détaillées, et mes propres tentatives avec PAROS et Ethereal ont été ... Moins que satisfaisantes.

Merci pour toute aide offerte!

Trimiert

24
Trimiert

Si vous souhaitez effectuer une prise de contact complète à trois, vous devrez le faire manuellement.

Commencez avec votre paquet 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 |>>

Ensuite, recevez le paquet SYN-ACK du serveur, sr1 fonctionne. Envoyez ensuite votre requête 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' |>>>

Ensuite, définissez votre TCP séquence et numéros d'acquittement et envoyez le 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)
34
nmichaels

FTR, à partir de Scapy 2.4.3, la dissection des paquets HTTP a été implémentée, parmi un utilitaire appelé "TCP_client" pour faire les 3 handshake automatiquement.

Bien que ce ne soit pas aussi instructif que la réponse ci-dessus, cela ne fait pas de mal de jeter un coup d'œil: https://scapy.readthedocs.io/en/latest/layers/http.html#use-scapy-to- envoyer-recevoir-http-1-x

load_layer("http")
req = HTTP()/HTTPRequest(
    Accept_Encoding=b'gzip, deflate',
    Cache_Control=b'no-cache',
    Connection=b'keep-alive',
    Host=b'www.secdev.org',
    Pragma=b'no-cache'
)
a = TCP_client.tcplink(HTTP, "www.secdev.org", 80)
answser = a.sr1(req)
a.close()
2
Cukic0d

Avez-vous jeté un œil à le tutoriel ? Il suffit de copier-coller, cela ressemble à une requête HTTP:

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