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()
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()
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
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}