#!/usr/bin/env ruby # frozen_string_literal: true require 'pwn' require 'optparse' require 'yaml' opts = {} OptionParser.new do |options| options.banner = "USAGE: #{File.basename($PROGRAM_NAME)} [opts] " options.on('-cYPATH', '--yaml-config=YPATH', '') do |c| opts[:yaml_config] = c end options.on('-tTASK_NAME', '--task-name=TASK_NAME', '') do |t| opts[:task_name] = t end options.on('-sDIR', '--save-report-to-dir=DIR', '') do |d| opts[:report_dir] = d end options.on('-fFILTER', '--report-filter=FILTER', '') do |p| opts[:password] = p end end.parse! if opts.empty? puts `#{File.basename($PROGRAM_NAME)} --help` exit 1 end task_name = opts[:task_name] report_dir = opts[:report_dir].to_s.scrub raise "#{report_dir} Does Not Exist." unless Dir.exist?( report_dir ) yaml_config = opts[:yaml_config] raise "YAML Config Not Found: #{yaml_config}" unless File.exist?(yaml_config) yaml = YAML.load_file( yaml_config, symbolize_names: true ) username = yaml[:username] password = if yaml[:password].nil? PWN::Plugins::AuthenticationHelper.mask_password else yaml[:password].to_s.scrub end report_filter = opts[:report_filter] begin start_time = Time.now puts "Started: #{start_time}" PWN::Plugins::OpenVAS.start_task( task_name: task_name, username: username, password: password ) loop do if PWN::Plugins::OpenVAS.get_task_status( task_name: task_name, username: username, password: password ).downcase == 'done' end_time = Time.now puts "\nCompleted: #{end_time}" break end print '.' sleep 30 end end_time = Time.now duration_mins = format( '%0.2f', (end_time - start_time) / 60 ) last_report_id = PWN::Plugins::OpenVAS.last_report_id( task_name: task_name, username: username, password: password ) puts "\nLast Report ID Generated by #{task_name}: #{last_report_id}" print "Saving report in #{report_dir}..." PWN::Plugins::OpenVAS.save_report( report_type: :csv, report_id: last_report_id, report_dir: report_dir, report_filter: report_filter, username: username, password: password ) puts 'complete.' puts "Task Duration (Minutes): #{duration_mins}" rescue Interrupt puts 'CTRL+C detected...goodbye.' rescue StandardError => e raise e end