Sisniff: Unterschied zwischen den Versionen

Aus Si:Wiki von Siegrist SystemLösungen - Informatik und Rezepte
Wechseln zu: Navigation, Suche
K
K
Zeile 22: Zeile 22:
 
   -pH                  Show HTTP Payload
 
   -pH                  Show HTTP Payload
 
</pre></small>
 
</pre></small>
<br />
+
<br /><p>
Download der aktuellen Version: [http://www.zweiernet.ch/download/sisniff-0.7.tar.gz sisniff-0.7.tar.gz]<br />
+
 
 +
;Downloads der aktuellen Version:
 +
: Source: [https://gitlab.com/siongitlab/sisniff/raw/master/sisniff.py]<br />
 +
: gzipped: [https://gitlab.com/siongitlab/sisniff/-/archive/master/sisniff-master.tar.gz]<br>
 +
<p>
  
 
{{IBox|i|
 
{{IBox|i|
Zeile 51: Zeile 55:
 
import argparse
 
import argparse
  
VERSION = "0.71"
+
VERSION = "0.76"
  
 
PROC_TCP4 = "/proc/net/tcp"
 
PROC_TCP4 = "/proc/net/tcp"
 
PROC_UDP4 = "/proc/net/udp"
 
PROC_UDP4 = "/proc/net/udp"
 +
PROC_ICMP4 = "/proc/net/icmp"
 
PROC_TCP6 = "/proc/net/tcp6"
 
PROC_TCP6 = "/proc/net/tcp6"
 
PROC_UDP6 = "/proc/net/udp6"
 
PROC_UDP6 = "/proc/net/udp6"
 
PROC_PACKET = "/proc/net/packet"
 
PROC_PACKET = "/proc/net/packet"
  
 +
# Services
 
TSERV = dict((TCP_SERVICES[k], k) for k in TCP_SERVICES.keys())
 
TSERV = dict((TCP_SERVICES[k], k) for k in TCP_SERVICES.keys())
 
USERV = dict((UDP_SERVICES[k], k) for k in UDP_SERVICES.keys())
 
USERV = dict((UDP_SERVICES[k], k) for k in UDP_SERVICES.keys())
  
 +
# IP Protocol Numbers (dec)
 +
IPPROTO_ICMP = 1
 +
IPPROTO_TCP = 6
 +
IPROTOP_IGP = 9
 +
IPPROTO_UDP = 17
 +
 +
nostate = set(['04','05','06''07','08','09','0C','0D'])
 
tcp_payload_hdrs = ['GET|POST|HTTP|HEAD|PUT|PATCH|DELETE|TRACE|OPTIONS|CONNECT']
 
tcp_payload_hdrs = ['GET|POST|HTTP|HEAD|PUT|PATCH|DELETE|TRACE|OPTIONS|CONNECT']
 
numeric = False
 
numeric = False
Zeile 69: Zeile 82:
 
def get_conn_info(proto,hosts,ports):
 
def get_conn_info(proto,hosts,ports):
 
     ''' returns: pid, exe, uid '''
 
     ''' returns: pid, exe, uid '''
 
+
    uid = 0
 +
   
 
     line_array = _proc4load(proto,hosts,ports)
 
     line_array = _proc4load(proto,hosts,ports)
   
+
   
 
     if line_array == 0:
 
     if line_array == 0:
 
         return ['?','?','?']
 
         return ['?','?','?']
Zeile 80: Zeile 94:
 
         uid = line_array[7]
 
         uid = line_array[7]
 
     '''
 
     '''
     uid = 0
+
       
 +
     inode = str(line_array[9])
 +
    if inode == "0":
 +
        return ['.','.','.']
 
      
 
      
     inode = line_array[9]                # Need the inode to get process pid.
+
     pid = _get_pid_of_inode(inode)          # try get a pid
    if inode == 0:
+
        return ['?','-','?']
+
 
      
 
      
    pid = _get_pid_of_inode(inode)
 
    if pid == "NoPid":
 
        return ["NoPid", "NoExe", uid]
 
 
      
 
      
 +
    if pid == "NoPid":
 +
        #print ">>>>>>>>>>>NoPID:" + str(hosts) +" "+ str(ports) + "//" + str(line_array)
 +
        return ['-', '-', uid]
 +
 
     try:                                            # try read the process name.
 
     try:                                            # try read the process name.
 
         exe = os.readlink('/proc/'+pid+'/exe').split('/')[-1]
 
         exe = os.readlink('/proc/'+pid+'/exe').split('/')[-1]
Zeile 102: Zeile 118:
 
     ''' Read the table of tcp/udp connections
 
     ''' Read the table of tcp/udp connections
 
     tcp/udp: "sl,  local_address, rem_address, st, tx_queue rx_queue, tr tm->when, retrnsmt,  uid , timeout, inode ,..."
 
     tcp/udp: "sl,  local_address, rem_address, st, tx_queue rx_queue, tr tm->when, retrnsmt,  uid , timeout, inode ,..."
     ---- TCP states
+
     ---- TCP states from https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/net/tcp_states.h?id=HEAD
 
     enum {
 
     enum {
 
TCP_ESTABLISHED = 1,
 
TCP_ESTABLISHED = 1,
Zeile 121: Zeile 137:
 
     ----------
 
     ----------
 
     '''
 
     '''
     content = []
+
      
    if proto == 6:
+
    #xhosts = _ip_hexrev(hosts)
 +
    xports = _dec2hex(ports)
 +
   
 +
    if proto == IPPROTO_UDP:
 +
        try:
 +
            with open(PROC_UDP4,'r') as f:
 +
                next(f)
 +
                for line in f:
 +
                    line_arrayu = _remove_empty(line.split(' '))
 +
                    l_xhost,l_xport = line_arrayu[1].split(':')
 +
                    if l_xhost not in xMYADDRS:
 +
                        continue
 +
                    if l_xport == xports:
 +
                        return line_arrayu
 +
                       
 +
                return 0
 +
        except:
 +
            print "open proc_udp4 error"
 +
            return 0
 +
    elif proto == IPPROTO_TCP:
 
         try:
 
         try:
 
             with open(PROC_TCP4,'r') as f:
 
             with open(PROC_TCP4,'r') as f:
                 content = f.readlines()
+
                 next(f)
                 f.close()
+
                 for line in f:
                content.pop(0)
+
                    line_arrayt = _remove_empty(line.split(' '))
 +
                    if line_arrayt[3] in nostate:        # not some TCP state
 +
                        continue
 +
                    l_xhost,l_xport = line_arrayt[1].split(':')
 +
                    if l_xhost not in xMYADDRS:
 +
                        continue
 +
                    if l_xport == xports:
 +
                        return line_arrayt
 +
                       
 +
                return 0
 
         except:
 
         except:
             print "open proc_tcp4 error"
+
             print "open proc_tcp error"
 
             return 0
 
             return 0
     if proto == 17:
+
      
 +
    elif proto == IPPROTO_ICMP:
 
         try:
 
         try:
             with open(PROC_UDP4,'r') as f:
+
             with open(PROC_ICMP4,'r') as f:
                 content = f.readlines()
+
                 next(f)
                 f.close()
+
                 for line in f:
                content.pop(0)
+
                    line_arrayi = _remove_empty(line.split(' '))
 +
                    l_xhost,l_xport = line_arrayi[1].split(':')
 +
                    if l_xhost not in xMYADDRS:
 +
                        continue
 +
                    if l_xport == xports:
 +
                        return line_arrayi
 +
                       
 +
                return 0
 
         except:
 
         except:
             print "open proc_udp4 error"
+
             print "open proc_icmp4 error"
 
             return 0
 
             return 0
 
      
 
      
    for line in content:    # src
 
        line_array = _remove_empty(line.split(' '))
 
        if line_array[3] in ['04','05','06''07','08','09','0C','0D']:        # not some state
 
            continue
 
        l_host,l_port = _convert_ipv4_port(line_array[1])
 
        # alt if l_host == '127.0.0.1' or l_host not in MYADDRS:
 
        if l_host not in MYADDRS:
 
            continue
 
       
 
        if str(l_port) == str(ports):
 
            #print l_host+" "+str(l_port)+" // "+host+" "+str(port)
 
            return line_array
 
    #print "no entry in procfile found!"
 
 
     return 0
 
     return 0
  
Zeile 159: Zeile 198:
 
     host,port = array.split(':')
 
     host,port = array.split(':')
 
     return _ip(host),_hex2dec(port)
 
     return _ip(host),_hex2dec(port)
 
+
       
 
def _hex2dec(s):
 
def _hex2dec(s):
 
     return str(int(s,16))
 
     return str(int(s,16))
  
 +
def _dec2hex(p):
 +
    return hex(int(p)).split('x')[-1].upper()
 +
   
 
def _ip(s):
 
def _ip(s):
 
     ip = [(_hex2dec(s[6:8])),(_hex2dec(s[4:6])),(_hex2dec(s[2:4])),(_hex2dec(s[0:2]))]
 
     ip = [(_hex2dec(s[6:8])),(_hex2dec(s[4:6])),(_hex2dec(s[2:4])),(_hex2dec(s[0:2]))]
Zeile 171: Zeile 213:
 
     #print '66666:', ':'.join(ip), s
 
     #print '66666:', ':'.join(ip), s
 
     return ':'.join(ip)
 
     return ':'.join(ip)
 +
 +
def _ip_hexrev(ip):
 +
    return ''.join([hex(int(x)+256)[3:] for x in ip.split('.')][::-1]).upper()
  
 
def _remove_empty(array):
 
def _remove_empty(array):
     return [x for x in array if x !='']
+
     return [x for x in array if x != '']
  
 
def _get_pid_of_inode(inode):
 
def _get_pid_of_inode(inode):
     for item in glob.glob('/proc/[0-9]*/fd/[0-9]*'):
+
    s_term = r'^socket\:\['+ inode +r'\]$'
 +
     for item in glob.iglob('/proc/[0-9]*/fd/[0-9]*'):
 
         try:
 
         try:
             if re.search(inode,os.readlink(item)):
+
             if re.match(s_term,os.readlink(item)):
 
                 return item.split('/')[2]
 
                 return item.split('/')[2]
 
         except:
 
         except:
Zeile 217: Zeile 263:
 
     if packet[0][1].src in MYADDRS:
 
     if packet[0][1].src in MYADDRS:
 
         conn_addr = packet[0][1].src
 
         conn_addr = packet[0][1].src
         if packet.haslayer(TCP) or packet.haslayer(UDP):
+
         if packet.haslayer(TCP) or packet.haslayer(UDP) or packet.haslayer(ICMP):
             conn_port = packet[0][2].sport
+
             try:
 +
                conn_port = packet[0][2].sport
 +
            except:
 +
                conn_port = 99999
 
         o_dir = 1
 
         o_dir = 1
 
     else:
 
     else:
 
         conn_addr = packet[0][1].dst
 
         conn_addr = packet[0][1].dst
         if packet.haslayer(TCP) or packet.haslayer(UDP):
+
         if packet.haslayer(TCP) or packet.haslayer(UDP) or packet.haslayer(ICMP):
             conn_port = packet[0][2].dport
+
             try:
 +
                conn_port = packet[0][2].dport
 +
            except:
 +
                conn_port = 99999
 
         o_dir = 0
 
         o_dir = 0
 
      
 
      
     if packet.haslayer(TCP) or packet.haslayer(UDP):
+
     if packet.haslayer(TCP) or packet.haslayer(UDP) or packet.haslayer(ICMP):        # grrr, no info in /proc/net/icmp so far. or packet.haslayer(ICMP):
 
         # logemol casch  
 
         # logemol casch  
         c_hash = conn_addr+'.'+str(conn_port)
+
         c_hash = conn_addr+'=:='+str(conn_port)
 
         if not any(x[0] == c_hash for x in conn_cache):
 
         if not any(x[0] == c_hash for x in conn_cache):
 
             # get the connection info from packet
 
             # get the connection info from packet
 
             spid,sexe,suid = get_conn_info(packet[0][1].proto, conn_addr, conn_port)
 
             spid,sexe,suid = get_conn_info(packet[0][1].proto, conn_addr, conn_port)
       
 
 
             if re.match("^[0-9]+$", spid):
 
             if re.match("^[0-9]+$", spid):
 
                 program = sexe
 
                 program = sexe
Zeile 239: Zeile 290:
 
                  
 
                  
 
                 # update cache
 
                 # update cache
                 if len(conn_cache) > cc_maxlen:
+
                 if len(conn_cache) >= cc_maxlen:
 
                     conn_cache.pop(0)
 
                     conn_cache.pop(0)
 
                 conn_cache.append([c_hash,program,pid])
 
                 conn_cache.append([c_hash,program,pid])
 
                 #print conn_cache
 
                 #print conn_cache
 
             else:
 
             else:
                 program = "-"
+
                 program = sexe
                 pid = "-"
+
                 pid = spid
                 uid = "-"
+
                 uid = suid
 
         else:
 
         else:
 
             # me honds fom casch
 
             # me honds fom casch
Zeile 271: Zeile 322:
 
         flags = ""
 
         flags = ""
 
         #o_payload = packet[0].sprintf('%10s,UDP.payload%')
 
         #o_payload = packet[0].sprintf('%10s,UDP.payload%')
     if packet.haslayer(TCP):
+
     elif packet.haslayer(TCP):
 
         o_proto = "TCP"
 
         o_proto = "TCP"
 
         try:
 
         try:
Zeile 289: Zeile 340:
 
                     o_payload = str(request_line)
 
                     o_payload = str(request_line)
 
                     #o_payload = tpld[0:20]
 
                     #o_payload = tpld[0:20]
      
+
     elif packet.haslayer(ICMP):
 +
        o_proto = "ICMP"
 +
        if conn_port == 99999:
 +
            o_dport = "-"
 +
            o_sport = "-"
 +
        else:
 +
            try:
 +
                o_dport = "\033[1m"+USERV[packet[0][2].sport]+"\033[0m"
 +
            except:
 +
                o_dport = str(packet[0][2].sport)
 +
            try:
 +
                o_sport = "\033[1m"+USERV[packet[0][2].dport]+"\033[0m"
 +
            except:
 +
                o_sport = str(packet[0][2].dport)
 +
        flags = "["+packet[0].sprintf('%ICMP.type%') + "/" + packet[0].sprintf('%ICMP.code%')+"]"
 +
    else:
 +
        o_proto = "UNKNOWN"
 +
       
 
     if o_dir == 1:
 
     if o_dir == 1:
 
         if numeric == False:
 
         if numeric == False:
Zeile 320: Zeile 388:
 
     conf.sniff_promisc=0
 
     conf.sniff_promisc=0
 
     conf.sniff_promisc=0
 
     conf.sniff_promisc=0
     print conf
+
     #print conf
     #sys.exit()
+
     sys.exit()
  
 
# get the interfaces
 
# get the interfaces
Zeile 345: Zeile 413:
  
 
# local addresses  
 
# local addresses  
MYADDRS = _remove_empty(commands.getoutput("hostname -I").split(' '))
+
MYADDRS = _remove_empty([os.popen('ip addr show '+iface).read().split("inet ")[1].split("/")[0]])
 
MYADDRS.append('0.0.0.0')
 
MYADDRS.append('0.0.0.0')
 
MYADDRS.append('127.0.0.1')
 
MYADDRS.append('127.0.0.1')
 +
xMYADDRS = [_ip_hexrev(x) for x in MYADDRS]
 
print "> My IP-Addresses: " + str(MYADDRS)
 
print "> My IP-Addresses: " + str(MYADDRS)
  
Zeile 357: Zeile 426:
 
res_cache = {}
 
res_cache = {}
 
n_try = 3
 
n_try = 3
 
+
print
 +
print "Prog/PID mavericks: ?/? = No entry in /proc/net/xxx; -/- = No PID for Inode found; ./. = Inode=0;"
 
print
 
print
 
print "Program/PID: Local addr:port <<->> Remote addr:port [Flags] Len:length : [Payload]"
 
print "Program/PID: Local addr:port <<->> Remote addr:port [Flags] Len:length : [Payload]"
Zeile 363: Zeile 433:
  
 
# sniff, filtering for IP traffic
 
# sniff, filtering for IP traffic
sniff(filter="ip"+fillter,iface=iface,prn=doPackets)
+
sniff(filter="ip"+fillter,iface=iface,prn=doPackets, store=0)
  
 
## -- oond denn isch schloss
 
## -- oond denn isch schloss

Version vom 4. Mai 2018, 17:01 Uhr

Ein Netzwerk-Sniffer der für jedes Packet nebst Adresse und Port die lokal verbundene Anwendung und deren PID ermittelt und anzeigt.
Es wird TCP, UDP und ICMP unterstützt.
Der Sniffer akzeptiert Filter wie sie bei tcpdump üblich sind.

Bei HTTP Verbindungen kann ausserdem ein Teil der Payload angezeigt werden.

sisniff Image

Die Option -h gibt eine Argumenteübersicht und listet die verfügbaren Interfaces auf.

# ./sisniff.py -h
usage: sisniff.py [-h] -i {eth0,lo,tun0,wlan0} [-n] [-pH] [filter]

positional arguments:
  filter                Pcap filter (BPF syntax) on top of IP (in dbl-quotes "...")

optional arguments:
  -h, --help            show this help message and exit
  -i {eth0,lo,tun0,wlan0}
                        Interface (mandatory)
  -n                    Do not resolve IP-Addresses
  -pH                   Show HTTP Payload

Downloads der aktuellen Version
Source: [1]
gzipped: [2]
<p>
i

Da sisniff.py auf der Scapy sniff()-Funktion aufsetzt, wird Scapy > 2.x benötigt:

Unter Debian/Ubuntu: apt-get install scapy
Andere: http://www.secdev.org/projects/scapy/


Python2 Code of sisniff.py:

#!/usr/bin/python2
 
# (c) 2017 by Siegrist(SystemLoesungen) <PSS@ZweierNet.ch>
 
from scapy.all import *
import pwd
import os
import re
import glob
import sys
import string
import fcntl
import struct
import commands
import argparse
 
VERSION = "0.76"
 
PROC_TCP4 = "/proc/net/tcp"
PROC_UDP4 = "/proc/net/udp"
PROC_ICMP4 = "/proc/net/icmp"
PROC_TCP6 = "/proc/net/tcp6"
PROC_UDP6 = "/proc/net/udp6"
PROC_PACKET = "/proc/net/packet"
 
# Services
TSERV = dict((TCP_SERVICES[k], k) for k in TCP_SERVICES.keys())
USERV = dict((UDP_SERVICES[k], k) for k in UDP_SERVICES.keys())
 
# IP Protocol Numbers (dec)
IPPROTO_ICMP = 1
IPPROTO_TCP = 6
IPROTOP_IGP = 9
IPPROTO_UDP = 17
 
nostate = set(['04','05','06''07','08','09','0C','0D'])
tcp_payload_hdrs = ['GET|POST|HTTP|HEAD|PUT|PATCH|DELETE|TRACE|OPTIONS|CONNECT']
numeric = False
payloadH = False
fillter = ""
 
def get_conn_info(proto,hosts,ports):
    ''' returns: pid, exe, uid '''
    uid = 0
 
    line_array = _proc4load(proto,hosts,ports)
 
    if line_array == 0:
        return ['?','?','?']
    '''    
    try:
        uid = pwd.getpwuid(int(line_array[7]))[0]       # Get user from UID.
    except:
        uid = line_array[7]
    '''
 
    inode = str(line_array[9])
    if inode == "0":
        return ['.','.','.']
 
    pid = _get_pid_of_inode(inode)          # try get a pid
 
 
    if pid == "NoPid":
        #print ">>>>>>>>>>>NoPID:" + str(hosts) +" "+ str(ports) + "//" + str(line_array)
        return ['-', '-', uid]
 
    try:                                            # try read the process name.
        exe = os.readlink('/proc/'+pid+'/exe').split('/')[-1]
    except:
        exe = None
 
    #print str(lhost) +" "+ str(lport) +" "+ inode +" "+ pid
    return [pid, exe, uid]
 
 
def _proc4load(proto,hosts,ports):
    ''' Read the table of tcp/udp connections
    tcp/udp: "sl,  local_address, rem_address, st, tx_queue rx_queue, tr tm->when, retrnsmt,   uid , timeout, inode ,..."
    ---- TCP states from https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/net/tcp_states.h?id=HEAD
    enum {
	TCP_ESTABLISHED = 1,
	TCP_SYN_SENT,
	TCP_SYN_RECV,
	TCP_FIN_WAIT1,
	TCP_FIN_WAIT2,
	TCP_TIME_WAIT,
	TCP_CLOSE,
	TCP_CLOSE_WAIT,
	TCP_LAST_ACK,
	TCP_LISTEN,
	TCP_CLOSING,	/* Now a valid state */
	TCP_NEW_SYN_RECV,
 
	TCP_MAX_STATES	/* Leave at the end! */
    };
    ----------
    '''
 
    #xhosts = _ip_hexrev(hosts)
    xports = _dec2hex(ports)
 
    if proto == IPPROTO_UDP:
        try:
            with open(PROC_UDP4,'r') as f:
                next(f)
                for line in f:
                    line_arrayu = _remove_empty(line.split(' '))
                    l_xhost,l_xport = line_arrayu[1].split(':')
                    if l_xhost not in xMYADDRS:
                        continue
                    if l_xport == xports:
                        return line_arrayu
 
                return 0
        except:
            print "open proc_udp4 error"
            return 0
    elif proto == IPPROTO_TCP:
        try:
            with open(PROC_TCP4,'r') as f:
                next(f)
                for line in f:
                    line_arrayt = _remove_empty(line.split(' '))
                    if line_arrayt[3] in nostate:        # not some TCP state
                        continue
                    l_xhost,l_xport = line_arrayt[1].split(':')
                    if l_xhost not in xMYADDRS:
                        continue
                    if l_xport == xports:
                        return line_arrayt
 
                return 0
        except:
            print "open proc_tcp error"
            return 0
 
    elif proto == IPPROTO_ICMP:
        try:
            with open(PROC_ICMP4,'r') as f:
                next(f)
                for line in f:
                    line_arrayi = _remove_empty(line.split(' '))
                    l_xhost,l_xport = line_arrayi[1].split(':')
                    if l_xhost not in xMYADDRS:
                        continue
                    if l_xport == xports:
                        return line_arrayi
 
                return 0
        except:
            print "open proc_icmp4 error"
            return 0
 
    return 0
 
def _convert_ipv4_port(array):
    host,port = array.split(':')
    return _ip(host),_hex2dec(port)
 
def _hex2dec(s):
    return str(int(s,16))
 
def _dec2hex(p):
    return hex(int(p)).split('x')[-1].upper()
 
def _ip(s):
    ip = [(_hex2dec(s[6:8])),(_hex2dec(s[4:6])),(_hex2dec(s[2:4])),(_hex2dec(s[0:2]))]
    return '.'.join(ip)
 
def _ip6(s):
    ip = [s[6:8],s[4:6],s[2:4],s[0:2],s[12:14],s[14:16],s[10:12],s[8:10],s[22:24],s[20:22],s[18:20],s[16:18],s[30:32],s[28:30],s[26:28],s[24:26]]
    #print '66666:', ':'.join(ip), s
    return ':'.join(ip)
 
def _ip_hexrev(ip):
    return ''.join([hex(int(x)+256)[3:] for x in ip.split('.')][::-1]).upper()
 
def _remove_empty(array):
    return [x for x in array if x != '']
 
def _get_pid_of_inode(inode):
    s_term = r'^socket\:\['+ inode +r'\]$'
    for item in glob.iglob('/proc/[0-9]*/fd/[0-9]*'):
        try:
            if re.match(s_term,os.readlink(item)):
                return item.split('/')[2]
        except:
            pass
    return "NoPid"
 
def _resolve_ip(host):
    """
    resolve ip und update dictionary res_cache {'ip': 'name'}.
    If resolution for a ip failed, 'name' is n_try ... 0.
    """
    try:
        hname = socket.gethostbyaddr(host)[0]
        res_cache[host] = str(hname)
        return str(hname)
    except:
        res_cache[host] = str(host)
        return str(host)
 
def check_root():
   if os.getuid() == 0:
       return True
   else:
       return False
 
## Define our Custom Action function
def doPackets(packet):
 
    program = "-"
    pid = "-"    
    uid = "-"    
    o_proto = ""
    o_dport = "none"
    o_sport = "none"
    flags = ""
 
    # only local addresses
    if packet[0][1].src in MYADDRS:
        conn_addr = packet[0][1].src
        if packet.haslayer(TCP) or packet.haslayer(UDP) or packet.haslayer(ICMP):
            try:
                conn_port = packet[0][2].sport
            except:
                conn_port = 99999
        o_dir = 1
    else:
        conn_addr = packet[0][1].dst
        if packet.haslayer(TCP) or packet.haslayer(UDP) or packet.haslayer(ICMP):
            try:
                conn_port = packet[0][2].dport
            except:
                conn_port = 99999
        o_dir = 0
 
    if packet.haslayer(TCP) or packet.haslayer(UDP) or packet.haslayer(ICMP):        # grrr, no info in /proc/net/icmp so far. or packet.haslayer(ICMP):
        # logemol casch 
        c_hash = conn_addr+'=:='+str(conn_port)
        if not any(x[0] == c_hash for x in conn_cache):
            # get the connection info from packet
            spid,sexe,suid = get_conn_info(packet[0][1].proto, conn_addr, conn_port)
            if re.match("^[0-9]+$", spid):
                program = sexe
                pid = spid
                uid = suid
 
                # update cache
                if len(conn_cache) >= cc_maxlen:
                    conn_cache.pop(0)
                conn_cache.append([c_hash,program,pid])
                #print conn_cache
            else:
                program = sexe
                pid = spid
                uid = suid
        else:
            # me honds fom casch
            indx = [x[0] for x in conn_cache].index(c_hash)
            program = conn_cache[indx][1]
            pid = conn_cache[indx][2]
            uid = 0
            # cache aktualisieren
            renew = conn_cache.pop(indx)
            conn_cache.append(renew)
 
 
    o_payload = ""
    if packet.haslayer(UDP):
        o_proto = "UDP"
        try:
            o_dport = "\033[1m"+USERV[packet[0][2].dport]+"\033[0m"
        except:
            o_dport = str(packet[0][2].dport)
        try:
            o_sport = "\033[1m"+USERV[packet[0][2].sport]+"\033[0m"
        except:
            o_sport = str(packet[0][2].sport)
        flags = ""
        #o_payload = packet[0].sprintf('%10s,UDP.payload%')
    elif packet.haslayer(TCP):
        o_proto = "TCP"
        try:
            o_dport = "\033[1m"+TSERV[packet[0][2].dport]+"\033[0m"
        except:
            o_dport = str(packet[0][2].dport)
        try:
            o_sport = "\033[1m"+TSERV[packet[0][2].sport]+"\033[0m"
        except:
            o_sport = str(packet[0][2].sport)
        flags = packet[0].sprintf('%3s,TCP.flags%')
        if payloadH == True:
            if packet.haslayer(Raw):
                tpld = packet[0].sprintf('%TCP.payload%')
                if re.match("^GET|POST|HTTP|HEAD|PUT|PATCH|DELETE|TRACE|OPTIONS|CONNECT.*", tpld[0:8]):
                    request_line, gaga = tpld.split('\r\n', 1)
                    o_payload = str(request_line)
                    #o_payload = tpld[0:20]
    elif packet.haslayer(ICMP):
        o_proto = "ICMP"
        if conn_port == 99999:
            o_dport = "-"
            o_sport = "-"
        else:
            try:
                o_dport = "\033[1m"+USERV[packet[0][2].sport]+"\033[0m"
            except:
                o_dport = str(packet[0][2].sport)
            try:
                o_sport = "\033[1m"+USERV[packet[0][2].dport]+"\033[0m"
            except:
                o_sport = str(packet[0][2].dport)
        flags = "["+packet[0].sprintf('%ICMP.type%') + "/" + packet[0].sprintf('%ICMP.code%')+"]"
    else:
        o_proto = "UNKNOWN"
 
    if o_dir == 1:
        if numeric == False:
            if res_cache.has_key(packet[0][1].dst):
                rem_name = res_cache[packet[0][1].dst]
            else:
                rem_name = _resolve_ip(packet[0][1].dst)
        else:
            rem_name = packet[0][1].dst
 
        return "\033[1m"+str(program)+"\033[0m" +"/"+ str(pid) + " - " + o_proto + ": " + packet[0][1].src + ":" + o_sport + "\033[1m\033[31m  ->>>  \033[0m" + rem_name + ":" + o_dport + " " + flags + " Len:" + str(packet[0][1].len) + " : " + o_payload
    else:
        if numeric == False:
            if res_cache.has_key(packet[0][1].src):
                rem_name = res_cache[packet[0][1].src]
            else:
                rem_name = _resolve_ip(packet[0][1].src)
        else:
            rem_name = packet[0][1].src
 
        return "\033[1m"+str(program)+"\033[0m" +"/"+ str(pid) + " - " + o_proto + ": " + packet[0][1].dst + ":" + o_dport + "\033[1m\033[36m  <<<-  \033[0m" + rem_name + ":" + o_sport + " " + flags + " Len:" + str(packet[0][1].len) + " : " + o_payload
 
 
 
## -- Ond denn s'Hooptprogramm
 
# root check
if not check_root():
    print("This program needs root privileges !\nThats because of reading the /proc filesystem and using libpcap functions.\nSo I give up\n")
    conf.sniff_promisc=0
    conf.sniff_promisc=0
    #print conf
    sys.exit()
 
# get the interfaces
ifaces = commands.getoutput("ls /sys/class/net")
iface_list = ifaces.split('\n')
 
print
# commandline params
parser = argparse.ArgumentParser(description='sisniff V'+VERSION)
parser.add_argument('-i', help="Interface (mandatory)", choices=iface_list, required=True)
parser.add_argument('-n', help="Do not resolve IP-Addresses", action="store_true")
parser.add_argument('-pH', help="Show HTTP Payload", action="store_true")
parser.add_argument('filter', nargs='?', help="Filter (BPF syntax) on top of IP (in dbl-quotes \"...\")", type=str)
args = parser.parse_args()
iface = args.i
if args.n:
    numeric = True
if args.pH:
    payloadH = True
if args.filter:
    fillter = " and (" + args.filter + ")"
    print "> Applying Filter: \"ip" + fillter + "\"" 
 
# local addresses 
MYADDRS = _remove_empty([os.popen('ip addr show '+iface).read().split("inet ")[1].split("/")[0]])
MYADDRS.append('0.0.0.0')
MYADDRS.append('127.0.0.1')
xMYADDRS = [_ip_hexrev(x) for x in MYADDRS]
print "> My IP-Addresses: " + str(MYADDRS)
 
# confirmed connections cache (ringboffer)
conn_cache = []
cc_maxlen = 20
 
# resolver cache
res_cache = {}
n_try = 3
print
print "Prog/PID mavericks: ?/? = No entry in /proc/net/xxx; -/- = No PID for Inode found; ./. = Inode=0;"
print
print "Program/PID: Local addr:port <<->> Remote addr:port [Flags] Len:length : [Payload]"
print "-------------------------------------------------------------------------------"
 
# sniff, filtering for IP traffic
sniff(filter="ip"+fillter,iface=iface,prn=doPackets, store=0)
 
## -- oond denn isch schloss