Exemple #1
0
    def get(self, request, *args, **kwargs):
        project = kwargs.get("project", "default")
        if project not in get_project_list():
            raise Http404("unknown project: {}".format(project))

        template_name = "viperweb/cli.html"
        return render(request, template_name, {'project': project,
                                               'projects': get_project_list()})
Exemple #2
0
    def get(self, request, *args, **kwargs):
        project = kwargs.get("project", "default")
        if project not in get_project_list():
            raise Http404("unknown project: {}".format(project))

        template_name = "viperweb/cli.html"
        return render(request, template_name, {'project': project,
                                               'projects': get_project_list()})
Exemple #3
0
    def get(self, request, *args, **kwargs):
        template_name = 'viperweb/yara.html'

        # Read Rules
        action = request.GET.get('action')
        rule = request.GET.get('rule')
        rule_text = ''

        if action == 'list' or action is None:
            return render(
                request, template_name, {
                    'rule_list': self.yara_rule_list,
                    'rule_text': rule_text,
                    'projects': get_project_list()
                })
        elif action == 'display' and rule:
            # Display Rule Contents
            rule_file = os.path.join(self.yara_rule_path, rule)
            if os.path.isfile(rule_file):
                # Only allow .yar or .yara files to be read
                file_name, file_ext = os.path.splitext(rule_file)
                if file_ext in ['.yar', '.yara']:
                    rule_text = open(rule_file, 'r').read()
                    if not rule_text:
                        rule_text = "Empty Rule"
                else:
                    rule_text = 'Invalid Rule File'
            else:
                rule_text = 'Invalid Rules File'

        elif action == 'delete':
            rule_name = request.GET.get('rulename')
            if rule_name.split('.')[-1] in ['yar', 'yara']:
                try:
                    os.remove(os.path.join(self.yara_rule_path, rule_name))
                except FileNotFoundError:
                    raise Http404(
                        "Yara rule file not found: {}".format(rule_name))
                log.debug('Rule {0} Deleted'.format(rule_name))
                rule_text = 'Rule {0} Deleted'.format(rule_name)
            else:
                rule_text = 'Invalid Rule'
            return render(
                request, template_name, {
                    'rule_list': self.yara_rule_list,
                    'rule_text': rule_text,
                    'projects': get_project_list()
                })
        else:
            rule_text = 'Invalid Action'

        return render(
            request, template_name, {
                'rule_list': self.yara_rule_list,
                'rule_name': rule,
                'rule_text': rule_text,
                'projects': get_project_list()
            })
Exemple #4
0
    def post(self, request, *args, **kwargs):
        template_name = "viperweb/search_result.html"
        key = request.POST.get('key')
        value = request.POST.get('term').lower()
        cur_project = request.POST.get('cur_project', 'default')

        search_all_projects = request.POST.get('search-project-radio', 'search-this-project')
        print("projects: {}".format(search_all_projects))

        # TODO(frennkie) remove DEBUG
        print("Key: {}".format(key))
        print("Value: {}".format(value))

        if not value:
            print("no search term provided")
            messages.error(request, "no search term provided")
            return redirect(reverse("main-page-project", kwargs={"project": cur_project}))

        # Set some data holders
        results = []
        projects = []

        # Search All Projects
        if search_all_projects == "search-all-projects":
            # Get list of project paths
            projects = get_project_list()
        else:
            # If not searching all projects what are we searching
            projects.append(cur_project)

        # Search each Project in the list
        for project in projects:
            db = open_db(project)
            print(db)
            # get results
            proj_results = []
            rows = db.find(key=key, value=value)
            print(rows)

            for row in rows:
                proj_results.append([row.name, row.sha256])
            results.append({'name': project, 'res': proj_results})

        if results:
            # Return some things
            return render(request, template_name, {'results': results,
                                                   'searched_key': key,
                                                   'searched_value': value,
                                                   'projects': get_project_list()})
        else:
            return render(request, template_name, {'results': [],
                                                   'searched_key': key,
                                                   'searched_value': value,
                                                   'projects': get_project_list()})
