파이썬에서 패킷 스니핑 (Windows)
문제
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 프로토콜 형식의 이미지입니다.
이 튜토리얼은 원시 패킷을 이해하고 헤더로 나누는 데 도움이 될 수 있습니다. 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
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()