A friend was going through Nessus output and checking the CVEs that were mentioned in each entry against the CVE database looking for false positives and other things he could add to his report. He was doing this by hand, individually pasting each CVE into the NIST NDV and I thought, there has to be an easier way.
So here is a quick script which takes a list of CVEs in the format found in Nessus, does a look up on each one and creates a CSV file containing the bits of information he was looking for. To add other bits should be simple, just add more regex lines.
Output is written to a file called cves.csv in the current directory.
#!/usr/bin/env ruby require 'net/http' require "csv" # A comma separated list of CVEs, typically found in Nessus output cves = "CVE-2007-0455, CVE-2007-1001, CVE-2007-1375" site = "web.nvd.nist.gov" url = "/view/vuln/detail?vulnId=" params = {'User-Agent' => "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"} port = 80 csv_writer = CSV.open "cves.csv", "w" csv_writer << ["CVE", "Overview", "Impact Subscore", "Exploitability Subscore", "Access Vector"] http = Net::HTTP.new(site, port) cves.each(",") { |cve| cve.strip! cve.delete!(",") puts "Checking " + cve request = Net::HTTP::Get.new(url + cve, params) response = http.request(request) next_overview = false next_impact_score = false next_exploitable_score = false overview = nil impact_score = nil exploitable_score = nil access_vector = nil response.body.each{ |line| if next_exploitable_score exploitable_score = line.gsub(/<\/?[^>]*>/, "").strip next_exploitable_score = false end if next_impact_score impact_score = line.gsub(/<\/?[^>]*>/, "").strip next_impact_score = false end if next_overview overview = line.gsub(/<\/?[^>]*>/, "").strip next_overview = false end if line =~ /<h4>Overview<\/h4>/ next_overview = true end if line =~ /Exploitability Subscore:/ next_exploitable_score = true end if line =~ /Impact Subscore:/ next_impact_score = true end if /Access Vector:<\/span>\s*(Network exploitable)/.match(line) access_vector = $1 end } #puts overview #puts impact_score #puts exploitable_score #puts access_vector csv_writer << [cve,overview,impact_score,exploitable_score,access_vector] } csv_writer.close
Here is a sample output
CVE,Overview,Impact Subscore,Exploitability Subscore,Access Vector CVE-2007-0455,Buffer overflow in the gdImageStringFTEx function in gdft.c in GD Graphics Library 2.0.33 and earlier allows remote attackers to cause a denial of service (application crash) and possibly execute arbitrary code via a crafted string with a JIS encoded font.,6.4,10.0,Network exploitable CVE-2007-1001,Multiple integer overflows in the (1) createwbmp and (2) readwbmp functions in wbmp.c in the GD library (libgd) in PHP 4.0.0 through 4.4.6 and 5.0.0 through 5.2.1 allow context-dependent attackers to execute arbitrary code via Wireless Bitmap (WBMP) images with large width or height values.,6.4,8.6,Network exploitable CVE-2007-1375,"Integer overflow in the substr_compare function in PHP 5.2.1 and earlier allows context-dependent attackers to read sensitive memory via a large value in the length argument, a different vulnerability than CVE-2006-1991.",2.9,10.0,Network exploitable
Submitted by Robin Wood