Changeset 5523
- Timestamp:
- 02/11/10 20:26:01 (6 months ago)
- Location:
- pm/trunk
- Files:
-
- 2 modified
-
audits/passive/ftp/sources/main.py (modified) (3 diffs)
-
umit/pm/manager/sessionmanager.py (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
pm/trunk/audits/passive/ftp/sources/main.py
r5327 r5523 41 41 42 42 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 44 45 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) 48 47 49 sess = sessions.is_first_mpkt_from_server(mpkt, FTP_PORTS, FTP_NAME) 48 if sess and not sess.data: 49 payload = mpkt.data 50 50 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) 54 55 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) 59 59 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 65 62 66 if not sess.data:67 sessions.delete_session(sess)68 return None63 # Skip empty and server packets 64 if mpkt.l4_dst not in FTP_PORTS or not mpkt.data: 65 return 69 66 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() 79 68 80 69 if payload[:5].upper() == 'USER ': … … 94 83 95 84 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, 98 86 sess.data[0] or '', 99 87 sess.data[1] or ''), 100 6, 'dissector.ftp')88 6, FTP_NAME) 101 89 102 90 mpkt.set_cfield('username', sess.data[0]) … … 118 106 119 107 __plugins__ = [FTPDissector] 120 __plugins_deps__ = [('FTPDissector', ['TCPDecoder'], ['FTPD ecoder-1.0'], []),]108 __plugins_deps__ = [('FTPDissector', ['TCPDecoder'], ['FTPDissector-1.0'], []),] 121 109 122 110 __audit_type__ = 0 123 111 __protocols__ = (('tcp', 21), ('ftp', None)) 124 __vulnerabilities__ = ((' HTTP dissector', {112 __vulnerabilities__ = (('FTP dissector', { 125 113 'description' : 'File Transfer Protocol (FTP) is a standard network ' 126 114 'protocol used to exchange and manipulate files over an ' -
pm/trunk/umit/pm/manager/sessionmanager.py
r5513 r5523 24 24 25 25 import time 26 from socket import inet_aton27 26 28 27 from umit.pm.core.logger import log … … 32 31 class DissectIdent(object): 33 32 magic = None 34 35 def __init__(self, l3src, l3dst, l4src, l4dst, proto):36 self.l3_src = l3src37 self.l3_dst = l3dst38 self.l4_src = l4src39 self.l4_dst = l4dst40 self.proto = proto41 42 def __eq__(self, other):43 if self.magic != other.magic or self.proto != other.proto:44 return False45 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 True51 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 True57 58 return False59 60 @classmethod61 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_TCP67 33 68 34 def __init__(self, l3src, l3dst, l4src, l4dst): … … 91 57 92 58 @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 93 64 def create(self, mpkt): 94 65 return TCPIdent(mpkt.l3_src, mpkt.l3_dst, 95 66 mpkt.l4_src, mpkt.l4_dst) 96 67 97 @classmethod 98 def mkhash(self, ident): 99 return hash(ident.l3_src) ^ hash(ident.l3_dst) ^ \ 100 ident.l4_src ^ ident.l4_dst 68 class TCPIdent(DissectIdent): 69 magic = NL_TYPE_TCP 101 70 102 71 INJ_FIN = 1 … … 154 123 # Dissectors methods 155 124 156 def create_session (self, mpkt, ports, dissector):125 def create_session_on_sack(self, mpkt, ports, dissector): 157 126 """ 158 127 Check for SYN/ACK on mpkt and create a session … … 164 133 tcpflags = mpkt.l4_flags 165 134 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 175 145 176 146 return None 177 147 178 def create_ ident_from_mpkt(self, mpkt, magic):148 def create_dissect_ident(self, mpkt, magic): 179 149 """ 180 150 Create a session object starting from a mpkt instance 181 151 """ 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) 184 153 ident.magic = magic 185 154 … … 187 156 188 157 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) 190 159 sess = self.get_session(ident) 191 160 … … 196 165 return sess 197 166 198 def is_first_ mpkt_from_server(self, mpkt, ports, decoder):167 def is_first_pkt_from_server(self, mpkt, ports, decoder): 199 168 if mpkt.l4_src in ports and \ 200 169 mpkt.l4_flags & TH_PSH != 0: 201 170 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)) 204 172 205 173 # Standard methods