Exemple #5
0
    def post(self, request, *args, **kwargs):
        template_name = "viperweb/search_result.html"
        key = request.POST.get('key')
        value = request.POST.get('term').lower()
        cur_project = request.POST.get('cur_project', 'default')

        search_all_projects = request.POST.get('search-project-radio', 'search-this-project')
        print("projects: {}".format(search_all_projects))

        # TODO(frennkie) remove DEBUG
        print("Key: {}".format(key))
        print("Value: {}".format(value))

        if not value:
            print("no search term provided")
            messages.error(request, "no search term provided")
            return redirect(reverse("main-page-project", kwargs={"project": cur_project}))

        # Set some data holders
        results = []
        projects = []

        # Search All Projects
        if search_all_projects == "search-all-projects":
            # Get list of project paths
            projects = get_project_list()
        else:
            # If not searching all projects what are we searching
            projects.append(cur_project)

        # Search each Project in the list
        for project in projects:
            db = open_db(project)
            print(db)
            # get results
            proj_results = []
            rows = db.find(key=key, value=value)
            print(rows)

            for row in rows:
                proj_results.append([row.name, row.sha256])
            results.append({'name': project, 'res': proj_results})

        if results:
            # Return some things
            return render(request, template_name, {'results': results,
                                                   'searched_key': key,
                                                   'searched_value': value,
                                                   'projects': get_project_list()})
        else:
            return render(request, template_name, {'results': [],
                                                   'searched_key': key,
                                                   'searched_value': value,
                                                   'projects': get_project_list()})
Exemple #6
0
    def get(self, request, *args, **kwargs):
        template_name = 'viperweb/yara.html'

        # Read Rules
        action = request.GET.get('action')
        rule = request.GET.get('rule')
        rule_text = ''

        if action == 'list' or action is None:
            return render(request, template_name, {'rule_list': self.yara_rule_list,
                                                   'rule_text': rule_text,
                                                   'projects': get_project_list()})
        elif action == 'display' and rule:
            # Display Rule Contents
            rule_file = os.path.join(self.yara_rule_path, rule)
            if os.path.isfile(rule_file):
                # Only allow .yar or .yara files to be read
                file_name, file_ext = os.path.splitext(rule_file)
                if file_ext in ['.yar', '.yara']:
                    rule_text = open(rule_file, 'r').read()
                    if not rule_text:
                        rule_text = "Empty Rule"
                else:
                    rule_text = 'Invalid Rule File'
            else:
                rule_text = 'Invalid Rules File'

        elif action == 'delete':
            rule_name = request.GET.get('rulename')
            if rule_name.split('.')[-1] in ['yar', 'yara']:
                try:
                    os.remove(os.path.join(self.yara_rule_path, rule_name))
                except FileNotFoundError:
                    raise Http404("Yara rule file not found: {}".format(rule_name))
                log.debug('Rule {0} Deleted'.format(rule_name))
                rule_text = 'Rule {0} Deleted'.format(rule_name)
            else:
                rule_text = 'Invalid Rule'
            return render(request, template_name, {'rule_list': self.yara_rule_list,
                                                   'rule_text': rule_text,
                                                   'projects': get_project_list()
                                                   })
        else:
            rule_text = 'Invalid Action'

        return render(request, template_name, {'rule_list': self.yara_rule_list,
                                               'rule_name': rule,
                                               'rule_text': rule_text,
                                               'projects': get_project_list()})
