blob: 5fb5601c47f911ae9a1c7c6f2228efe33531ce14 [file]
import operator
from collections import defaultdict
from aiohttp_jinja2 import template
from app.service.auth_svc import check_authorization
from app.utility.base_world import BaseWorld
class CampaignPack(BaseWorld):
def __init__(self, services):
self.auth_svc = services.get('auth_svc')
self.app_svc = services.get('app_svc')
self.data_svc = services.get('data_svc')
self.rest_svc = services.get('rest_svc')
async def enable(self):
self.app_svc.application.router._frozen = False
self.app_svc.application.router.add_route('GET', '/campaign/agents', self._section_agent)
self.app_svc.application.router.add_route('GET', '/campaign/abilities', self._section_abilities)
self.app_svc.application.router.add_route('GET', '/campaign/adversaries', self._section_profiles)
self.app_svc.application.router.add_route('GET', '/campaign/operations', self._section_operations)
@check_authorization
@template('agents.html')
async def _section_agent(self, request):
search = dict(access=tuple(await self.auth_svc.get_permissions(request)))
agents = [h.display for h in await self.data_svc.locate('agents', match=search)]
ability_ids = tuple(self.get_config(name='agents', prop='deployments'))
abilities = await self.data_svc.locate('abilities', match=dict(ability_id=ability_ids))
agent_config = self.get_config(name='agents')
return dict(agents=agents, abilities=self._rollup_abilities(abilities), agent_config=agent_config)
@check_authorization
@template('abilities.html')
async def _section_abilities(self, request):
access = dict(access=tuple(await self.auth_svc.get_permissions(request)))
abilities = await self.data_svc.locate('abilities', match=access)
payloads = list(await self.rest_svc.list_payloads())
platforms = dict()
for a in abilities:
for executor in a.executors:
if executor.platform in platforms:
platforms[executor.platform].add(executor.name)
else:
platforms[executor.platform] = set([executor.name])
for p in platforms:
platforms[p] = list(platforms[p])
return dict(platforms=platforms, payloads=payloads)
@check_authorization
@template('adversaries.html')
async def _section_profiles(self, request):
access = dict(access=tuple(await self.auth_svc.get_permissions(request)))
abilities = await self.data_svc.locate('abilities', match=access)
objs = await self.data_svc.locate('objectives', match=access)
platforms = dict()
for a in abilities:
for executor in a.executors:
if executor.platform in platforms:
platforms[executor.platform].add(executor.name)
else:
platforms[executor.platform] = set([executor.name])
for p in platforms:
platforms[p] = list(platforms[p])
tactics = sorted(list(set(a.tactic.lower() for a in abilities)))
payloads = list(await self.rest_svc.list_payloads())
adversaries = sorted([a.display for a in await self.data_svc.locate('adversaries', match=access)],
key=lambda a: a['name'])
exploits = sorted([a.display for a in abilities], key=operator.itemgetter('technique_id', 'name'))
objectives = sorted([a.display for a in objs], key=operator.itemgetter('id', 'name'))
return dict(adversaries=adversaries, exploits=exploits, payloads=payloads,
tactics=tactics, platforms=platforms, objectives=objectives)
@check_authorization
@template('operations.html')
async def _section_operations(self, request):
def load_usage_markdown(header):
f = open('plugins/fieldmanual/sphinx-docs/Basic-Usage.md', 'r')
markdown = []
seen_header = False
for x in f:
if (not seen_header and "## Operations" in x):
markdown = []
seen_header = True
elif (seen_header and "## " in x):
break
elif (seen_header):
if "*" in x:
key, val = x.split(': ')
if (key and val):
key = key.split("*")[3]
val = val.strip("\n")
markdown.append({key: val})
f.close()
return markdown
access = dict(access=tuple(await self.auth_svc.get_permissions(request)))
hosts = [h.display for h in await self.data_svc.locate('agents', match=access)]
groups = sorted(list(set(([h['group'] for h in hosts]))))
adversaries = sorted([a.display for a in await self.data_svc.locate('adversaries', match=access)],
key=lambda a: a['name'])
sources = [s.display for s in await self.data_svc.locate('sources', match=access)]
planners = sorted([p.display for p in await self.data_svc.locate('planners')],
key=lambda p: p['name'])
obfuscators = [o.display for o in await self.data_svc.locate('obfuscators')]
operations = [o.display for o in await self.data_svc.locate('operations', match=access)]
usage = load_usage_markdown('operations')
return dict(operations=operations, groups=groups, adversaries=adversaries, sources=sources, planners=planners,
obfuscators=obfuscators, usage=usage)
@staticmethod
def _rollup_abilities(abilities):
rolled = defaultdict(list)
for a in abilities:
rolled[a.ability_id].append(a.display)
return dict(rolled)