3

Если между программой A и B TCP установлено TCP-соединение, и его IP-адрес / порт источника и IP-адрес / порт назначения известны злоумышленнику, теперь злоумышленник хочет отправить пакет сброса TCP на A, чтобы завершить TCP-соединение.

Теперь давайте предположим, что для A его стек TCP только что отправил пакет TCP Ack с порядковым номером 1000 и номером подтверждения 5000.

Существуют ли какие-либо требования к порядковому номеру и номеру подтверждения в пакете сброса?

Если пакет Reset использует seq: 5000 and ack:1000 , он определенно будет принят стеком TCP для A, а соединение TCP завершено на A.

Как насчет следующих комбинаций?

1 seq: 5000, ack_seq: 0
2 seq: 5000, ack_seq: 999  ( this ack_seq is obsolete, namely <1000)
3 seq: 5000, ack_seq: 1002 ( this ack_seq is proactive, namely >1000)
4 seq: 5001, ack_seq: 1000 ( the seq is not consistent)
5 seq: 5001, ack_seq: 999  ( both seq and ack_seq are not consistent)

Мне кажется, что 1 нормально для того, чтобы убить соединение?

2 ответа2

1

В этом случае у вас установлено соединение. Это означает, что комбинация 1 не будет работать.

В RFC793, стр. 15 говорится следующее о номере ACK:

Номер подтверждения: 32 бита

Если бит управления ACK установлен, это поле содержит значение следующего порядкового номера, который ожидает получить отправитель сегмента. Как только соединение установлено, оно всегда отправляется.

Таким образом, вам все еще нужно отправить номер ACK с пакетом RST, чтобы разорвать соединение. Но это также верно и для неустановленного соединения и закрытых портов. Если вы отправите пакет SYN на закрытый порт, то другая сторона ответит пакетом RST, ACK.

Вы можете проанализировать это с помощью wireshark.

0

Согласно RFC793, стр. 69, когда сегмент приходит для соединения в состоянии, отличном от LISTEN, сначала проверяется, попадает ли порядковый номер в окно получателя, а если нет, он отбрасывается.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .