2015-06-20 5 views
-1

Я написал базовый сетевой сниффер с Python. Когда поступают пакеты, программа печатает сломанные символы в моем терминале gnome. коды программы:Терминал Gnome печатает сломанные символы с пакетом sniffer

#!/usr/bin/python 
import socket 
import struct 
import binascii 

s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, 8) 
i = 1 

while True: 
    pkt = s.recvfrom(2048) 
    ethhead = pkt[0][0:14] 
    eth = struct.unpack("!6s6s2s",ethhead) 

    print "--------Ethernet Frame %d------" % i 
    print "Destination MAC: ", binascii.hexlify(eth[0]) 
    print "Source MAC: ", binascii.hexlify(eth[1]) 
    binascii.hexlify(eth[2]) 

    ipheader = pkt[0][14:34] #next 20 bytes 
    ip_hdr = struct.unpack("!8sB3s4s4s",ipheader) 
    print "-----------IP------------------" 
    print "TTL :", ip_hdr[1] 
    print "Source IP", socket.inet_ntoa(ip_hdr[3]) 
    print "Destination IP", socket.inet_ntoa(ip_hdr[4]) 

    tcpheader = pkt[0][34:54] #extracts next 20 bytes 
    tcp_hdr = struct.unpack("!HH9ss6s",tcpheader)  
    print "---------TCP----------" 
    print "Source Port ", tcp_hdr[0] 
    print "Destination port ", tcp_hdr[1] 
    print "Flag ",binascii.hexlify(tcp_hdr[3]) 

    print "\n\n" 
    i += 1 
    print pkt[0][54:] 

Пример вывода:

Sample Output Picture

Я установил терминал> Установить кодировку символов> Unicode (UTF-8), но это не сработало.

Я использую Kali Linux 1.1.0, терминал Gnome v 3.4.1.1.

ответ

0

К сожалению, многие протоколы, такие как SSH и HTTPS, используют шифрование и отображают символы, которые не существуют в ASCII или UTF-8. Ваш терминал не сможет их показать. Это связано с тем, что такие вещи, как пароли и данные, должны быть скрыты, чтобы люди не могли делать MITM почти так же легко. Попробуйте Wireshark, графический пакетный сниффер, он может работать.

0

Байты в диапазоне 128-255 обычно не образуют действительные строки UTF-8. Даже если полезная нагрузка кодируется в UTF-8, нет гарантии, что границы пакетов будут совпадать с границами кодовых точек.

Возможно, в качестве обходного пути вы хотели бы отображать пакеты, например. Строки ISO-8859-1 или, возможно, даже (gasp) предлагают возможность указать кодировку. Единственное изменение, которое вам нужно, это pkt[0][54:].decode(encoding) - если когда-либо есть пакет, содержащий только полные, действительные последовательности UTF-8, умственное его декодирование с этого выхода должно быть возможно с небольшим количеством тренировок.