2012-04-18 1 views
3

tcpdump를 사용하여 캡처 한 패킷을 포함하는 파일을 분석하려고합니다. 먼저 5-tuple을 사용하여 패킷을 플로우로 분류하려고합니다. 그럼 각 흐름에서 각 패킷의 크기와 도착 시간을 알아야합니다. wireshark에서 대화 목록을 시도했지만 흐름의 각 패킷에 대한 정보가 아닌 흐름의 패킷 수만을 제공합니다. 작업을 수행 할 수있는 모든 코드 (C++ 또는 쉘 스크립트)에 대한 제안? 고마워요pcap 파일을 분석하는 코드

+0

[Bro] (http://www.bro-ids.org)의 강력한 네트워크 스크립팅 언어를 살펴볼 수 있습니다. 그것은 "파이썬/네트워크 분석을위한 루비"입니다. 구체적으로, ['new_packet' 이벤트] (http://www.bro-ids.org/documentation/scripts/base/event.bif.html#id-new_packet)를 후크하는 스크립트를 작성하여 말하는. – mavam

답변

1

나는 tcp 덤프를 분석하기 위해 라이브러리에서 일했지만 비즈니스를위한 것이 었습니다. 그래서 저는 여러분에게 줄 수 없습니다. 찾고있는 것을 찾지 못하면 내 대답이 도움이 될 수 있습니다. tcpdump는 Matryoshka dolls과 같이 중첩 된 네트워크 데이터이며 pcap 계층은 tcpdump에 의해 추가됩니다.

캡처에만 작업하려는 경우 덤프 형식은 Libpcap File Format으로 지정됩니다. 각 패킷의 도착 시간과 크기를 얻으려면이 사양을 사용하여 덤프를 처리해야합니다.

당신은 순서대로 다음 층 인 분석에 더 깊게해야하는 경우

  1. 링크 계층
  2. 인터넷 층
  3. 전송 계층
  4. 응용 계층

각 레이어에는 헤더 정의가 있습니다. 그래서 여러분은 여러분의 pcap 데이터가 포함하는 프로토콜 스택을 찾고 헤더를 파싱하여 정보를 얻어야합니다.

+1

해당 사양을 사용하여 덤프를 처리하는 가장 쉬운 방법은 libpcap을 사용하여 덤프를 읽는 것입니다.'pcap_open_offline()'을 사용하여 엽니 다. 대부분의 경우 처리하기 위해 자신의 코드를 작성하는 것은 시간 낭비입니다. libpcap을 사용하면 최신 버전의 libpcap에서 많은 pcap-ng 파일도 읽을 수 있습니다. –

0

5-tuple의 멤버는 무엇입니까? 플로우가 TCP 또는 UDP 인 경우, 소스 및 대상 IP 주소와 포트 x 호와 두 엔드 포인트 사이의 시간 경과에 따른 다중 플로우를 구별 할 수있는 x 호가 작동합니다. SCTP의 경우 흐름이 스트림 인 경우 더 많이 필요할 수도 있지만 비슷합니다.

Wireshark에서 5-tuple의 멤버가 모두 "필드 이름"인 경우 -T fields 옵션을 사용하여 TShark를 사용하고 -e 옵션을 사용하여 인쇄 할 필드를 지정하고 타임 스탬프가있는 필드를 선택할 수 있습니다 (frame.time_epoch은 UN * X 신기원 이후의 초 단위 및 초 단위로 시간을 알려줍니다.), 적절한 크기의 필드 (frame.len은 링크 계층 패킷 PLUS과 같은 모든 메타 데이터와 같은 원시 바이트 수를 제공합니다. 802.11 무선 정보를위한 radiotap 헤더로), 그리고 다른 필드를 입력하고 TShark의 출력을 원하는 처리를 수행하는 스크립트 또는 프로그램에 제공하십시오. 이를 통해 TShark는 프로토콜 계층의 처리를 수행하므로 프로그램에서 결과 데이터 만 처리하면됩니다. 당신이 Scapy 들어하지 않은 경우

2

UmNyobe,

아직 난 당신이 완벽에 가까운 적합 할 것입니다 무엇을하려고 믿습니다. 예를 들어,이 작은 스 니펫을 작성하여 pcap 필드를 구문 분석하고 Scapy 사용에 관해 이야기하고있는 것과 같은 것을 제공합니다.

#!/usr/bin/python -tt 

from scapy import * 
import sys 
from datetime import datetime 

'''Parse PCAP files into easy to read NETFLOW like output\n 
    Usage:\n 
    python cap2netflow.py <[ pcap filename or -l ]>\n 
    -l is live capture switch\n 
    ICMP packets print as source ip, type --> dest ip, code''' 


def parse_netflow(pkt): 
    # grabs 'netflow-esqe' fields from packets in a PCAP file 
    try: 
     type = pkt.getlayer(IP).proto 
    except: 
     pass 

    snifftime = datetime.fromtimestamp(pkt.time).strftime('%Y-%m-%d %H:%M:%S').split(' ')[1] 

    if type == 6: 
     type = 'TCP' 
    if type == 17: 
     type = 'UDP' 
    if type == 1: 
     type = 'ICMP' 

    if type == 'TCP' or type == 'UDP': 
     print(' '.join([snifftime, type.rjust(4, ' '), str(pkt.getlayer(IP).src).rjust(15, ' ') , str(pkt.getlayer(type).sport).rjust(5, ' ') , '-->' , str(pkt.getlayer(IP).dst).rjust(15, ' ') , str(pkt.getlayer(type).dport).rjust(5, ' ')])) 

    elif type == 'ICMP': 
     print(' '.join([snifftime, 'ICMP'.rjust(4, ' '), str(pkt.getlayer(IP).src).rjust(15, ' ') , ('t: '+ str(pkt.getlayer(ICMP).type)).rjust(5, ' '), '-->' , str(pkt.getlayer(IP).dst).rjust(15, ' '), ('c: ' + str(pkt.getlayer(ICMP).code)).rjust(5, ' ')])) 

    else: 
     pass 
if '-l' in sys.argv: 
    sniff(prn=parse_netflow) 
else: 
    pkts = rdpcap(sys.argv[1]) 
    print(' '.join(['Date: ',datetime.fromtimestamp(pkts[0].time).strftime('%Y-%m-%d %H:%M:%S').split(' ')[0]])) 
    for pkt in pkts: 
     parse_netflow(pkt) 

Python과 Scapy를 설치 한 다음 시작하면됩니다. C + +의 기회가 이미 당신에게 많은 의미를 갖게 될 것이라는 것을 안다면, 모든 것을 알아내는 데 도움이 필요하면 알려주십시오.

여기

가져 오기 Scapy

http://www.secdev.org/projects/scapy/

는 마음 Scapy 유지, 도움이 튜토리얼이 페이지의 링크의 톤이있다 않습니다 많이 더 있지만 .. PCAP 구문 분석에 대해 얘기 분야에

을 숫돌

이 도움이 되었기를 바랍니다.

dc