Exemple #7
0
    def get(self, request, *args, **kwargs):
        template_name = "viperweb/index.html"

        # default to "default" project if none given
        project = kwargs.get('project', 'default')
        db = open_db(project)

        # Get all Samples
        sample_list = db.find('all')

        # set pagination details
        page = request.GET.get('page', 1)
        page_count = request.GET.get('count', 15)

        sample_count = len(sample_list)
        first_sample = int(page) * int(page_count) - int(page_count) + 1
        last_sample = int(page) * int(page_count)

        if last_sample > sample_count:
            last_sample = sample_count

        paginator = Paginator(sample_list, page_count)
        try:
            samples = paginator.page(page)
        except PageNotAnInteger:
            samples = paginator.page(1)
        except EmptyPage:
            samples = paginator.page(paginator.num_pages)

        return render(request, template_name, {'sample_list': samples,
                                               'sample_count': sample_count,
                                               'samples': [first_sample, last_sample],
                                               'extractors': Extractor().extractors,
                                               'project': project,
                                               'projects': get_project_list()})
Exemple #8
0
        def func_wrapper(viewset, *args, **kwargs):
            log.debug("running decorator: get_project_open_db - called by: {}".
                      format(viewset))

            project = viewset.kwargs.get(viewset.lookup_field_project, None)
            if project == 'default':
                __project__.open(project)
                db = Database()
            elif project in get_project_list():
                log.debug("setting project to: {}".format(project))
                __project__.open(project)
                db = Database()
            else:
                db = None

            if not db:
                error = {
                    "error": {
                        "code": "NotFound",
                        "message": "Project not found: {}".format(project)
                    }
                }
                log.error(error)
                raise NotFound(detail=error)

            return func(viewset, project=project, db=db, *args, **kwargs)
Exemple #9
0
    def create(self, request, project=None, db=None, *args, **kwargs):
        """Create a new Project"""
        # kwargs provided by URLs/Routers: -

        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        if serializer.validated_data['name'] in get_project_list():
            # exists already
            # return Response(data=serializer.validated_data, status=status.HTTP_200_OK)
            error = {
                "error": {
                    "code":
                    "ExistsAlready",
                    "message":
                    "Project exists already: {}".format(
                        serializer.validated_data['name'])
                }
            }
            raise ValidationError(detail=error)

        new_project_new = serializer.validated_data['name']

        __project__.open(new_project_new)

        serializer_new = self.get_serializer(new_project_new)
        headers = self.get_success_headers(serializer_new.data)

        return Response(data=serializer_new.data,
                        status=status.HTTP_201_CREATED,
                        headers=headers)
Exemple #10
0
    def get(self, request, *args, **kwargs):
        template_name = "viperweb/file.html"

        # default to "default" project if none given
        project = kwargs.get('project', 'default')
        db = open_db(project)

        sha256 = kwargs.get('sha256')
        if not sha256:
            log.error("no sha256 hashed provided")
            raise Http404("no sha256 hashed provided")

        path = get_sample_path(sha256)
        if not path:
            raise Http404(
                "could not retrieve file for sha256 hash: {}".format(sha256))

        # Get additional details for file
        malware = db.find(key='sha256', value=sha256)
        try:
            malware_obj = malware[0]
        except IndexError:
            raise Http404(
                "could not find file for sha256 hash: {}".format(sha256))

        note_list = []
        notes = malware_obj.note
        if notes:
            for note in notes:
                note_list.append({
                    'title': note.title,
                    'body': note.body,
                    'id': note.id
                })

        module_history = []
        analysis_list = malware_obj.analysis
        if analysis_list:
            for item in analysis_list:
                module_history.append({
                    'id': item.id,
                    'cmd_line': item.cmd_line
                })

        tag_list = db.list_tags_for_malware(sha256)
        children = db.list_children(malware_obj.id)
        parent = db.get_parent(malware_obj.id)

        return render(
            request, template_name, {
                'malware': malware_obj,
                'note_list': note_list,
                'tag_list': tag_list,
                'children': children,
                'parent': parent,
                'module_history': module_history,
                'project': project,
                'projects': get_project_list()
            })
