Beispiel #1
0
    def test_prepare_nvt_prefs_no_prefs(self, mock_kb):
        w = DummyDaemon()

        p = PreferenceHandler('456-789', mock_kb, w.scan_collection, None)
        p._nvts_params = {}
        p.kbdb.add_scan_preferences = MagicMock()
        p.prepare_nvt_preferences()

        p.kbdb.add_scan_preferences.assert_not_called()
Beispiel #2
0
    def test_prepare_nvt_prefs_no_prefs(self, mock_kb):
        dummy = DummyDaemon()

        p_handler = PreferenceHandler(
            '456-789', mock_kb, dummy.scan_collection, None
        )
        p_handler._nvts_params = {}  # pylint: disable = protected-access
        p_handler.kbdb.add_scan_preferences = MagicMock()
        p_handler.prepare_nvt_preferences()

        p_handler.kbdb.add_scan_preferences.assert_not_called()
Beispiel #3
0
    def test_prepare_nvt_prefs(self, mock_kb):
        w = DummyDaemon()

        alive_test_out = [
            "1.3.6.1.4.1.25623.1.0.100315:1:checkbox:Do a TCP ping|||no"
        ]

        p = PreferenceHandler('1234-1234', mock_kb, w.scan_collection, None)
        p._nvts_params = {
            "1.3.6.1.4.1.25623.1.0.100315:1:checkbox:Do a TCP ping": "no"
        }
        p.kbdb.add_scan_preferences = MagicMock()
        p.prepare_nvt_preferences()

        p.kbdb.add_scan_preferences.assert_called_with(
            p.scan_id,
            alive_test_out,
        )
Beispiel #4
0
    def test_prepare_nvt_prefs(self, mock_kb):
        dummy = DummyDaemon()

        alive_test_out = [
            "1.3.6.1.4.1.25623.1.0.100315:1:checkbox:Do a TCP ping|||no"
        ]

        p_handler = PreferenceHandler(
            '1234-1234', mock_kb, dummy.scan_collection, None
        )
        p_handler._nvts_params = {  # pylint: disable = protected-access
            "1.3.6.1.4.1.25623.1.0.100315:1:checkbox:Do a TCP ping": "no"
        }
        p_handler.kbdb.add_scan_preferences = MagicMock()
        p_handler.prepare_nvt_preferences()

        p_handler.kbdb.add_scan_preferences.assert_called_with(
            p_handler.scan_id,
            alive_test_out,
        )
Beispiel #5
0
    def exec_scan(self, scan_id: str):
        """ Starts the OpenVAS scanner for scan_id scan. """
        do_not_launch = False
        kbdb = self.main_db.get_new_kb_database()
        scan_prefs = PreferenceHandler(scan_id, kbdb, self.scan_collection,
                                       self.nvti)
        kbdb.add_scan_id(scan_id)
        scan_prefs.prepare_target_for_openvas()

        if not scan_prefs.prepare_ports_for_openvas():
            self.add_scan_error(scan_id,
                                name='',
                                host='',
                                value='No port list defined.')
            do_not_launch = True

        # Set credentials
        if not scan_prefs.prepare_credentials_for_openvas():
            self.add_scan_error(scan_id,
                                name='',
                                host='',
                                value='Malformed credential.')
            do_not_launch = True

        if not scan_prefs.prepare_plugins_for_openvas():
            self.add_scan_error(scan_id,
                                name='',
                                host='',
                                value='No VTS to run.')
            do_not_launch = True

        scan_prefs.prepare_main_kbindex_for_openvas()
        scan_prefs.prepare_host_options_for_openvas()
        scan_prefs.prepare_scan_params_for_openvas(OSPD_PARAMS)
        scan_prefs.prepare_reverse_lookup_opt_for_openvas()
        scan_prefs.prepare_alive_test_option_for_openvas()

        # VT preferences are stored after all preferences have been processed,
        # since alive tests preferences have to be able to overwrite default
        # preferences of ping_host.nasl for the classic method.
        scan_prefs.prepare_nvt_preferences()
        scan_prefs.prepare_boreas_alive_test()

        # Release memory used for scan preferences.
        del scan_prefs

        if do_not_launch or kbdb.scan_is_stopped(scan_id):
            self.main_db.release_database(kbdb)
            return

        result = Openvas.start_scan(
            scan_id,
            not self.is_running_as_root and self.sudo_available,
            self._niceness,
        )

        if result is None:
            self.main_db.release_database(kbdb)
            return

        ovas_pid = result.pid
        kbdb.add_scan_process_id(ovas_pid)
        logger.debug('pid = %s', ovas_pid)

        # Wait until the scanner starts and loads all the preferences.
        while kbdb.get_status(scan_id) == 'new':
            res = result.poll()
            if res and res < 0:
                self.stop_scan_cleanup(scan_id)
                logger.error(
                    'It was not possible run the task %s, since openvas ended '
                    'unexpectedly with errors during launching.',
                    scan_id,
                )
                return

            time.sleep(1)

        got_results = False
        while True:
            target_is_finished = kbdb.target_is_finished(scan_id)
            openvas_process_is_alive = self.is_openvas_process_alive(
                kbdb, ovas_pid, scan_id)
            if not target_is_finished and not openvas_process_is_alive:
                logger.error(
                    'Task %s was unexpectedly stopped or killed.',
                    scan_id,
                )
                self.add_scan_error(
                    scan_id,
                    name='',
                    host='',
                    value='Task was unexpectedly stopped or killed.',
                )

                # check for scanner error messages before leaving.
                self.report_openvas_results(kbdb, scan_id)

                kbdb.stop_scan(scan_id)

                for scan_db in kbdb.get_scan_databases():
                    self.main_db.release_database(scan_db)
                self.main_db.release_database(kbdb)
                return

            # Wait a second before trying to get result from redis if there
            # was no results before.
            # Otherwise, wait 50 msec to give access other process to redis.
            if not got_results:
                time.sleep(1)
            else:
                time.sleep(0.05)
            got_results = False

            # Check if the client stopped the whole scan
            if kbdb.scan_is_stopped(scan_id):
                logger.debug('%s: Scan stopped by the client', scan_id)

                # clean main_db, but wait for scanner to finish.
                while not kbdb.target_is_finished(scan_id):
                    logger.debug('%s: Waiting the scan to finish', scan_id)
                    time.sleep(1)
                self.main_db.release_database(kbdb)
                return

            got_results = self.report_openvas_results(kbdb, scan_id)
            self.report_openvas_scan_status(kbdb, scan_id)

            # Scan end. No kb in use for this scan id
            if kbdb.target_is_finished(scan_id):
                logger.debug('%s: Target is finished', scan_id)
                break

        # Delete keys from KB related to this scan task.
        logger.debug('%s: End Target. Release main database', scan_id)
        self.main_db.release_database(kbdb)