'
+__license__ = 'Apache License 2.0'
+
+import logging
+import time
+import types
+import unicodedata
+from collections import defaultdict
+
+from lxml import etree, objectify
+
+
+# Set module level logger.
+logger = logging.getLogger(__name__)
+
+
+def generate_vm_report(self, report_details, startup_delay=60, polling_delay=30, max_checks=10):
+ ''' Spool and download QualysGuard VM report.
+
+ startup_delay: Time in seconds to wait before initially checking.
+ polling_delay: Time in seconds to wait between checks.
+ max_checks: Maximum number of times to check for report spooling completion.
+
+ '''
+ # Merge parameters.
+ report_details['action'] = 'launch'
+ logger.debug(report_details)
+ xml_output = qualysapi_instance.request(2, 'report', report_details)
+ report_id = etree.XML(xml_output).find('.//VALUE').text
+ logger.debug('report_id: %s' % (report_id))
+ # Wait for report to finish spooling.
+ # Maximum number of times to check for report. About 10 minutes.
+ MAX_CHECKS = 10
+ logger.info('Report sent to spooler. Checking for report in %s seconds.' % (startup_delay))
+ time.sleep(startup_delay)
+ for n in range(0, max_checks):
+ # Check to see if report is done.
+ xml_output = qualysapi_instance.request(2, 'report', {'action': 'list', 'id': report_id})
+ tag_status = etree.XML(xml_output).findtext(".//STATE")
+ logger.debug('tag_status: %s' % (tag_status))
+ tag_status = etree.XML(xml_output).findtext(".//STATE")
+ logger.debug('tag_status: %s' % (tag_status))
+ if tag_status is not None:
+ # Report is showing up in the Report Center.
+ if tag_status == 'Finished':
+ # Report creation complete.
+ break
+ # Report not finished, wait.
+ logger.info('Report still spooling. Trying again in %s seconds.' % (polling_delay))
+ time.sleep(polling_delay)
+ # We now have to fetch the report. Use the report id.
+ report_xml = qualysapi_instance.request(2, 'report', {'action': 'fetch', 'id': report_id})
+ return report_xml
+
+
+def qg_html_to_ascii(qg_html_text):
+ """Convert and return QualysGuard's quasi HTML text to ASCII text."""
+ text = qg_html_text
+ # Handle tagged line breaks (,
)
+ text = re.sub(r'(?i)
[ ]*', '\n', text)
+ text = re.sub(r'(?i)
[ ]*', '\n', text)
+ # Remove consecutive line breaks
+ text = re.sub(r"^\s+", "", text, flags=re.MULTILINE)
+ # Remove empty lines at the end.
+ text = re.sub('[\n]+$', '$', text)
+ # Store anchor tags href attribute
+ links = list(lxml.html.iterlinks(text))
+ # Remove anchor tags
+ html_element = lxml.html.fromstring(text)
+ # Convert anchor tags to "link_text (link: link_url )".
+ logging.debug('Converting anchor tags...')
+ text = html_element.text_content().encode('ascii', 'ignore')
+ # Convert each link.
+ for l in links:
+ # Find and replace each link.
+ link_text = l[0].text_content().encode('ascii', 'ignore').strip()
+ link_url = l[2].strip()
+ # Replacing link_text
+ if link_text != link_url:
+ # Link text is different, most likely a description.
+ text = string.replace(text, link_text, '%s (link: %s )' % (link_text, link_url))
+ else:
+ # Link text is the same as the href. No need to duplicate link.
+ text = string.replace(text, link_text, '%s' % (link_url))
+ logging.debug('Done.')
+ return text
+
+
+def qg_parse_informational_qids(xml_report):
+ """Return vulnerabilities of severity 1 and 2 levels due to a restriction of
+ QualysGuard's inability to report them in the internal ticketing system.
+ """
+ # asset_group's vulnerability data map:
+ # {'qid_number': {
+ # # CSV info
+ # 'hosts': [{'ip': '10.28.0.1', 'dns': 'hostname', 'netbios': 'blah', 'vuln_id': 'remediation_ticket_number'}, {'ip': '10.28.0.3', 'dns': 'hostname2', 'netbios': '', 'vuln_id': 'remediation_ticket_number'}, ...],
+ # 'solution': '',
+ # 'impact': '',
+ # 'threat': '',
+ # 'severity': '',
+ # }
+ # 'qid_number2': ...
+ # }
+ # Add all vulnerabilities to list of dictionaries.
+ # Use defaultdict in case a new QID is encountered.
+ info_vulns = defaultdict(dict)
+ # Parse vulnerabilities in xml string.
+ tree = objectify.fromstring(xml_report)
+ # Write IP, DNS, & Result into each QID CSV file.
+ logging.debug('Parsing report...')
+ # TODO: Check against c_args.max to prevent creating CSV content for QIDs that we won't use.
+ for host in tree.HOST_LIST.HOST:
+ # Extract possible extra hostname information.
+ try:
+ netbios = unicodedata.normalize('NFKD', six.text_type(host.NETBIOS)).encode('ascii', 'ignore').strip()
+ except AttributeError:
+ netbios = ''
+ try:
+ dns = unicodedata.normalize('NFKD', six.text_type(host.DNS)).encode('ascii', 'ignore').strip()
+ except AttributeError:
+ dns = ''
+ ip = unicodedata.normalize('NFKD', six.text_type(host.IP)).encode('ascii', 'ignore').strip()
+ # Extract vulnerabilities host is affected by.
+ for vuln in host.VULN_INFO_LIST.VULN_INFO:
+ try:
+ result = unicodedata.normalize('NFKD', six.text_type(vuln.RESULT)).encode('ascii', 'ignore').strip()
+ except AttributeError:
+ result = ''
+ qid = unicodedata.normalize('NFKD', six.text_type(vuln.QID)).encode('ascii', 'ignore').strip()
+ # Attempt to add host to QID's list of affected hosts.
+ try:
+ info_vulns[qid]['hosts'].append({'ip': '%s' % (ip),
+ 'dns': '%s' % (dns),
+ 'netbios': '%s' % (netbios),
+ 'vuln_id': '',
+ # Informational QIDs do not have vuln_id numbers. This is a flag to write the CSV file.
+ 'result': '%s' % (result), })
+ except KeyError:
+ # New QID.
+ logging.debug('New QID found: %s' % (qid))
+ info_vulns[qid]['hosts'] = []
+ info_vulns[qid]['hosts'].append({'ip': '%s' % (ip),
+ 'dns': '%s' % (dns),
+ 'netbios': '%s' % (netbios),
+ 'vuln_id': '',
+ # Informational QIDs do not have vuln_id numbers. This is a flag to write the CSV file.
+ 'result': '%s' % (result), })
+ # All vulnerabilities added.
+ # Add all vulnerabilty information.
+ for vuln_details in tree.GLOSSARY.VULN_DETAILS_LIST.VULN_DETAILS:
+ qid = unicodedata.normalize('NFKD', six.text_type(vuln_details.QID)).encode('ascii', 'ignore').strip()
+ info_vulns[qid]['title'] = unicodedata.normalize('NFKD', six.text_type(vuln_details.TITLE)).encode('ascii',
+ 'ignore').strip()
+ info_vulns[qid]['severity'] = unicodedata.normalize('NFKD', six.text_type(vuln_details.SEVERITY)).encode('ascii',
+ 'ignore').strip()
+ info_vulns[qid]['solution'] = qg_html_to_ascii(
+ unicodedata.normalize('NFKD', six.text_type(vuln_details.SOLUTION)).encode('ascii', 'ignore').strip())
+ info_vulns[qid]['threat'] = qg_html_to_ascii(
+ unicodedata.normalize('NFKD', six.text_type(vuln_details.THREAT)).encode('ascii', 'ignore').strip())
+ info_vulns[qid]['impact'] = qg_html_to_ascii(
+ unicodedata.normalize('NFKD', six.text_type(vuln_details.IMPACT)).encode('ascii', 'ignore').strip())
+ # Ready to report informational vulnerabilities.
+ return info_vulns
+
+
+# TODO: Implement required function qg_remediation_tickets(asset_group, status, qids)
+# TODO: Remove static 'report_template' value. Parameterize and document required report template.
+def qg_ticket_list(asset_group, severity, qids=None):
+ """Return dictionary of each vulnerability reported against asset_group of severity."""
+ global asset_group_details
+ # All vulnerabilities imported to list of dictionaries.
+ vulns = qg_remediation_tickets(asset_group, 'OPEN', qids) # vulns now holds all open remediation tickets.
+ if not vulns:
+ # No tickets to report.
+ return False
+ #
+ # Sort the vulnerabilities in order of prevalence -- number of hosts affected.
+ vulns = OrderedDict(sorted(list(vulns.items()), key=lambda t: len(t[1]['hosts'])))
+ logging.debug('vulns sorted = %s' % (vulns))
+ #
+ # Remove QIDs that have duplicate patches.
+ #
+ # Read in patch report.
+ # TODO: Allow for lookup of report_template.
+ # Report template is Patch report "Sev 5 confirmed patchable".
+ logging.debug('Retrieving patch report from QualysGuard.')
+ print('Retrieving patch report from QualysGuard.')
+ report_template = '1063695'
+ # Call QualysGuard for patch report.
+ csv_output = qg_command(2, 'report', {'action': 'launch', 'output_format': 'csv',
+ 'asset_group_ids': asset_group_details['qg_asset_group_id'],
+ 'template_id': report_template,
+ 'report_title': 'QGIR Patch %s' % (asset_group)})
+ logging.debug('csv_output =')
+ logging.debug(csv_output)
+ logging.debug('Improving remediation efficiency by removing unneeded, redundant patches.')
+ print('Improving remediation efficiency by removing unneeded, redundant patches.')
+ # Find the line for Patches by Host data.
+ logging.debug('Header found at %s.' % (csv_output.find('Patch QID, IP, DNS, NetBIOS, OS, Vulnerability Count')))
+
+ starting_pos = csv_output.find('Patch QID, IP, DNS, NetBIOS, OS, Vulnerability Count') + 52
+ logging.debug('starting_pos = %s' % str(starting_pos))
+ # Data resides between line ending in 'Vulnerability Count' and a blank line.
+ patches_by_host = csv_output[starting_pos:csv_output[starting_pos:].find(
+ 'Host Vulnerabilities Fixed by Patch') + starting_pos - 3]
+ logging.debug('patches_by_host =')
+ logging.debug(patches_by_host)
+ # Read in string patches_by_host csv to a dictionary.
+ f = patches_by_host.split(os.linesep)
+ reader = csv.DictReader(f, ['Patch QID', 'IP', 'DNS', 'NetBIOS', 'OS', 'Vulnerability Count'], delimiter=',')
+ # Mark Patch QIDs that fix multiple vulnerabilities with associated IP addresses.
+ redundant_qids = defaultdict(list)
+ for row in reader:
+ if int(row['Vulnerability Count']) > 1:
+ # Add to list of redundant QIDs.
+ redundant_qids[row['Patch QID']].append(row['IP'])
+ logging.debug('%s, %s, %s, %s' % (
+ row['Patch QID'],
+ row['IP'],
+ int(row['Vulnerability Count']),
+ redundant_qids[row['Patch QID']]))
+ # Log for debugging.
+ logging.debug('len(redundant_qids) = %s, redundant_qids =' % (len(redundant_qids)))
+ for patch_qid in list(redundant_qids.keys()):
+ logging.debug('%s, %s' % (str(patch_qid), str(redundant_qids[patch_qid])))
+ # Extract redundant QIDs with associated IP addresses.
+ # Find the line for Patches by Host data.
+ starting_pos = csv_output.find('Patch QID, IP, QID, Severity, Type, Title, Instance, Last Detected') + 66
+ # Data resides between line ending in 'Vulnerability Count' and end of string.
+ host_vulnerabilities_fixed_by_patch = csv_output[starting_pos:]
+ # Read in string host_vulnerabilities_fixed_by_patch csv to a dictionary.
+ f = host_vulnerabilities_fixed_by_patch.split(os.linesep)
+ reader = csv.DictReader(f, ['Patch QID', 'IP', 'QID', 'Severity', 'Type', 'Title', 'Instance', 'Last Detected'],
+ delimiter=',')
+ # Remove IP addresses associated with redundant QIDs.
+ qids_to_remove = defaultdict(list)
+ for row in reader:
+ # If the row's IP address's Patch QID was found to have multiple vulnerabilities...
+ if len(redundant_qids[row['Patch QID']]) > 0 and redundant_qids[row['Patch QID']].count(row['IP']) > 0:
+ # Add the QID column to the list of dictionaries {QID: [IP address, IP address, ...], QID2: [IP address], ...}
+ qids_to_remove[row['QID']].append(row['IP'])
+ # Log for debugging.
+ logging.debug('len(qids_to_remove) = %s, qids_to_remove =' % (len(qids_to_remove)))
+ for a_qid in list(qids_to_remove.keys()):
+ logging.debug('%s, %s' % (str(a_qid), str(qids_to_remove[a_qid])))
+ #
+ # Diff vulns against qids_to_remove and against open incidents.
+ #
+ vulns_length = len(vulns)
+ # Iterate over list of keys rather than original dictionary as some keys may be deleted changing the size of the dictionary.
+ for a_qid in list(vulns.keys()):
+ # Debug log original qid's hosts.
+ logging.debug('Before diffing vulns[%s] =' % (a_qid))
+ logging.debug(vulns[a_qid]['hosts'])
+ # Pop each host.
+ # The [:] returns a "slice" of x, which happens to contain all its elements, and is thus effectively a copy of x.
+ for host in vulns[a_qid]['hosts'][:]:
+ # If the QID for the host is a dupe or if a there is an open Reaction incident.
+ if qids_to_remove[a_qid].count(host['ip']) > 0 or reaction_open_issue(host['vuln_id']):
+ # Remove the host from the QID's list of target hosts.
+ logging.debug('Removing remediation ticket %s.' % (host['vuln_id']))
+ vulns[a_qid]['hosts'].remove(host)
+ else:
+ # Do not remove this vuln
+ logging.debug('Will report remediation %s.' % (host['vuln_id']))
+ # Debug log diff'd qid's hosts.
+ logging.debug('After diffing vulns[%s]=' % (a_qid))
+ logging.debug(vulns[a_qid]['hosts'])
+ # If there are no more hosts left to patch for the qid.
+ if len(vulns[a_qid]['hosts']) == 0:
+ # Remove the QID.
+ logging.debug('Deleting vulns[%s].' % (a_qid))
+ del vulns[a_qid]
+ # Diff completed
+ if not vulns_length == len(vulns):
+ print('A count of %s vulnerabilities have been consolidated to %s vulnerabilities, a reduction of %s%%.' % (
+ int(vulns_length),
+ int(len(vulns)),
+ int(round((int(vulns_length) - int(len(vulns))) / float(vulns_length) * 100))))
+ # Return vulns to report.
+ logging.debug('vulns =')
+ logging.debug(vulns)
+ return vulns
diff --git a/deps/qualysapi/qualysapi/settings.py b/deps/qualysapi/qualysapi/settings.py
new file mode 100644
index 0000000..f3ad22f
--- /dev/null
+++ b/deps/qualysapi/qualysapi/settings.py
@@ -0,0 +1,21 @@
+''' Module to hold global settings reused throughout qualysapi. '''
+
+from __future__ import absolute_import
+__author__ = "Colin Bell "
+__copyright__ = "Copyright 2011-2013, University of Waterloo"
+__license__ = "BSD-new"
+
+import os
+
+global defaults
+global default_filename
+
+
+if os.name == 'nt':
+ default_filename = "config.ini"
+else:
+ default_filename = ".qcrc"
+
+defaults = {'hostname': 'qualysapi.qualys.com',
+ 'max_retries': '3',
+ 'template_id': '00000'}
diff --git a/deps/qualysapi/qualysapi/util.py b/deps/qualysapi/qualysapi/util.py
new file mode 100644
index 0000000..5f0521e
--- /dev/null
+++ b/deps/qualysapi/qualysapi/util.py
@@ -0,0 +1,29 @@
+""" A set of utility functions for QualysConnect module. """
+from __future__ import absolute_import
+import logging
+
+import qualysapi.config as qcconf
+import qualysapi.connector as qcconn
+import qualysapi.settings as qcs
+
+__author__ = "Parag Baxi & Colin Bell "
+__copyright__ = "Copyright 2011-2013, Parag Baxi & University of Waterloo"
+__license__ = 'Apache License 2.0'
+
+# Set module level logger.
+logger = logging.getLogger(__name__)
+
+
+def connect(config_file=qcs.default_filename, remember_me=False, remember_me_always=False):
+ """ Return a QGAPIConnect object for v1 API pulling settings from config
+ file.
+ """
+ # Retrieve login credentials.
+ conf = qcconf.QualysConnectConfig(filename=config_file, remember_me=remember_me,
+ remember_me_always=remember_me_always)
+ connect = qcconn.QGConnector(conf.get_auth(),
+ conf.get_hostname(),
+ conf.proxies,
+ conf.max_retries)
+ logger.info("Finished building connector.")
+ return connect
diff --git a/deps/qualysapi/qualysapi/version.py b/deps/qualysapi/qualysapi/version.py
new file mode 100644
index 0000000..b22e775
--- /dev/null
+++ b/deps/qualysapi/qualysapi/version.py
@@ -0,0 +1,3 @@
+__author__ = 'Parag Baxi '
+__pkgname__ = 'qualysapi'
+__version__ = '4.1.0'
diff --git a/deps/qualysapi/setup.py b/deps/qualysapi/setup.py
new file mode 100644
index 0000000..8eedb12
--- /dev/null
+++ b/deps/qualysapi/setup.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python
+
+from __future__ import absolute_import
+import os
+import sys
+try:
+ from setuptools import setup
+except ImportError:
+ from distutils.core import setup
+
+__author__ = 'Parag Baxi '
+__copyright__ = 'Copyright 2011-2013, Parag Baxi'
+__license__ = 'BSD-new'
+# Make pyflakes happy.
+__pkgname__ = None
+__version__ = None
+exec(compile(open('qualysapi/version.py').read(), 'qualysapi/version.py', 'exec'))
+
+
+# A utility function to read the README file into the long_description field.
+def read(fname):
+ """ Takes a filename and returns the contents of said file relative to
+ the current directory.
+ """
+ return open(os.path.join(os.path.dirname(__file__), fname)).read()
+
+
+setup(name=__pkgname__,
+ version=__version__,
+ author='Parag Baxi',
+ author_email='parag.baxi@gmail.com',
+ description='QualysGuard(R) Qualys API Package',
+ license='BSD-new',
+ keywords='Qualys QualysGuard API helper network security',
+ url='https://github.com/paragbaxi/qualysapi',
+ package_dir={'': '.'},
+ packages=['qualysapi', ],
+ # package_data={'qualysapi':['LICENSE']},
+ # scripts=['src/scripts/qhostinfo.py', 'src/scripts/qscanhist.py', 'src/scripts/qreports.py'],
+ long_description=read('README.md'),
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Topic :: Utilities',
+ 'License :: OSI Approved :: Apache Software License',
+ 'Intended Audience :: Developers',
+ ],
+ install_requires=[
+ 'requests',
+ ],
+ )
diff --git a/elasticsearch/logstash-nessus-template.txt b/elasticsearch/logstash-nessus-template.json
similarity index 100%
rename from elasticsearch/logstash-nessus-template.txt
rename to elasticsearch/logstash-nessus-template.json
diff --git a/kibana/vuln_whisp_kibana/nessus_reporting_dashboard.json b/kibana/vuln_whisp_kibana/nessus_reporting_dashboard.json
deleted file mode 100755
index ff9541c..0000000
--- a/kibana/vuln_whisp_kibana/nessus_reporting_dashboard.json
+++ /dev/null
@@ -1,26 +0,0 @@
-[
- {
- "_id": "72051530-448e-11e7-a818-f5f80dfc3590",
- "_type": "dashboard",
- "_source": {
- "title": "Nessus - Reporting",
- "hits": 0,
- "description": "",
- "panelsJSON": "[{\"col\":1,\"id\":\"2f979030-44b9-11e7-a818-f5f80dfc3590\",\"panelIndex\":5,\"row\":7,\"size_x\":6,\"size_y\":4,\"type\":\"visualization\"},{\"size_x\":6,\"size_y\":4,\"panelIndex\":12,\"type\":\"visualization\",\"id\":\"8d9592d0-44ec-11e7-a05f-d9719b331a27\",\"col\":1,\"row\":3},{\"size_x\":6,\"size_y\":4,\"panelIndex\":14,\"type\":\"visualization\",\"id\":\"67d432e0-44ec-11e7-a05f-d9719b331a27\",\"col\":7,\"row\":3},{\"size_x\":3,\"size_y\":4,\"panelIndex\":15,\"type\":\"visualization\",\"id\":\"297df800-3f7e-11e7-bd24-6903e3283192\",\"col\":10,\"row\":7},{\"size_x\":3,\"size_y\":2,\"panelIndex\":16,\"type\":\"visualization\",\"id\":\"b4474f30-4489-11e7-b27d-bb1b79a0c6f6\",\"col\":10,\"row\":1},{\"size_x\":3,\"size_y\":2,\"panelIndex\":17,\"type\":\"visualization\",\"id\":\"93e7cda0-4489-11e7-b27d-bb1b79a0c6f6\",\"col\":7,\"row\":1},{\"size_x\":3,\"size_y\":2,\"panelIndex\":18,\"type\":\"visualization\",\"id\":\"c85f9a90-4484-11e7-b936-eb7d06aad726\",\"col\":1,\"row\":1},{\"size_x\":3,\"size_y\":2,\"panelIndex\":19,\"type\":\"visualization\",\"id\":\"30aab610-4486-11e7-b7a7-19baec0783ed\",\"col\":4,\"row\":1},{\"size_x\":3,\"size_y\":2,\"panelIndex\":20,\"type\":\"visualization\",\"id\":\"471a3580-3f6b-11e7-88e7-df1abe6547fb\",\"col\":7,\"row\":9},{\"size_x\":3,\"size_y\":2,\"panelIndex\":21,\"type\":\"visualization\",\"id\":\"ecbb99c0-3f84-11e7-97f9-3777d794626d\",\"col\":7,\"row\":7},{\"size_x\":3,\"size_y\":2,\"panelIndex\":22,\"type\":\"visualization\",\"id\":\"995e2280-3df3-11e7-a44e-c79ca8efb780\",\"col\":10,\"row\":11}]",
- "optionsJSON": "{\"darkTheme\":false}",
- "uiStateJSON": "{\"P-5\":{\"vis\":{\"legendOpen\":false}},\"P-15\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-20\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-22\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}}",
- "version": 1,
- "timeRestore": true,
- "timeTo": "now",
- "timeFrom": "now-30d",
- "refreshInterval": {
- "display": "Off",
- "pause": false,
- "value": 0
- },
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"filter\":[{\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}}}]}"
- }
- }
- }
-]
\ No newline at end of file
diff --git a/kibana/vuln_whisp_kibana/nessus_risk_mitigation_dashboard.json b/kibana/vuln_whisp_kibana/nessus_risk_mitigation_dashboard.json
deleted file mode 100755
index d26efe5..0000000
--- a/kibana/vuln_whisp_kibana/nessus_risk_mitigation_dashboard.json
+++ /dev/null
@@ -1,26 +0,0 @@
-[
- {
- "_id": "5dba30c0-3df3-11e7-a44e-c79ca8efb780",
- "_type": "dashboard",
- "_source": {
- "title": "Nessus - Risk Mitigation",
- "hits": 0,
- "description": "",
- "panelsJSON": "[{\"col\":11,\"id\":\"a9225930-3df2-11e7-a44e-c79ca8efb780\",\"panelIndex\":10,\"row\":6,\"size_x\":2,\"size_y\":2,\"type\":\"visualization\"},{\"col\":11,\"id\":\"995e2280-3df3-11e7-a44e-c79ca8efb780\",\"panelIndex\":20,\"row\":8,\"size_x\":2,\"size_y\":4,\"type\":\"visualization\"},{\"col\":1,\"id\":\"852816e0-3eb1-11e7-90cb-918f9cb01e3d\",\"panelIndex\":21,\"row\":7,\"size_x\":3,\"size_y\":4,\"type\":\"visualization\"},{\"col\":4,\"id\":\"d72349b0-3ebb-11e7-a14a-ff0848e07dca\",\"panelIndex\":23,\"row\":3,\"size_x\":5,\"size_y\":6,\"type\":\"visualization\"},{\"col\":4,\"id\":\"297df800-3f7e-11e7-bd24-6903e3283192\",\"panelIndex\":27,\"row\":9,\"size_x\":5,\"size_y\":3,\"type\":\"visualization\"},{\"col\":9,\"id\":\"35b6d320-3f7f-11e7-bd24-6903e3283192\",\"panelIndex\":28,\"row\":6,\"size_x\":2,\"size_y\":6,\"type\":\"visualization\"},{\"col\":1,\"id\":\"471a3580-3f6b-11e7-88e7-df1abe6547fb\",\"panelIndex\":30,\"row\":3,\"size_x\":3,\"size_y\":2,\"type\":\"visualization\"},{\"col\":1,\"id\":\"de1a5f40-3f85-11e7-97f9-3777d794626d\",\"panelIndex\":31,\"row\":11,\"size_x\":3,\"size_y\":3,\"type\":\"visualization\"},{\"col\":1,\"id\":\"c85f9a90-4484-11e7-b936-eb7d06aad726\",\"panelIndex\":32,\"row\":1,\"size_x\":3,\"size_y\":2,\"type\":\"visualization\"},{\"col\":4,\"id\":\"30aab610-4486-11e7-b7a7-19baec0783ed\",\"panelIndex\":33,\"row\":1,\"size_x\":3,\"size_y\":2,\"type\":\"visualization\"},{\"col\":7,\"id\":\"93e7cda0-4489-11e7-b27d-bb1b79a0c6f6\",\"panelIndex\":34,\"row\":1,\"size_x\":3,\"size_y\":2,\"type\":\"visualization\"},{\"col\":10,\"id\":\"b4474f30-4489-11e7-b27d-bb1b79a0c6f6\",\"panelIndex\":35,\"row\":1,\"size_x\":3,\"size_y\":2,\"type\":\"visualization\"},{\"col\":9,\"id\":\"5093c620-44e9-11e7-8014-ede06a7e69f8\",\"panelIndex\":37,\"row\":3,\"size_x\":4,\"size_y\":3,\"type\":\"visualization\"},{\"col\":1,\"columns\":[\"host\",\"risk\",\"risk_score\",\"cve\",\"plugin_name\",\"solution\",\"plugin_output\"],\"id\":\"54648700-3f74-11e7-852e-69207a3d0726\",\"panelIndex\":38,\"row\":14,\"size_x\":12,\"size_y\":6,\"sort\":[\"@timestamp\",\"desc\"],\"type\":\"search\"},{\"col\":1,\"id\":\"fb6eb020-49ab-11e7-8f8c-57ad64ec48a6\",\"panelIndex\":39,\"row\":5,\"size_x\":3,\"size_y\":2,\"type\":\"visualization\"}]",
- "optionsJSON": "{\"darkTheme\":false}",
- "uiStateJSON": "{\"P-10\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-11\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-2\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-20\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-21\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"desc\"}}}},\"P-27\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-28\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"desc\"}}}},\"P-3\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"asc\"}}}},\"P-30\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-31\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-5\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-6\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-8\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}}",
- "version": 1,
- "timeRestore": true,
- "timeTo": "now",
- "timeFrom": "now-30d",
- "refreshInterval": {
- "display": "Off",
- "pause": false,
- "value": 0
- },
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"filter\":[{\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"-risk:None\"}}}]}"
- }
- }
- }
-]
\ No newline at end of file
diff --git a/kibana/vuln_whisp_kibana/nessus_visualizations.json b/kibana/vuln_whisp_kibana/nessus_visualizations.json
deleted file mode 100755
index 5a7ba97..0000000
--- a/kibana/vuln_whisp_kibana/nessus_visualizations.json
+++ /dev/null
@@ -1,534 +0,0 @@
-[
- {
- "_id": "7e7fbc90-3df2-11e7-a44e-c79ca8efb780",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-PluginID",
- "visState": "{\"title\":\"Nessus-PluginID\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showMeticsAtAllLevels\":false,\"showPartialRows\":false,\"showTotal\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"plugin_id.raw\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"1\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "c786bc20-3df4-11e7-a3dd-33f478b7be91",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-RiskPie",
- "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{},\"schema\":\"metric\",\"type\":\"count\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"field\":\"risk.raw\",\"order\":\"desc\",\"orderBy\":\"1\",\"size\":50},\"schema\":\"segment\",\"type\":\"terms\"},{\"enabled\":true,\"id\":\"3\",\"params\":{\"field\":\"name.raw\",\"order\":\"desc\",\"orderBy\":\"1\",\"size\":50},\"schema\":\"segment\",\"type\":\"terms\"},{\"enabled\":true,\"id\":\"4\",\"params\":{\"field\":\"synopsis.raw\",\"order\":\"desc\",\"orderBy\":\"1\",\"size\":50},\"schema\":\"segment\",\"type\":\"terms\"},{\"enabled\":true,\"id\":\"5\",\"params\":{\"field\":\"host\",\"order\":\"desc\",\"orderBy\":\"1\",\"size\":50},\"schema\":\"segment\",\"type\":\"terms\"}],\"listeners\":{},\"params\":{\"addLegend\":true,\"addTooltip\":true,\"isDonut\":true,\"legendPosition\":\"right\"},\"title\":\"Nessus-RiskPie\",\"type\":\"pie\"}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"!(None)\"}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "5a3c0340-3eb3-11e7-a192-93f36fbd9d05",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-CVSSHeatmap",
- "visState": "{\"title\":\"Nessus-CVSSHeatmap\",\"type\":\"heatmap\",\"params\":{\"addTooltip\":true,\"addLegend\":true,\"enableHover\":false,\"legendPosition\":\"right\",\"times\":[],\"colorsNumber\":4,\"colorSchema\":\"Yellow to Red\",\"setColorRange\":false,\"colorsRange\":[],\"invertColors\":false,\"percentageMode\":false,\"valueAxes\":[{\"show\":false,\"id\":\"ValueAxis-1\",\"type\":\"value\",\"scale\":{\"type\":\"linear\",\"defaultYExtents\":false},\"labels\":{\"show\":false,\"rotate\":0,\"color\":\"#555\"}}]},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"host\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"1\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"cvss\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"_term\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"defaultColors\":{\"0 - 3500\":\"rgb(255,255,204)\",\"3500 - 7000\":\"rgb(254,217,118)\",\"7000 - 10500\":\"rgb(253,141,60)\",\"10500 - 14000\":\"rgb(227,27,28)\"}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "60418690-3eb1-11e7-90cb-918f9cb01e3d",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-TopPorts",
- "visState": "{\"title\":\"Nessus-TopPorts\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"port\",\"size\":20,\"order\":\"desc\",\"orderBy\":\"1\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "983687e0-3df2-11e7-a44e-c79ca8efb780",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-Protocol",
- "visState": "{\"title\":\"Nessus-Protocol\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showMeticsAtAllLevels\":false,\"showPartialRows\":false,\"showTotal\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"protocol.raw\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Protocol\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "995e2280-3df3-11e7-a44e-c79ca8efb780",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-Host",
- "visState": "{\"title\":\"Nessus-Host\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showMeticsAtAllLevels\":false,\"showPartialRows\":false,\"showTotal\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"host\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Host IP\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "87338510-3df2-11e7-a44e-c79ca8efb780",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-PluginOutput",
- "visState": "{\"title\":\"Nessus-PluginOutput\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showMeticsAtAllLevels\":false,\"showPartialRows\":false,\"showTotal\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"plugin_output.raw\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Plugin Output\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "068d4bc0-3df3-11e7-a44e-c79ca8efb780",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-SeeAlso",
- "visState": "{\"title\":\"Nessus-SeeAlso\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showMeticsAtAllLevels\":false,\"showPartialRows\":false,\"showTotal\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"see_also.raw\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"See Also\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "1de9e550-3df1-11e7-a44e-c79ca8efb780",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-Description",
- "visState": "{\"title\":\"Nessus-Description\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"description.raw\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Description\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "1e59fa50-3df3-11e7-a44e-c79ca8efb780",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-Synopsis",
- "visState": "{\"title\":\"Nessus-Synopsis\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showMeticsAtAllLevels\":false,\"showPartialRows\":false,\"showTotal\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"synopsis.raw\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Synopsis\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "13c7d4e0-3df3-11e7-a44e-c79ca8efb780",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-Solution",
- "visState": "{\"title\":\"Nessus-Solution\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showMeticsAtAllLevels\":false,\"showPartialRows\":false,\"showTotal\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"solution.raw\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Solution\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "69765d50-3f5e-11e7-98cc-d924fd28047d",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-CVE",
- "visState": "{\"title\":\"Nessus-CVE\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"cve.raw\",\"size\":10,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"CVE ID\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"!(nan)\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "852816e0-3eb1-11e7-90cb-918f9cb01e3d",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-CVSS",
- "visState": "{\"title\":\"Nessus-CVSS\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"cvss\",\"size\":20,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"CVSS Score\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"host\",\"customLabel\":\"# of Hosts\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"desc\"}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "099a3820-3f68-11e7-a6bd-e764d950e506",
- "_type": "visualization",
- "_source": {
- "title": "Timelion Nessus Example",
- "visState": "{\"type\":\"timelion\",\"title\":\"Timelion Nessus Example\",\"params\":{\"expression\":\".es(index=logstash-nessus-*,q=risk:high).label(\\\"Current High Risk\\\"),.es(index=logstash-nessus-*,q=risk:high,offset=-1y).label(\\\"Last 1 Year High Risk\\\"),.es(index=logstash-nessus-*,q=risk:medium).label(\\\"Current Medium Risk\\\"),.es(index=logstash-nessus-*,q=risk:medium,offset=-1y).label(\\\"Last 1 Year Medium Risk\\\")\",\"interval\":\"auto\"}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{}"
- }
- }
- },
- {
- "_id": "56f0f5f0-3ebe-11e7-a192-93f36fbd9d05",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-RiskOverTime",
- "visState": "{\n \"title\": \"Nessus-RiskOverTime\",\n \"type\": \"line\",\n \"params\": {\n \"addTooltip\": true,\n \"addLegend\": true,\n \"legendPosition\": \"right\",\n \"showCircles\": true,\n \"interpolate\": \"linear\",\n \"scale\": \"linear\",\n \"drawLinesBetweenPoints\": true,\n \"radiusRatio\": 9,\n \"times\": [],\n \"addTimeMarker\": false,\n \"defaultYExtents\": false,\n \"setYExtents\": false,\n \"orderBucketsBySum\": false\n },\n \"aggs\": [\n {\n \"id\": \"1\",\n \"enabled\": true,\n \"type\": \"count\",\n \"schema\": \"metric\",\n \"params\": {}\n },\n {\n \"id\": \"2\",\n \"enabled\": true,\n \"type\": \"date_histogram\",\n \"schema\": \"segment\",\n \"params\": {\n \"field\": \"@timestamp\",\n \"interval\": \"auto\",\n \"customInterval\": \"2h\",\n \"min_doc_count\": 1,\n \"extended_bounds\": {}\n }\n },\n {\n \"id\": \"3\",\n \"enabled\": true,\n \"type\": \"terms\",\n \"schema\": \"group\",\n \"params\": {\n \"field\": \"risk\",\n \"size\": 5,\n \"order\": \"desc\",\n \"orderBy\": \"1\"\n }\n }\n ],\n \"listeners\": {}\n}",
- "uiStateJSON": "{\n \"vis\": {\n \"colors\": {\n \"High\": \"#E0752D\",\n \"Critical\": \"#E24D42\",\n \"Medium\": \"#F2C96D\",\n \"Low\": \"#7EB26D\"\n }\n }\n}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\n \"index\": \"logstash-nessus-*\",\n \"query\": {\n \"query_string\": {\n \"query\": \"!(None)\",\n \"analyze_wildcard\": true\n }\n },\n \"filter\": []\n}"
- }
- }
- },
- {
- "_id": "297df800-3f7e-11e7-bd24-6903e3283192",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - Plugin Name",
- "visState": "{\"title\":\"Nessus - Plugin Name\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"plugin_name.raw\",\"size\":10,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Plugin Name\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "bab8eca0-3df6-11e7-8d0f-bbaa05e9c1ab",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-CriticalRiskCount",
- "visState": "{\"title\":\"Nessus-CriticalRiskCount\",\"type\":\"health-metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"fontColor\":\"white\",\"invertScale\":false,\"redThreshold\":0,\"yellowThreshold\":0,\"redColor\":\"#fd482f\",\"yellowColor\":\"#ffa500\",\"greenColor\":\"#fd482f\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Critical Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"risk:Critical\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "ffe4e6d0-3df6-11e7-8a61-8d8a5592a3a4",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-MediumRiskCount",
- "visState": "{\"title\":\"Nessus-MediumRiskCount\",\"type\":\"health-metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"fontColor\":\"white\",\"invertScale\":false,\"redThreshold\":0,\"yellowThreshold\":0,\"redColor\":\"#FFCC00\",\"yellowColor\":\"#FFCC00\",\"greenColor\":\"#FFCC00\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Medium Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"risk:Medium\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "4befdef0-3df6-11e7-8d0f-bbaa05e9c1ab",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-HighRiskCount",
- "visState": "{\"title\":\"Nessus-HighRiskCount\",\"type\":\"health-metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"fontColor\":\"white\",\"invertScale\":false,\"redThreshold\":0,\"yellowThreshold\":0,\"redColor\":\"#ffa500\",\"yellowColor\":\"#ffa500\",\"greenColor\":\"#ffa500\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"High Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"risk:High\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "26632390-3df6-11e7-8d0f-bbaa05e9c1ab",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-LowRiskCount",
- "visState": "{\"title\":\"Nessus-LowRiskCount\",\"type\":\"health-metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"fontColor\":\"white\",\"invertScale\":false,\"redThreshold\":0,\"yellowThreshold\":0,\"redColor\":\"#6dc066\",\"yellowColor\":\"#6dc066\",\"greenColor\":\"#6dc066\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Low Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"risk:Low\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "de1a5f40-3f85-11e7-97f9-3777d794626d",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - ScanName",
- "visState": "{\"title\":\"Nessus - ScanName\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"scan_name.raw\",\"size\":20,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Scan Name\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "ecbb99c0-3f84-11e7-97f9-3777d794626d",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - Total",
- "visState": "{\"title\":\"Nessus - Total\",\"type\":\"metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Total\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "d72349b0-3ebb-11e7-a14a-ff0848e07dca",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - Critical Assets",
- "visState": "{\"title\":\"Nessus - Critical Assets\",\"type\":\"prelert_swimlane\",\"params\":{\"interval\":{\"display\":\"Auto\",\"val\":\"auto\",\"description\":\"day\"},\"lowThreshold\":0,\"warningThreshold\":3,\"minorThreshold\":5,\"majorThreshold\":7,\"criticalThreshold\":9,\"tooltipNumberFormat\":\"0.0\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"viewBy\",\"params\":{\"field\":\"host\",\"size\":15,\"orderAgg\":{\"id\":\"1-orderAgg\",\"enabled\":true,\"type\":\"count\",\"schema\":\"orderAgg\",\"params\":{}},\"order\":\"desc\",\"orderBy\":\"custom\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"timeSplit\",\"params\":{\"field\":\"@timestamp\",\"interval\":\"auto\",\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{}}},{\"id\":\"3\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"risk_score\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"P-10\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-11\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-2\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-20\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-21\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"desc\"}}}},\"P-27\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-28\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"desc\"}}}},\"P-3\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"asc\"}}}},\"P-30\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-5\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-6\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-8\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"-risk:None tags:critical_asset\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "471a3580-3f6b-11e7-88e7-df1abe6547fb",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - Vulnerabilities by Tag",
- "visState": "{\"title\":\"Nessus - Vulnerabilities by Tag\",\"type\":\"table\",\"params\":{\"perPage\":3,\"showMeticsAtAllLevels\":false,\"showPartialRows\":false,\"showTotal\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"3\",\"enabled\":true,\"type\":\"filters\",\"schema\":\"bucket\",\"params\":{\"filters\":[{\"input\":{\"query\":{\"query_string\":{\"query\":\"tags:has_hipaa_data\",\"analyze_wildcard\":true}}},\"label\":\"Systems with HIPAA data\"},{\"input\":{\"query\":{\"query_string\":{\"query\":\"tags:pci_asset\",\"analyze_wildcard\":true}}},\"label\":\"PCI Systems\"},{\"input\":{\"query\":{\"query_string\":{\"query\":\"tags:hipaa_asset\",\"analyze_wildcard\":true}}},\"label\":\"HIPAA Systems\"}]}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "35b6d320-3f7f-11e7-bd24-6903e3283192",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - Residual Risk",
- "visState": "{\"title\":\"Nessus - Residual Risk\",\"type\":\"table\",\"params\":{\"perPage\":15,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":0,\"direction\":\"desc\"},\"showTotal\":false,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"risk_score\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Risk Number\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"desc\"}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "a9225930-3df2-11e7-a44e-c79ca8efb780",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-Risk",
- "visState": "{\"title\":\"Nessus-Risk\",\"type\":\"table\",\"params\":{\"perPage\":4,\"showMeticsAtAllLevels\":false,\"showPartialRows\":false,\"showTotal\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"risk\",\"size\":10,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Risk Severity\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "b4474f30-4489-11e7-b27d-bb1b79a0c6f6",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - CriticalResidualRiskCount",
- "visState": "{\"title\":\"Nessus - CriticalResidualRiskCount\",\"type\":\"health-metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"fontColor\":\"white\",\"invertScale\":false,\"redThreshold\":0,\"yellowThreshold\":0,\"redColor\":\"#fd482f\",\"yellowColor\":\"#ffa500\",\"greenColor\":\"#fd482f\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Critical Residual Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"(risk_score:>=9 AND risk_score:<=10)\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "30aab610-4486-11e7-b7a7-19baec0783ed",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - MediumResidualRiskCount",
- "visState": "{\"title\":\"Nessus - MediumResidualRiskCount\",\"type\":\"health-metric\",\"params\":{\"fontColor\":\"white\",\"fontSize\":60,\"greenColor\":\"#FFCC00\",\"handleNoResults\":true,\"invertScale\":false,\"redColor\":\"#FFCC00\",\"redThreshold\":0,\"yellowColor\":\"#FFCC00\",\"yellowThreshold\":0},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Medium Residual Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"(risk_score:>=4 AND risk_score:<7)\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "93e7cda0-4489-11e7-b27d-bb1b79a0c6f6",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - HighResidualRiskCount",
- "visState": "{\"title\":\"Nessus - HighResidualRiskCount\",\"type\":\"health-metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"fontColor\":\"white\",\"invertScale\":false,\"redThreshold\":0,\"yellowThreshold\":0,\"redColor\":\"#ffa500\",\"yellowColor\":\"#ffa500\",\"greenColor\":\"#ffa500\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"High Residual Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"(risk_score:>=7 AND risk_score:<9)\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "c85f9a90-4484-11e7-b936-eb7d06aad726",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - LowResidualRiskCount",
- "visState": "{\"title\":\"Nessus - LowResidualRiskCount\",\"type\":\"health-metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"fontColor\":\"white\",\"invertScale\":false,\"redThreshold\":0,\"yellowThreshold\":0,\"redColor\":\"#6dc066\",\"yellowColor\":\"#6dc066\",\"greenColor\":\"#6dc066\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Low Residual Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"(risk_score:>0 AND risk_score:<4)\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "2f979030-44b9-11e7-a818-f5f80dfc3590",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - ScanBarChart",
- "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{},\"schema\":\"metric\",\"type\":\"count\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"customLabel\":\"Scan Name\",\"field\":\"scan_name.raw\",\"order\":\"desc\",\"orderBy\":\"1\",\"size\":10},\"schema\":\"segment\",\"type\":\"terms\"}],\"listeners\":{},\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"defaultYExtents\":false,\"legendPosition\":\"right\",\"mode\":\"stacked\",\"scale\":\"linear\",\"setYExtents\":false,\"times\":[]},\"title\":\"Nessus - ScanBarChart\",\"type\":\"histogram\"}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "5093c620-44e9-11e7-8014-ede06a7e69f8",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - Mitigation Readme",
- "visState": "{\"title\":\"Nessus - Mitigation Readme\",\"type\":\"markdown\",\"params\":{\"markdown\":\"** Legend **\\n\\n* [Common Vulnerability Scoring System (CVSS)](https://nvd.nist.gov/vuln-metrics/cvss) is the NIST vulnerability scoring system\\n* Risk Number is residual risk score calculated from CVSS, which is adjusted to be specific to Heartland which accounts for services not in use such as Java and Flash\\n* Vulnerabilities by Tag are systems tagged with HIPAA and PCI identification.\\n\\n\\n** Workflow **\\n* Select 10.0 under Risk Number to identify Critical Vulnerabilities. \\n* For more information about a CVE, scroll down and click the CVE link.\\n* To filter by tags, use one of the following filters:\\n** tags:has_hipaa_data, tags:pci_asset, tags:hipaa_asset**\"},\"aggs\":[],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "5e00be00-44f6-11e7-bc13-dff41515cdab",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - Risk Explorer",
- "visState": "{\"title\":\"Nessus - Risk Explorer\",\"type\":\"network\",\"params\":{\"canvasBackgroundColor\":\"#FFFFFF\",\"firstNodeColor\":\"#FD7BC4\",\"gravitationalConstant\":-35000,\"maxCutMetricSizeEdge\":5000,\"maxCutMetricSizeNode\":5000,\"maxEdgeSize\":5,\"maxNodeSize\":80,\"minCutMetricSizeNode\":0,\"minEdgeSize\":0.1,\"minNodeSize\":8,\"secondNodeColor\":\"#00d1ff\",\"shapeFirstNode\":\"dot\",\"shapeSecondNode\":\"box\",\"showColorLegend\":true,\"showLabels\":true,\"showPopup\":true,\"springConstant\":0.001},\"aggs\":[{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"first\",\"params\":{\"field\":\"host\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"_term\"}},{\"id\":\"5\",\"enabled\":true,\"type\":\"max\",\"schema\":\"size_node\",\"params\":{\"field\":\"risk_score\"}},{\"id\":\"6\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"second\",\"params\":{\"field\":\"cve\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"5\"}},{\"id\":\"7\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"colornode\",\"params\":{\"field\":\"plugin_name.raw\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"_term\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "67d432e0-44ec-11e7-a05f-d9719b331a27",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - TL-Critical Risk",
- "visState": "{\"title\":\"Nessus - TL-Critical Risk\",\"type\":\"timelion\",\"params\":{\"expression\":\".es(index='logstash-nessus-*',q='(risk_score:>=9 AND risk_score:<=10)').label(\\\"Original\\\"),.es(index='logstash-nessus-*',q='(risk_score:>=9 AND risk_score:<=10)',offset=-1w).label(\\\"One week offset\\\"),.es(index='logstash-nessus-*',q='(risk_score:>=9 AND risk_score:<=10)').subtract(.es(index='logstash-nessus-*',q='(risk_score:>=9 AND risk_score:<=10)',offset=-1w)).label(\\\"Difference\\\").lines(steps=3,fill=2,width=1)\",\"interval\":\"auto\"},\"aggs\":[],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "a91b9fe0-44ec-11e7-a05f-d9719b331a27",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - TL-Medium Risk",
- "visState": "{\"title\":\"Nessus - TL-Medium Risk\",\"type\":\"timelion\",\"params\":{\"expression\":\".es(index='logstash-nessus-*',q='(risk_score:>=4 AND risk_score:<7)').label(\\\"Original\\\"),.es(index='logstash-nessus-*',q='(risk_score:>=4 AND risk_score:<7)',offset=-1w).label(\\\"One week offset\\\"),.es(index='logstash-nessus-*',q='(risk_score:>=4 AND risk_score:<7)').subtract(.es(index='logstash-nessus-*',q='(risk_score:>=4 AND risk_score:<7)',offset=-1w)).label(\\\"Difference\\\").lines(steps=3,fill=2,width=1)\",\"interval\":\"auto\"},\"aggs\":[],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "8d9592d0-44ec-11e7-a05f-d9719b331a27",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - TL-High Risk",
- "visState": "{\"title\":\"Nessus - TL-High Risk\",\"type\":\"timelion\",\"params\":{\"expression\":\".es(index='logstash-nessus-*',q='(risk_score:>=7 AND risk_score:<9)').label(\\\"Original\\\"),.es(index='logstash-nessus-*',q='(risk_score:>=7 AND risk_score:<9)',offset=-1w).label(\\\"One week offset\\\"),.es(index='logstash-nessus-*',q='(risk_score:>=7 AND risk_score:<9)').subtract(.es(index='logstash-nessus-*',q='(risk_score:>=7 AND risk_score:<9)',offset=-1w)).label(\\\"Difference\\\").lines(steps=3,fill=2,width=1)\",\"interval\":\"auto\"},\"aggs\":[],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "a2d66660-44ec-11e7-a05f-d9719b331a27",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - TL-Low Risk",
- "visState": "{\"title\":\"Nessus - TL-Low Risk\",\"type\":\"timelion\",\"params\":{\"expression\":\".es(index='logstash-nessus-*',q='(risk_score:>0 AND risk_score:<4)').label(\\\"Original\\\"),.es(index='logstash-nessus-*',q='(risk_score:>0 AND risk_score:<4)',offset=-1w).label(\\\"One week offset\\\"),.es(index='logstash-nessus-*',q='(risk_score:>0 AND risk_score:<4)').subtract(.es(index='logstash-nessus-*',q='(risk_score:>0 AND risk_score:<4)',offset=-1w)).label(\\\"Difference\\\").lines(steps=3,fill=2,width=1)\",\"interval\":\"auto\"},\"aggs\":[],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "fb6eb020-49ab-11e7-8f8c-57ad64ec48a6",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - Critical Risk Score for Tagged Assets",
- "visState": "{\"title\":\"Nessus - Critical Risk Score for Tagged Assets\",\"type\":\"timelion\",\"params\":{\"expression\":\".es(index=logstash-nessus-*,q='risk_score:>9 AND tags:hipaa_asset').label(\\\"HIPAA Assets\\\"),.es(index=logstash-nessus-*,q='risk_score:>9 AND tags:pci_asset').label(\\\"PCI Systems\\\"),.es(index=logstash-nessus-*,q='risk_score:>9 AND tags:has_hipaa_data').label(\\\"Has HIPAA Data\\\")\",\"interval\":\"auto\"},\"aggs\":[],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- }
-]
\ No newline at end of file
diff --git a/kibana/vuln_whisp_kibana/nessus_saved_search.json b/kibana/vuln_whisp_kibana/vulnWhispererSavedSearches.json
similarity index 100%
rename from kibana/vuln_whisp_kibana/nessus_saved_search.json
rename to kibana/vuln_whisp_kibana/vulnWhispererSavedSearches.json
diff --git a/kibana/vuln_whisp_kibana/nessus_visuals_mitigation.json b/kibana/vuln_whisp_kibana/vulnWhispererVisualiations.json
similarity index 68%
rename from kibana/vuln_whisp_kibana/nessus_visuals_mitigation.json
rename to kibana/vuln_whisp_kibana/vulnWhispererVisualiations.json
index 71fd6a8..bfb5300 100755
--- a/kibana/vuln_whisp_kibana/nessus_visuals_mitigation.json
+++ b/kibana/vuln_whisp_kibana/vulnWhispererVisualiations.json
@@ -195,20 +195,6 @@
}
}
},
- {
- "_id": "56f0f5f0-3ebe-11e7-a192-93f36fbd9d05",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-RiskOverTime",
- "visState": "{\n \"title\": \"Nessus-RiskOverTime\",\n \"type\": \"line\",\n \"params\": {\n \"addTooltip\": true,\n \"addLegend\": true,\n \"legendPosition\": \"right\",\n \"showCircles\": true,\n \"interpolate\": \"linear\",\n \"scale\": \"linear\",\n \"drawLinesBetweenPoints\": true,\n \"radiusRatio\": 9,\n \"times\": [],\n \"addTimeMarker\": false,\n \"defaultYExtents\": false,\n \"setYExtents\": false,\n \"orderBucketsBySum\": false\n },\n \"aggs\": [\n {\n \"id\": \"1\",\n \"enabled\": true,\n \"type\": \"count\",\n \"schema\": \"metric\",\n \"params\": {}\n },\n {\n \"id\": \"2\",\n \"enabled\": true,\n \"type\": \"date_histogram\",\n \"schema\": \"segment\",\n \"params\": {\n \"field\": \"@timestamp\",\n \"interval\": \"auto\",\n \"customInterval\": \"2h\",\n \"min_doc_count\": 1,\n \"extended_bounds\": {}\n }\n },\n {\n \"id\": \"3\",\n \"enabled\": true,\n \"type\": \"terms\",\n \"schema\": \"group\",\n \"params\": {\n \"field\": \"risk\",\n \"size\": 5,\n \"order\": \"desc\",\n \"orderBy\": \"1\"\n }\n }\n ],\n \"listeners\": {}\n}",
- "uiStateJSON": "{\n \"vis\": {\n \"colors\": {\n \"High\": \"#E0752D\",\n \"Critical\": \"#E24D42\",\n \"Medium\": \"#F2C96D\",\n \"Low\": \"#7EB26D\"\n }\n }\n}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\n \"index\": \"logstash-nessus-*\",\n \"query\": {\n \"query_string\": {\n \"query\": \"!(None)\",\n \"analyze_wildcard\": true\n }\n },\n \"filter\": []\n}"
- }
- }
- },
{
"_id": "297df800-3f7e-11e7-bd24-6903e3283192",
"_type": "visualization",
@@ -223,62 +209,6 @@
}
}
},
- {
- "_id": "bab8eca0-3df6-11e7-8d0f-bbaa05e9c1ab",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-CriticalRiskCount",
- "visState": "{\"title\":\"Nessus-CriticalRiskCount\",\"type\":\"health-metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"fontColor\":\"white\",\"invertScale\":false,\"redThreshold\":0,\"yellowThreshold\":0,\"redColor\":\"#fd482f\",\"yellowColor\":\"#ffa500\",\"greenColor\":\"#fd482f\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Critical Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"risk:Critical\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "ffe4e6d0-3df6-11e7-8a61-8d8a5592a3a4",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-MediumRiskCount",
- "visState": "{\"title\":\"Nessus-MediumRiskCount\",\"type\":\"health-metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"fontColor\":\"white\",\"invertScale\":false,\"redThreshold\":0,\"yellowThreshold\":0,\"redColor\":\"#FFCC00\",\"yellowColor\":\"#FFCC00\",\"greenColor\":\"#FFCC00\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Medium Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"risk:Medium\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "4befdef0-3df6-11e7-8d0f-bbaa05e9c1ab",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-HighRiskCount",
- "visState": "{\"title\":\"Nessus-HighRiskCount\",\"type\":\"health-metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"fontColor\":\"white\",\"invertScale\":false,\"redThreshold\":0,\"yellowThreshold\":0,\"redColor\":\"#ffa500\",\"yellowColor\":\"#ffa500\",\"greenColor\":\"#ffa500\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"High Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"risk:High\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "26632390-3df6-11e7-8d0f-bbaa05e9c1ab",
- "_type": "visualization",
- "_source": {
- "title": "Nessus-LowRiskCount",
- "visState": "{\"title\":\"Nessus-LowRiskCount\",\"type\":\"health-metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"fontColor\":\"white\",\"invertScale\":false,\"redThreshold\":0,\"yellowThreshold\":0,\"redColor\":\"#6dc066\",\"yellowColor\":\"#6dc066\",\"greenColor\":\"#6dc066\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Low Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"risk:Low\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
{
"_id": "de1a5f40-3f85-11e7-97f9-3777d794626d",
"_type": "visualization",
@@ -307,20 +237,6 @@
}
}
},
- {
- "_id": "d72349b0-3ebb-11e7-a14a-ff0848e07dca",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - Critical Assets",
- "visState": "{\"title\":\"Nessus - Critical Assets\",\"type\":\"prelert_swimlane\",\"params\":{\"interval\":{\"display\":\"Auto\",\"val\":\"auto\",\"description\":\"day\"},\"lowThreshold\":0,\"warningThreshold\":3,\"minorThreshold\":5,\"majorThreshold\":7,\"criticalThreshold\":9,\"tooltipNumberFormat\":\"0.0\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"viewBy\",\"params\":{\"field\":\"host\",\"size\":15,\"orderAgg\":{\"id\":\"1-orderAgg\",\"enabled\":true,\"type\":\"count\",\"schema\":\"orderAgg\",\"params\":{}},\"order\":\"desc\",\"orderBy\":\"custom\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"timeSplit\",\"params\":{\"field\":\"@timestamp\",\"interval\":\"auto\",\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{}}},{\"id\":\"3\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"risk_score\"}}],\"listeners\":{}}",
- "uiStateJSON": "{\"P-10\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-11\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-2\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-20\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-21\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"desc\"}}}},\"P-27\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-28\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"desc\"}}}},\"P-3\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"asc\"}}}},\"P-30\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-5\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-6\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-8\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"-risk:None tags:critical_asset\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
{
"_id": "471a3580-3f6b-11e7-88e7-df1abe6547fb",
"_type": "visualization",
@@ -363,62 +279,6 @@
}
}
},
- {
- "_id": "b4474f30-4489-11e7-b27d-bb1b79a0c6f6",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - CriticalResidualRiskCount",
- "visState": "{\"title\":\"Nessus - CriticalResidualRiskCount\",\"type\":\"health-metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"fontColor\":\"white\",\"invertScale\":false,\"redThreshold\":0,\"yellowThreshold\":0,\"redColor\":\"#fd482f\",\"yellowColor\":\"#ffa500\",\"greenColor\":\"#fd482f\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Critical Residual Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"(risk_score:>=9 AND risk_score:<=10)\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "30aab610-4486-11e7-b7a7-19baec0783ed",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - MediumResidualRiskCount",
- "visState": "{\"title\":\"Nessus - MediumResidualRiskCount\",\"type\":\"health-metric\",\"params\":{\"fontColor\":\"white\",\"fontSize\":60,\"greenColor\":\"#FFCC00\",\"handleNoResults\":true,\"invertScale\":false,\"redColor\":\"#FFCC00\",\"redThreshold\":0,\"yellowColor\":\"#FFCC00\",\"yellowThreshold\":0},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Medium Residual Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"(risk_score:>=4 AND risk_score:<7)\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "93e7cda0-4489-11e7-b27d-bb1b79a0c6f6",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - HighResidualRiskCount",
- "visState": "{\"title\":\"Nessus - HighResidualRiskCount\",\"type\":\"health-metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"fontColor\":\"white\",\"invertScale\":false,\"redThreshold\":0,\"yellowThreshold\":0,\"redColor\":\"#ffa500\",\"yellowColor\":\"#ffa500\",\"greenColor\":\"#ffa500\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"High Residual Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"(risk_score:>=7 AND risk_score:<9)\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
- {
- "_id": "c85f9a90-4484-11e7-b936-eb7d06aad726",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - LowResidualRiskCount",
- "visState": "{\"title\":\"Nessus - LowResidualRiskCount\",\"type\":\"health-metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"fontColor\":\"white\",\"invertScale\":false,\"redThreshold\":0,\"yellowThreshold\":0,\"redColor\":\"#6dc066\",\"yellowColor\":\"#6dc066\",\"greenColor\":\"#6dc066\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Low Residual Risk\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"(risk_score:>0 AND risk_score:<4)\",\"analyze_wildcard\":true}},\"filter\":[]}"
- }
- }
- },
{
"_id": "2f979030-44b9-11e7-a818-f5f80dfc3590",
"_type": "visualization",
@@ -433,20 +293,6 @@
}
}
},
- {
- "_id": "5e00be00-44f6-11e7-bc13-dff41515cdab",
- "_type": "visualization",
- "_source": {
- "title": "Nessus - Risk Explorer",
- "visState": "{\"title\":\"Nessus - Risk Explorer\",\"type\":\"network\",\"params\":{\"canvasBackgroundColor\":\"#FFFFFF\",\"firstNodeColor\":\"#FD7BC4\",\"gravitationalConstant\":-35000,\"maxCutMetricSizeEdge\":5000,\"maxCutMetricSizeNode\":5000,\"maxEdgeSize\":5,\"maxNodeSize\":80,\"minCutMetricSizeNode\":0,\"minEdgeSize\":0.1,\"minNodeSize\":8,\"secondNodeColor\":\"#00d1ff\",\"shapeFirstNode\":\"dot\",\"shapeSecondNode\":\"box\",\"showColorLegend\":true,\"showLabels\":true,\"showPopup\":true,\"springConstant\":0.001},\"aggs\":[{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"first\",\"params\":{\"field\":\"host\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"_term\"}},{\"id\":\"5\",\"enabled\":true,\"type\":\"max\",\"schema\":\"size_node\",\"params\":{\"field\":\"risk_score\"}},{\"id\":\"6\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"second\",\"params\":{\"field\":\"cve\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"5\"}},{\"id\":\"7\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"colornode\",\"params\":{\"field\":\"plugin_name.raw\",\"size\":50,\"order\":\"desc\",\"orderBy\":\"_term\"}}],\"listeners\":{}}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[]}"
- }
- }
- },
{
"_id": "67d432e0-44ec-11e7-a05f-d9719b331a27",
"_type": "visualization",
@@ -531,6 +377,160 @@
}
}
},
+ {
+ "_id": "a6508640-897a-11e7-bbc0-33592ce0be1e",
+ "_type": "visualization",
+ "_source": {
+ "title": "Nessus - Critical Assets Aggregated",
+ "visState": "{\"title\":\"Nessus - Critical Assets Aggregated\",\"type\":\"heatmap\",\"params\":{\"addTooltip\":true,\"addLegend\":true,\"enableHover\":true,\"legendPosition\":\"right\",\"times\":[],\"colorsNumber\":4,\"colorSchema\":\"Green to Red\",\"setColorRange\":true,\"colorsRange\":[{\"from\":0,\"to\":3},{\"from\":3,\"to\":7},{\"from\":7,\"to\":9},{\"from\":9,\"to\":11}],\"invertColors\":false,\"percentageMode\":false,\"valueAxes\":[{\"show\":false,\"id\":\"ValueAxis-1\",\"type\":\"value\",\"scale\":{\"type\":\"linear\",\"defaultYExtents\":false},\"labels\":{\"show\":true,\"rotate\":0,\"color\":\"white\"}}]},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"risk_score\",\"customLabel\":\"Residual Risk Score\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"@timestamp\",\"interval\":\"auto\",\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"Date\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"host\",\"size\":10,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Critical Asset IP\"}},{\"id\":\"5\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"split\",\"params\":{\"field\":\"plugin_name.raw\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\",\"row\":true}}],\"listeners\":{}}",
+ "uiStateJSON": "{\"vis\":{\"colors\":{\"0 - 3\":\"#7EB26D\",\"3 - 7\":\"#EAB839\",\"7 - 9\":\"#EF843C\",\"8 - 10\":\"#BF1B00\",\"9 - 11\":\"#BF1B00\"},\"defaultColors\":{\"0 - 3\":\"rgb(0,104,55)\",\"3 - 7\":\"rgb(135,203,103)\",\"7 - 9\":\"rgb(255,255,190)\",\"9 - 11\":\"rgb(249,142,82)\"},\"legendOpen\":false}}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"Critical Asset\",\"disabled\":false,\"index\":\"logstash-nessus-*\",\"key\":\"tags\",\"negate\":false,\"type\":\"phrase\",\"value\":\"critical_asset\"},\"query\":{\"match\":{\"tags\":{\"query\":\"critical_asset\",\"type\":\"phrase\"}}}}]}"
+ }
+ }
+ },
+ {
+ "_id": "465c5820-8977-11e7-857e-e1d56b17746d",
+ "_type": "visualization",
+ "_source": {
+ "title": "Nessus - Critical Assets",
+ "visState": "{\"title\":\"Nessus - Critical Assets\",\"type\":\"heatmap\",\"params\":{\"addTooltip\":true,\"addLegend\":true,\"enableHover\":true,\"legendPosition\":\"right\",\"times\":[],\"colorsNumber\":4,\"colorSchema\":\"Green to Red\",\"setColorRange\":true,\"colorsRange\":[{\"from\":0,\"to\":3},{\"from\":3,\"to\":7},{\"from\":7,\"to\":9},{\"from\":9,\"to\":11}],\"invertColors\":false,\"percentageMode\":false,\"valueAxes\":[{\"show\":false,\"id\":\"ValueAxis-1\",\"type\":\"value\",\"scale\":{\"type\":\"linear\",\"defaultYExtents\":false},\"labels\":{\"show\":true,\"rotate\":0,\"color\":\"white\"}}]},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"risk_score\",\"customLabel\":\"Residual Risk Score\"}},{\"id\":\"2\",\"enabled\":false,\"type\":\"terms\",\"schema\":\"split\",\"params\":{\"field\":\"host\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\",\"row\":true}},{\"id\":\"3\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"@timestamp\",\"interval\":\"auto\",\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"Date\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"host\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Critical Asset IP\"}}],\"listeners\":{}}",
+ "uiStateJSON": "{\"vis\":{\"defaultColors\":{\"0 - 3\":\"rgb(0,104,55)\",\"3 - 7\":\"rgb(135,203,103)\",\"7 - 9\":\"rgb(255,255,190)\",\"9 - 11\":\"rgb(249,142,82)\"},\"colors\":{\"8 - 10\":\"#BF1B00\",\"9 - 11\":\"#BF1B00\",\"7 - 9\":\"#EF843C\",\"3 - 7\":\"#EAB839\",\"0 - 3\":\"#7EB26D\"},\"legendOpen\":false}}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[{\"meta\":{\"index\":\"logstash-nessus-*\",\"negate\":false,\"disabled\":false,\"alias\":\"Critical Asset\",\"type\":\"phrase\",\"key\":\"tags\",\"value\":\"critical_asset\"},\"query\":{\"match\":{\"tags\":{\"query\":\"critical_asset\",\"type\":\"phrase\"}}},\"$state\":{\"store\":\"appState\"}}]}"
+ }
+ }
+ },
+ {
+ "_id": "56f0f5f0-3ebe-11e7-a192-93f36fbd9d05",
+ "_type": "visualization",
+ "_source": {
+ "title": "Nessus-RiskOverTime",
+ "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{},\"schema\":\"metric\",\"type\":\"count\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"customInterval\":\"2h\",\"extended_bounds\":{},\"field\":\"@timestamp\",\"interval\":\"auto\",\"min_doc_count\":1},\"schema\":\"segment\",\"type\":\"date_histogram\"},{\"enabled\":true,\"id\":\"3\",\"params\":{\"field\":\"risk\",\"order\":\"desc\",\"orderBy\":\"1\",\"size\":5},\"schema\":\"group\",\"type\":\"terms\"}],\"listeners\":{},\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"show\":true,\"truncate\":100},\"position\":\"bottom\",\"scale\":{\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{},\"type\":\"category\"}],\"defaultYExtents\":false,\"drawLinesBetweenPoints\":true,\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"},\"valueAxis\":\"ValueAxis-1\"},\"interpolate\":\"linear\",\"legendPosition\":\"right\",\"orderBucketsBySum\":false,\"radiusRatio\":9,\"scale\":\"linear\",\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"Count\"},\"drawLinesBetweenPoints\":true,\"interpolate\":\"linear\",\"mode\":\"normal\",\"show\":\"true\",\"showCircles\":true,\"type\":\"line\",\"valueAxis\":\"ValueAxis-1\"}],\"setYExtents\":false,\"showCircles\":true,\"times\":[],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"left\",\"scale\":{\"mode\":\"normal\",\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"Count\"},\"type\":\"value\"}]},\"title\":\"Nessus-RiskOverTime\",\"type\":\"line\"}",
+ "uiStateJSON": "{\"vis\":{\"colors\":{\"Critical\":\"#E24D42\",\"High\":\"#E0752D\",\"Low\":\"#7EB26D\",\"Medium\":\"#F2C96D\"}}}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[]}"
+ }
+ }
+ },
+ {
+ "_id": "479deab0-8a39-11e7-a58a-9bfcb3761a3d",
+ "_type": "visualization",
+ "_source": {
+ "title": "Nessus - TL - TaggedAssetsPluginNames",
+ "visState": "{\"title\":\"Nessus - TL - TaggedAssetsPluginNames\",\"type\":\"timelion\",\"params\":{\"expression\":\".es(index='logstash-nessus-*', q='tags:critical_asset OR tags:hipaa_asset OR tags:pci_asset', split=\\\"plugin_name.raw:10\\\").bars(width=4).label(regex=\\\".*:(.+)>.*\\\",label=\\\"$1\\\")\",\"interval\":\"auto\"},\"aggs\":[],\"listeners\":{}}",
+ "uiStateJSON": "{}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
+ }
+ }
+ },
+ {
+ "_id": "84f5c370-8a38-11e7-a58a-9bfcb3761a3d",
+ "_type": "visualization",
+ "_source": {
+ "title": "Nessus - TL - CriticalAssetsPluginNames",
+ "visState": "{\"title\":\"Nessus - TL - CriticalAssetsPluginNames\",\"type\":\"timelion\",\"params\":{\"expression\":\".es(index='logstash-nessus-*', q='tags:critical_asset', split=\\\"plugin_name.raw:10\\\").bars(width=4).label(regex=\\\".*:(.+)>.*\\\",label=\\\"$1\\\")\",\"interval\":\"auto\"},\"aggs\":[],\"listeners\":{}}",
+ "uiStateJSON": "{}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
+ }
+ }
+ },
+ {
+ "_id": "307cdae0-8a38-11e7-a58a-9bfcb3761a3d",
+ "_type": "visualization",
+ "_source": {
+ "title": "Nessus - TL - PluginNames",
+ "visState": "{\"title\":\"Nessus - TL - PluginNames\",\"type\":\"timelion\",\"params\":{\"expression\":\".es(index='logstash-nessus-*', split=\\\"plugin_name.raw:25\\\").bars(width=4).label(regex=\\\".*:(.+)>.*\\\",label=\\\"$1\\\")\",\"interval\":\"auto\"},\"aggs\":[],\"listeners\":{}}",
+ "uiStateJSON": "{}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
+ }
+ }
+ },
+ {
+ "_id": "d048c220-80b3-11e7-8790-73b60225f736",
+ "_type": "visualization",
+ "_source": {
+ "title": "Nessus - Risk: High",
+ "visState": "{\"title\":\"Nessus - Risk: High\",\"type\":\"goal\",\"params\":{\"addTooltip\":true,\"addLegend\":true,\"type\":\"gauge\",\"gauge\":{\"verticalSplit\":false,\"autoExtend\":false,\"percentageMode\":false,\"gaugeType\":\"Metric\",\"gaugeStyle\":\"Full\",\"backStyle\":\"Full\",\"orientation\":\"vertical\",\"useRanges\":false,\"colorSchema\":\"Green to Red\",\"gaugeColorMode\":\"Background\",\"colorsRange\":[{\"from\":0,\"to\":1000}],\"invertColors\":false,\"labels\":{\"show\":false,\"color\":\"black\"},\"scale\":{\"show\":true,\"labels\":false,\"color\":\"#333\",\"width\":2},\"type\":\"simple\",\"style\":{\"bgFill\":\"white\",\"bgColor\":true,\"labelColor\":false,\"subText\":\"\",\"fontSize\":\"34\"},\"extendRange\":true}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"High Risk\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"filters\",\"schema\":\"group\",\"params\":{\"filters\":[{\"input\":{\"query\":{\"query_string\":{\"query\":\"risk:High\",\"analyze_wildcard\":true}}},\"label\":\"\"}]}}],\"listeners\":{}}",
+ "uiStateJSON": "{\"vis\":{\"defaultColors\":{\"0 - 1000\":\"rgb(0,104,55)\"},\"legendOpen\":true,\"colors\":{\"0 - 10000\":\"#EF843C\",\"0 - 1000\":\"#E0752D\"}}}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
+ }
+ }
+ },
+ {
+ "_id": "c1361da0-80b3-11e7-8790-73b60225f736",
+ "_type": "visualization",
+ "_source": {
+ "title": "Nessus - Risk: Medium",
+ "visState": "{\"title\":\"Nessus - Risk: Medium\",\"type\":\"goal\",\"params\":{\"addTooltip\":true,\"addLegend\":true,\"type\":\"gauge\",\"gauge\":{\"verticalSplit\":false,\"autoExtend\":false,\"percentageMode\":false,\"gaugeType\":\"Metric\",\"gaugeStyle\":\"Full\",\"backStyle\":\"Full\",\"orientation\":\"vertical\",\"useRanges\":false,\"colorSchema\":\"Green to Red\",\"gaugeColorMode\":\"Background\",\"colorsRange\":[{\"from\":0,\"to\":10000}],\"invertColors\":false,\"labels\":{\"show\":false,\"color\":\"black\"},\"scale\":{\"show\":true,\"labels\":false,\"color\":\"#333\",\"width\":2},\"type\":\"simple\",\"style\":{\"bgFill\":\"white\",\"bgColor\":true,\"labelColor\":false,\"subText\":\"\",\"fontSize\":\"34\"},\"extendRange\":false}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Medium Risk\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"filters\",\"schema\":\"group\",\"params\":{\"filters\":[{\"input\":{\"query\":{\"query_string\":{\"query\":\"risk:Medium\",\"analyze_wildcard\":true}}},\"label\":\"Medium Risk\"}]}}],\"listeners\":{}}",
+ "uiStateJSON": "{\"vis\":{\"defaultColors\":{\"0 - 10000\":\"rgb(0,104,55)\"},\"legendOpen\":true,\"colors\":{\"0 - 10000\":\"#EAB839\"}}}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
+ }
+ }
+ },
+ {
+ "_id": "e46ff7f0-897d-11e7-934b-67cec0a7da65",
+ "_type": "visualization",
+ "_source": {
+ "title": "Nessus - Risk: Low",
+ "visState": "{\"title\":\"Nessus - Risk: Low\",\"type\":\"goal\",\"params\":{\"addTooltip\":true,\"addLegend\":true,\"type\":\"gauge\",\"gauge\":{\"verticalSplit\":false,\"autoExtend\":false,\"percentageMode\":false,\"gaugeType\":\"Metric\",\"gaugeStyle\":\"Full\",\"backStyle\":\"Full\",\"orientation\":\"vertical\",\"useRanges\":false,\"colorSchema\":\"Green to Red\",\"gaugeColorMode\":\"Background\",\"colorsRange\":[{\"from\":0,\"to\":10000}],\"invertColors\":false,\"labels\":{\"show\":false,\"color\":\"black\"},\"scale\":{\"show\":true,\"labels\":false,\"color\":\"#333\",\"width\":2},\"type\":\"simple\",\"style\":{\"bgFill\":\"white\",\"bgColor\":true,\"labelColor\":false,\"subText\":\"\",\"fontSize\":\"34\"},\"extendRange\":false}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Low Risk\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"filters\",\"schema\":\"group\",\"params\":{\"filters\":[{\"input\":{\"query\":{\"query_string\":{\"query\":\"risk:Low\",\"analyze_wildcard\":true}}},\"label\":\"Low Risk\"}]}}],\"listeners\":{}}",
+ "uiStateJSON": "{\"vis\":{\"defaultColors\":{\"0 - 10000\":\"rgb(0,104,55)\"},\"legendOpen\":true,\"colors\":{\"0 - 10000\":\"#629E51\"}}}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"filter\":[]}"
+ }
+ }
+ },
+ {
+ "_id": "db55bce0-80b3-11e7-8790-73b60225f736",
+ "_type": "visualization",
+ "_source": {
+ "title": "Nessus - Risk: Critical",
+ "visState": "{\"title\":\"Nessus - Risk: Critical\",\"type\":\"goal\",\"params\":{\"addLegend\":true,\"addTooltip\":true,\"gauge\":{\"autoExtend\":false,\"backStyle\":\"Full\",\"colorSchema\":\"Green to Red\",\"colorsRange\":[{\"from\":0,\"to\":10000}],\"gaugeColorMode\":\"Background\",\"gaugeStyle\":\"Full\",\"gaugeType\":\"Metric\",\"invertColors\":false,\"labels\":{\"color\":\"black\",\"show\":false},\"orientation\":\"vertical\",\"percentageMode\":false,\"scale\":{\"color\":\"#333\",\"labels\":false,\"show\":true,\"width\":2},\"style\":{\"bgColor\":true,\"bgFill\":\"white\",\"fontSize\":\"34\",\"labelColor\":false,\"subText\":\"Risk\"},\"type\":\"simple\",\"useRanges\":false,\"verticalSplit\":false},\"type\":\"gauge\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Critical Risk\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"filters\",\"schema\":\"group\",\"params\":{\"filters\":[{\"input\":{\"query\":{\"query_string\":{\"query\":\"risk:Critical\",\"analyze_wildcard\":true}}},\"label\":\"Critical\"}]}}],\"listeners\":{}}",
+ "uiStateJSON": "{\"vis\":{\"colors\":{\"0 - 10000\":\"#BF1B00\"},\"defaultColors\":{\"0 - 10000\":\"rgb(0,104,55)\"},\"legendOpen\":false}}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[]}"
+ }
+ }
+ },
+ {
+ "_id": "b2f2adb0-897f-11e7-a2d2-c57bca21b3aa",
+ "_type": "visualization",
+ "_source": {
+ "title": "Nessus - Risk: Total",
+ "visState": "{\"title\":\"Nessus - Risk: Total\",\"type\":\"goal\",\"params\":{\"addLegend\":true,\"addTooltip\":true,\"gauge\":{\"autoExtend\":false,\"backStyle\":\"Full\",\"colorSchema\":\"Green to Red\",\"colorsRange\":[{\"from\":0,\"to\":10000}],\"gaugeColorMode\":\"Background\",\"gaugeStyle\":\"Full\",\"gaugeType\":\"Metric\",\"invertColors\":false,\"labels\":{\"color\":\"black\",\"show\":false},\"orientation\":\"vertical\",\"percentageMode\":false,\"scale\":{\"color\":\"#333\",\"labels\":false,\"show\":true,\"width\":2},\"style\":{\"bgColor\":true,\"bgFill\":\"white\",\"fontSize\":\"34\",\"labelColor\":false,\"subText\":\"Risk\"},\"type\":\"simple\",\"useRanges\":false,\"verticalSplit\":false},\"type\":\"gauge\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Total\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"filters\",\"schema\":\"group\",\"params\":{\"filters\":[{\"input\":{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}}},\"label\":\"Critical\"}]}}],\"listeners\":{}}",
+ "uiStateJSON": "{\"vis\":{\"colors\":{\"0 - 10000\":\"#64B0C8\"},\"defaultColors\":{\"0 - 10000\":\"rgb(0,104,55)\"},\"legendOpen\":false}}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"index\":\"logstash-nessus-*\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}},\"filter\":[]}"
+ }
+ }
+ },
{
"_id": "5093c620-44e9-11e7-8014-ede06a7e69f8",
"_type": "visualization",
diff --git a/kibana/vuln_whisp_kibana/vuln_whisperer_kibana_dashboard.json b/kibana/vuln_whisp_kibana/vuln_whisperer_kibana_dashboard.json
new file mode 100755
index 0000000..bf9bb80
--- /dev/null
+++ b/kibana/vuln_whisp_kibana/vuln_whisperer_kibana_dashboard.json
@@ -0,0 +1,50 @@
+[
+ {
+ "_id": "5dba30c0-3df3-11e7-a44e-c79ca8efb780",
+ "_type": "dashboard",
+ "_source": {
+ "title": "Nessus - Risk Mitigation",
+ "hits": 0,
+ "description": "",
+ "panelsJSON": "[{\"col\":11,\"id\":\"995e2280-3df3-11e7-a44e-c79ca8efb780\",\"panelIndex\":20,\"row\":7,\"size_x\":2,\"size_y\":6,\"type\":\"visualization\"},{\"col\":1,\"id\":\"852816e0-3eb1-11e7-90cb-918f9cb01e3d\",\"panelIndex\":21,\"row\":8,\"size_x\":3,\"size_y\":5,\"type\":\"visualization\"},{\"col\":4,\"id\":\"297df800-3f7e-11e7-bd24-6903e3283192\",\"panelIndex\":27,\"row\":8,\"size_x\":3,\"size_y\":5,\"type\":\"visualization\"},{\"col\":9,\"id\":\"35b6d320-3f7f-11e7-bd24-6903e3283192\",\"panelIndex\":28,\"row\":7,\"size_x\":2,\"size_y\":6,\"type\":\"visualization\"},{\"col\":1,\"id\":\"471a3580-3f6b-11e7-88e7-df1abe6547fb\",\"panelIndex\":30,\"row\":4,\"size_x\":3,\"size_y\":2,\"type\":\"visualization\"},{\"col\":7,\"id\":\"de1a5f40-3f85-11e7-97f9-3777d794626d\",\"panelIndex\":31,\"row\":8,\"size_x\":2,\"size_y\":5,\"type\":\"visualization\"},{\"col\":9,\"id\":\"5093c620-44e9-11e7-8014-ede06a7e69f8\",\"panelIndex\":37,\"row\":4,\"size_x\":4,\"size_y\":3,\"type\":\"visualization\"},{\"col\":1,\"columns\":[\"host\",\"risk\",\"risk_score\",\"cve\",\"plugin_name\",\"solution\",\"plugin_output\"],\"id\":\"54648700-3f74-11e7-852e-69207a3d0726\",\"panelIndex\":38,\"row\":13,\"size_x\":12,\"size_y\":6,\"sort\":[\"@timestamp\",\"desc\"],\"type\":\"search\"},{\"col\":1,\"id\":\"fb6eb020-49ab-11e7-8f8c-57ad64ec48a6\",\"panelIndex\":39,\"row\":6,\"size_x\":3,\"size_y\":2,\"type\":\"visualization\"},{\"col\":4,\"id\":\"465c5820-8977-11e7-857e-e1d56b17746d\",\"panelIndex\":40,\"row\":4,\"size_x\":5,\"size_y\":4,\"type\":\"visualization\"},{\"col\":7,\"id\":\"db55bce0-80b3-11e7-8790-73b60225f736\",\"panelIndex\":41,\"row\":1,\"size_x\":2,\"size_y\":3,\"type\":\"visualization\"},{\"col\":1,\"id\":\"e46ff7f0-897d-11e7-934b-67cec0a7da65\",\"panelIndex\":42,\"row\":1,\"size_x\":2,\"size_y\":3,\"type\":\"visualization\"},{\"col\":5,\"id\":\"d048c220-80b3-11e7-8790-73b60225f736\",\"panelIndex\":43,\"row\":1,\"size_x\":2,\"size_y\":3,\"type\":\"visualization\"},{\"col\":3,\"id\":\"c1361da0-80b3-11e7-8790-73b60225f736\",\"panelIndex\":44,\"row\":1,\"size_x\":2,\"size_y\":3,\"type\":\"visualization\"},{\"col\":9,\"id\":\"b2f2adb0-897f-11e7-a2d2-c57bca21b3aa\",\"panelIndex\":45,\"row\":1,\"size_x\":2,\"size_y\":3,\"type\":\"visualization\"},{\"size_x\":2,\"size_y\":3,\"panelIndex\":46,\"type\":\"visualization\",\"id\":\"56f0f5f0-3ebe-11e7-a192-93f36fbd9d05\",\"col\":11,\"row\":1}]",
+ "optionsJSON": "{\"darkTheme\":false}",
+ "uiStateJSON": "{\"P-11\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-2\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-20\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-21\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"desc\"}}}},\"P-27\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-28\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"desc\"}}}},\"P-3\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"asc\"}}}},\"P-30\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-31\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-40\":{\"vis\":{\"defaultColors\":{\"0 - 3\":\"rgb(0,104,55)\",\"3 - 7\":\"rgb(135,203,103)\",\"7 - 9\":\"rgb(255,255,190)\",\"9 - 11\":\"rgb(249,142,82)\"}}},\"P-41\":{\"vis\":{\"defaultColors\":{\"0 - 10000\":\"rgb(0,104,55)\"}}},\"P-42\":{\"vis\":{\"defaultColors\":{\"0 - 10000\":\"rgb(0,104,55)\"},\"legendOpen\":false}},\"P-43\":{\"vis\":{\"defaultColors\":{\"0 - 1000\":\"rgb(0,104,55)\"},\"legendOpen\":false}},\"P-44\":{\"vis\":{\"defaultColors\":{\"0 - 10000\":\"rgb(0,104,55)\"},\"legendOpen\":false}},\"P-5\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-6\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-8\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-45\":{\"vis\":{\"defaultColors\":{\"0 - 10000\":\"rgb(0,104,55)\"}}},\"P-46\":{\"vis\":{\"legendOpen\":false}}}",
+ "version": 1,
+ "timeRestore": true,
+ "timeTo": "now",
+ "timeFrom": "now-30d",
+ "refreshInterval": {
+ "display": "Off",
+ "pause": false,
+ "value": 0
+ },
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[{\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}}}],\"highlightAll\":true,\"version\":true}"
+ }
+ }
+ },
+ {
+ "_id": "72051530-448e-11e7-a818-f5f80dfc3590",
+ "_type": "dashboard",
+ "_source": {
+ "title": "Nessus - Reporting",
+ "hits": 0,
+ "description": "",
+ "panelsJSON": "[{\"col\":1,\"id\":\"2f979030-44b9-11e7-a818-f5f80dfc3590\",\"panelIndex\":5,\"row\":12,\"size_x\":6,\"size_y\":4,\"type\":\"visualization\"},{\"col\":1,\"id\":\"8d9592d0-44ec-11e7-a05f-d9719b331a27\",\"panelIndex\":12,\"row\":8,\"size_x\":6,\"size_y\":4,\"type\":\"visualization\"},{\"col\":7,\"id\":\"67d432e0-44ec-11e7-a05f-d9719b331a27\",\"panelIndex\":14,\"row\":4,\"size_x\":6,\"size_y\":4,\"type\":\"visualization\"},{\"col\":10,\"id\":\"297df800-3f7e-11e7-bd24-6903e3283192\",\"panelIndex\":15,\"row\":8,\"size_x\":3,\"size_y\":4,\"type\":\"visualization\"},{\"col\":7,\"id\":\"471a3580-3f6b-11e7-88e7-df1abe6547fb\",\"panelIndex\":20,\"row\":8,\"size_x\":3,\"size_y\":2,\"type\":\"visualization\"},{\"col\":11,\"id\":\"995e2280-3df3-11e7-a44e-c79ca8efb780\",\"panelIndex\":22,\"row\":1,\"size_x\":2,\"size_y\":3,\"type\":\"visualization\"},{\"col\":9,\"id\":\"b2f2adb0-897f-11e7-a2d2-c57bca21b3aa\",\"panelIndex\":23,\"row\":1,\"size_x\":2,\"size_y\":3,\"type\":\"visualization\"},{\"col\":7,\"id\":\"db55bce0-80b3-11e7-8790-73b60225f736\",\"panelIndex\":25,\"row\":1,\"size_x\":2,\"size_y\":3,\"type\":\"visualization\"},{\"col\":5,\"id\":\"d048c220-80b3-11e7-8790-73b60225f736\",\"panelIndex\":26,\"row\":1,\"size_x\":2,\"size_y\":3,\"type\":\"visualization\"},{\"col\":1,\"id\":\"e46ff7f0-897d-11e7-934b-67cec0a7da65\",\"panelIndex\":27,\"row\":1,\"size_x\":2,\"size_y\":3,\"type\":\"visualization\"},{\"col\":3,\"id\":\"c1361da0-80b3-11e7-8790-73b60225f736\",\"panelIndex\":28,\"row\":1,\"size_x\":2,\"size_y\":3,\"type\":\"visualization\"},{\"size_x\":6,\"size_y\":4,\"panelIndex\":29,\"type\":\"visualization\",\"id\":\"479deab0-8a39-11e7-a58a-9bfcb3761a3d\",\"col\":1,\"row\":4}]",
+ "optionsJSON": "{\"darkTheme\":false}",
+ "uiStateJSON": "{\"P-15\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-20\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-21\":{\"vis\":{\"defaultColors\":{\"0 - 100\":\"rgb(0,104,55)\"}}},\"P-22\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}},\"P-23\":{\"vis\":{\"defaultColors\":{\"0 - 10000\":\"rgb(0,104,55)\"}}},\"P-24\":{\"vis\":{\"defaultColors\":{\"0 - 10000\":\"rgb(0,104,55)\"}}},\"P-25\":{\"vis\":{\"defaultColors\":{\"0 - 10000\":\"rgb(0,104,55)\"}}},\"P-26\":{\"vis\":{\"defaultColors\":{\"0 - 1000\":\"rgb(0,104,55)\"},\"legendOpen\":false}},\"P-27\":{\"vis\":{\"defaultColors\":{\"0 - 10000\":\"rgb(0,104,55)\"},\"legendOpen\":false}},\"P-28\":{\"vis\":{\"defaultColors\":{\"0 - 10000\":\"rgb(0,104,55)\"},\"legendOpen\":false}},\"P-5\":{\"vis\":{\"legendOpen\":false}}}",
+ "version": 1,
+ "timeRestore": true,
+ "timeTo": "now",
+ "timeFrom": "now-30d",
+ "refreshInterval": {
+ "display": "Off",
+ "pause": false,
+ "value": 0
+ },
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[{\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"*\"}}}],\"highlightAll\":true,\"version\":true}"
+ }
+ }
+ }
+]
\ No newline at end of file
diff --git a/logstash/1000_nessus_preprocess_nessus.conf b/logstash/1000_nessus_preprocess_nessus.conf
index e0ab447..0f65742 100755
--- a/logstash/1000_nessus_preprocess_nessus.conf
+++ b/logstash/1000_nessus_preprocess_nessus.conf
@@ -3,6 +3,7 @@
# Last Update: 05/22/2017
# Version 0.2
# Description: Take in nessus reports from vulnWhisperer and pumps into logstash
+#Replace "filebeathost" with the name of your computer
input {
beats {
diff --git a/logstash/1000_nessus_process_file.conf b/logstash/1000_nessus_process_file.conf
index 3ad627a..9e0a107 100644
--- a/logstash/1000_nessus_process_file.conf
+++ b/logstash/1000_nessus_process_file.conf
@@ -1,12 +1,12 @@
# Author: Austin Taylor and Justin Henderson
# Email: email@austintaylor.io
-# Last Update: 08/04/2017
-# Version 0.2
+# Last Update: 12/20/2017
+# Version 0.3
# Description: Take in nessus reports from vulnWhisperer and pumps into logstash
input {
file {
- path => "/opt/vulnwhisp/scans/My Scans/*"
+ path => "/opt/vulnwhisp/scans/**/*"
start_position => "beginning"
tags => "nessus"
type => "nessus"
@@ -85,43 +85,46 @@ filter {
# Compensating controls - adjust risk_score
# Adobe and Java are not allowed to run in browser unless whitelisted
# Therefore, lower score by dividing by 3 (score is subjective to risk)
- if [risk_score] != 0 {
- if [plugin_name] =~ "Adobe" and [risk_score] > 6 or [plugin_name] =~ "Java" and [risk_score] > 6 {
- ruby {
- code => "event.set('risk_score', event.get('risk_score') / 3)"
- }
- mutate {
- add_field => { "compensating_control" => "Adobe and Flash removed from browsers unless whitelisted site." }
- }
- }
- }
+
+ #Modify and uncomment when ready to use
+ #if [risk_score] != 0 {
+ # if [plugin_name] =~ "Adobe" and [risk_score] > 6 or [plugin_name] =~ "Java" and [risk_score] > 6 {
+ # ruby {
+ # code => "event.set('risk_score', event.get('risk_score') / 3)"
+ # }
+ # mutate {
+ # add_field => { "compensating_control" => "Adobe and Flash removed from browsers unless whitelisted site." }
+ # }
+ # }
+ #}
# Add tags for reporting based on assets or criticality
- if [host] == "192.168.0.1" or [host] == "192.168.0.50" or [host] =~ "^192\.168\.10\." or [host] =~ "^42.42.42." {
- mutate {
- add_tag => [ "critical_asset" ]
- }
- }
- if [host] =~ "^192\.168\.[45][0-9][0-9]\.1$" or [host] =~ "^192.168\.[50]\.[0-9]{1,2}\.1$"{
- mutate {
- add_tag => [ "has_hipaa_data" ]
- }
- }
- if [host] =~ "^192\.168\.[45][0-9][0-9]\." {
- mutate {
- add_tag => [ "hipaa_asset" ]
- }
- }
- if [host] =~ "^192\.168\.5\." {
- mutate {
- add_tag => [ "pci_asset" ]
- }
- }
- if [host] =~ "^10\.0\.50\." {
- mutate {
- add_tag => [ "web_servers" ]
- }
- }
+
+ #if [host] == "192.168.0.1" or [host] == "192.168.0.50" or [host] =~ "^192\.168\.10\." or [host] =~ "^42.42.42." {
+ # mutate {
+ # add_tag => [ "critical_asset" ]
+ # }
+ #}
+ #if [host] =~ "^192\.168\.[45][0-9][0-9]\.1$" or [host] =~ "^192.168\.[50]\.[0-9]{1,2}\.1$"{
+ # mutate {
+ # add_tag => [ "has_hipaa_data" ]
+ # }
+ #}
+ #if [host] =~ "^192\.168\.[45][0-9][0-9]\." {
+ # mutate {
+ # add_tag => [ "hipaa_asset" ]
+ # }
+ #}
+ #if [host] =~ "^192\.168\.5\." {
+ # mutate {
+ # add_tag => [ "pci_asset" ]
+ # }
+ #}
+ #if [host] =~ "^10\.0\.50\." {
+ # mutate {
+ # add_tag => [ "web_servers" ]
+ # }
+ #}
}
}
diff --git a/requirements.txt b/requirements.txt
index ffb6a9d..1023ba2 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,3 +2,4 @@ pandas==0.20.3
setuptools==0.9.8
pytz==2017.2
Requests==2.18.3
+qualysapi==4.1.0
\ No newline at end of file
diff --git a/vulnwhisp/frameworks/qualys.py b/vulnwhisp/frameworks/qualys.py
new file mode 100644
index 0000000..7fde359
--- /dev/null
+++ b/vulnwhisp/frameworks/qualys.py
@@ -0,0 +1,477 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+__author__ = 'Austin Taylor'
+
+from lxml import objectify
+from lxml.builder import E
+import xml.etree.ElementTree as ET
+import pandas as pd
+import qualysapi.config as qcconf
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+
+import sys
+import os
+import csv
+import dateutil.parser as dp
+
+class qualysWhisper(object):
+ COUNT = '/count/was/webapp'
+ DELETE_REPORT = '/delete/was/report/{report_id}'
+ GET_WEBAPP_DETAILS = '/get/was/webapp/{was_id}'
+ QPS_REST_3 = '/qps/rest/3.0'
+
+ REPORT_DETAILS = '/get/was/report/{report_id}'
+ REPORT_STATUS = '/status/was/report/{report_id}'
+ REPORT_CREATE = '/create/was/report'
+ REPORT_DOWNLOAD = '/download/was/report/{report_id}'
+ SEARCH_REPORTS = '/search/was/report'
+ SEARCH_WEB_APPS = '/search/was/webapp'
+ SEARCH_WAS_SCAN = '/search/was/wasscan'
+ VERSION = '/qps/rest/portal/version'
+
+ def __init__(self, config=None):
+ self.config = config
+ try:
+ self.qgc = qualysapi.connect(config)
+ print('[SUCCESS] - Connected to Qualys at %s' \
+ % self.qgc.server)
+ except Exception as e:
+ print('[ERROR] Could not connect to Qualys - %s' % e)
+ self.headers = {'content-type': 'text/xml'}
+ self.config_parse = qcconf.QualysConnectConfig(config)
+ try:
+ self.template_id = self.config_parse.get_template_id()
+ except:
+ print 'ERROR - Could not retrieve template ID'
+
+ def request(
+ self,
+ path,
+ method='get',
+ data=None,
+ ):
+ methods = {'get': requests.get, 'post': requests.post}
+ base = 'https://' + self.qgc.server + path
+ req = methods[method](base, auth=self.qgc.auth, data=data,
+ headers=self.headers).content
+ return req
+
+ def get_version(self):
+ return self.request(self.VERSION)
+
+ def get_scan_count(self, scan_name):
+ parameters = E.ServiceRequest(E.filters(E.Criteria(scan_name,
+ field='name', operator='CONTAINS')))
+ xml_output = self.qgc.request(self.COUNT, parameters)
+ root = objectify.fromstring(xml_output)
+ return root.count.text
+
+ def get_reports(self):
+ return self.qgc.request(self.SEARCH_REPORTS)
+
+ def xml_parser(self, xml, dupfield=None):
+ all_records = []
+ root = ET.XML(xml)
+ for (i, child) in enumerate(root):
+ for subchild in child:
+ record = {}
+ for p in subchild:
+ record[p.tag] = p.text
+ for o in p:
+ if o.tag == 'id':
+ record[dupfield] = o.text
+ else:
+ record[o.tag] = o.text
+ all_records.append(record)
+ return pd.DataFrame(all_records)
+
+ def get_report_list(self):
+ """Returns a dataframe of reports"""
+
+ return self.xml_parser(self.get_reports(), dupfield='user_id')
+
+ def get_web_apps(self):
+ """Returns webapps available for account"""
+
+ return self.qgc.request(self.SEARCH_WEB_APPS)
+
+ def get_web_app_list(self):
+ """Returns dataframe of webapps"""
+
+ return self.xml_parser(self.get_web_apps(), dupfield='user_id')
+
+ def get_web_app_details(self, was_id):
+ """Get webapp details - use to retrieve app ID tag"""
+
+ return self.qgc.request(self.GET_WEBAPP_DETAILS.format(was_id=was_id))
+
+ def get_scans_by_app_id(self, app_id):
+ data = self.generate_app_id_scan_XML(app_id)
+ return self.qgc.request(self.SEARCH_WAS_SCAN, data)
+
+ def get_report_details(self, report_id):
+ return self.qgc.request(self.REPORT_DETAILS.format(report_id=report_id))
+
+ def get_report_status(self, report_id):
+ return self.qgc.request(self.REPORT_STATUS.format(report_id=report_id))
+
+ def download_report(self, report_id):
+ return self.qgc.request(self.REPORT_DOWNLOAD.format(report_id=report_id))
+
+ def generate_webapp_report_XML(self, app_id):
+ """Generates a CSV report for an asset based on template defined in .ini file"""
+
+ report_xml = \
+ E.ServiceRequest(E.data(E.Report(E.name('![CDATA[API Web Application Report generated by VulnWhisperer]]>'
+ ),
+ E.description(''
+ ), E.format('CSV'),
+ E.template(E.id(self.template_id)),
+ E.config(E.webAppReport(E.target(E.webapps(E.WebApp(E.id(app_id)))))))))
+
+ return report_xml
+
+ def generate_app_id_scan_XML(self, app_id):
+ report_xml = \
+ E.ServiceRequest(E.filters(E.Criteria({'field': 'webApp.id'
+ , 'operator': 'EQUALS'}, app_id)))
+
+ return report_xml
+
+ def create_report(self, report_id):
+ data = self.generate_webapp_report_XML(report_id)
+ return self.qgc.request(self.REPORT_CREATE.format(report_id=report_id),
+ data)
+
+ def delete_report(self, report_id):
+ return self.qgc.request(self.DELETE_REPORT.format(report_id=report_id))
+
+
+class qualysWebAppReport:
+ CATEGORIES = ['VULNERABILITY', 'SENSITIVE CONTENT',
+ 'INFORMATION GATHERED']
+
+ # URL Vulnerability Information
+
+ WEB_APP_VULN_BLOCK = [
+ 'Web Application Name',
+ CATEGORIES[0],
+ 'ID',
+ 'QID',
+ 'Url',
+ 'Param',
+ 'Function',
+ 'Form Entry Point',
+ 'Access Path',
+ 'Authentication',
+ 'Ajax Request',
+ 'Ajax Request ID',
+ 'Status',
+ 'Ignored',
+ 'Ignore Reason',
+ 'Ignore Date',
+ 'Ignore User',
+ 'Ignore Comments',
+ 'First Time Detected',
+ 'Last Time Detected',
+ 'Last Time Tested',
+ 'Times Detected',
+ 'Payload #1',
+ 'Request Method #1',
+ 'Request URL #1',
+ 'Request Headers #1',
+ 'Response #1',
+ 'Evidence #1',
+ ]
+
+ WEB_APP_VULN_HEADER = list(WEB_APP_VULN_BLOCK)
+ WEB_APP_VULN_HEADER[WEB_APP_VULN_BLOCK.index(CATEGORIES[0])] = \
+ 'Vulnerability Category'
+
+ WEB_APP_SENSITIVE_HEADER = list(WEB_APP_VULN_HEADER)
+ WEB_APP_SENSITIVE_HEADER.insert(WEB_APP_SENSITIVE_HEADER.index('Url'
+ ), 'Content')
+
+ WEB_APP_SENSITIVE_BLOCK = list(WEB_APP_SENSITIVE_HEADER)
+ WEB_APP_SENSITIVE_BLOCK[WEB_APP_SENSITIVE_BLOCK.index('Vulnerability Category'
+ )] = CATEGORIES[1]
+
+
+ WEB_APP_INFO_HEADER = [
+ 'Web Application Name',
+ 'Vulnerability Category',
+ 'ID',
+ 'QID',
+ 'Response #1',
+ 'Last Time Detected',
+ ]
+ WEB_APP_INFO_BLOCK = [
+ 'Web Application Name',
+ CATEGORIES[2],
+ 'ID',
+ 'QID',
+ 'Results',
+ 'Detection Date',
+ ]
+
+ QID_HEADER = [
+ 'QID',
+ 'Id',
+ 'Title',
+ 'Category',
+ 'Severity Level',
+ 'Groups',
+ 'OWASP',
+ 'WASC',
+ 'CWE',
+ 'CVSS Base',
+ 'CVSS Temporal',
+ 'Description',
+ 'Impact',
+ 'Solution',
+ ]
+ GROUP_HEADER = ['GROUP', 'Name', 'Category']
+ OWASP_HEADER = ['OWASP', 'Code', 'Name']
+ WASC_HEADER = ['WASC', 'Code', 'Name']
+ CATEGORY_HEADER = ['Category', 'Severity', 'Level', 'Description']
+
+ def __init__(
+ self,
+ config=None,
+ file_in=None,
+ file_stream=False,
+ delimiter=',',
+ quotechar='"',
+ ):
+ self.file_in = file_in
+ self.file_stream = file_stream
+ self.report = None
+ if config:
+ try:
+ self.qw = qualysWhisper(config=config)
+ except Exception as e:
+ print('Could not load config! Please check settings for %s' \
+ % e)
+
+ if file_stream:
+ self.open_file = file_in.splitlines()
+ elif file_in:
+
+ self.open_file = open(file_in, 'rb')
+
+ self.downloaded_file = None
+
+ def get_hostname(self, report):
+ host = ''
+ with open(report, 'rb') as csvfile:
+ q_report = csv.reader(csvfile, delimiter=',', quotechar='"')
+ for x in q_report:
+
+ if 'Web Application Name' in x[0]:
+ host = q_report.next()[0]
+ return host
+
+ def grab_section(
+ self,
+ report,
+ section,
+ end=[],
+ pop_last=False,
+ ):
+ temp_list = []
+ max_col_count = 0
+ with open(report, 'rb') as csvfile:
+ q_report = csv.reader(csvfile, delimiter=',', quotechar='"')
+ for line in q_report:
+ if set(line) == set(section):
+ break
+
+ # Reads text until the end of the block:
+ for line in q_report: # This keeps reading the file
+ temp_list.append(line)
+
+ if line in end:
+ break
+ if pop_last and len(temp_list) > 1:
+ temp_list.pop(-1)
+ return temp_list
+
+ def iso_to_epoch(self, dt):
+ return dp.parse(dt).strftime('%s')
+
+ def cleanser(self, _data):
+ repls = (('\n', '|||'), ('\r', '|||'), (',', ';'), ('\t', '|||'
+ ))
+ if _data:
+ _data = reduce(lambda a, kv: a.replace(*kv), repls, _data)
+ return _data
+
+ def grab_sections(self, report):
+ all_dataframes = []
+ category_list = []
+ with open(report, 'rb') as csvfile:
+ q_report = csv.reader(csvfile, delimiter=',', quotechar='"')
+ all_dataframes.append(pd.DataFrame(self.grab_section(report,
+ self.WEB_APP_VULN_BLOCK,
+ end=[self.WEB_APP_SENSITIVE_BLOCK,
+ self.WEB_APP_INFO_BLOCK],
+ pop_last=True),
+ columns=self.WEB_APP_VULN_HEADER))
+ all_dataframes.append(pd.DataFrame(self.grab_section(report,
+ self.WEB_APP_SENSITIVE_BLOCK,
+ end=[self.WEB_APP_INFO_BLOCK,
+ self.WEB_APP_SENSITIVE_BLOCK],
+ pop_last=True),
+ columns=self.WEB_APP_SENSITIVE_HEADER))
+ all_dataframes.append(pd.DataFrame(self.grab_section(report,
+ self.WEB_APP_INFO_BLOCK,
+ end=[self.QID_HEADER],
+ pop_last=True),
+ columns=self.WEB_APP_INFO_HEADER))
+ all_dataframes.append(pd.DataFrame(self.grab_section(report,
+ self.QID_HEADER,
+ end=[self.GROUP_HEADER],
+ pop_last=True),
+ columns=self.QID_HEADER))
+ all_dataframes.append(pd.DataFrame(self.grab_section(report,
+ self.GROUP_HEADER,
+ end=[self.OWASP_HEADER],
+ pop_last=True),
+ columns=self.GROUP_HEADER))
+ all_dataframes.append(pd.DataFrame(self.grab_section(report,
+ self.OWASP_HEADER,
+ end=[self.WASC_HEADER],
+ pop_last=True),
+ columns=self.OWASP_HEADER))
+ all_dataframes.append(pd.DataFrame(self.grab_section(report,
+ self.WASC_HEADER, end=[['APPENDIX']],
+ pop_last=True),
+ columns=self.WASC_HEADER))
+ all_dataframes.append(pd.DataFrame(self.grab_section(report,
+ self.CATEGORY_HEADER, end=''),
+ columns=self.CATEGORY_HEADER))
+
+ return all_dataframes
+
+ def data_normalizer(self, dataframes):
+ """
+ Merge and clean data
+ :param dataframes:
+ :return:
+ """
+
+ merged_df = pd.concat([dataframes[0], dataframes[1],
+ dataframes[2]], axis=0,
+ ignore_index=False).fillna('N/A')
+ merged_df = pd.merge(merged_df, dataframes[3], left_on='QID',
+ right_on='Id')
+
+ if 'Content' not in merged_df:
+ merged_df['Content'] = ''
+
+ merged_df['Payload #1'] = merged_df['Payload #1'
+ ].apply(self.cleanser)
+ merged_df['Request Method #1'] = merged_df['Request Method #1'
+ ].apply(self.cleanser)
+ merged_df['Request URL #1'] = merged_df['Request URL #1'
+ ].apply(self.cleanser)
+ merged_df['Request Headers #1'] = merged_df['Request Headers #1'
+ ].apply(self.cleanser)
+ merged_df['Response #1'] = merged_df['Response #1'
+ ].apply(self.cleanser)
+ merged_df['Evidence #1'] = merged_df['Evidence #1'
+ ].apply(self.cleanser)
+
+ merged_df['Description'] = merged_df['Description'
+ ].apply(self.cleanser)
+ merged_df['Impact'] = merged_df['Impact'].apply(self.cleanser)
+ merged_df['Solution'] = merged_df['Solution'
+ ].apply(self.cleanser)
+ merged_df['Url'] = merged_df['Url'].apply(self.cleanser)
+ merged_df['Content'] = merged_df['Content'].apply(self.cleanser)
+ merged_df = merged_df.drop(['QID_y', 'QID_x'], axis=1)
+
+ merged_df = merged_df.rename(columns={'Id': 'QID'})
+
+ try:
+ merged_df = \
+ merged_df[~merged_df.Title.str.contains('Links Crawled|External Links Discovered'
+ )]
+ except Exception as e:
+ print(e)
+ return merged_df
+
+ def download_file(self, file_id):
+ report = self.qw.download_report(file_id)
+ filename = str(file_id) + '.csv'
+ file_out = open(filename, 'w')
+ for line in report.splitlines():
+ file_out.write(line + '\n')
+ file_out.close()
+ print('[ACTION] - File written to %s' % filename)
+ return filename
+
+ def remove_file(self, filename):
+ os.remove(filename)
+
+ def process_data(self, file_id, cleanup=True):
+ """Downloads a file from qualys and normalizes it"""
+
+ download_file = self.download_file(file_id)
+ print('[ACTION] - Downloading file ID: %s' % file_id)
+ report_data = self.grab_sections(download_file)
+ merged_data = self.data_normalizer(report_data)
+
+ # TODO cleanup old data (delete)
+
+ return merged_data
+
+ def whisper_webapp(self, report_id, updated_date):
+ """
+ report_id: App ID
+ updated_date: Last time scan was ran for app_id
+ """
+
+ try:
+ vuln_ready = None
+ if 'Z' in updated_date:
+ updated_date = self.iso_to_epoch(updated_date)
+ report_name = 'qualys_web_' + str(report_id) \
+ + '_{last_updated}'.format(last_updated=updated_date) \
+ + '.csv'
+ if os.path.isfile(report_name):
+ print('[ACTION] - File already exist! Skipping...')
+ pass
+ else:
+ print('[ACTION] - Generating report for %s' % report_id)
+ status = self.qw.create_report(report_id)
+ root = objectify.fromstring(status)
+ if root.responseCode == 'SUCCESS':
+ print('[INFO] - Successfully generated report for webapp: %s' \
+ % report_id)
+ generated_report_id = root.data.Report.id
+ print ('[INFO] - New Report ID: %s' \
+ % generated_report_id)
+ vuln_ready = self.process_data(generated_report_id)
+
+ vuln_ready.to_csv(report_name, index=False) # add when timestamp occured
+ print('[SUCCESS] - Report written to %s' \
+ % report_name)
+ print('[ACTION] - Removing report %s' \
+ % generated_report_id)
+ cleaning_up = \
+ self.qw.delete_report(generated_report_id)
+ os.remove(str(generated_report_id) + '.csv')
+ print('[ACTION] - Deleted report: %s' \
+ % generated_report_id)
+ else:
+ print('Could not process report ID: %s' % status)
+ except Exception as e:
+ print('[ERROR] - Could not process %s - %s' % (report_id, e))
+ return vuln_ready
+
+
+
diff --git a/vulnwhisp/vulnwhisp.py b/vulnwhisp/vulnwhisp.py
index 6648928..accd153 100755
--- a/vulnwhisp/vulnwhisp.py
+++ b/vulnwhisp/vulnwhisp.py
@@ -16,13 +16,14 @@ import logging
class vulnWhisperer(object):
- def __init__(self, config=None, db_name='report_tracker.db', purge=False, verbose=None, debug=False):
+ def __init__(self, config=None, db_name='report_tracker.db', purge=False, verbose=None, debug=False, username=None, password=None):
self.verbose = verbose
self.nessus_connect = False
self.develop = True
self.purge = purge
+
if config is not None:
try:
self.config = vwConfig(config_in=config)
@@ -31,8 +32,18 @@ class vulnWhisperer(object):
if self.nessus_enabled:
self.nessus_hostname = self.config.get('nessus', 'hostname')
self.nessus_port = self.config.get('nessus', 'port')
- self.nessus_username = self.config.get('nessus', 'username')
- self.nessus_password = self.config.get('nessus', 'password')
+
+ if password:
+ self.nessus_password = password
+ else:
+ self.nessus_password = self.config.get('nessus', 'password')
+
+
+ if username:
+ self.nessus_username = username
+ else:
+ self.nessus_username = self.config.get('nessus', 'username')
+
self.nessus_writepath = self.config.get('nessus', 'write_path')
self.nessus_dbpath = self.config.get('nessus', 'db_path')
self.nessus_trash = self.config.getbool('nessus', 'trash')
@@ -155,7 +166,7 @@ class vulnWhisperer(object):
except Exception as e:
- print(e)
+ #print(e)
pass
if completed: