dradis-qualys 4.10.0 → 4.12.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d098ef2f9fc3fd21e8d09b9d2aa3790c17bfc4b18c86e9969c2c49b677d9bdcc
4
- data.tar.gz: 682b88bd9778657a19aa741a9c257fce62130b5c0a72e21b5b5c24c454de7329
3
+ metadata.gz: 713b00a5f7d23b32165f761846270268623c4fc3185a8ce10d1f15e4dde9bf9c
4
+ data.tar.gz: 1ce4e1c00ab931cf7d2eb88c56163ca95f5dd28552637481301de1b035cfb8d0
5
5
  SHA512:
6
- metadata.gz: 11a7e81f2da1d25ebbb870b8b5b6f0940d2a8f5240c267f9dcac2e3a7ba24ce1a2b55c49b019ed4b6d20c5baa40724ccf49189405d35571b80484ac66f047956
7
- data.tar.gz: c0d9c50c8179cb2a16cfb3e7529cbe5badf21552d890f31af9e5fb35f3a476ff38e0cd6764420b705efbf320f4f9bc317f6c74ea0c2a2a0f1466e6504171b572
6
+ metadata.gz: 702b434a597b1e43c113e1a7928cc4cd23be114215e58acf94e3f70b1bd11b9b83ebf4ff88fedb075357339585854c4cf38a80a5fa9d5e773df3be3dd1eb5b2d
7
+ data.tar.gz: 2d35abd53b2c28e9ad04942593d27384d1f431e288218c21c8a96e541e3f9d84e8063c7253889b2432788110626ee941534b57cccd4e59d479c8fa7666930a6a
@@ -1,3 +1,5 @@
1
+ Please review [CONTRIBUTING.md](https://github.com/dradis/dradis-ce/blob/develop/CONTRIBUTING.md) and remove this line.
2
+
1
3
  ### Summary
2
4
 
3
5
  Provide a general description of the code changes in your pull
@@ -6,6 +8,11 @@ these bugs have open GitHub issues, be sure to tag them here as well,
6
8
  to keep the conversation linked together.
7
9
 
8
10
 
11
+ ### Testing Steps
12
+
13
+ Provide steps to test functionality, described in detail for someone not familiar with this part of the application / code base
14
+
15
+
9
16
  ### Other Information
10
17
 
11
18
  If there's anything else that's important and relevant to your pull
@@ -26,11 +33,13 @@ products, we must have the copyright associated with the entire
26
33
  codebase. Any code you create which is merged must be owned by us.
27
34
  That's not us trying to be a jerks, that's just the way it works.
28
35
 
29
- Please review the [CONTRIBUTING.md](https://github.com/dradis/dradis-ce/blob/master/CONTRIBUTING.md)
30
- file for the details.
31
-
32
36
  You can delete this section, but the following sentence needs to
33
37
  remain in the PR's description:
34
38
 
35
39
  > I assign all rights, including copyright, to any future Dradis
36
40
  > work by myself to Security Roots.
41
+
42
+ ### Check List
43
+
44
+ - [ ] Added a CHANGELOG entry
45
+ - [ ] Added specs
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ v4.12.0 (May 2024)
2
+ - Update Dradis links in README
3
+ - Migrate integration to use Mappings Manager
4
+ - Update template names to include uploader
5
+
6
+ v4.11.0 (January 2023)
7
+ - Add support for the output for Qualys WAS API 3.13 and later
8
+
1
9
  v4.10.0 (September 2023)
2
10
  - Update gemspec links
3
11
 
data/README.md CHANGED
@@ -4,18 +4,17 @@
4
4
 
5
5
  Upload Qualys files into Dradis.
6
6
 
7
- The add-on requires [Dradis CE](https://dradisframework.org/) > 3.0, or [Dradis Pro](https://dradisframework.com/pro/).
8
-
7
+ The add-on requires [Dradis CE](https://dradis.com/ce/) > 3.0, or [Dradis Pro](https://dradis.com/).
9
8
 
10
9
 
11
10
  ## More information
12
11
 
13
- See the Dradis Framework's [README.md](https://github.com/dradis/dradisframework/blob/master/README.md)
12
+ See the Dradis Framework's [README.md](https://github.com/dradis/dradis-ce/blob/develop/README.md)
14
13
 
15
14
 
16
15
  ## Contributing
17
16
 
18
- See the Dradis Framework's [CONTRIBUTING.md](https://github.com/dradis/dradisframework/blob/master/CONTRIBUTING.md)
17
+ See the Dradis Framework's [CONTRIBUTING.md](https://github.com/dradis/dradis-ce/blob/develop/CONTRIBUTING.md)
19
18
 
20
19
 
21
20
  ## License
@@ -13,7 +13,7 @@ module Dradis::Plugins::Qualys
13
13
 
14
14
  class Importer < Dradis::Plugins::Upload::Importer
15
15
  def self.templates
16
- { evidence: 'asset-evidence', issue: 'asset-issue' }
16
+ { evidence: 'asset_evidence', issue: 'asset_issue' }
17
17
  end
18
18
 
19
19
  def initialize(args={})
@@ -86,7 +86,7 @@ module Dradis::Plugins::Qualys
86
86
  def process_issue(xml_vuln)
87
87
  qid = xml_vuln.at_xpath('QID').text
88
88
  logger.info { "\t => Creating new issue (plugin_id: #{ qid })" }
89
- issue_text = template_service.process_template(template: 'asset-issue', data: xml_vuln)
89
+ issue_text = mapping_service.apply_mapping(source: 'asset_issue', data: xml_vuln)
90
90
  issue = content_service.create_issue(text: issue_text, id: qid)
91
91
 
92
92
  issue_lookup[qid.to_i] = issue
@@ -107,7 +107,7 @@ module Dradis::Plugins::Qualys
107
107
  return
108
108
  end
109
109
 
110
- evidence_content = template_service.process_template(template: 'asset-evidence', data: xml_evidence)
110
+ evidence_content = mapping_service.apply_mapping(source: 'asset_evidence', data: xml_evidence)
111
111
  content_service.create_evidence(issue: issue, node: node, content: evidence_content)
112
112
  end
113
113
  end
@@ -8,7 +8,7 @@ module Dradis
8
8
 
9
9
  module VERSION
10
10
  MAJOR = 4
11
- MINOR = 10
11
+ MINOR = 12
12
12
  TINY = 0
13
13
  PRE = nil
14
14
 
@@ -0,0 +1,137 @@
1
+ module Dradis::Plugins::Qualys
2
+ module Mapping
3
+ DEFAULT_MAPPING = {
4
+ asset_evidence: {
5
+ 'Result' => '{{ qualys[asset-evidence.result] }}',
6
+ 'Status' => '{{ qualys[asset-evidence.vuln_status] }}',
7
+ 'SSL' => '{{ qualys[asset-evidence.ssl] }}',
8
+ 'CVSSv3.Final' => '{{ qualys[asset-evidence.cvss_final] }}'
9
+ },
10
+ asset_issue: {
11
+ 'Title' => '{{ qualys[asset-issue.title] }}',
12
+ 'Severity' => '{{ qualys[asset-issue.severity] }}',
13
+ 'Categories' => 'Category: {{ qualys[asset-issue.category] }}',
14
+ 'CVSSv3.BaseScore' => '{{ qualys[asset-issue.cvss3_base] }}',
15
+ 'CVSSv3.TemporalScore' => '{{ qualys[asset-issue.cvss3_temporal] }}',
16
+ 'Threat' => '{{ qualys[asset-issue.threat] }}',
17
+ 'Impact' => '{{ qualys[asset-issue.impact] }}',
18
+ 'Solution' => '{{ qualys[asset-issue.solution] }}'
19
+ },
20
+ vuln_element: {
21
+ 'Title' => '{{ qualys[element.title] }}',
22
+ 'CVSSv3.BaseScore' => '{{ qualys[element.cvss_base] }}',
23
+ 'CVSSv3.Vector' => 'Temporal score: {{ qualys[element.cvss_temporal] }}',
24
+ 'Type' => 'External',
25
+ 'Description' => "{{ qualys[element.diagnosis] }}\n{{ qualys[element.consequence] }}",
26
+ 'Solution' => '{{ qualys[element.solution] }}',
27
+ 'References' => '{{ qualys[element.vendor_reference_list] }}',
28
+ },
29
+ vuln_evidence: {
30
+ 'Location' => "{{ qualys[evidence.cat_protocol] }}/{{ qualys[evidence.cat_port] }}",
31
+ 'Output' => '{{ qualys[evidence.result] }}'
32
+ },
33
+ was_evidence: {
34
+ 'Location' => '{{ qualys[was-evidence.url] }}',
35
+ 'Output' => "*Request*\n\nMethod: {{ qualys[was-evidence.request_method] }}\nURL: {{ qualys[was-evidence.request_url] }}\n\nbc.. {{ qualys[was-evidence.request_headers] }}\n\np. *Response*\n\nEvidence: {{ qualys[was-evidence.response_evidence] }}\n\nbc.. {{ qualys[was-evidence.response_contents] }}"
36
+ },
37
+ was_issue: {
38
+ 'Title' => '{{ qualys[was-issue.title] }}',
39
+ 'Severity' => '{{ qualys[was-issue.severity] }}',
40
+ 'Categories' => "Category: {{ qualys[was-issue.category] }}\nGroup: {{ qualys[was-issue.group] }}\nOWASP: {{ qualys[was-issue.owasp] }}\nCWE: {{ qualys[was-issue.cwe] }}",
41
+ 'CVSSv3.Vector' => '{{ qualys[was-issue.cvss3_vector] }}',
42
+ 'CVSSv3.BaseScore' => '{{ qualys[was-issue.cvss3_base] }}',
43
+ 'CVSSv3.TemporalScore' => '{{ qualys[was-issue.cvss3_temporal] }}',
44
+ 'Description' => "{{ qualys[was-issue.description] }}\n\n{{ qualys[was-issue.impact] }}",
45
+ 'Solution' => '{{ qualys[was-issue.solution] }}'
46
+ }
47
+ }.freeze
48
+
49
+ SOURCE_FIELDS = {
50
+ asset_evidence: [
51
+ 'asset-evidence.cvss3_final',
52
+ 'asset-evidence.cvss_final',
53
+ 'asset-evidence.first_found',
54
+ 'asset-evidence.last_found',
55
+ 'asset-evidence.result',
56
+ 'asset-evidence.ssl',
57
+ 'asset-evidence.times_found',
58
+ 'asset-evidence.type',
59
+ 'asset-evidence.vuln_status'
60
+ ],
61
+ asset_issue: [
62
+ 'asset-issue.category',
63
+ 'asset-issue.cvss3_base',
64
+ 'asset-issue.cvss3_temporal',
65
+ 'asset-issue.cvss_base',
66
+ 'asset-issue.cvss_temporal',
67
+ 'asset-issue.impact',
68
+ 'asset-issue.last_update',
69
+ 'asset-issue.pci_flag',
70
+ 'asset-issue.qid',
71
+ 'asset-issue.result',
72
+ 'asset-issue.severity',
73
+ 'asset-issue.solution',
74
+ 'asset-issue.threat',
75
+ 'asset-issue.title'
76
+ ],
77
+ vuln_element: [
78
+ 'element.number',
79
+ 'element.severity',
80
+ 'element.cveid',
81
+ 'element.title',
82
+ 'element.last_update',
83
+ 'element.cvss_base',
84
+ 'element.cvss_temporal',
85
+ 'element.pci_flag',
86
+ 'element.vendor_reference_list',
87
+ 'element.cve_id_list',
88
+ 'element.bugtraq_id_list',
89
+ 'element.diagnosis',
90
+ 'element.consequence',
91
+ 'element.solution',
92
+ 'element.compliance',
93
+ 'element.result',
94
+ 'element.qualys_collection'
95
+ ],
96
+ vuln_evidence: [
97
+ 'evidence.cat_fqdn',
98
+ 'evidence.cat_misc',
99
+ 'evidence.cat_port',
100
+ 'evidence.cat_protocol',
101
+ 'evidence.cat_value',
102
+ 'evidence.result'
103
+ ],
104
+ was_evidence: [
105
+ 'was-evidence.access_paths',
106
+ 'was-evidence.ajax',
107
+ 'was-evidence.authentication',
108
+ 'was-evidence.ignored',
109
+ 'was-evidence.potential',
110
+ 'was-evidence.request_headers',
111
+ 'was-evidence.request_method',
112
+ 'was-evidence.request_url',
113
+ 'was-evidence.response_contents',
114
+ 'was-evidence.response_evidence',
115
+ 'was-evidence.url'
116
+ ],
117
+ was_issue: [
118
+ 'was-issue.category',
119
+ 'was-issue.cvss_base',
120
+ 'was-issue.cvss_temporal',
121
+ 'was-issue.cvss3_base',
122
+ 'was-issue.cvss3_temporal',
123
+ 'was-issue.cvss3_vector',
124
+ 'was-issue.cwe',
125
+ 'was-issue.description',
126
+ 'was-issue.group',
127
+ 'was-issue.impact',
128
+ 'was-issue.owasp',
129
+ 'was-issue.qid',
130
+ 'was-issue.severity',
131
+ 'was-issue.solution',
132
+ 'was-issue.title',
133
+ 'was-issue.wasc'
134
+ ]
135
+ }.freeze
136
+ end
137
+ end
@@ -14,7 +14,7 @@ module Dradis::Plugins::Qualys
14
14
  attr_accessor :host_node
15
15
 
16
16
  def self.templates
17
- { evidence: 'evidence', issue: 'element' }
17
+ { evidence: 'vuln_evidence', issue: 'vuln_element' }
18
18
  end
19
19
 
20
20
  def initialize(args={})
@@ -95,11 +95,11 @@ module Dradis::Plugins::Qualys
95
95
  # Issue and Evidence template out of it.
96
96
  def process_vuln(vuln_number, xml_cat)
97
97
  logger.info{ "\t\t => Creating new issue (plugin_id: #{ vuln_number })" }
98
- issue_text = template_service.process_template(template: 'element', data: xml_cat)
98
+ issue_text = mapping_service.apply_mapping(source: 'vuln_element', data: xml_cat)
99
99
  issue = content_service.create_issue(text: issue_text, id: vuln_number)
100
100
 
101
101
  logger.info{ "\t\t => Creating new evidence" }
102
- evidence_content = template_service.process_template(template: 'evidence', data: xml_cat)
102
+ evidence_content = mapping_service.apply_mapping(source: 'vuln_evidence', data: xml_cat)
103
103
  content_service.create_evidence(issue: issue, node: self.host_node, content: evidence_content)
104
104
  end
105
105
  end
@@ -1,5 +1,4 @@
1
1
  module Dradis::Plugins::Qualys
2
-
3
2
  # This module knows how to parse Qualys Web Application Scanner format.
4
3
  module WAS
5
4
  def self.meta
@@ -14,20 +13,20 @@ module Dradis::Plugins::Qualys
14
13
 
15
14
  class Importer < Dradis::Plugins::Upload::Importer
16
15
  def self.templates
17
- { evidence: 'was-evidence', issue: 'was-issue' }
16
+ { evidence: 'was_evidence', issue: 'was_issue' }
18
17
  end
19
18
 
20
- def initialize(args={})
19
+ def initialize(args = {})
21
20
  args[:plugin] = Dradis::Plugins::Qualys
22
21
  super(args)
23
22
 
24
23
  @issue_lookup = {}
25
24
  end
26
25
 
27
- def import(params={})
26
+ def import(params = {})
28
27
  file_content = File.read(params[:file])
29
28
 
30
- logger.info { 'Parsing Qualys WAS XML output file...'}
29
+ logger.info { 'Parsing Qualys WAS XML output file...' }
31
30
  doc = Nokogiri::XML(file_content)
32
31
  logger.info { 'Done.' }
33
32
 
@@ -38,20 +37,27 @@ module Dradis::Plugins::Qualys
38
37
  return false
39
38
  end
40
39
 
41
- logger.info { 'Global Summary information'}
40
+ logger.info { 'Global Summary information' }
42
41
 
43
42
  xml_global_summary = doc.at_xpath('WAS_SCAN_REPORT/SUMMARY/GLOBAL_SUMMARY')
44
43
  logger.info { 'Security Risk: ' + xml_global_summary.at_xpath('./SECURITY_RISK').text }
45
44
  logger.info { 'Vulnerabilities found: ' + xml_global_summary.at_xpath('./VULNERABILITY').text }
46
45
 
47
- xml_webapp = doc.at_xpath('WAS_SCAN_REPORT/APPENDIX/WEBAPP')
46
+ xml_webapp =
47
+ doc.at_xpath('WAS_SCAN_REPORT/APPENDIX/WEBAPP | WAS_SCAN_REPORT/APPENDIX/WEB_APPLICATION')
48
48
  process_webapp(xml_webapp)
49
49
 
50
50
  doc.xpath('WAS_SCAN_REPORT/GLOSSARY/QID_LIST/QID').each do |xml_qid|
51
51
  process_issue(xml_qid)
52
52
  end
53
53
 
54
- doc.xpath('WAS_SCAN_REPORT/RESULTS/VULNERABILITY_LIST/VULNERABILITY').each do |xml_vulnerability|
54
+ vulnerability_list =
55
+ doc.xpath(
56
+ 'WAS_SCAN_REPORT/RESULTS/VULNERABILITY_LIST/VULNERABILITY | ' +
57
+ 'WAS_SCAN_REPORT/RESULTS/WEB_APPLICATION/VULNERABILITY_LIST/VULNERABILITY'
58
+ )
59
+
60
+ vulnerability_list.each do |xml_vulnerability|
55
61
  process_evidence(xml_vulnerability)
56
62
  end
57
63
 
@@ -68,22 +74,22 @@ module Dradis::Plugins::Qualys
68
74
  if issue
69
75
  issue_id = issue.respond_to?(:id) ? issue.id : issue.to_issue.id
70
76
 
71
- logger.info{ "\t => Creating new evidence (plugin_id: #{id})" }
72
- logger.info{ "\t\t => Issue: #{issue.title} (plugin_id: #{issue_id})" }
73
- logger.info{ "\t\t => Node: #{webapp_node.label} (#{webapp_node.id})" }
77
+ logger.info { "\t => Creating new evidence (plugin_id: #{id})" }
78
+ logger.info { "\t\t => Issue: #{issue.title} (plugin_id: #{issue_id})" }
79
+ logger.info { "\t\t => Node: #{webapp_node.label} (#{webapp_node.id})" }
74
80
  else
75
- logger.info{ "\t => Couldn't find QID for evidence with ID=#{id}" }
81
+ logger.info { "\t => Couldn't find QID for evidence with ID=#{id}" }
76
82
  return
77
83
  end
78
84
 
79
- evidence_content = template_service.process_template(template: 'was-evidence', data: xml_vulnerability)
85
+ evidence_content = mapping_service.apply_mapping(source: 'was_evidence', data: xml_vulnerability)
80
86
  content_service.create_evidence(issue: issue, node: webapp_node, content: evidence_content)
81
87
  end
82
88
 
83
89
  def process_issue(xml_qid)
84
90
  qid = xml_qid.at_xpath('QID').text
85
- logger.info{ "\t => Creating new issue (plugin_id: #{ qid })" }
86
- issue_text = template_service.process_template(template: 'was-issue', data: xml_qid)
91
+ logger.info { "\t => Creating new issue (plugin_id: #{ qid })" }
92
+ issue_text = mapping_service.apply_mapping(source: 'was_issue', data: xml_qid)
87
93
  issue = content_service.create_issue(text: issue_text, id: qid)
88
94
 
89
95
  issue_lookup[qid.to_i] = issue
@@ -7,6 +7,7 @@ end
7
7
 
8
8
  require 'dradis/plugins/qualys/engine'
9
9
  require 'dradis/plugins/qualys/field_processor'
10
+ require 'dradis/plugins/qualys/mapping'
10
11
  require 'dradis/plugins/qualys/version'
11
12
 
12
13
  require 'dradis/plugins/qualys/asset/importer'
@@ -0,0 +1,138 @@
1
+ <?xml version='1.0' encoding='UTF-8'?>
2
+ <WAS_SCAN_REPORT>
3
+ <HEADER>
4
+ <NAME>Scan Report</NAME>
5
+ <DESCRIPTION>Vulnerabilities of all selected scans are consolidated into one report so that you can view their evolution.</DESCRIPTION>
6
+ <GENERATION_DATETIME>10 Nov 2021 10:00AM GMT-0500</GENERATION_DATETIME>
7
+ <COMPANY_INFO>
8
+ <NAME>Sample Company</NAME>
9
+ <ADDRESS>Sample Address</ADDRESS>
10
+ <CITY>Sample City</CITY>
11
+ <STATE>Sample State</STATE>
12
+ <COUNTRY>Sample Country</COUNTRY>
13
+ <ZIP_CODE>00000</ZIP_CODE>
14
+ </COMPANY_INFO>
15
+ <USER_INFO>
16
+ <NAME>Test User</NAME>
17
+ <USERNAME>test_user</USERNAME>
18
+ <ROLE>PC User,VM User</ROLE>
19
+ </USER_INFO>
20
+ </HEADER>
21
+ <FILTERS>
22
+ <FILTER>
23
+ <NAME>REMEDIATION</NAME>
24
+ <VALUE>Include patched findings</VALUE>
25
+ </FILTER>
26
+ <FILTER>
27
+ <NAME>REMEDIATION</NAME>
28
+ <VALUE>Show ignored findings </VALUE>
29
+ </FILTER>
30
+ </FILTERS>
31
+ <TARGET>
32
+ <SCAN>Test Scan</SCAN>
33
+ </TARGET>
34
+ <SUMMARY>
35
+ <GLOBAL_SUMMARY>
36
+ <SECURITY_RISK>High</SECURITY_RISK>
37
+ <VULNERABILITY>31</VULNERABILITY>
38
+ <SENSITIVE_CONTENT>0</SENSITIVE_CONTENT>
39
+ <INFORMATION_GATHERED>30</INFORMATION_GATHERED>
40
+ </GLOBAL_SUMMARY>
41
+ <SUMMARY_STATS>
42
+ <SUMMARY_STAT>
43
+ <SCAN>test Scan</SCAN>
44
+ <DATE>12 Oct 2021</DATE>
45
+ <LEVEL5>5</LEVEL5>
46
+ <LEVEL4>2</LEVEL4>
47
+ <LEVEL3>9</LEVEL3>
48
+ <LEVEL2>2</LEVEL2>
49
+ <LEVEL1>13</LEVEL1>
50
+ <SENSITIVE_CONTENT>0</SENSITIVE_CONTENT>
51
+ <INFORMATION_GATHERED>30</INFORMATION_GATHERED>
52
+ </SUMMARY_STAT>
53
+ </SUMMARY_STATS>
54
+ </SUMMARY>
55
+ <RESULTS>
56
+ <WEB_APPLICATION>
57
+ <ID>12345</ID>
58
+ <NAME>Example Company</NAME>
59
+ <VULNERABILITY_LIST>
60
+ <VULNERABILITY>
61
+ <UNIQUE_ID>test-id</UNIQUE_ID>
62
+ <ID>1</ID>
63
+ <DETECTION_ID>1</DETECTION_ID>
64
+ <QID>6</QID>
65
+ <URL>http://example.com</URL>
66
+ <ACCESS_PATH>
67
+ <URL>http://example.com</URL>
68
+ </ACCESS_PATH>
69
+ <AJAX>false</AJAX>
70
+ <AUTHENTICATION>Not Required</AUTHENTICATION>
71
+ <DETECTION_DATE>21 Aug 2021 10:00PM GMT-0500</DETECTION_DATE>
72
+ <POTENTIAL>false</POTENTIAL>
73
+ <PAYLOADS>
74
+ <PAYLOAD>
75
+ <NUM>1</NUM>
76
+ <PAYLOAD>N/A</PAYLOAD>
77
+ <REQUEST>
78
+ <METHOD>GET</METHOD>
79
+ <URL>http://example.com</URL>
80
+ <HEADERS>
81
+ <HEADER>
82
+ <key>Host</key>
83
+ <value><![CDATA[ example.com ]]></value>
84
+ </HEADER>
85
+ <HEADER>
86
+ <key>User-Agent</key>
87
+ <value>user-agent</value>
88
+ </HEADER>
89
+ <HEADER>
90
+ <key>Accept</key>
91
+ <value><![CDATA[ */*
92
+ </HEADER>
93
+ </HEADERS>
94
+ <BODY></BODY>
95
+ </REQUEST>
96
+ <RESPONSE>
97
+ <CONTENTS base64="true"></CONTENTS>
98
+ </RESPONSE>
99
+ </PAYLOAD>
100
+ </PAYLOADS>
101
+ <IGNORED>false</IGNORED>
102
+ </VULNERABILITY>
103
+ </VULNERABILITY_LIST>
104
+ </WEB_APPLICATION>
105
+ </RESULTS>
106
+ <GLOSSARY>
107
+ <QID_LIST>
108
+ <QID>
109
+ <QID>6</QID>
110
+ <CATEGORY>Information Gathered</CATEGORY>
111
+ <SEVERITY>1</SEVERITY>
112
+ <TITLE>DNS Host Name</TITLE>
113
+ <GROUP>DIAG</GROUP>
114
+ <DESCRIPTION>The fully qualified domain name of this host, if it was obtained from a DNS server, is displayed in the RESULT section.</DESCRIPTION>
115
+ <IMPACT>N/A</IMPACT>
116
+ <SOLUTION>N/A</SOLUTION>
117
+ <CVSS_BASE>4.3</CVSS_BASE>
118
+ <CVSS_TEMPORAL>3.9</CVSS_TEMPORAL>
119
+ <CVSS_V3>
120
+ <BASE>6.1</BASE>
121
+ <TEMPORAL>5.8</TEMPORAL>
122
+ <ATTACK_VECTOR>Network</ATTACK_VECTOR>
123
+ </CVSS_V3>
124
+ </QID>
125
+ </QID_LIST>
126
+ </GLOSSARY>
127
+ <APPENDIX>
128
+ <WEB_APPLICATION>
129
+ <ID>1</ID>
130
+ <NAME>Test</NAME>
131
+ <URL>http://example.com</URL>
132
+ <OWNER>Test User</OWNER>
133
+ <SCOPE>Limit to URL hostname</SCOPE>
134
+ <CUSTOM_ATTRIBUTES/>
135
+ <TAGS/>
136
+ </WEBAPP>
137
+ </APPENDIX>
138
+ </WAS_SCAN_REPORT>
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
  require 'ostruct'
3
3
 
4
4
  module Dradis::Plugins
5
- describe 'Qualys upload plugin' do
5
+ shared_examples 'Qualys upload plugin' do
6
6
  before(:each) do
7
7
  # Stub template service
8
8
  templates_dir = File.expand_path('../../../../templates', __FILE__)
@@ -16,7 +16,6 @@ module Dradis::Plugins
16
16
  )
17
17
  end
18
18
 
19
- let(:example_xml) { 'spec/fixtures/files/simple_was.xml' }
20
19
  let(:run_import!) { @importer.import(file: example_xml) }
21
20
 
22
21
  it 'creates nodes as needed' do
@@ -38,4 +37,16 @@ module Dradis::Plugins
38
37
  run_import!
39
38
  end
40
39
  end
40
+
41
+ context 'Simple WAS template' do
42
+ let(:example_xml) { 'spec/fixtures/files/simple_was.xml' }
43
+
44
+ include_examples 'Qualys upload plugin'
45
+ end
46
+
47
+ context 'WAS template with WEB_APPLICATION' do
48
+ let(:example_xml) { 'spec/fixtures/files/simple_was_updated.xml' }
49
+
50
+ include_examples 'Qualys upload plugin'
51
+ end
41
52
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dradis-qualys
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.10.0
4
+ version: 4.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Martin
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-07 00:00:00.000000000 Z
11
+ date: 2024-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dradis-plugins
@@ -96,7 +96,7 @@ dependencies:
96
96
  version: 0.5.2
97
97
  description: This add-on allows you to upload and parse output produced from Qualys
98
98
  Vulnerability Scanner into Dradis.
99
- email:
99
+ email:
100
100
  executables: []
101
101
  extensions: []
102
102
  extra_rdoc_files: []
@@ -119,6 +119,7 @@ files:
119
119
  - lib/dradis/plugins/qualys/engine.rb
120
120
  - lib/dradis/plugins/qualys/field_processor.rb
121
121
  - lib/dradis/plugins/qualys/gem_version.rb
122
+ - lib/dradis/plugins/qualys/mapping.rb
122
123
  - lib/dradis/plugins/qualys/version.rb
123
124
  - lib/dradis/plugins/qualys/vuln/importer.rb
124
125
  - lib/dradis/plugins/qualys/was/importer.rb
@@ -133,6 +134,7 @@ files:
133
134
  - spec/fixtures/files/simple.xml
134
135
  - spec/fixtures/files/simple_asset.xml
135
136
  - spec/fixtures/files/simple_was.xml
137
+ - spec/fixtures/files/simple_was_updated.xml
136
138
  - spec/fixtures/files/two_hosts_common_issue.xml
137
139
  - spec/fixtures/files/with_ciphers.xml
138
140
  - spec/qualys/asset/importer_spec.rb
@@ -141,29 +143,17 @@ files:
141
143
  - spec/qualys/was/importer_spec.rb
142
144
  - spec/spec_helper.rb
143
145
  - spec/support/spec_macros.rb
144
- - templates/asset-evidence.fields
145
- - templates/asset-evidence.sample
146
- - templates/asset-evidence.template
147
- - templates/asset-issue.fields
148
- - templates/asset-issue.sample
149
- - templates/asset-issue.template
150
- - templates/element.fields
151
- - templates/element.sample
152
- - templates/element.template
153
- - templates/evidence.fields
154
- - templates/evidence.sample
155
- - templates/evidence.template
156
- - templates/was-evidence.fields
157
- - templates/was-evidence.sample
158
- - templates/was-evidence.template
159
- - templates/was-issue.fields
160
- - templates/was-issue.sample
161
- - templates/was-issue.template
146
+ - templates/asset_evidence.sample
147
+ - templates/asset_issue.sample
148
+ - templates/vuln_element.sample
149
+ - templates/vuln_evidence.sample
150
+ - templates/was_evidence.sample
151
+ - templates/was_issue.sample
162
152
  homepage: https://dradis.com/integrations/qualys.html
163
153
  licenses:
164
154
  - GPL-2
165
155
  metadata: {}
166
- post_install_message:
156
+ post_install_message:
167
157
  rdoc_options: []
168
158
  require_paths:
169
159
  - lib
@@ -179,7 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
179
169
  version: '0'
180
170
  requirements: []
181
171
  rubygems_version: 3.1.4
182
- signing_key:
172
+ signing_key:
183
173
  specification_version: 4
184
174
  summary: Qualys add-on for the Dradis Framework.
185
175
  test_files:
@@ -188,6 +178,7 @@ test_files:
188
178
  - spec/fixtures/files/simple.xml
189
179
  - spec/fixtures/files/simple_asset.xml
190
180
  - spec/fixtures/files/simple_was.xml
181
+ - spec/fixtures/files/simple_was_updated.xml
191
182
  - spec/fixtures/files/two_hosts_common_issue.xml
192
183
  - spec/fixtures/files/with_ciphers.xml
193
184
  - spec/qualys/asset/importer_spec.rb
@@ -1,9 +0,0 @@
1
- asset-evidence.cvss3_final
2
- asset-evidence.cvss_final
3
- asset-evidence.first_found
4
- asset-evidence.last_found
5
- asset-evidence.result
6
- asset-evidence.ssl
7
- asset-evidence.times_found
8
- asset-evidence.type
9
- asset-evidence.vuln_status
@@ -1,11 +0,0 @@
1
- #[Result]#
2
- %asset-evidence.result%
3
-
4
- #[Status]#
5
- %asset-evidence.vuln_status%
6
-
7
- #[SSL]#
8
- %asset-evidence.ssl%
9
-
10
- #[CVSSv3.Final]#
11
- %asset-evidence.cvss_final%
@@ -1,14 +0,0 @@
1
- asset-issue.category
2
- asset-issue.cvss3_base
3
- asset-issue.cvss3_temporal
4
- asset-issue.cvss_base
5
- asset-issue.cvss_temporal
6
- asset-issue.impact
7
- asset-issue.last_update
8
- asset-issue.pci_flag
9
- asset-issue.qid
10
- asset-issue.result
11
- asset-issue.severity
12
- asset-issue.solution
13
- asset-issue.threat
14
- asset-issue.title
@@ -1,22 +0,0 @@
1
- #[Title]#
2
- %asset-issue.title%
3
-
4
- #[Severity]#
5
- %asset-issue.severity%
6
-
7
- #[Categories]#
8
- Category: %asset-issue.category%
9
-
10
- #[CVSSv3.BaseScore]#
11
- %asset-issue.cvss3_base%
12
-
13
- #[CVSSv3.TemporalScore]#
14
- %asset-issue.cvss3_temporal%
15
-
16
- #[Threat]#
17
- %asset-issue.threat%
18
-
19
- %asset-issue.impact%
20
-
21
- #[Solution]#
22
- %asset-issue.solution%
@@ -1,17 +0,0 @@
1
- element.number
2
- element.severity
3
- element.cveid
4
- element.title
5
- element.last_update
6
- element.cvss_base
7
- element.cvss_temporal
8
- element.pci_flag
9
- element.vendor_reference_list
10
- element.cve_id_list
11
- element.bugtraq_id_list
12
- element.diagnosis
13
- element.consequence
14
- element.solution
15
- element.compliance
16
- element.result
17
- element.qualys_collection
@@ -1,39 +0,0 @@
1
- #[Title]#
2
- %element.title%
3
-
4
-
5
- #[Severity]#
6
- %element.severity%
7
-
8
-
9
- #[CVE]#
10
- %element.cveid%
11
-
12
-
13
- #[CVSS]#
14
- Base: %element.cvss_base%
15
- Temporal: %element.cvss_temporal%
16
-
17
-
18
- #[Diagnosis]#
19
- %element.diagnosis%
20
-
21
-
22
- #[Consequence]#
23
- %element.consequence%
24
-
25
-
26
- #[Solution]#
27
- %element.solution%
28
-
29
-
30
- #[Result]#
31
- %element.result%
32
-
33
-
34
- #[CVEList]#
35
- %element.cve_id_list%
36
-
37
-
38
- #[QualysCollection]#
39
- %element.qualys_collection%
@@ -1,6 +0,0 @@
1
- evidence.cat_fqdn
2
- evidence.cat_misc
3
- evidence.cat_port
4
- evidence.cat_protocol
5
- evidence.cat_value
6
- evidence.result
@@ -1,11 +0,0 @@
1
- #[Category]#
2
- %evidence.cat_value%
3
-
4
- #[Protocol]#
5
- %evidence.cat_protocol%
6
-
7
- #[Port]#
8
- %evidence.cat_port%
9
-
10
- #[Output]#
11
- %evidence.result%
@@ -1,11 +0,0 @@
1
- was-evidence.access_paths
2
- was-evidence.ajax
3
- was-evidence.authentication
4
- was-evidence.ignored
5
- was-evidence.potential
6
- was-evidence.request_headers
7
- was-evidence.request_method
8
- was-evidence.request_url
9
- was-evidence.response_contents
10
- was-evidence.response_evidence
11
- was-evidence.url
@@ -1,16 +0,0 @@
1
- #[Location]#
2
- %was-evidence.url%
3
-
4
- #[Output]#
5
- *Request*
6
-
7
- Method: %was-evidence.request_method%
8
- URL: %was-evidence.request_url%
9
-
10
- bc.. %was-evidence.request_headers%
11
-
12
- p. *Response*
13
-
14
- Evidence: %was-evidence.response_evidence%
15
-
16
- bc.. %was-evidence.response_contents%
@@ -1,16 +0,0 @@
1
- was-issue.category
2
- was-issue.cvss_base
3
- was-issue.cvss_temporal
4
- was-issue.cvss3_base
5
- was-issue.cvss3_temporal
6
- was-issue.cvss3_vector
7
- was-issue.cwe
8
- was-issue.description
9
- was-issue.group
10
- was-issue.impact
11
- was-issue.owasp
12
- was-issue.qid
13
- was-issue.severity
14
- was-issue.solution
15
- was-issue.title
16
- was-issue.wasc
@@ -1,28 +0,0 @@
1
- #[Title]#
2
- %was-issue.title%
3
-
4
- #[Severity]#
5
- %was-issue.severity%
6
-
7
- #[Categories]#
8
- Category: %was-issue.category%
9
- Group: %was-issue.group%
10
- OWASP: %was-issue.owasp%
11
- CWE: %was-issue.cwe%
12
-
13
- #[CVSSv3.Vector]#
14
- %was-issue.cvss3_vector%
15
-
16
- #[CVSSv3.BaseScore]#
17
- %was-issue.cvss3_base%
18
-
19
- #[CVSSv3.TemporalScore]#
20
- %was-issue.cvss3_temporal%
21
-
22
- #[Description]#
23
- %was-issue.description%
24
-
25
- %was-issue.impact%
26
-
27
- #[Solution]#
28
- %was-issue.solution%
File without changes
File without changes