TCP: Comment sont les numéros suivants / ack générés?
-
22-08-2019 - |
Question
Je travaille actuellement sur un programme qui renifle les paquets TCP envoyés et reçus vers et à partir d'une adresse particulière. Ce que je suis en train d'accomplir est de répondre avec des paquets personnalisés sur mesure à certains paquets reçus. J'ai déjà fait l'analyse syntaxique. Je peux déjà généré Ethernet valide, IP, et - pour la plupart -. Paquets TCP
La seule chose que je ne peux pas comprendre comment les chiffres suivants / ack sont déterminées.
Bien que cela puisse être sans rapport avec le problème, le programme est écrit en C ++ en utilisant WinPCap. Je demande des conseils, des articles ou d'autres ressources qui peuvent me aider.
La solution
Lorsqu'une connexion TCP est établie, chaque côté génère un nombre aléatoire comme numéro de séquence initial. Il est un nombre fortement aléatoire. Il y a des problèmes de sécurité si quelqu'un sur Internet peut deviner le numéro de séquence, car ils peuvent facilement établir des paquets à injecter dans le flux TCP
Ensuite, pour chaque octet transmis le numéro de séquence est incrémenté de 1. Le champ d'accusé de réception est le numéro de séquence de l'autre côté, renvoyé à accuser réception.
RFC 793 , la spécification du protocole TCP d'origine, peut être d'une grande aide.
Autres conseils
J'ai le même travail à faire.
Tout d'abord le # initial suivants seront générés au hasard (0-4294967297).
Ensuite, le récepteur comptera la longueur des données qu'il a reçues et envoyer l'accusé de réception de seq# + length = x
à l'expéditeur. La séquence sera alors x et l'expéditeur envoie les données. De même, le récepteur comptera le x + length = y
de longueur et envoyer l'ACK comme y
et ainsi de suite ... Sa façon dont le seq / ack est généré ...
Si vous voulez montrer essayer pratiquement renifler un paquet dans Wireshark et suivez le flux TCP et voir le scénario ...
Si je vous comprends bien - vous essayez de monter un TCP SEQ attaque de prédiction . Si tel est le cas, vous aurez envie d'étudier les spécificités de votre cible OS le numéro de séquence initiale .
Il y avait largement rendues publiques dans vulnerabilties assez bien tous les principaux systèmes d'exploitation leurs générateurs de WRT ISN étant prévisible . Je ne l'ai pas suivi les retombées de près, mais je crois comprendre que la plupart des fournisseurs a publié des correctifs à randomisent leurs incréments de ISN .
Il semble que le reste des réponses a expliqué à peu près tout sur l'endroit où trouver des informations détaillées et officielles sur ACK, à savoir Analyse TCP - Section 2: numéros de séquence et acquittement
section RFC 793 3.3 applique aux numéros de séquence. La dernière fois que je l'ai écrit le code à ce niveau, je pense que nous gardions un contre un pour les numéros de séquence qui persistaient.
Ces valeurs font référence les décalages attendus du début de la charge utile du paquet par rapport au numéro de séquence initial pour la connexion.
Numéro de séquence (32 bits) - a une double rôle Si le drapeau SYN est, cette est le numéro de séquence initial. le Numéro de séquence de la première réelle octet de données sera alors cette séquence nombre plus 1. Si le drapeau SYN est pas ensemble, alors ceci est le numéro de séquence du premier octet de données
Acquittement nombre (32 bits) - si le drapeau ACK est Réglez ensuite la valeur de ce champ est l'octet suivant prévu que le récepteur attend.
Les nombres sont générés au hasard des deux côtés, puis a augmenté de nombre d'octets envoyés (octets).
Le numéro de séquence incrément après que la connexion est établie. Le numéro de séquence initiale sur une nouvelle connexion est idéalement choisie au hasard mais beaucoup de systèmes d'exploitation ont un algorithme semi-aléatoire. Les RFC sont le meilleur endroit pour en savoir plus TCP RFC .