Здравствуйте, я использую nfqueue и scapy, и я хочу получить пакеты в моем NFQUEUE, изменить полезную нагрузку и отправить их повторно.Измените полезную нагрузку на TCP с помощью nfqueue/scapy
Я могу изменить поля, такие как TTL, без каких-либо проблем, но когда дело доходит до изменения полезной нагрузки, я сталкиваюсь с проблемами.
Когда я меняю полезную нагрузку, я обнюхиваю пакет с помощью wirehark и, по-видимому, я отправляю пакет с измененной полезной нагрузкой, но сервер не отвечает.
Это мой код:
#!/usr/bin/env python
import nfqueue
from scapy.all import *
def callback(payload):
data = payload.get_data()
pkt = IP(data)
pkt[TCP].payload = str(pkt[TCP].payload).replace("ABC","GET")
pkt[IP].ttl = 40
print 'Data: '+ str(pkt[TCP].payload)
print 'TTL: ' + str(pkt[IP].ttl)
del pkt[IP].chksum
payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(pkt), len(pkt))
def main():
q = nfqueue.queue()
q.open()
q.bind(socket.AF_INET)
q.set_callback(callback)
q.create_queue(0)
try:
q.try_run() # Main loop
except KeyboardInterrupt:
q.unbind(socket.AF_INET)
q.close()
main()
Я установил это правило для исходящего трафика на порт 80: iptables -I OUTPUT -s 192.168.1.10 -p tcp --dport 80 -j NFQUEUE
И, чтобы проверить это, например, открыть телнет к Google порт 80, сделать GET/HTTP/1.1
и это то, что я вижу:
TTL: 40
DATA: GET/HTTP/1.1
Теперь, если я ABC/HTTP/1.1
я не получаю никакого ответа! Мой telnet просто застрял.
Я также пробовал на веб-сайтах HTTP-браузеров, чтобы что-то просматривать, проверьте, как мои TTL действительно меняются на 40, затем просматривайте строку «ABC», и мой браузер снова застревает. Я нюхаю запрос, измененный на GET, но я не получаю ответа.
Спасибо, это дает мне головную боль, и я был бы очень признателен, если бы кто-то с большим опытом мог привести меня к правильному пути. Заранее спасибо.
Я думаю, что вы должны также инициировать пересчет поля контрольной суммы TCP, подобно тому, как это делается в поле контрольной суммы IP. – Yoel