Проблема в чтении метаданных TLS со scapy - PullRequest
0 голосов
/ 21 апреля 2020

Я хочу написать python скрипт с использованием scapy, который извлекает длину TLS-записи TLS-пакетов из файла pcap. Для этого я использовал то, что было упомянуто в этих двух вопросах

Чтобы написать следующий скрипт

from scapy.all import *
def printlen(pkt):
  hasraw=0
  if pkt.haslayer(Raw):
    hasraw=1
    extra_tls_layers = TLS(pkt[TLS].load)
  i=0
  while True:
   try:
      print(pkt[TLS][i].deciphered_len)
      i+=1
   except AttributeError:
      i+=1
      continue
   except IndexError:
      break
  i=0
  while True and hasraw:
   try:
      print(extra_tls_layers[i].len)
      i+=1
   except AttributeError:
      i+=1
      continue
   except IndexError:
      break


pcapfile = "/home/ala-jeb/Videos/SH/traffic/facebook.com.pcap"
load_layer("tls")

try:
    reader = PcapReader(pcapfile)

    # tls frame accumulation related variables.
    tls_accumulate = False
    tls_leftover_len = 0
    tls_blist = list()

    for pkt in reader:
      try:
        if tls_accumulate and pkt.haslayer(TCP):
          ip_tcp_hdr_overhead = ((pkt[IP].ihl*4) + (pkt[TCP].dataofs*4))
          pkt_payload_len = (pkt[IP].len - ip_tcp_hdr_overhead)
          tls_leftover_len = (tls_leftover_len - pkt_payload_len)
          tls_blist.append(raw(pkt[TCP].payload))

          if tls_leftover_len <= 0:
            # got complete TLS frame
            tls_raw_bytes = b''.join(tls_blist)

            # parse accumulated frame.
            tls = TLS(tls_raw_bytes)
            printlen(tls)

            # reset accumlation variables.
            tls_accumulate = False
            tls_leftover_len = 0
            tls_blist = list()
          else:
            continue

        if pkt.haslayer(TCP) and pkt.haslayer(TLS):
          if not tls_accumulate:
            # Process new TLS frame.
            # Pkt over head: ip-hdr-len + tcp-hdr-len
            ip_tcp_hdr_overhead = ((pkt[IP].ihl*4) + (pkt[TCP].dataofs*4))
            pkt_payload_len = (pkt[IP].len - ip_tcp_hdr_overhead)
            if pkt[TLS].len > pkt_payload_len:
              # partial TLS frame. Start accumulating.
              tls_accumulate = True
              tls_leftover_len = (pkt[TLS].len - pkt_payload_len)
              tls_blist.append(raw(pkt[TCP].payload))
            else:
              # complete TLS frame
              # ... process complete TLS Frame 
              printlen(pkt)
      except Exception as error:
        pkt.show()
        print("tcp-processing error: %s", error)
        sys.exit(-1)

except Exception as error:
    print("packet processing error: %s", error)
    sys.exit(-1)

Вот файл pcap, который я использовал https://drive.google.com/file/d/1MvaDKUiba2HLIiYHt_SIekB6FlWQkIv2/view?usp=sharing

Полученный результат - 512 122 1 1017 1517 1 53 166 69

Но ожидаемый результат -
512 122 1 1017 1517 466 1 53 166 69

Может кто-нибудь сказать мне, что я сделал не так

...