2014-12-04 3 views
2

Здравствуйте, я использую 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, но я не получаю ответа.

Спасибо, это дает мне головную боль, и я был бы очень признателен, если бы кто-то с большим опытом мог привести меня к правильному пути. Заранее спасибо.

+2

Я думаю, что вы должны также инициировать пересчет поля контрольной суммы TCP, подобно тому, как это делается в поле контрольной суммы IP. – Yoel

ответ

7

Я добавил строку для пересчета контрольной суммы TCP, которая была полезной.

Это работает только в том случае, если я изменяю полезную нагрузку. Я не изменяю ее длину, в противном случае мне нужно будет изменить длину поля заголовка IP и ответить самому себе, а может быть и другим людям, которые ищут этот ответ я добиться того, чтобы просто делать:

payload_before = len(pkt[TCP].payload) 

pkt[TCP].payload = str(pkt[TCP].payload).replace("Heading","Other string") 

payload_after = len(pkt[TCP].payload) 

payload_dif = payload_after - payload_before 

pkt[IP].len = pkt[IP].len + payload_dif 

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

В настоящее время я не знаю, как достичь этого эффективно, но мало-помалу. Надеюсь, что кто-то найдет мое решение для изменения полезной нагрузки.

+0

Благодарим за комментарий, но если вы хотите, чтобы все работало правильно, вы должны добавить также «payload.set_verdict_modified (nfqueue.NF_ACCEPT, str (pkt), len (pkt) + payload_dif) ' –

4

Во втором случае вы подделываете уровень TCP, а также уровень IP.

Вы разрешаете Scapy исправить контрольную сумму IP, но не TCP-код. Измените del pkt[IP].chksum на del pkt[IP].chksum pkt[TCP].chksum в своем коде.