diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..d82721d --- /dev/null +++ b/.travis.yml @@ -0,0 +1,24 @@ +group: travis_latest +language: python +cache: pip +python: + - 2.7 + +# - 3.6 +#matrix: +# allow_failures: +# - python: 3.6 - Commenting out testing for Python 3.6 until ready + +install: + - pip install -r requirements.txt + - pip install flake8 # pytest # add another testing frameworks later +before_script: + # stop the build if there are Python syntax errors or undefined names + - flake8 . --count --exclude=deps/qualysapi --select=E901,E999,F821,F822,F823 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + - flake8 . --count --exit-zero --exclude=deps/qualysapi --max-complexity=10 --max-line-length=127 --statistics +script: + - true # pytest --capture=sys # add other tests here +notifications: + on_success: change + on_failure: change # `always` will be the setting once code changes slow down diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..b5b3a32 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +www.vulnwhisperer.com \ No newline at end of file diff --git a/README.md b/README.md index a2c6cfc..dc315c9 100644 --- a/README.md +++ b/README.md @@ -2,28 +2,37 @@

Create actionable data from your vulnerability scans

-

+

-VulnWhisperer is a vulnerability report aggregator. VulnWhisperer will pull all the reports +VulnWhisperer is a vulnerability data and report aggregator. VulnWhisperer will pull all the reports and create a file with a unique filename which is then fed into logstash. Logstash extracts data from the filename and tags all of the information inside the report (see logstash_vulnwhisp.conf file). Data is then shipped to elasticsearch to be indexed. +[![Build Status](https://travis-ci.org/austin-taylor/VulnWhisperer.svg?branch=master)](https://travis-ci.org/austin-taylor/VulnWhisperer) +[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](http://choosealicense.com/licenses/mit/) + Requirements ------------- #### -* ElasticStack +* ElasticStack 5.x * Python 2.7 * Vulnerability Scanner * Optional: Message broker such as Kafka or RabbitMQ Currently Supports -------------- -#### -* Elasticsearch 2.x -* Python 2.7 -* Nessus -* Qualys - Web Application Scanner +----------------- + +### Vulnerability Frameworks + +- [X] Nessus V6 +- [X] Qualys Web Applications +- [ ] Qualys Vulnerability Management (_in progress_) +- [ ] OpenVAS +- [ ] Nexpose +- [ ] Insight VM +- [ ] NMAP +- [ ] More to come Setup @@ -55,6 +64,10 @@ There are a few configuration steps to setting up VulnWhisperer: * Import ElasticSearch Templates * Import Kibana Dashboards +example.ini file +

+ + Run ----- To run, fill out the configuration file with your vulnerability scanner settings. Then you can execute from the command line. @@ -65,6 +78,7 @@ or vuln_whisperer -c configs/example.ini -s qualys ``` +

Next you'll need to import the visualizations into Kibana and setup your logstash config. A more thorough README is underway with setup instructions. _For windows, you may need to type the full path of the binary in vulnWhisperer located in the bin directory._ @@ -73,6 +87,7 @@ Credit ------ Big thank you to Justin Henderson for his contributions to vulnWhisperer! + AS SEEN ON TV ------------- -

\ No newline at end of file +

diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..b849713 --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-leap-day \ No newline at end of file diff --git a/docs/source/config_example.png b/docs/source/config_example.png new file mode 100644 index 0000000..faa7e65 Binary files /dev/null and b/docs/source/config_example.png differ diff --git a/docs/source/running_vuln_whisperer.png b/docs/source/running_vuln_whisperer.png new file mode 100644 index 0000000..4118a21 Binary files /dev/null and b/docs/source/running_vuln_whisperer.png differ diff --git a/docs/source/vulnWhispererWebApplications.png b/docs/source/vulnWhispererWebApplications.png new file mode 100644 index 0000000..acedea8 Binary files /dev/null and b/docs/source/vulnWhispererWebApplications.png differ diff --git a/kibana/vuln_whisp_kibana/1000_vulnWhispererBaseVisuals.json b/kibana/vuln_whisp_kibana/1000_vulnWhispererBaseVisuals.json index 485894a..6ea9304 100755 --- a/kibana/vuln_whisp_kibana/1000_vulnWhispererBaseVisuals.json +++ b/kibana/vuln_whisp_kibana/1000_vulnWhispererBaseVisuals.json @@ -144,7 +144,7 @@ "_type": "visualization", "_source": { "title": "VulnWhisperer - ScanName", - "visState": "{\"title\":\"VulnWhisperer - 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\":\"plugin_name.keyword\",\"size\":20,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Scan Name\"}}],\"listeners\":{}}", + "visState": "{\"title\":\"VulnWhisperer - 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.keyword\",\"size\":20,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Scan Name\"}}],\"listeners\":{}}", "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}", "description": "", "version": 1, diff --git a/vulnwhisp/frameworks/qualys.py b/vulnwhisp/frameworks/qualys.py index 1285f33..d818d71 100644 --- a/vulnwhisp/frameworks/qualys.py +++ b/vulnwhisp/frameworks/qualys.py @@ -25,7 +25,6 @@ class qualysWhisperAPI(object): 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' diff --git a/vulnwhisp/vulnwhisp.py b/vulnwhisp/vulnwhisp.py index 5cccf74..885e0bb 100755 --- a/vulnwhisp/vulnwhisp.py +++ b/vulnwhisp/vulnwhisp.py @@ -531,7 +531,8 @@ class vulnWhispererQualys(vulnWhispererBase): vuln_ready = self.qualys_scan.process_data(path=self.write_path, file_id=str(generated_report_id)) - vuln_ready.to_csv(relative_path_name, index=False, header=True) # add when timestamp occured + vuln_ready['scan_name'] = scan_name + vuln_ready['scan_reference'] = scan_reference vuln_ready.rename(columns=self.COLUMN_MAPPING, inplace=True) record_meta = (