Exemple #11
0
    def post(self, request, *args, **kwargs):
        project_name = request.POST['project'].replace(' ', '_')
        if project_name not in get_project_list():
            log.debug("creating new project: {}".format(project_name))

        log.debug("redirecting to project: {}".format(project_name))
        __project__.open(project_name)
        return redirect(reverse('main-page-project', kwargs={'project': project_name}))
Exemple #12
0
    def get(self, request, *args, **kwargs):
        template_name = "viperweb/changelog.html"

        _changelog = {"foo": "bar"}
        return render(request, template_name, {
            'changelog': _changelog,
            'projects': get_project_list()
        })
Exemple #13
0
    def post(self, request, *args, **kwargs):
        project_name = request.POST['project'].replace(' ', '_')
        if project_name not in get_project_list():
            log.debug("creating new project: {}".format(project_name))

        log.debug("redirecting to project: {}".format(project_name))
        __project__.open(project_name)
        return redirect(reverse('main-page-project', kwargs={'project': project_name}))
Exemple #14
0
    def get(self, request, *args, **kwargs):
        template_name = "viperweb/about.html"

        return render(
            request, template_name, {
                'version': __version__,
                'extractors': Extractor().extractors,
                'projects': get_project_list()
            })
Exemple #15
0
    def get(self, request, *args, **kwargs):
        template_name = "viperweb/config.html"

        sections = list(cfg.__dict__)
        config_values = {}
        for section in sections:
            config_values[section] = cfg.get(section)
        return render(request, template_name, {'config_values': config_values,
                                               'projects': get_project_list()})
Exemple #16
0
    def get(self, request, *args, **kwargs):
        template_name = "viperweb/config.html"

        sections = list(cfg.__dict__)
        config_values = {}
        for section in sections:
            config_values[section] = cfg.get(section)
        return render(request, template_name, {'config_values': config_values,
                                               'projects': get_project_list()})
Exemple #17
0
    def post(self, request, *args, **kwargs):
        template_name = "viperweb/search.html"
        key = request.POST.get('key')
        value = request.POST.get('term').lower()
        curr_project = request.POST.get('curr_project')

        project_search = request.POST.get('project', False)

        print("Key: {}".format(key))
        print("Value: {}".format(value))

        # Set some data holders
        results = []
        projects = []

        # Search All Projects
        if project_search:
            # Get list of project paths
            projects = get_project_list()
        else:
            # If not searching all projects what are we searching
            projects.append(curr_project)

        # Search each Project in the list
        for project in projects:
            db = open_db(project)
            print(db)
            # get results
            proj_results = []
            rows = db.find(key=key, value=value)
            print(rows)

            for row in rows:
                url = row.url.split('/')[2]
                proj_results.append([row.name, row.sha256, url])
            results.append({'name': project, 'res': proj_results})

        if results:
            # Return some things
            return render(request, template_name, {'results': results,
                                                   'projects': get_project_list()})
        else:
            return render(request, template_name, {'results': [],
                                                   'projects': get_project_list()})
Exemple #18
0
    def get(self, request, *args, **kwargs):
        template_name = "viperweb/file.html"

        # default to "default" project if none given
        project = kwargs.get('project', 'default')
        db = open_db(project)

        sha256 = kwargs.get('sha256')
        if not sha256:
            log.error("no sha256 hashed provided")
            raise Http404("no sha256 hashed provided")

        path = get_sample_path(sha256)
        if not path:
            raise Http404("could not retrieve file for sha256 hash: {}".format(sha256))

        # Get additional details for file
        malware = db.find(key='sha256', value=sha256)
        try:
            malware_obj = malware[0]
        except IndexError:
            raise Http404("could not find file for sha256 hash: {}".format(sha256))

        note_list = []
        notes = malware_obj.note
        if notes:
            for note in notes:
                note_list.append({'title': note.title,
                                  'body': note.body,
                                  'id': note.id})

        module_history = []
        analysis_list = malware_obj.analysis
        if analysis_list:
            for item in analysis_list:
                module_history.append({'id': item.id,
                                       'cmd_line': item.cmd_line})

        tag_list = db.list_tags_for_malware(sha256)
        children = db.list_children(malware_obj.id)
        parent = db.get_parent(malware_obj.id)

        return render(request, template_name, {'malware': malware_obj,
                                               'note_list': note_list,
                                               'tag_list': tag_list,
                                               'children': children,
                                               'parent': parent,
                                               'module_history': module_history,
                                               'project': project,
                                               'projects': get_project_list()})
