как добавить заголовки 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 \ r для обозначения завершения заголовка в соответствии со стандартом HTTP.

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

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

Но это лишает всех ранее существовавших заголовков и только "Новый заголовок" остается.

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

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

 Greg Hewgill23 окт. 2012 г., 06:45
Конечно, если вы хотите добавить определенные заголовки к транзакции HTTP, вы должны использовать прокси-приложение HTTP, а не пытаться напрямую манипулировать IP-пакетами.
 fayyazkl22 окт. 2012 г., 20:57
Согласовано. Но я могу пока игнорировать это. Вероятно, нужно написать высокопроизводительное реальное приложение на языке c. POC с базовым контрольным примером будет в порядке.
 fayyazkl24 окт. 2012 г., 07:07
Я пытаюсь создать новый полезный груз http, который будет содержать предыдущие заголовки, и я добавлю некоторые. Может кто-нибудь помочь с тем, как удалить существующий слой? Так что я могу использовать оставшуюся часть пакета как есть.
 fayyazkl22 окт. 2012 г., 22:44
@GregHewgill Кстати, у вас есть еще один инструмент, который работает выше, когда вы нюхаете? Я неЯ имею в виду изменить pcap.
 Greg Hewgill22 окт. 2012 г., 20:53
Это действительно высокоуровневая вещь, которую нужно делать с инструментами анализа пакетов. Что если заголовки HTTP разделены между двумя (или более) пакетами?
 fayyazkl23 окт. 2012 г., 07:02
Прокси-приложение создаст его пакетСобственно и перешлите его. Он будет содержать исходный ip прокси, а не исходный отправитель. Затем прокси-сервер должен получить ответ обратно и переслать исходному отправителю. Это влечет за собой дополнительные накладные расходы обработки на прокси, который я пытаюсь избежать.

Ответы на вопрос(1)

Решение Вопроса

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

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

old_hdr = pkt[Raw] или же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 заголовки.

 fayyazkl25 окт. 2012 г., 16:02
Большое спасибо. Я попробую это и свяжусь с вами, если у меня возникнут проблемы.
 fayyazkl23 апр. 2015 г., 16:40
Просто чтобы подтвердить, что это работает для меня. еще раз спасибо

Ваш ответ на вопрос