как добавить заголовки http в пакет, обнюханный с помощью scapy

Я пытаюсь обнюхать исходящий http-пакет, используя scapy, добавить в него несколько новых заголовков http и отправить его вперед. Цель здесь состоит в том, чтобы вставлять только новые заголовки, сохраняя при этом целостность пакета. При максимальном значении должен выполняться любой пересчет контрольной суммы, если это необходимо.

Прошли почти все вопросы по SO, но точно не получили решения.

Вот что я сделал.

def parse(pkt):

    if pkt.haslayer(TCP) and pkt.getlayer(TCP).dport == 80 and pkt.haslayer(Raw):
        pkt = pkt / "New Header:value\r\n\r\n"

        # OR i tried this
        #pkt = pkt.getlayer(Raw).load / Raw.load(load="New Header:value\r\n\r\n")

        #pkt.getlayer(Raw).load("New Header:value\r\n\r\n")
        pkt.show()
        #del pkt[IP].chksum
        send(pkt)
#end parse function

# start sniffing
a=sniff(filter="tcp and ( port 80 )", prn=parse)

Проблема в том, что приведенный выше код вставляет новый необработанный раздел полезной нагрузки вместо простого заголовка. Уже есть двойная новая строка \r\n\r\n для обозначения завершения заголовка в соответствии со стандартом HTTP.

Чтобы преодолеть это, я попытался удалить последний \r\n, выполнив следующие действия.

   #pkt = pkt.getlayer(Raw).load[-2:] / Raw.load(load="New Header:value\r\n\r\n")

Но это удаляет все ранее существовавшие заголовки, и остается только «Новый заголовок».

Я пробовал это на Linux Mint.

ОБНОВЛЕНИЕ: я пытаюсь создать новую полезную нагрузку http, которая будет содержать предыдущие заголовки, и я добавлю некоторые из них. Может ли кто-нибудь помочь с удалением существующего слоя


person fkl    schedule 22.10.2012    source источник
comment
Это действительно высокоуровневая вещь, которую нужно пытаться сделать с помощью инструментов анализа пакетов. Что делать, если заголовки HTTP разделены между двумя (или более) пакетами?   -  person Greg Hewgill    schedule 22.10.2012
comment
Согласованный. Но я могу игнорировать это до поры до времени. Высокопроизводительное реальное приложение, вероятно, нужно было бы написать на c. Подойдет POC с базовым тестовым случаем.   -  person fkl    schedule 22.10.2012
comment
@GregHewgill Кстати, у вас есть другой инструмент, который делает вышеперечисленное, нюхая вживую? Я не имею в виду модифицировать pcap.   -  person fkl    schedule 23.10.2012
comment
Конечно, если вы хотите добавить определенные заголовки в HTTP-транзакцию, вам следует использовать приложение HTTP-прокси, а не пытаться напрямую возиться с IP-пакетами.   -  person Greg Hewgill    schedule 23.10.2012
comment
Прокси-приложение создаст собственный пакет и перешлет его. Он будет содержать исходный IP-адрес прокси-сервера, а не исходного отправителя. Затем прокси-сервер также должен получить ответ и перенаправить исходному отправителю. Это влечет за собой дополнительные накладные расходы на обработку прокси-сервера, которых я пытаюсь избежать.   -  person fkl    schedule 23.10.2012
comment
Я пытаюсь создать новую полезную нагрузку http, которая будет содержать предыдущие заголовки, и я добавлю некоторые. Может ли кто-нибудь помочь с удалением существующего слоя? Так что я могу использовать остальную часть пакета как есть.   -  person fkl    schedule 24.10.2012


Ответы (1)


Если я правильно понимаю, проблема заключается в том, что вы хотите обновить существующий HTTP-запрос новым заголовком. Что вы хотите, так это обновить строку на месте, что Python не может сделать напрямую (строки неизменяемы).

Итак, что вам нужно сделать, это взять заголовок HTTP:

old_hdr = pkt[Raw] or old_hdr = pkt[TCP].payload

и манипулировать им как строкой:

new_hdr = 'New Header: value'
hdr = old_hdr.split('\r\n') # This is a crappy hack. Parsing HTTP headers
hdr.insert(new_hdr, 2)      # is a [solved problem][1].
send_hdr = '\r\n'.join(hdr)
pkt[TCP].payload = send_hdr

Если вы обнаружите, что контрольные суммы не обновляются, удалите их перед отправкой пакета:

del pkt[TCP].chksum

и Scapy вернет их вам с правильными значениями.

Изменить: я только что заметил, что моя ссылка не работает. Вот показано, как анализировать заголовки HTTP.

person nmichaels    schedule 25.10.2012
comment
Большое Вам спасибо. Я попробую это и вернусь к вам, если у меня возникнут проблемы. - person fkl; 25.10.2012