Exemple #19
0
    def get(self, request, *args, **kwargs):
        template_name = "viperweb/index.html"

        # default to "default" project if none given
        project = kwargs.get('project', 'default')
        db = open_db(project)

        # Get all Samples
        sample_list = db.find('all')

        return render(request, template_name, {'sample_list': sample_list,
                                               'extractors': Extractor().extractors,
                                               'project': project,
                                               'projects': get_project_list()})
Exemple #20
0
    def get(self, request, *args, **kwargs):
        template_name = "viperweb/index.html"

        # default to "default" project if none given
        project = kwargs.get('project', 'default')
        db = open_db(project)

        # Get all Samples
        sample_list = db.find('all')

        return render(request, template_name, {'sample_list': sample_list,
                                               'extractors': Extractor().extractors,
                                               'project': project,
                                               'projects': get_project_list()})
Exemple #21
0
    def get(self, request, *args, **kwargs):
        project = kwargs.get("project", "default")
        if project not in get_project_list():
            raise Http404("unknown project: {}".format(project))

        sha256 = kwargs.get("sha256")
        if not sha256:
            log.error("no sha256 hashed provided")
            raise Http404("no sha256 hashed provided")

        # Open a session
        try:
            path = get_sample_path(sha256)
            __sessions__.new(path)
        except Exception as err:
            log.error("Error: {}".format(err))
            return HttpResponse('<span class="alert alert-danger">Invalid Submission</span>'.format())

        try:
            task_list_url = '{0}/tasks/list'.format(cfg.cuckoo.cuckoo_host)
            task_list_response = requests.get(task_list_url)
            if task_list_response.status_code == 200:
                task_list = task_list_response.json()
                task_list_filtered = [x for x in task_list["tasks"] if x["sample"]["sha256"] == sha256]
                if task_list_filtered:
                    task_list_filtered_sorted = sorted(task_list_filtered, key=itemgetter("added_on"), reverse=True)
                    task_id = task_list_filtered_sorted[0]["id"]
                    return HttpResponse('<a href="{0}/analysis/{1}/summary/" target="_blank"> Link to latest existing Cukoo Report</a>'.format(cfg.cuckoo.cuckoo_web, str(task_id)))
        except Exception as err:
            log.error("Error: {}".format(err))
            return HttpResponse('<span class="alert alert-danger">Error Connecting To Cuckoo</span>'.format())

        # If it doesn't exist, submit it.

        # Get the file data from viper
        file_data = open(__sessions__.current.file.path, 'rb').read()
        file_name = __sessions__.current.file.name

        if file_data:
            # Submit file data to cuckoo
            uri = '{0}{1}'.format(cfg.cuckoo.cuckoo_host, '/tasks/create/file')
            options = {'file': (file_name, file_data)}
            cuckoo_response = requests.post(uri, files=options)
            if cuckoo_response.status_code == 200:
                cuckoo_id = dict(cuckoo_response.json())['task_id']
                return HttpResponse('<a href="{0}/analysis/pending/" target="_blank"> Link To Cuckoo (pending tasks)</a>'.format(cfg.cuckoo.cuckoo_web, str(cuckoo_id)))
            else:
                log.error("Cuckoo Response Code: {}".format(cuckoo_response.status_code))

        return HttpResponse('<span class="alert alert-danger">Unable to Submit File</span>')
