scapy: правильный метод для изменения TTL прослушанного трафика
Я играю со Scapy и заметил кое-что странное.
Если я создаю пакет, чтобы вызвать сообщение об ошибке превышения времени ICMP:
myPacket = IP(dst="www.google.com", ttl=3)/TCP()
... я получаю сообщение ICMP после отправки с помощью функции sr
,
С другой стороны, если я беру любой исходящий пакет, который я прослушал, и меняю его значение ttl на то же, что использовалось выше, я не получаю никакого ответа.
В чем здесь проблема? Я думал, что смогу испытать это, используя фиктивный трафик, а не реальный трафик! Я даже пытался с другими значениями TTL, но безрезультатно.
2 ответа
Хорошо, пакеты отбрасывались, потому что, как только я изменил значение ttl, контрольная сумма больше не была правильной. Мне просто пришлось снова вычислить контрольную сумму, удалив ее значение:
del(mypacket.getlayer(IP).chksum)
Другой вариант - использовать функцию 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)