This is the one we use the most its for CVSS 6+ as thats what we focus on.
@Starshine @wwolczaski
WITH
asset_ips AS (
SELECT asset_id, ip_address, type
FROM dim_asset_ip_address dips
),
vulnerability_age AS (
SELECT fvi1.asset_id, fvi1.vulnerability_id, min(fvi1.date) as vulnerability_age
FROM fact_asset_scan_vulnerability_instance fvi1
GROUP BY fvi1.asset_id, fvi1.vulnerability_id
),
asset_addresses AS (
SELECT da.asset_id,
(SELECT array_to_string(array_agg(ip_address), ',') FROM asset_ips WHERE asset_id = da.asset_id AND type = 'IPv4') AS ipv4s,
(SELECT array_to_string(array_agg(ip_address), ',') FROM asset_ips WHERE asset_id = da.asset_id AND type = 'IPv6') AS ipv6s,
(SELECT array_to_string(array_agg(mac_address), ',') FROM dim_asset_mac_address WHERE asset_id = da.asset_id) AS macs
FROM dim_asset da
JOIN asset_ips USING (asset_id)
),
asset_names AS (
SELECT asset_id, array_to_string(array_agg(host_name), ',') AS names
FROM dim_asset_host_name
GROUP BY asset_id
),
asset_facts AS (
SELECT asset_id, riskscore, exploits, malware_kits
FROM fact_asset
),
vulnerability_metadata AS (
SELECT *
FROM dim_vulnerability dv
),
vuln_cves_ids AS (
SELECT vulnerability_id, array_to_string(array_agg(reference), ',') AS cves
FROM dim_vulnerability_reference
WHERE source = 'CVE'
GROUP BY vulnerability_id
),
vuln_reference_ids AS (
SELECT vulnerability_id, array_to_string(array_agg(reference), ',') AS ids
FROM dim_vulnerability_reference
WHERE source <> 'CVE' AND source <> 'URL'
GROUP BY vulnerability_id
),
vuln_tags AS (
SELECT vulnerability_id, array_to_string(array_agg(category_name ORDER BY category_name ASC), ',') AS tags
FROM dim_vulnerability_category
GROUP BY vulnerability_id
),
vuln_minimum_skill AS (
SELECT vulnerability_id, skill_level AS min_skill
FROM (
SELECT vulnerability_id,
row_number() OVER (
PARTITION BY vulnerability_id
ORDER BY CASE
WHEN skill_level = 'Expert' THEN 1
WHEN skill_level = 'Intermediate' THEN 2
WHEN skill_level = 'Novice' THEN 3
ELSE 4
END DESC
) AS row, skill_level
FROM dim_vulnerability_exploit dve
) v
WHERE row = 1
),
vulnerability_proofs AS (
SELECT asset_id, vulnerability_id, csv(htmlToText(proof, false)) AS proofs
FROM fact_asset_vulnerability_instance
GROUP BY asset_id, vulnerability_id
),
vulnerability_solutions AS (
SELECT asset_id, vulnerability_id, csv(htmlToText(ds.fix, false)) AS solutions
FROM vulnerability_proofs
JOIN dim_asset_vulnerability_solution USING (asset_id, vulnerability_id)
JOIN dim_solution_highest_supercedence dshs USING (solution_id)
JOIN dim_solution ds ON ds.solution_id = dshs.superceding_solution_id
GROUP BY asset_id, vulnerability_id
)
SELECT
ds.name AS "SITENAME",
da.ip_address AS "IPADDRESS",
an.names AS "ASSETNAME",
favi.port AS "PORT",
dp.name AS "PROTOCOL",
dsvc.name AS "SERVICE",
dos.name AS "Asset_OS_Name",
dos.family AS "Asset_OS_Family",
dos.version AS "Asset_OS_Version",
cves.cves AS "CVE",
vm.nexpose_id AS "Nexpose ID",
vm.severity_score AS "Severity",
vm.cvss_score AS "CVSS SCORE",
vm.title AS "TITLE",
proofAsText(vm.description) AS "DESCRIPTION",
proofAsText(favi.proof) AS "PROOF",
solutions AS "SOLUTION",
round(age(va.vulnerability_age, 'days')) AS "Vulnerability_Age",
va.vulnerability_age::date AS "Vulnerable_Since",
vtags.tags AS "Vulnerability_Tags",
favi.date::date AS "Vulnerability_Test_Date",
vuln_minimum_skill.min_skill AS "Exploit_Minimum_Skill",
af.malware_kits AS "Malware_Kit_Count"
FROM fact_asset_vulnerability_instance favi
JOIN dim_asset da USING (asset_id)
LEFT OUTER JOIN asset_addresses aa USING (asset_id)
LEFT OUTER JOIN asset_names an USING (asset_id)
JOIN dim_operating_system dos USING (operating_system_id)
JOIN asset_facts af USING (asset_id)
JOIN dim_service dsvc USING (service_id)
JOIN dim_protocol dp USING (protocol_id)
JOIN dim_site_asset dsa USING (asset_id)
JOIN dim_site ds USING (site_id)
JOIN vulnerability_metadata vm USING (vulnerability_id)
JOIN dim_vulnerability_status dvs USING (status_id)
JOIN vulnerability_age va USING (vulnerability_id, asset_id)
LEFT OUTER JOIN vuln_cves_ids cves USING (vulnerability_id)
LEFT OUTER JOIN vuln_tags vtags USING (vulnerability_id)
LEFT OUTER JOIN vuln_minimum_skill USING (vulnerability_id)
LEFT OUTER JOIN vulnerability_solutions USING (asset_id, vulnerability_id)
WHERE vm.cvss_v2_score >= 6.0