scapy: правильный метод изменения TTL перехваченного трафика

Я играюсь со Scapy и заметил кое-что странное.

Если я создаю пакет, чтобы вызвать сообщение об ошибке ICMP с превышением времени:

myPacket = IP(dst="www.google.com", ttl=3)/TCP()

... Я получаю сообщение ICMP, когда отправляю его с помощью функции sr.

С другой стороны, если я возьму любой исходящий пакет, который я перенюхал, и изменю его значение ttl на то же, что и выше, я не получу никакого ответа.

В чем проблема? Я думал, что смогу испытать это, используя фиктивный трафик, а не реальный трафик! Пробовал даже с другими значениями TTL, но безрезультатно.


person Ricky Robinson    schedule 26.04.2012    source источник
comment
ricky, есть вероятность, что этот маршрутизатор третьего прыжка может молча отбрасывать пакеты с превышением времени ttl, попробуйте ttl 4 и 2. Также ваш traceroute в scapy показывает отсутствующую ссылку на 3 прыжках?   -  person dc5553    schedule 27.04.2012
comment
Да, я пробовал со значениями от 1 до 20, но сообщения ICMP по-прежнему не возвращаются. Я действительно не знаю, что происходит.   -  person Ricky Robinson    schedule 27.04.2012
comment
Попробуйте пропинговать с -i 3 и просто понюхать, чтобы узнать, есть ли у вас что-нибудь помимо scapy?   -  person dc5553    schedule 27.04.2012
comment
traceroute работает отлично, как и любой пакет, созданный в Scapy, который я отправляю с любыми значениями TTL. Хорошо, несколько переходов сбрасывают мои пакеты без отправки каких-либо ошибок ICMP, но большинство из них отвечают. Я мог бы иметь представление о том, в чем проблема. До сих пор я просто менял поле TTL, не пересчитывая длину заголовка или контрольную сумму пакета. Как вы думаете, это может быть причиной?   -  person Ricky Robinson    schedule 27.04.2012
comment
Только контрольная сумма IP-заголовка предотвратит маршрутизацию, чтобы заставить ее пересчитать, просто удалите ее. Изменение ttl не повлияет на длину заголовка, только на контрольную сумму   -  person dc5553    schedule 27.04.2012
comment
К вашему сведению, единственное, что могло бы изменить len IP-заголовка, — это параметры IP, которые вы почти никогда не должны видеть.   -  person dc5553    schedule 27.04.2012
comment
Да, это было так. Мне нужно было сделать del(mypacket.getlayer(IP).chksum), и все работает как часы. :)   -  person Ricky Robinson    schedule 27.04.2012


Ответы (2)


Хорошо, пакеты отбрасывались, потому что после того, как я изменил значение ttl, контрольная сумма перестала быть правильной. Мне просто нужно было принудительно вычислить контрольную сумму, удалив ее значение:

del(mypacket.getlayer(IP).chksum) 
person Ricky Robinson    schedule 27.04.2012

Другой вариант — использовать функцию sendp(). Scapy автоматически вычисляет контрольные суммы IP и TCP.

myPacket = IP(dst="www.google.com", ttl=3)/TCP()
sendp(myPacket)

def dissect(pck):
    if pck.haslayer("ICMP"): # Filter out all but ICMP packets.  You could do additional filtering
        pck.show()           # Display response packets

sniff(iface="eth0", prn=lambda x:dissect(x), store=0)
person phoenix    schedule 16.05.2012