Bonjour,
Je dois réaliser une connexion HTTP avec un GET en Scapy. Le but étant de pouvoir relever les différents temps de chaque phase (échange, SYN, SYN ACK, ACK, request, response, etc).
Lorsque j'envoi mon paquet tcp contenant mon GET, 3 paquets doivent revenir:
- Un packet ACK pour mon GET
- La réponse du GET (les data quoi) a priori: HTTP/1.0 200 OK
- Et enfin un FIN ACK disant que la transmission est finie
Il faut que je puisse récuper ces 3 paquets de façon automatique, pour cela j'ai trouvé 2 façons:
=> 1) la fonction sr() avec l'option multi=1
=> 2) utiliser sniff juste apres mon GET
1) Pour sr(), le problème est d'arreter la capture, si je met multi=1, il attend plusieurs réponses au stimuli, mais ne sais pas quand s'arreter, il n'y a pas d'option "count" pour lui dire de s'arreter à 3 réponses.
Une solution serait d'utiliser un timeout, sauf que vu que ce script marchera sur des sites très différents, il est possible qu'un jour une réponse excède mon timeout. Et si le timeout est trop grand, c'est handicapant en terme de perfo.
2) Si j'utilise sniff, pas de problème vu que je peux utilser "count" et lui dire de s'arreter a 3 paquets, l'ennui est qu'il capte tous les paquets entrant et pas seulement les réponses de mon stimuli. Donc il faut faire un filtre pour preciser quel paquet exact je recherche. Seulement je ne suis pas sûr de pouvoir faire un filtre assez precis pour que jamais un paquet "batar" d'un autre protocole ne s'interpose.
De plus, un autre problème est qu'il arrive parfois qu'entre la ligne:
send(GET_PACKET) qui envoie mon paquet TCP GET
et la ligne juste en dessous:
answers=sniff(...))
certains paquets aient deja été envoyé avant l'activation du sniff, du coup quand je lis le 3è paquets reçu, ce n'est pas le FIN ACK.
L'idée serait de pouvori utiliser sr() de sorte qu'il s'arrete à un nombre de paquets donnés.
Une meilleure solution serait de seulement attendre le paquet FIN ACK car des fois la réponse au GET est découpée en plusieurs paquets, du coup au total j'ai:
1 ACK
"N" GET response
1 FIN ACK
il y a peut etre d'autres façon auxquelles je n'ai pas pensé, je ne suis pas expert en scapy,
mon but est de relever 4 temps:
DNS resolution (facile)
Connect resolution (facile: delta entre l'envoi du SYN et la reception du SYN ACK)
Response (delta entre l'envoi du GET et la réception du ACK)
Data (delta entre la reception du premier paquet de reponse et la réception du dernier (le FIN ACK)
Si quelqu'un a une idée ce serait super
Merci
Partager