Changeset 5523

Show
Ignore:
Timestamp:
02/11/10 20:26:01 (6 months ago)
Author:
nopper
Message:

Cleanup and refactoring in session manager.
Fixing ftp dissector accordingly.

Location:
pm/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • pm/trunk/audits/passive/ftp/sources/main.py

    r5327 r5523  
    4141 
    4242    def ftp(mpkt): 
    43         sess = sessions.create_session(mpkt, FTP_PORTS, FTP_NAME) 
     43        if sessions.create_session_on_sack(mpkt, FTP_PORTS, FTP_NAME): 
     44            return 
    4445 
    45         # This is a SYN/ACK packet. 
    46         if sess: 
    47             return None 
     46        sess = sessions.is_first_pkt_from_server(mpkt, FTP_PORTS, FTP_NAME) 
    4847 
    49         sess = sessions.is_first_mpkt_from_server(mpkt, FTP_PORTS, FTP_NAME) 
     48        if sess and not sess.data: 
     49            payload = mpkt.data 
    5050 
    51         if sess: 
    52             if not sess.data: 
    53                 payload = mpkt.get_field('raw.load') 
     51            # Ok we have an FTP banner over here 
     52            if payload and payload.startswith('220'): 
     53                banner = payload[4:].strip() 
     54                mpkt.set_cfield('banner', banner) 
    5455 
    55                 # Ok we have an FTP banner over here 
    56                 if payload and payload.startswith('220'): 
    57                     banner = payload[4:].strip() 
    58                     mpkt.set_cfield('banner', banner) 
     56                manager.user_msg('FTP : %s:%d banner: %s' % \ 
     57                                 (mpkt.l3_src, mpkt.l4_src, banner), 
     58                                 6, FTP_NAME) 
    5959 
    60                     manager.user_msg('FTP : %s:%d banner: %s' % \ 
    61                                      (mpkt.get_field('ip.src'), 
    62                                       mpkt.get_field('tcp.sport'), 
    63                                       banner), 
    64                                       6, 'dissector.ftp') 
     60            sessions.delete_session(sess) 
     61            return 
    6562 
    66             if not sess.data: 
    67                 sessions.delete_session(sess) 
    68                 return None 
     63        # Skip empty and server packets 
     64        if mpkt.l4_dst not in FTP_PORTS or not mpkt.data: 
     65            return 
    6966 
    70         if mpkt.get_field('tcp.dport') not in FTP_PORTS: 
    71             return None 
    72  
    73         payload = mpkt.get_field('raw.load') 
    74  
    75         if not payload: 
    76             return None 
    77  
    78         payload = payload.strip() 
     67        payload = mpkt.data.strip() 
    7968 
    8069        if payload[:5].upper() == 'USER ': 
     
    9483 
    9584            manager.user_msg('FTP : %s:%d -> USER: %s PASS: %s' % \ 
    96                              (mpkt.get_field('ip.dst'), 
    97                               mpkt.get_field('tcp.dport'), 
     85                             (mpkt.l3_dst, mpkt.l4_dst, 
    9886                              sess.data[0] or '', 
    9987                              sess.data[1] or ''), 
    100                               6, 'dissector.ftp') 
     88                              6, FTP_NAME) 
    10189 
    10290            mpkt.set_cfield('username', sess.data[0]) 
     
    118106 
    119107__plugins__ = [FTPDissector] 
    120 __plugins_deps__ = [('FTPDissector', ['TCPDecoder'], ['FTPDecoder-1.0'], []),] 
     108__plugins_deps__ = [('FTPDissector', ['TCPDecoder'], ['FTPDissector-1.0'], []),] 
    121109 
    122110__audit_type__ = 0 
    123111__protocols__ = (('tcp', 21), ('ftp', None)) 
    124 __vulnerabilities__ = (('HTTP dissector', { 
     112__vulnerabilities__ = (('FTP dissector', { 
    125113    'description' : 'File Transfer Protocol (FTP) is a standard network ' 
    126114                    'protocol used to exchange and manipulate files over an ' 
  • pm/trunk/umit/pm/manager/sessionmanager.py

    r5513 r5523  
    2424 
    2525import time 
    26 from socket import inet_aton 
    2726 
    2827from umit.pm.core.logger import log 
     
    3231class DissectIdent(object): 
    3332    magic = None 
    34  
    35     def __init__(self, l3src, l3dst, l4src, l4dst, proto): 
    36         self.l3_src = l3src 
    37         self.l3_dst = l3dst 
    38         self.l4_src = l4src 
    39         self.l4_dst = l4dst 
    40         self.proto = proto 
    41  
    42     def __eq__(self, other): 
    43         if self.magic != other.magic or self.proto != other.proto: 
    44             return False 
    45  
    46         if self.l3_src == other.l3_src and \ 
    47            self.l3_dst == other.l3_dst and \ 
    48            self.l4_src == other.l4_src and \ 
    49            self.l4_dst == other.l4_dst: 
    50             return True 
    51  
    52         if self.l3_src == other.l3_dst and \ 
    53            self.l3_dst == other.l3_src and \ 
    54            self.l4_src == other.l4_dst and \ 
    55            self.l4_dst == other.l4_src: 
    56             return True 
    57  
    58         return False 
    59  
    60     @classmethod 
    61     def mkhash(self, ident): 
    62         return hash(ident.l3_src) ^ hash(ident.l3_dst) ^ \ 
    63                ident.l4_src ^ ident.l4_dst ^ hash(ident.proto) 
    64  
    65 class TCPIdent(object): 
    66     magic = NL_TYPE_TCP 
    6733 
    6834    def __init__(self, l3src, l3dst, l4src, l4dst): 
     
    9157 
    9258    @classmethod 
     59    def mkhash(self, ident): 
     60        return hash(ident.l3_src) ^ hash(ident.l3_dst) ^ \ 
     61               ident.l4_src ^ ident.l4_dst 
     62 
     63    @classmethod 
    9364    def create(self, mpkt): 
    9465        return TCPIdent(mpkt.l3_src, mpkt.l3_dst, 
    9566                        mpkt.l4_src, mpkt.l4_dst) 
    9667 
    97     @classmethod 
    98     def mkhash(self, ident): 
    99         return hash(ident.l3_src) ^ hash(ident.l3_dst) ^ \ 
    100                ident.l4_src ^ ident.l4_dst 
     68class TCPIdent(DissectIdent): 
     69    magic = NL_TYPE_TCP 
    10170 
    10271INJ_FIN = 1 
     
    154123    # Dissectors methods 
    155124 
    156     def create_session(self, mpkt, ports, dissector): 
     125    def create_session_on_sack(self, mpkt, ports, dissector): 
    157126        """ 
    158127        Check for SYN/ACK on mpkt and create a session 
     
    164133        tcpflags = mpkt.l4_flags 
    165134 
    166         if tcpflags & TH_SYN != 0 and tcpflags & TH_ACK != 0: 
    167             if mpkt.l4_src in ports: 
    168                 log.debug('Creating sessions for dissector %s' % dissector) 
    169                 ident = self.create_ident_from_mpkt(mpkt, dissector) 
    170  
    171                 sess = Session(ident) 
    172                 self.put_session(sess) 
    173  
    174                 return sess 
     135        if tcpflags & TH_SYN != 0 and tcpflags & TH_ACK != 0 and \ 
     136           mpkt.l4_src in ports: 
     137 
     138            log.debug('Creating sessions for dissector %s' % dissector) 
     139            ident = self.create_dissect_ident(mpkt, dissector) 
     140 
     141            sess = Session(ident) 
     142            self.put_session(sess) 
     143 
     144            return sess 
    175145 
    176146        return None 
    177147 
    178     def create_ident_from_mpkt(self, mpkt, magic): 
     148    def create_dissect_ident(self, mpkt, magic): 
    179149        """ 
    180150        Create a session object starting from a mpkt instance 
    181151        """ 
    182         ident = DissectIdent(inet_aton(mpkt.l3_src), inet_aton(mpkt.l3_dst), 
    183                              mpkt.l4_src, mpkt.l4_dst, mpkt.l4_proto) 
     152        ident = DissectIdent.create(mpkt) 
    184153        ident.magic = magic 
    185154 
     
    187156 
    188157    def lookup_session(self, mpkt, ports, decoder, create_on_fail=False): 
    189         ident = self.create_ident_from_mpkt(mpkt, decoder) 
     158        ident = self.create_dissect_ident(mpkt, decoder) 
    190159        sess = self.get_session(ident) 
    191160 
     
    196165        return sess 
    197166 
    198     def is_first_mpkt_from_server(self, mpkt, ports, decoder): 
     167    def is_first_pkt_from_server(self, mpkt, ports, decoder): 
    199168        if mpkt.l4_src in ports and \ 
    200169           mpkt.l4_flags & TH_PSH != 0: 
    201170 
    202             ident = self.create_ident_from_mpkt(mpkt, decoder) 
    203             return self.get_session(ident) 
     171            return self.get_session(self.create_dissect_ident(mpkt, decoder)) 
    204172 
    205173    # Standard methods