복붙노트

[PYTHON] scapy에서 변경된 src / dst로 pcap에서 패킷 보내기

PYTHON

scapy에서 변경된 src / dst로 pcap에서 패킷 보내기

나는 이전에 기록 된 트래픽 (pcap 형식으로 캡처 됨)을 scapy와 함께 보내려고합니다. 현재 나는 원래의 Ether 레이어를 스트라이핑 할 때 붙어 있습니다. 트래픽은 다른 호스트에서 캡쳐되었으며 기본적으로 IP 및 Ether 레이어 src 및 dst를 모두 변경해야합니다. 나는 IP 레이어를 대체하고 체크섬을 다시 계산할 수 있었지만 Ether 레이어로 인해 문제가 발생했습니다.

누구나 IP 및 Ether 레이어 (src 및 dst)에 적용된 변경 사항이있는 캡처 파일에서 패킷을 재전송 한 경험이 있습니까? 또한 캡쳐는 Gb의 다소 큰 커플입니다. 그런 트래픽 양으로 얼마나 까다로운 실적이 나는가요?

해결법

  1. ==============================

    1.이 예제를 확인하십시오.

    이 예제를 확인하십시오.

    from scapy.all import *
    from scapy.utils import rdpcap
    
    pkts=rdpcap("FileName.pcap")  # could be used like this rdpcap("filename",500) fetches first 500 pkts
    for pkt in pkts:
         pkt[Ether].src= new_src_mac  # i.e new_src_mac="00:11:22:33:44:55"
         pkt[Ether].dst= new_dst_mac
         pkt[IP].src= new_src_ip # i.e new_src_ip="255.255.255.255"
         pkt[IP].dst= new_dst_ip
         sendp(pkt) #sending packet at layer 2
    

    코멘트:

  2. ==============================

    2.내가 너라면, Scapy가 Ether 레이어를 처리하게하고 send () 함수를 사용한다. 예 :

    내가 너라면, Scapy가 Ether 레이어를 처리하게하고 send () 함수를 사용한다. 예 :

    ip_map = {"1.2.3.4": "10.0.0.1", "1.2.3.5": "10.0.0.2"}
    for p in PcapReader("filename.cap"):
        if IP not in p:
            continue
        p = p[IP]
        # if you want to use a constant map, only let the following line
        p.src = "10.0.0.1"
        p.dst = "10.0.0.2"
        # if you want to use the original src/dst if you don't find it in ip_map
        p.src = ip_map.get(p.src, p.src)
        p.dst = ip_map.get(p.dst, p.dst)
        # if you want to drop the packet if you don't find both src and dst in ip_map
        if p.src not in ip_map or p.dst not in ip_map:
            continue
        p.src = ip_map[p.src]
        p.dst = ip_map[p.dst]
        # as suggested by @AliA, we need to let Scapy compute the correct checksum
        del(p.chksum)
        # then send the packet
        send(p)
    
  3. ==============================

    3.글쎄, scapy와 함께 나는 다음을 생각해 냈다 (나의 파이썬에 유감스럽게 생각한다). 희망적으로 그것은 누군가를 도울 것입니다. pcap 파일의 모든 패킷을 메모리로 읽어들이는 간단한 시나리오가 있었지만 대용량 캡처 파일에 문제가 발생할 수 있습니다.

    글쎄, scapy와 함께 나는 다음을 생각해 냈다 (나의 파이썬에 유감스럽게 생각한다). 희망적으로 그것은 누군가를 도울 것입니다. pcap 파일의 모든 패킷을 메모리로 읽어들이는 간단한 시나리오가 있었지만 대용량 캡처 파일에 문제가 발생할 수 있습니다.

    from scapy.all import *
    global src_ip, dst_ip
    src_ip = 1.1.1.1
    dst_ip = 2.2.2.2
    infile = "dump.pcap"
    
    try:
        my_reader = PcapReader(infile)
        my_send(my_reader)
    except IOError:
        print "Failed reading file %s contents" % infile
        sys.exit(1)
    
    def my_send(rd, count=100):
        pkt_cnt = 0
        p_out = []
    
        for p in rd:
            pkt_cnt += 1
            np = p.payload
            np[IP].dst = dst_ip
            np[IP].src = src_ip
            del np[IP].chksum
            p_out.append(np)
            if pkt_cnt % count == 0:
                send(PacketList(p_out))
                p_out = []
    
        # Send remaining in final batch
        send(PacketList(p_out))
        print "Total packets sent %d" % pkt_cn
    
  4. ==============================

    4.올바른 체크섬을 위해 delp [UDP] .checksum을 추가해야했습니다.

    올바른 체크섬을 위해 delp [UDP] .checksum을 추가해야했습니다.

  5. from https://stackoverflow.com/questions/8726881/sending-packets-from-pcap-with-changed-src-dst-in-scapy by cc-by-sa and MIT license