Exemple #22
0
    def get(self, request, *args, **kwargs):
        project = kwargs.get("project", "default")
        if project not in get_project_list():
            raise Http404("unknown project: {}".format(project))

        sha256 = kwargs.get("sha256")
        if not sha256:
            log.error("no sha256 hashed provided")
            raise Http404("no sha256 hashed provided")

        # Open a session
        try:
            path = get_sample_path(sha256)
            __sessions__.new(path)
        except Exception as err:
            log.error("Error: {}".format(err))
            return HttpResponse('<span class="alert alert-danger">Invalid Submission</span>'.format())

        try:
            task_list_url = '{0}/tasks/list'.format(cfg.cuckoo.cuckoo_host)
            task_list_response = requests.get(task_list_url)
            if task_list_response.status_code == 200:
                task_list = task_list_response.json()
                task_list_filtered = [x for x in task_list["tasks"] if x["sample"]["sha256"] == sha256]
                if task_list_filtered:
                    task_list_filtered_sorted = sorted(task_list_filtered, key=itemgetter("added_on"), reverse=True)
                    task_id = task_list_filtered_sorted[0]["id"]
                    return HttpResponse('<a href="{0}/analysis/{1}/summary/" target="_blank"> Link to latest existing Cukoo Report</a>'.format(cfg.cuckoo.cuckoo_web, str(task_id)))
        except Exception as err:
            log.error("Error: {}".format(err))
            return HttpResponse('<span class="alert alert-danger">Error Connecting To Cuckoo</span>'.format())

        # If it doesn't exist, submit it.

        # Get the file data from viper
        file_data = open(__sessions__.current.file.path, 'rb').read()
        file_name = __sessions__.current.file.name

        if file_data:
            # Submit file data to cuckoo
            uri = '{0}{1}'.format(cfg.cuckoo.cuckoo_host, '/tasks/create/file')
            options = {'file': (file_name, file_data)}
            cuckoo_response = requests.post(uri, files=options)
            if cuckoo_response.status_code == 200:
                cuckoo_id = dict(cuckoo_response.json())['task_id']
                return HttpResponse('<a href="{0}/analysis/pending/" target="_blank"> Link To Cuckoo (pending tasks)</a>'.format(cfg.cuckoo.cuckoo_web, str(cuckoo_id)))
            else:
                log.error("Cuckoo Response Code: {}".format(cuckoo_response.status_code))

        return HttpResponse('<span class="alert alert-danger">Unable to Submit File</span>')
Exemple #23
0
    def post(self, request, *args, **kwargs):
        template_name = 'viperweb/yara.html'

        rule_name = request.POST.get('rule_name')
        rule_text = request.POST.get('rule_text')
        rule_file = os.path.join(self.yara_rule_path, rule_name)
        # Prevent storing files in a relative path or with a non yar extension
        rule_test = rule_name.split('.')
        if len(rule_test) == 2 and rule_test[-1] in ['yar', 'yara']:
            # if file exists overwrite
            with open(rule_file, 'w') as rule_edit:
                rule_edit.write(rule_text)
        else:
            rule_text = "The File Name did not match the style 'name.yar'"

        return render(request, template_name, {'rule_list': self.yara_rule_list,
                                               'rule_name': rule_name,
                                               'rule_text': rule_text,
                                               'projects': get_project_list()})
Exemple #24
0
    def post(self, request, *args, **kwargs):
        template_name = 'viperweb/yara.html'

        rule_name = request.POST.get('rule_name')
        rule_text = request.POST.get('rule_text')
        rule_file = os.path.join(self.yara_rule_path, rule_name)
        # Prevent storing files in a relative path or with a non yar extension
        rule_test = rule_name.split('.')
        if len(rule_test) == 2 and rule_test[-1] in ['yar', 'yara']:
            # if file exists overwrite
            with open(rule_file, 'w') as rule_edit:
                rule_edit.write(rule_text)
        else:
            rule_text = "The File Name did not match the style 'name.yar'"

        return render(request, template_name, {'rule_list': self.yara_rule_list,
                                               'rule_name': rule_name,
                                               'rule_text': rule_text,
                                               'projects': get_project_list()})
