Подтвердить что ты не робот

Инструмент воспроизведения tcp stream

Я ищу инструмент для записи и воспроизведения одной стороны потока TCP для тестирования. Я вижу инструменты, которые записывают весь поток TCP (как сервер, так и клиент) для тестирования брандмауэров и т.д., Но то, что я ищу, - это инструмент, который будет записывать только трафик, отправленный клиентом (с информацией о времени), а затем повторно отправить его на сервер для тестирования.

4b9b3361

Ответ 1

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

Обычно люди используют tcpreplay для воспроизведения пакетов; однако не поддерживает синхронизацию порядковых номеров TCP. Поскольку вам необходимо иметь двунаправленный поток TCP (и для этого требуется синхронизация нумерации seq), используйте одну из следующих опций:

  • Если это очень интерактивный клиент/серверный протокол, вы можете использовать scapy, чтобы отключить содержимое TCP вашего поток, анализ времени и интерактивности. Затем используйте эту информацию, откройте новый TCP-сокет на своем сервере и десериализуйте эти данные в новый сокет TCP. Анализ исходного потока с помощью scapy может быть сложным, если вы запускаете повторные передачи TCP и динамику окон. Написание байтов в новый TCP-сокет не потребует обработки нумерации последовательностей... OS позаботится об этом.

  • Если это простой поток, и вы можете обойтись без синхронизации (или хотите вручную вставить информацию о синхронизации), вы можете использовать wirehark для получения необработанных байтов из паролей TCP, не беспокоясь о разборе с scapy. После того, как у вас есть необработанные байты, напишите эти байты в новый TCP-сокет (с учетом интерактивности). Написание байтов в новый TCP-сокет не потребует обработки нумерации последовательностей... OS позаботится об этом.

  • Если ваш поток - это строго текстовые (но не html или xml) команды, такие как сеанс telnet, Expect -подобное решение может быть проще, чем вышеупомянутый синтаксический анализ. В этом решении вы не должны открывать TCP-сокет непосредственно из вашего кода, используя ожидание spawn сеанса telnet (или любого другого) и повторять текстовые команды с помощью send/expect. Ваша библиотека ожидания/базовая ОС позаботится о нумерации по порядку.

  • Если вы тестируете веб-сервис, я подозреваю, что было бы намного проще имитировать реального веб-клиента, нажимая ссылки на Selenium или Splinter. Ваша библиотека http/базовая ОС позаботится о нумерации номеров в новом потоке.

Ответ 2

Взгляните на WirePlay code.google.com/p/wireplay или github.com/abhisek/wireplay, который promises воспроизводит либо клиентскую, либо серверную сторону захваченного сеанса TCP с модификацией всех порядковых номеров SYN/ACK по мере необходимости.

Я не знаю, есть ли какие-либо бинарные сборки, вам нужно скомпилировать их самостоятельно.

Примечание. Я еще не пробовал это сам, но изучаю его.

Ответ 3

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

https://github.com/wangbin579/tcpcopy

Ответ 4

Мне нужно нечто похожее, поэтому я немного поработал с scapy и придумал решение, которое сработало для меня. Моя цель состояла в том, чтобы воспроизвести клиентскую часть захваченного файла pcap. Мне было интересно получать ответы с сервера - не обязательно с таймингами. Ниже мое острое решение - оно ни в коем случае не проверено и не завершено, но я сделал то, что хотел. Надеюсь, это хороший пример того, как воспроизводить поток TCP с помощью scapy.

from scapy.all import *
import sys

#NOTE - This script assumes that there is only 1 TCP stream in the PCAP file and that 
# you wish to replay the role of the client

#acks
ACK = 0x10
#client closing the connection
RSTACK = 0x14

def replay(infile, inface):
    recvSeqNum = 0
    first = True
    targetIp = None
    #send will put the correct src ip and mac in
    #this assumes that the client portion of the stream is being replayed
    for p in rdpcap(infile):
        if 'IP' in p and 'TCP' in p:
            ip = p[IP]
            eth = p[Ether]
            tcp = p[TCP]
            if targetIp == None:
                #figure out the target ip we're interested in
                targetIp = ip.dst
                print(targetIp)
            elif ip.dst != targetIp:
                # don't replay a packet that isn't to our target ip
                continue
            # delete checksums so that they are recalculated
            del ip.chksum
            del tcp.chksum
            if tcp.flags == ACK or tcp.flags == RSTACK:
                tcp.ack = recvSeqNum+1
                if first or tcp.flags == RSTACK:
                    # don't expect a response from these
                    sendp(p, iface=inface)
                    first=False
                    continue

            rcv = srp1(p, iface=inface)
            recvSeqNum = rcv[TCP].seq

def printUsage(prog):
    print("%s <pcapPath> <interface>" % prog)

if __name__ == "__main__":
    if 3 != len(sys.argv):
        printUsage(sys.argv[0])
        exit(1)
    replay(sys.argv[1], sys.argv[2])

Ответ 5

Запишите пакетный захват полной связи TCP/TCP-клиента. Затем вы можете использовать tcpliveplay для воспроизведения только клиентской стороны связи на реальном сервере. tcpliveplay будет генерировать новые порядковые номера, IP-адреса, MAC-адреса и т.д., поэтому связь будет протекать должным образом.