#!/usr/bin/ruby -w # Script hecho para Sm4rt Security Services # Por Adrian Puente Z. # Version 1.0a # # *** DESCRIPCION # Estre script busca dentro de un output grepeable de un escaneo por Nmap la # la IP de la maquina y genera un archivo con los puertos abiertos en formato # comma separated value que se puede abrir en Excel y pegar directamente en # Word. # # *** USO Y TIPS # En general es mas practico unir todos los escaneos de nmap en uno solo. # El siguiente comando funciona perfecto. # # cat *.gnmap > all.scans.gnmap # El script se puede utilizar para sacar una IP o un rango de IPs, por ejemplo # # gnmap2csv.rb 10.11.11.12 all.scans.gnmap # # Este ejemplo obtiene todas las IPs de 12 a 12[0-9], si se quiere usar para # solo una IP el siguiente ejemplo da una idea. # # gnmap2csv.rb "10.11.11.12 " all.scans.gnmap # # *** BUGS CONOCIDOS # Cuando encuentra multiples instancias de una sola IP la ultima encontrada # sera la usada en el output. # # No ha sido probado en Windows. # # *** EVOLUCION # Corregido un bug que interrumpia el parseado de los puertos cuando encontraba # un puerto abierto pero sin banner. # # Ya cuenta los puertos por IP. # # El archivo es cargado directamente a la memoria para optimizar su parseado # y ya se puede contabilizar el espacio ocupado. # # Ya cuenta las IPs parseadas. # # Se corrigio el bug de los banners con simbolos como (,),#,!,~. # # Se le integro header en el archivo csv para facilitar su interpretacion # e integracion al documento word. if ARGV.length < 2 puts "Sintaxis: gnmap2csv.rb " exit end ip = ARGV[0] archivo = ARGV[1] lineas = Array.new numline = 0 File.open( archivo , "r" ) do |infile| puts "Cargados #{File.size( archivo )} bytes" lineas = infile.grep(/Ports:/).grep(/#{ip}/) if lineas.empty? puts "Valor no encontrado o puertos no registrados." exit end puts "Encontrados #{lineas.length} hosts." lineas.each { |i| data = i.gsub( / / , '_' ).split( ' ' ) direccion = data[0].gsub( /Host:_/ , '' ).gsub( /_(.*)/ , '' ) outfile = File.open( "#{direccion}.csv" , 'w+' ) outfile.puts "#Host: #{direccion}" outfile.puts "Puerto,Protocolo,Encabezado" puertos = data[1].gsub( /Ports:_/ , '' ).gsub( /\/\// , '/' ).gsub( /\/open\// , 'AWAW' ).split( ',_' ) puertos.each { |line| columna = line.split( '/' ) if columna.length == 1 columna[1] = "sin identificar" end if columna.length < 3 columna[2] = columna[1] end cptos = columna.length outfile.puts "#{columna[0].gsub( /AWAW/ , '/' )},#{columna[1].gsub( /\?/ , '' ).gsub( /_/ , '' )},#{columna[2].gsub( /\?/ , '' ).gsub( /_/ , ' ' ).gsub( /^\ / , '' )}" } puts "Procesado #{direccion} con #{puertos.length} puertos abiertos." outfile.close } end