Exemple #25
0
        def func_wrapper(viewset, *args, **kwargs):
            log.debug("running decorator: get_project_open_db - called by: {}".format(viewset))

            project = viewset.kwargs.get(viewset.lookup_field_project, None)
            if project == 'default':
                __project__.open(project)
                db = Database()
            elif project in get_project_list():
                log.debug("setting project to: {}".format(project))
                __project__.open(project)
                db = Database()
            else:
                db = None

            if not db:
                error = {"error": {"code": "NotFound", "message": "Project not found: {}".format(project)}}
                log.error(error)
                raise NotFound(detail=error)

            return func(viewset, project=project, db=db, *args, **kwargs)
Exemple #26
0
    def create(self, request, project=None, db=None, *args, **kwargs):
        """Create a new Project"""
        # kwargs provided by URLs/Routers: -

        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        if serializer.validated_data['name'] in get_project_list():
            # exists already
            # return Response(data=serializer.validated_data, status=status.HTTP_200_OK)
            error = {"error": {"code": "ExistsAlready",
                               "message": "Project exists already: {}".format(serializer.validated_data['name'])}}
            raise ValidationError(detail=error)

        new_project_new = serializer.validated_data['name']

        __project__.open(new_project_new)

        serializer_new = self.get_serializer(new_project_new)
        headers = self.get_success_headers(serializer_new.data)

        return Response(data=serializer_new.data, status=status.HTTP_201_CREATED, headers=headers)
Exemple #27
0
        def complete(text, state):
            # filesystem path completion only makes sense for a few commands/modules
            fs_path_completion = False

            # clean up user input so far (no leading/trailing/duplicate spaces)
            line = " ".join(readline.get_line_buffer().split())
            words = line.split(" ")  # split words; e.g. store -f /tmp -> ['store', '-f', '/tmp']

            if words[0] in [i for i in self.cmd.commands]:
                # handle completion for commands

                # enable filesystem path completion for certain commands (e.g. export, store)
                if words[0] in [x for x in self.cmd.commands if self.cmd.commands[x]["fs_path_completion"]]:
                    fs_path_completion = True

                options = [key for key in self.cmd.commands[words[0]]["parser_args"]]

                # enable tab completion for projects --switch
                if words[0] == "projects":
                    if "--switch" in words or "-s" in words:
                        options += get_project_list()

                        # enable tab completion for copy (list projects)
                if words[0] == "copy":
                    options += get_project_list()

                completions = [i for i in options if i.startswith(text) and i not in words]

            elif words[0] in [i for i in __modules__]:
                # handle completion for modules
                if len(words) == 1:
                    # only the module name is give so far - present all args and the subparsers (if any)
                    options = [key for key in __modules__[words[0]]["parser_args"]]
                    options += [key for key in __modules__[words[0]]["subparser_args"]]

                elif len(words) == 2:
                    # 1 complete word and one either complete or incomplete that specifies the subparser or an arg
                    if words[1] in list(__modules__[words[0]]["parser_args"]):
                        # full arg for a module is given
                        options = [key for key in __modules__[words[0]]["parser_args"]]

                    elif words[1] in list(__modules__[words[0]]["subparser_args"]):
                        # subparser is specified - get all subparser args
                        options = [key for key in __modules__[words[0]]["subparser_args"][words[1]]]

                    else:
                        options = [key for key in __modules__[words[0]]["parser_args"]]
                        options += [key for key in __modules__[words[0]]["subparser_args"]]

                else:  # more that 2 words
                    if words[1] in list(__modules__[words[0]]["subparser_args"]):
                        # subparser is specified - get all subparser args
                        options = [key for key in __modules__[words[0]]["subparser_args"][words[1]]]
                    else:
                        options = [key for key in __modules__[words[0]]["parser_args"]]

                completions = [i for i in options if i.startswith(text) and i not in words]

            else:
                # initial completion for both commands and modules
                completions = [i for i in self.cmd.commands if i.startswith(text)]
                completions += [i for i in __modules__ if i.startswith(text)]

            if state < len(completions):
                return completions[state]

            if fs_path_completion:
                # completion for paths only if it makes sense
                if text.startswith("~"):
                    text = "{0}{1}".format(expanduser("~"), text[1:])
                return (glob.glob(text + '*') + [None])[state]

            return
