Ejemplo n.º 1
0
    async def run(self):
        """
		Reads targets from queue and scans them
		"""
        try:
            self.worker_q = asyncio.Queue()

            for _ in range(self.concurrent_connections):
                self.worker_tasks.append(asyncio.create_task(self.worker()))

            while True:
                target = await self.in_q.get()
                if target is None:
                    for _ in range(self.concurrent_connections):
                        await self.worker_q.put(None)
                    break
                else:
                    await self.worker_q.put(target)

            results = await asyncio.gather(*self.worker_tasks,
                                           return_exceptions=True)
            for res in results:
                if isinstance(res, Exception):
                    logger.error('Error! %s' % res)
            await self.out_q.put(None)
        except:
            import traceback
            traceback.print_exc()
Ejemplo n.º 2
0
    async def run(self):
        try:
            _, err = await self.setup()
            if err is not None:
                raise err

            if self.ldap_mgr is not None:
                self.ad_id, self.graph_id, err = await self.gather_ldap()
                if err is not None:
                    raise err

            if self.kerb_url is not None:
                _, err = await self.kerberoast()
                if err is not None:
                    logger.error('Kerberos did not work... %s' % err)

            if self.rdns_resolver is not None:
                _, err = await self.gather_dns()
                if err is not None:
                    logger.error('DNS lookup did not work... %s' % err)

            if self.smb_url is not None:
                _, err = await self.gather_smb()
                if err is not None:
                    raise err

            if self.smb_enum_shares is True and self.smb_url is not None:
                _, err = await self.share_enum()
                if err is not None:
                    raise err

            if self.calculate_edges is True and self.store_to_db is True:
                _, err = await self.calc_edges()
                if err is not None:
                    raise err

            if self.progress_queue is not None:
                msg = GathererProgress()
                msg.type = GathererProgressType.INFO
                msg.msg_type = MSGTYPE.FINISHED
                msg.adid = self.ad_id
                msg.text = 'Gatherer finished!'
                await self.progress_queue.put(msg)

            return True, None
        except Exception as e:
            return False, e

        finally:
            if self.progress_queue is not None:
                await self.progress_queue.put(None)
            if self.show_progress is True and self.progress_queue is None and self.progress_task is not None:
                try:
                    await asyncio.wait_for(
                        asyncio.gather(*[self.progress_task]), 1)
                except asyncio.TimeoutError:
                    self.progress_task.cancel()

                if self.progress_refresh_task is not None:
                    self.progress_refresh_task.cancel()
Ejemplo n.º 3
0
def create(graph_id, dbsession, work_dir, backend_object, db_url):
    if isinstance(work_dir, str):
        work_dir = Path(work_dir)

    sqlite_file = None
    if db_url.lower().startswith('sqlite') is True:
        sqlite_file = db_url.replace('sqlite:///', '')

    logger.error(sqlite_file)
    gi = dbsession.query(GraphInfo).get(graph_id)
    graphid = gi.id
    graph_cache_dir = work_dir.joinpath('graphcache')
    graph_dir = graph_cache_dir.joinpath(str(gi.id))
    try:
        graph_dir.mkdir(parents=True, exist_ok=False)
    except Exception as e:
        logger.warning(
            'Graph cache dir with ID %s already exists, skipping! Err %s' %
            (str(gi.id), str(e)))
        return graphid

    backend_object.create(dbsession,
                          str(gi.id),
                          graph_dir,
                          sqlite_file=sqlite_file)

    return graphid
Ejemplo n.º 4
0
def create(adids):
    if len(adids) != 1:
        logger.warning(
            'More than one adid requested, but only one is supported currently!'
        )

    sqlite_file = None
    if current_app.config['SQLALCHEMY_DATABASE_URI'].lower().startswith(
            'sqlite') is True:
        sqlite_file = current_app.config['SQLALCHEMY_DATABASE_URI'].replace(
            'sqlite:///', '')

    logger.error(sqlite_file)
    for ad_id in adids:
        domaininfo = current_app.db.session.query(ADInfo).get(ad_id)
        domain_sid = domaininfo.objectSid
        domain_id = domaininfo.id

        res = current_app.db.session.query(GraphInfoAD).filter_by(
            ad_id=ad_id).first()

        gi = current_app.db.session.query(GraphInfo).get(res.graph_id)
        graphid = gi.id
        graph_cache_dir = current_app.config['JACKDAW_WORK_DIR'].joinpath(
            'graphcache')
        graph_dir = graph_cache_dir.joinpath(str(gi.id))
        try:
            graph_dir.mkdir(parents=True, exist_ok=False)
        except Exception as e:
            logger.warning(
                'Graph cache dir with ID %s already exists, skipping! Err %s' %
                (str(gi.id), str(e)))
            continue

        current_app.config.get('JACKDAW_GRAPH_BACKEND_OBJ').create(
            current_app.db.session,
            str(gi.id),
            graph_dir,
            sqlite_file=sqlite_file)

    #TODO: fix this, need noew UI to handle the logic :(
    return {'graphid': graphid}