Changeset 5736

Show
Ignore:
Timestamp:
07/13/10 02:46:16 (3 years ago)
Author:
diogo
Message:

zion running in thread; communication between interface and zion with signals

Location:
zion/trunk/umit
Files:
1 added
3 modified

Legend:

Unmodified
Added
Removed
  • zion/trunk/umit/scan/zion/gui/ZionScanNotebookPage.py

    r5735 r5736  
    4040from umit.scan.zion.gui.AttractorWidget import AttractorWidget 
    4141from umit.zion.scan import probe 
    42 from umit.zion.core import address, options, zion, host 
     42from umit.zion.core import address, options, zion, host, connector 
    4343from umit.zion.core.host import PORT_STATE_OPEN 
    4444 
     
    160160        """ 
    161161        self.__hbox = HIGHBox() 
    162         self.__info = gtk.Label(_('Information')) 
     162        self.__info = gtk.Label(_('No information available')) 
    163163        self.__attractor = AttractorWidget() 
    164164        self.__frame_attractor = HIGFrameRNet(_('Attractor')) 
    165165        self.__frame_attractor._add(self.__attractor) 
     166         
     167        self.__table = gtk.Table(2, 2, False) 
     168        self.__table.set_col_spacings(3) 
     169        self.__table.set_row_spacings(3) 
     170        self.__table.attach(gtk.Label('Vendor:'), 0, 1, 0, 1) 
     171        self.vendor = gtk.Label('') 
     172        self.__table.attach(self.vendor, 1, 2, 0, 1) 
     173        self.__table.attach(gtk.Label('OS name:'), 0, 1, 1, 2) 
     174        self.os_name = gtk.Label('') 
     175        self.__table.attach(self.os_name, 1, 2, 1, 2) 
    166176 
    167177        self.__hbox._pack_expand_fill(self.__info) 
    168178        self.__hbox._pack_noexpand_nofill(self.__frame_attractor) 
    169  
     179         
    170180        self._pack_noexpand_nofill(self.__hbox) 
     181        self.pack_end(self.__table, True, True, 0) 
    171182         
    172183    def update_attractors(self,attractors): 
    173184        """ 
     185        Update the attractors at widget to plot them. 
    174186        """ 
    175187        self.__attractor.update(attractors) 
    176188         
    177  
     189    def update_os_info(self, info): 
     190        """ 
     191        Update information about OS running on host. 
     192        """ 
     193        print 'updated' 
     194        self.__info.set_text('Information:') 
     195        self.vendor.set_text(info['vendor_name']) 
     196        os = '%s %s' % (info['os_name'], info['os_version']) 
     197        self.os_name.set_text(os) 
     198         
    178199class ZionHostsList(gtk.ScrolledWindow): 
    179200    """ 
     
    326347 
    327348        self.pack_end(self.result) 
     349         
     350        # signals needed to update info 
     351        self.connector = connector.Connector() 
    328352 
    329353    def update_target(self, target): 
     
    337361        if self.target: 
    338362            return True 
    339  
    340363        return False 
     364     
     365    def update_info(self, obj, text): 
     366        """ 
     367        Update information page. 
     368        """ 
     369        self.result.get_hosts_view().get_scans_page().write(text) 
     370         
     371    def update_port_info(self, obj, host): 
     372        """ 
     373        Update the port scan information of host. 
     374        """ 
     375        self.result.update_host_info(host) 
     376        self.update_info(None, 'Obtaining TPC ISN samples\n') 
     377         
     378    def update_attractors(self, obj, attractors): 
     379        """ 
     380        Update the identification page with the graph of attractors 
     381        """ 
     382        self.result.get_hosts_view().get_identification_page().update_attractors(attractors) 
     383        self.update_info(None, 'Building fingerprint\n') 
     384         
     385    def update_host_information(self, obj, info): 
     386        """ 
     387        Update information about OS running on host. 
     388        """ 
     389        self.result.get_hosts_view().get_identification_page().update_os_info(info) 
     390        self.update_info(None, 'OS detection finished\n') 
    341391 
    342392class ZionProfileHoneyd(ZionProfile): 
     
    351401        """ 
    352402        """ 
    353         z = zion.Zion(options.Options(), []) 
     403        self.connector.connect('scan_finished', self.update_port_info) 
     404        self.connector.connect('honeyd_finished', self.honeyd_finished) 
     405        self.connector.connect('update_status', self.update_info) 
    354406         
    355407        self.result.get_hosts_list().clear_hosts() 
     
    362414                    targets.append(host.Host(i, self.target)) 
    363415                    host_str = '%s\n%s' % (i, self.target) 
    364                     self.result.get_hosts_list().add_host(host_str, PIXBUF_FIREWALL) 
     416                    self.result.get_hosts_list().add_host(host_str) 
    365417                except: 
    366418                    print "Unimplemented support to address: %s." % i 
    367419        else: 
    368420            targets.append(host.Host(self.target)) 
    369             self.result.get_hosts_list().add_host(i, PIXBUF_FIREWALL) 
     421            self.result.get_hosts_list().add_host(i) 
    370422             
    371423        device = get_default_device() 
    372424        saddr = get_ip_address(device) 
    373         z.get_option_object().add("-c",device) 
    374         z.get_option_object().add("--forge-addr",saddr) 
     425         
     426        opts = options.Options() 
     427        opts.add("-c",device) 
     428        opts.add("--forge-addr",saddr) 
     429        # honeyd option 
     430        opts.add("-n") 
     431         
     432        self.update_info(None, 'Honeyd Detection Started\n') 
    375433         
    376434        for target in targets: 
    377             if z.honeyd_detection(target): 
    378                 print 'target is honeyd' 
    379             else: 
    380                 print 'target isnt honeyd' 
    381  
     435            z = zion.Zion(opts,  [target], self.connector) 
     436            z.start() 
     437             
     438    def honeyd_finished(self, obj, result): 
     439        """ 
     440        Write information about honeyd detection result 
     441        """ 
     442        if result: 
     443            self.update_info(None, 'Target is honeyd\n') 
     444        else: 
     445            self.update_info(None, 'Target isnt honeyd\n') 
    382446 
    383447class ZionProfileOS(ZionProfile): 
     
    389453        ZionProfile.__init__(self, target) 
    390454         
     455        self.connector.connect('scan_finished', self.update_port_info) 
     456        self.connector.connect('isn_samples_finished', self.update_info, 'Creating time series\n') 
     457        self.connector.connect('timeseries_created', self.update_info, 'Building attractors\n') 
     458        self.connector.connect('attractors_built', self.update_attractors) 
     459        self.connector.connect('fingerprint_finished', self.update_info, 'Performing OS fingerprint matching\n') 
     460        self.connector.connect('matching_finished', self.update_host_information) 
     461         
    391462    def start(self): 
    392463        """ 
    393464        """ 
    394         z = zion.Zion(options.Options(), []) 
     465        z = zion.Zion(options.Options(), [], self.connector) 
    395466         
    396467        self.result.clear_port_list() 
     
    406477                    z.append_target(host.Host(i, self.target)) 
    407478                    host_str = '%s\n%s' % (i, self.target) 
     479                    self.result.get_hosts_list().add_host(host_str) 
    408480                except: 
    409481                    print "Unimplemented support to address: %s." % i 
     
    412484            self.result.get_hosts_list().add_host(self.target) 
    413485             
    414         self.result.get_hosts_list().add_host(host_str) 
    415  
    416486        # configure zion options 
    417487        device = get_default_device() 
     
    420490        z.get_option_object().add("-d") 
    421491        z.get_option_object().add("--forge-addr",saddr) 
    422         z.run() 
    423         #z.start() 
    424          
    425         # update host information 
    426         self.result.update_host_info(z.get_target_list()[0]) 
    427          
    428         attractors = z.get_attractors() 
    429          
    430         self.result.get_hosts_view().get_identification_page().update_attractors(attractors) 
    431  
     492        z.start() 
     493         
     494        self.update_info(None, 'OS Detection Started\n') 
     495        self.update_info(None, 'Scanning host\n') 
    432496 
    433497class ZionProfilePrompt(ZionProfile): 
     
    467531        """ 
    468532        """ 
    469         z = zion.Zion(options.Options(), []) 
     533        self.connector.connect('scan_finished', self.update_port_info) 
     534        self.connector.connect('synproxy_finished', self.synproxy_finished) 
     535        self.connector.connect('update_status', self.update_info) 
    470536         
    471537        self.result.get_hosts_list().clear_hosts() 
     
    478544                    targets.append(host.Host(i, self.target)) 
    479545                    host_str = '%s\n%s' % (i, self.target) 
    480                     self.result.get_hosts_list().add_host(host_str, PIXBUF_FIREWALL) 
     546                    self.result.get_hosts_list().add_host(host_str) 
    481547                except: 
    482548                    print "Unimplemented support to address: %s." % i 
    483549        else: 
    484550            targets.append(host.Host(self.target)) 
    485             self.result.get_hosts_list().add_host(i, PIXBUF_FIREWALL) 
     551            self.result.get_hosts_list().add_host(i) 
    486552             
    487553        device = get_default_device() 
    488554        saddr = get_ip_address(device) 
    489         z.get_option_object().add("-c",device) 
    490         z.get_option_object().add("--forge-addr",saddr) 
     555         
     556        opts = options.Options() 
     557        opts.add("-c",device) 
     558        opts.add("--forge-addr",saddr) 
     559        # synproxy option 
     560        opts.add("-y") 
     561         
     562        self.update_info(None, 'Syn Proxy Detection Started\n') 
    491563         
    492564        for target in targets: 
    493             if z.synproxy_detection(target): 
    494                 print 'target is syn proxy' 
    495             else: 
    496                 print 'target isnt syn proxy' 
     565            self.update_info(None, 'Scanning host\n') 
     566            z = zion.Zion(opts,  [target], self.connector) 
     567            z.start() 
     568             
     569    def synproxy_finished(self, obj, result): 
     570        """ 
     571        Write information about synproxy detection result 
     572        """ 
     573        if result: 
     574            self.update_info(None, 'Target is synproxy\n') 
     575        else: 
     576            self.update_info(None, 'Target isnt synproxy\n') 
    497577                 
    498578 
     
    610690 
    611691    # TODO: read device from options 
    612     device = "eth0" 
     692    device = "wlan0" 
    613693    #device = netifaces.interfaces()[0] 
    614694    return device 
  • zion/trunk/umit/zion/core/options.py

    r5703 r5736  
    5757OPTION_SEND_INTERVAL = 11 
    5858OPTION_HELP = 12 
     59OPTION_HONEYD = 13 
     60OPTION_SYNPROXY = 14 
    5961 
    6062FORGE_MODE_SYN = 'syn' 
     
    7779           '-i':                OPTION_SEND_INTERVAL, 
    7880           '-d':                OPTION_DETECT, 
    79            '--detect':          OPTION_DETECT} 
     81           '--detect':          OPTION_DETECT, 
     82           '-y':                OPTION_SYNPROXY, 
     83           '-n':                OPTION_HONEYD} 
    8084 
    81 OPTIONS_SHORT = 'c:i:p:f:svhd' 
     85OPTIONS_SHORT = 'c:i:p:f:svhdyn' 
    8286OPTIONS_LONG = ['capture=', 
    8387                'capture-amount=', 
  • zion/trunk/umit/zion/core/zion.py

    r5735 r5736  
    3737FORGE_FILTER = 'src host %s and src port %s and dst host %s and dst port %s' 
    3838AMOUNT_OS_DETECTION = 50 
    39 AMOUNT_HONEYD_DETECTION = 25 
     39AMOUNT_HONEYD_DETECTION = 5 
    4040SEND_INTERVAL = 0.1 
    4141SYNPROXY_INTERVAL = 1 
     
    4848    """ 
    4949    """ 
    50     def __init__(self, option, target=[]): 
     50    def __init__(self, option, target=[], connector=None): 
    5151        """ 
    5252        """ 
     
    5555        self.__capture_result = [] 
    5656        self.__attractors = [] 
     57        self.__connector = connector 
    5758        threading.Thread.__init__ (self) 
    5859 
     
    9495        for target in self.__target: 
    9596            print target 
     97             
     98        self.notify('scan_finished', self.__target[0]) 
    9699             
    97100    def do_capture(self, dev=None): 
     
    186189 
    187190            print options.HELP_TEXT 
    188  
    189         if self.__option.has(options.OPTION_FORGE): 
     191             
     192        elif self.__option.has(options.OPTION_SYNPROXY): 
     193            synproxy = self.synproxy_detection() 
     194            if synproxy==True: 
     195                print 'Target is synproxy' 
     196            else: 
     197                print 'Target isnt synproxy' 
     198            self.notify('synproxy_finished', synproxy) 
     199             
     200        elif self.__option.has(options.OPTION_HONEYD): 
     201            honeyd = self.honeyd_detection() 
     202            if honeyd==False: 
     203                print 'Target isnt honeyd' 
     204            else: 
     205                print 'Target is honeyd' 
     206            self.notify('honeyd_finished', honeyd) 
     207 
     208        elif self.__option.has(options.OPTION_FORGE): 
    190209 
    191210            print 
     
    218237            print 'Capturing packets' 
    219238            self.do_forge() 
     239             
     240            self.notify('isn_samples_finished') 
    220241 
    221242            print 'Calculating PRNG' 
    222243            Rt = self.calculate_PRNG() 
    223244             
     245            self.notify('timeseries_created') 
     246             
    224247            print 'Creating attractors' 
    225248            self.__classification(Rt) 
    226249             
     250            self.notify('fingerprint_finished') 
     251             
    227252            print 'Matching' 
    228             return self.__matching() 
     253            result = self.__matching() 
     254         
     255            self.notify('matching_finished', result) 
    229256                 
    230257        elif self.__option.has(options.OPTION_CAPTURE): 
     
    240267             
    241268             
    242     def honeyd_detection(self,target): 
    243         """ Detect if target are an honeyd. """ 
    244          
    245         print 'start honeyd detection' 
    246         self.__target = [] 
    247         self.append_target(target) 
    248          
     269    def honeyd_detection(self): 
     270        """ Detect if target are an honeyd. """         
    249271        # configure parameters for honeyd detection 
    250272        if not self.__option.has(options.OPTION_CAPTURE_AMOUNT): 
     
    272294                if increments.count(k)==4: 
    273295                    return True 
    274  
    275             return False                 
    276         else: 
     296             
    277297            return False 
    278  
    279          
    280     def synproxy_detection(self, target): 
     298        else: 
     299            return False 
     300             
     301 
     302         
     303    def synproxy_detection(self): 
    281304        """ Detect if target is an syn proxy. """ 
    282          
    283         print 'start syn proxy detection' 
    284         self.__target = [] 
    285         self.append_target(target) 
    286          
     305                 
    287306        # configure parameters for honeyd detection 
    288307        if not self.__option.has(options.OPTION_CAPTURE_AMOUNT): 
     
    290309        self.__option.add('-f','syn') 
    291310         
     311        self.notify('update_status','Searching for open ports\n') 
     312         
     313        target = self.__target[0] 
     314         
    292315        # search for open ports in target 
    293316        self.do_scan() 
    294317        ports = target.get_open_ports() 
     318         
     319        self.notify('update_status','Generate random ports\n') 
    295320         
    296321        origin_port1 = random.randint(1024, 65535) 
     
    303328        addr = self.__option.get(options.OPTION_FORGE_ADDR) 
    304329         
     330        self.notify('update_status','Sending packets\n') 
    305331        self.do_forge_mode_syn(s, target, ports[0], addr, origin_port1) 
    306332        isn1 = self.__capture_result[0][1] 
     
    316342        else: 
    317343            return False 
    318  
     344         
    319345             
    320346    def calculate_PRNG(self): 
     
    367393            matrix.set(self.__matrix, i, 0, x) 
    368394            matrix.set(self.__matrix, i, 1, y) 
     395             
     396        self.notify('attractors_built', self.__attractors)     
    369397 
    370398        som.caracterization(self.__som, self.__matrix, EPOCHS) 
     
    403431        return self.__attractors 
    404432     
     433    def notify(self, signal, param=None): 
     434        """ 
     435        If a connector exists, emits the signal. 
     436        """ 
     437        if self.__connector!=None: 
     438            if param==None: 
     439                self.__connector.emit(signal) 
     440            else: 
     441                self.__connector.emit(signal, param)