Exemple #28
0
 def get_queryset(self, project=None, db=None, *args, **kwargs):
     projects = get_project_list()
     if not next((i for i in projects if i == "default"), None):
         projects.append("default")  # make sure "default" is part of list of projects
     return projects
Exemple #29
0
    def get(self, request, *args, **kwargs):
        template_name = "viperweb/file.html"

        # default to "default" project if none given
        project = kwargs.get('project', 'default')
        db = open_db(project)

        sha256 = kwargs.get('sha256')
        if not sha256:
            log.error("no sha256 hashed provided")
            raise Http404("no sha256 hashed provided")

        path = get_sample_path(sha256)
        if not path:
            raise Http404("could not retrieve file for sha256 hash: {}".format(sha256))
        __sessions__.new(path)

        # Get the file info  - TODO (frennkie) this should not be done here.. move it to backend
        file_info = {
            'id': __sessions__.current.file.id,
            'name': __sessions__.current.file.name,
            'url': __sessions__.current.file.url,
            'path': __sessions__.current.file.path,
            'size': __sessions__.current.file.size,
            'type': __sessions__.current.file.type,
            'mime': __sessions__.current.file.mime,
            'md5': __sessions__.current.file.md5,
            'sha1': __sessions__.current.file.sha1,
            'sha256': __sessions__.current.file.sha256,
            'sha512': __sessions__.current.file.sha512,
            'ssdeep': __sessions__.current.file.ssdeep,
            'crc32': __sessions__.current.file.crc32,
            'parent': __sessions__.current.file.parent,
            'children': __sessions__.current.file.children.split(','),
            'tag_list': __sessions__.current.file.tags
        }

        # Get additional details for file
        malware = db.find(key='sha256', value=sha256)  # TODO (frennkie) this should not be done here.. move it to backend
        if not malware:
            raise Http404("could not find file for sha256 hash: {}".format(sha256))

        note_list = []
        notes = malware[0].note
        if notes:
            for note in notes:
                note_list.append({'title': note.title,
                                  'body': note.body,
                                  'id': note.id})

        module_history = []
        analysis_list = malware[0].analysis
        if analysis_list:
            for item in analysis_list:
                module_history.append({'id': item.id,
                                       'cmd_line': item.cmd_line})

        tag_list = db.list_tags_for_malware(sha256)

        return render(request, template_name, {'file_info': file_info,
                                               'note_list': note_list,
                                               'tag_list': tag_list,
                                               'project': project,
                                               'projects': get_project_list(),
                                               'module_history': module_history})
Exemple #30
0
    def get(self, request, *args, **kwargs):
        template_name = "viperweb/about.html"

        return render(request, template_name, {'version': __version__,
                                               'extractors': Extractor().extractors,
                                               'projects': get_project_list()})
Exemple #31
0
 def get_queryset(self, project=None, db=None, *args, **kwargs):
     projects = get_project_list()
     if not next((i for i in projects if i == "default"), None):
         projects.append(
             "default")  # make sure "default" is part of list of projects
     return projects
Exemple #32
0
    def get(self, request, *args, **kwargs):
        template_name = "viperweb/changelog.html"

        _changelog = {"foo": "bar"}
        return render(request, template_name, {'changelog': _changelog,
                                               'projects': get_project_list()})