문제

Python을 사용하여 네트워크 패킷을 스니핑하는 가장 좋은 방법은 무엇입니까?

여러 곳에서 가장 적합한 모듈은 SCAPY라는 모듈이라고 들었습니다. 불행히도 내 시스템에서 Python.exe가 충돌합니다. 다른 많은 사람들이 Windows에서 특히 잘 작동하지 않는다고 말한 것을 제외하고는 설치 방법에 문제가 있다고 가정합니다. (누군가 관심이 있다면 나는 Windows Vista를 실행하고 있는데, 그것은 사물에 영향을 줄 수 있습니다).

더 나은 솔루션을 아는 사람이 있습니까?

upd :

PYPCAP를 설치하라고 지시 한 답변을 읽은 후, 나는 그것에 대해 약간 엉망이되어 내가 사용했던 SCAPY가 사용하기위한 수정 된 버전이라는 점을 제외하고 PYPCAP를 설치하라고 지시하고 있음을 알았습니다. 대답의 예제도 교수형을 일으켰기 때문에이 수정 된 PYPCAP는 문제를 일으킨 것 같습니다.

PYPCAP의 원래 버전 (Google 사이트에서)을 설치했으며 SCAPY는 잘 작동하기 시작했습니다 (많은 것을 시도하지는 않았지만 스니핑을 시작하자마자 충돌하지 않았습니다). SCAPY 개발자에게 새로운 결함 티켓을 보냈습니다. http://trac.secdev.org/scapy/ticket/166, 그들이 그것으로 무언가를 할 수 있기를 바랍니다.

어쨌든, 내가 알게 될 것이라고 생각했다.

도움이 되었습니까?

해결책

사용 PYPCAP:

import dpkt, pcap
pc = pcap.pcap()     # construct pcap object
pc.setfilter('icmp') # filter out unwanted packets
for timestamp, packet in pc:
    print dpkt.ethernet.Ethernet(packet)

출력 샘플 :

Ethernet(src='\x00\x03G\xb2M\xe4', dst='\x00\x03G\x06h\x18', data=IP(src='\n\x00\x01\x1c',
dst='\n\x00\x01\x10', sum=39799, len=60, p=1, ttl=128, id=35102, data=ICMP(sum=24667,
type=8, data=Echo(id=512, seq=60160, data='abcdefghijklmnopqrstuvwabcdefghi'))))

Ethernet(src='\x00\x03G\x06h\x18', dst='\x00\x03G\xb2M\xe4', data=IP(src='\n\x00\x01\x10',
dst='\n\x00\x01\x1c', sum=43697, len=60, p=1, ttl=255, id=64227, data=ICMP(sum=26715,
data=Echo(id=512, seq=60160, data='abcdefghijklmnopqrstuvwabcdefghi'))))

다른 팁

어려운 방법

원시 소켓을 사용하여 모든 IP 패킷을 스니핑 할 수 있습니다.
원시 소켓은 소켓이 이진으로 데이터를 보내고 수신합니다.
파이썬의 이진은 다음과 같은 문자열로 표시됩니다. \x00\xff... 모든 \x.. 바이트입니다.
IP 패킷을 읽으려면 IP 프로토콜에 따라 이진에서 수신 된 패킷을 분석해야합니다.

이것은 모든 헤더의 크기로 크기가있는 IP 프로토콜 형식의 이미지입니다.

IP protocol format

이 튜토리얼은 원시 패킷을 이해하고 헤더로 나누는 데 도움이 될 수 있습니다. http://www.binarytides.com/python-packet-sniffer-code-linux/

쉬운 방법

IP 패킷을 매우 쉽게 스니핑하는 또 다른 방법은 SCAPY 모듈을 사용하는 것입니다.

from scapy.all import *
sniff(filter="ip", prn=lambda x:x.sprintf("{IP:%IP.src% -> %IP.dst%\n}"))

이 코드는 모든 IP 패킷의 소스 IP 및 대상 IP를 위해 인쇄합니다. 여기에서 문서를 읽음으로써 SCAPY로 훨씬 더 많은 일을 할 수 있습니다. http://www.secdev.org/projects/scapy/doc/usage.html

그것은 당신이 달성하려는 목표에 따라 다르지만 프로젝트를 구축 해야하는 경우 IT의 기능은 IP 패킷을 스니핑하는 것입니다. 더 안정적인 스크립트에 SCAPY를 사용하는 것이 좋습니다.

사용 Python-libpcap.

import pcap

p = pcap.pcapObject()
dev = pcap.lookupdev()
p.open_live(dev, 1600, 0, 100)
#p.setnonblock(1)
try:
    for pktlen, data, timestamp in p:
        print "[%s] Got data: %s" % (time.strftime('%H:%M', 
                                                   time.localtime(timestamp)),
                                     data)
except KeyboardInterrupt:
    print '%s' % sys.exc_type
    print 'shutting down'
    print ('%d packets received, %d packets dropped'
           ' %d packets dropped by interface') % p.stats()

인터페이스 IP 주소 (관리 모드)와 함께 원시 소켓을 사용할 수 있습니다.

import socket
s = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_IP)
s.bind(("YOUR_INTERFACE_IP",0))
s.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)
s.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)
while True:
   data = s.recvfrom(10000)
   print data

또 다른 옵션입니다 PYPCAP.

결과를 구문 분석하려면 건설하다 매우 매끄 럽습니다.

SCAPY 인 경우 Pleae는 다음 방법을 시도하십시오. (Windows 10에서 작동합니다)

# -*- coding: utf-8 -*-

# pip install scapy

"""
[{'name': 'Intel(R) 82574L Gigabit Network Connection',
  'win_index': '4',
  'description': 'Ethernet0',
  'guid': '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}',
  'mac': '00:0C:29:5C:EE:6D',
  'netid': 'Ethernet0'}]
"""

from pprint import pprint
from scapy.arch.windows import get_windows_if_list
from scapy.all import *


# disable verbose mode
conf.verb = 0


def parse_packet(packet):
    """sniff callback function.
    """
    if packet and packet.haslayer('UDP'):
        udp = packet.getlayer('UDP')
        udp.show()


def udp_sniffer():
    """start a sniffer.
    """
    interfaces = get_windows_if_list()
    pprint(interfaces)

    print('\n[*] start udp sniffer')
    sniff(
        filter="udp port 53",
        iface=r'Intel(R) 82574L Gigabit Network Connection', prn=parse_packet
    )


if __name__ == '__main__':
    udp_sniffer()
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top