lib/rex/parser/openvas_nokogiri.rb in rex-2.0.8 vs lib/rex/parser/openvas_nokogiri.rb in rex-2.0.9

- old
+ new

@@ -13,111 +13,110 @@ # get here (and turning things off when we exit in end_element()). def start_element(name=nil,attrs=[]) attrs = normalize_attrs(attrs) block = @block @state[:current_tag][name] = true + + unless @text.nil? + @state[:text_backup] = @text + @text = nil + end + case name when "host" @state[:has_text] = true end end # When we exit a tag, this is triggered. def end_element(name=nil) block = @block case name - when "name" - return if not in_tag("result") + when 'name' + if in_tag('result') + @state[:has_text] = true + @state[:vuln_name] = @text.strip if @text + end + when 'description' @state[:has_text] = true - @state[:vuln_name] = @text.strip if @text - @text = nil - when "description" - @state[:has_text] = true @state[:vuln_desc] = @text.strip if @text - @text = nil - when "bid" - return if not in_tag("result") - return if not in_tag("nvt") - @state[:has_text] = true - @state[:bid] = @text.strip if @text - @text = nil - when "cve" - return if not in_tag("result") - return if not in_tag("nvt") - @state[:has_text] = true - @state[:cves] = @text.strip if @text - @text = nil - when "risk_factor" - return if not in_tag("result") - return if not in_tag("nvt") - - #we do this to clean out the buffer so to speak - #if we don't set text to nil now, the text will show up later - @state[:has_text] = true - @text = nil - when "cvss_base" - return if not in_tag("result") - return if not in_tag("nvt") - @state[:has_text] = true - @text = nil - when "subnet" - @state[:has_text] = true - @text = nil - when "result" - return if not in_tag("results") - record_vuln - when "threat" - return if not in_tag("ports") - return if not in_tag("port") - @state[:has_text] = true - - if not @text.index('(') - @state[:name] = nil - @state[:port] = nil - @state[:proto] = nil - @text = nil - return + when 'bid' + if in_tag('result') && in_tag('nvt') + @state[:has_text] = true + @state[:bid] = @text.strip if @text end - - @state[:name] = @text.split(' ')[0] if @text - @state[:port] = @text.split('(')[1].split('/')[0] if @text - @state[:proto] = @text.split('(')[1].split('/')[1].split(')')[0] if @text - - @text = nil - when "host" + when 'cve' + if in_tag('result') && in_tag('nvt') + @state[:has_text] = true + @state[:cves] = @text.strip if @text + end + when 'risk_factor' + if in_tag('result') && in_tag('nvt') + #we do this to clean out the buffer so to speak + #if we don't set text to nil now, the text will show up later + @state[:has_text] = true + end + when 'cvss_base' + if in_tag('result') && in_tag('nvt') + @state[:has_text] = true + end + when 'subnet' + @state[:has_text] = true + when 'result' + record_vuln if in_tag('results') + when 'threat' + @state[:has_text] = true if in_tag('ports') && in_tag('port') + when 'host' if in_tag('result') @state[:has_text] = true @state[:host] = @text.strip if @text - @text = nil - elsif in_tag('ports') - return if not in_tag('port') + elsif in_tag('ports') && in_tag('port') @state[:has_text] = true @state[:host] = @text.strip if @text - @text = nil end - when "port" + when 'port' if in_tag('result') @state[:has_text] = true - if not @text.index('(') + if @text && @text.index('(') + @state[:proto] = @text.split('(')[1].split('/')[1].gsub(/\)/, '') + @state[:port] = @text.split('(')[1].split('/')[0].gsub(/\)/, '') + elsif @text && @text.index('/') + @state[:proto] = @text.split('/')[1].strip + @state[:port] = @text.split('/')[0].strip + else @state[:proto] = nil @state[:port] = nil - @text = nil - return end - @state[:proto] = @text.split('(')[0].strip if @text - @state[:port] = @text.split('(')[1].split('/')[0].gsub(/\)/, '') if @text - @text = nil + + if @state[:port] && @state[:port] == 'general' + @state[:proto] = nil + @state[:port] = nil + end elsif in_tag('ports') - record_service + if @text && @text.index('(') + @state[:name] = @text.split(' ')[0] + @state[:port] = @text.split('(')[1].split('/')[0] + @state[:proto] = @text.split('(')[1].split('/')[1].split(')')[0] + record_service unless @state[:name].nil? + elsif @text && @text.index('/') + @state[:port] = @text.split('/')[0] + @state[:proto] = @text.split('/')[1] + record_service unless @state[:port] == 'general' + end end - when "name" - return if not in_tag("result") + when 'name' + return if not in_tag('result') @state[:has_text] = true - @text = nil + end + + if @state[:text_backup] + @text = @state[:text_backup] + @state[:text_backup] = nil else @text = nil end + @state[:current_tag].delete name end def record_vuln if (@state[:cves] and @state[:cves] == "NOCVE") and (@state[:bid] and @state[:bid] == "NOBID") @@ -151,11 +150,9 @@ end end end def record_service - return if not @state[:name] - service_info = {} service_info[:host] = @state[:host] service_info[:name] = @state[:name] service_info[:port] = @state[:port] service_info[:proto] = @state[:proto]