
tshark용 Python 래퍼로, Wireshark 디섹터를 사용하여 Python 패킷 파싱을 가능하게 합니다.
Python wrapper for tshark, allowing python packet parsing using wireshark dissectors.
확장 문서: http://kiminewt.github.io/pyshark
기여자 찾습니다 - 여러 가지 이유로 현재 패키지를 유지 관리하고 개선할 시간을 내기 어렵습니다. 모든 풀 리퀘스트는 검토될 것이며, 관심이 있고 적합한 분이 계시다면 프로젝트에 포함시키게 되어 기쁩니다. dorgreen1 at gmail.com으로 메일 주시기 바랍니다.
꽤 많은 Python 패킷 파싱 모듈이 있지만, 이 모듈은 실제로 패킷을 파싱하지 않고 단지 tshark(wireshark 명령행 유틸리티)의 XML 내보내기 기능을 사용하여 파싱한다는 점에서 다릅니다.
이 패키지는 캡처 파일이나 라이브 캡처에서 파싱을 수행하며, 설치된 모든 wireshark 디섹터를 사용합니다. Windows/Linux에서 테스트되었습니다.
Python 3.7+가 지원됩니다. 지원되지 않는 Python 2 버전은 pyshark-legacy로 존재합니다.
tshark / wireshark의 모든 최신 버전을 지원하지만 일부 기능은 이전 버전에서 사용하지 못할 수 있습니다.
다음을 실행하여 pypi에서 최신 버전을 설치하세요.
pip install pyshark
또는 git 저장소에서 설치:
git clone https://github.com/KimiNewt/pyshark.git
cd pyshark/src
python setup.py install
예상치 못한 libxml 설치가 필요할 수 있습니다. clang 오류 또는 libxml 관련 오류 메시지가 발생하면 다음을 실행하세요:
xcode-select --install
pip install libxml
XCode에 대한 EULA에 동의해야 할 수 있으므로 GUI에서 "동의" 대화상자를 클릭할 준비를 하세요.
>>> import pyshark
>>> cap = pyshark.FileCapture('/tmp/mycapture.cap')
>>> cap
<FileCapture /tmp/mycapture.cap (589 packets)>
>>> print cap[0]
Packet (Length: 698)
Layer ETH:
Destination: BLANKED
Source: BLANKED
Type: IP (0x0800)
Layer IP:
Version: 4
Header Length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))
Total Length: 684
Identification: 0x254f (9551)
Flags: 0x00
Fragment offset: 0
Time to live: 1
Protocol: UDP (17)
Header checksum: 0xe148 [correct]
Source: BLANKED
Destination: BLANKED
...
>>> capture = pyshark.LiveCapture(interface='eth0')
>>> capture.sniff(timeout=50)
>>> capture
<LiveCapture (5 packets)>
>>> capture[3]
<UDP/HTTP Packet>
for packet in capture.sniff_continuously(packet_count=5):
print('Just arrived:', packet)
>>> capture = pyshark.LiveRingCapture(interface='eth0')
>>> capture.sniff(timeout=50)
>>> capture
<LiveCapture (5 packets)>
>>> capture[3]
<UDP/HTTP Packet>
for packet in capture.sniff_continuously(packet_count=5):
print('Just arrived:', packet)
>>> capture = pyshark.RemoteCapture('192.168.1.101', 'eth0')
>>> capture.sniff(timeout=50)
>>> capture
데이터는 여러 방식으로 접근할 수 있습니다. 패킷은 레이어로 나뉘며, 먼저 적절한 레이어에 도달한 후 필드를 선택해야 합니다.
다음은 모두 작동합니다:
>>> packet['ip'].dst
192.168.0.1
>>> packet.ip.src
192.168.0.100
>>> packet[2].src
192.168.0.100
패킷에 레이어가 있는지 확인하려면 이름을 사용할 수 있습니다:
>>> 'IP' in packet
True
가능한 모든 필드 이름을 보려면 packet.layer.field_names 속성(예: packet.ip.field_names)이나 인터프리터의 자동 완성 기능을 사용하세요.
필드의 원본 이진 데이터나 그에 대한 예쁜 설명도 얻을 수 있습니다:
>>> p.ip.addr.showname
Source or Destination Address: 10.0.0.10 (10.0.0.10)
# 그리고 몇 가지 새로운 속성도 있습니다:
>>> p.ip.addr.int_value
167772170
>>> p.ip.addr.binary_value
b'\n\x00\x00\n'
Pyshark는 WEP, WPA-PWD, WPA-PSK 표준을 사용한 트레이스 자동 복호화를 지원합니다(WPA-PWD가 기본값입니다).
>>> cap1 = pyshark.FileCapture('/tmp/capture1.cap', decryption_key='password')
>>> cap2 = pyshark.LiveCapture(interface='wi0', decryption_key='password', encryption_type='wpa-psk')
지원되는 암호화 표준의 튜플인 SUPPORTED_ENCRYPTION_STANDARDS가 각 캡처 클래스에 존재합니다.
>>> pyshark.FileCapture.SUPPORTED_ENCRYPTION_STANDARDS
('wep', 'wpa-pwd', 'wpa-psk')
>>> pyshark.LiveCapture.SUPPORTED_ENCRYPTION_STANDARDS
('wep', 'wpa-pwd', 'wpa-psk')
Pyshark 디스플레이 필터는 애플리케이션 중심 트래픽을 분석하는 데 유용할 수 있습니다. BPF 필터는 Wireshark의 디스플레이 필터만큼 유연하지 않습니다.
>>> cap1 = pyshark.FileCapture('/tmp/capture1.cap', display_filter="dns")
>>> cap2 = pyshark.LiveCapture(interface='en0', display_filter="tcp.analysis.retransmission")
이 프로젝트는 MIT 라이선스로 제공됩니다. 이 프로젝트에 대한 기여는 동일한 라이선스 하에 수락됩니다.