metasploit-framework/lib/lab/driver/workstation_driver.rb

189 lines
4.5 KiB
Ruby

require 'vm_driver'
##
## $Id$
##
module Lab
module Drivers
class WorkstationDriver < VmDriver
def initialize(config)
super(config)
if !File.exist?(@location)
raise ArgumentError,"Couldn't find: #{@location}"
end
end
def start
system_command("vmrun -T ws start " + "\'#{@location}\' nogui")
end
def stop
system_command("vmrun -T ws stop " + "\'#{@location}\' nogui")
end
def suspend
system_command("vmrun -T ws suspend " + "\'#{@location}\' nogui")
end
def pause
system_command("vmrun -T ws pause " + "\'#{@location}\' nogui")
end
def reset
system_command("vmrun -T ws reset " + "\'#{@location}\' nogui")
end
def create_snapshot(snapshot)
snapshot = filter_input(snapshot)
system_command("vmrun -T ws snapshot " + "\'#{@location}\' \'#{snapshot}\' nogui")
end
def revert_snapshot(snapshot)
snapshot = filter_input(snapshot)
system_command("vmrun -T ws revertToSnapshot " + "\'#{@location}\' \'#{snapshot}\' nogui")
end
def delete_snapshot(snapshot)
snapshot = filter_input(snapshot)
system_command("vmrun -T ws deleteSnapshot " + "\'#{@location}\' \'#{snapshot}\' nogui" )
end
def run_command(command)
script_rand_name = rand(10000)
if @os == "windows"
local_tempfile_path = "/tmp/lab_script_#{script_rand_name}.bat"
remote_tempfile_path = "C:\\\\lab_script_#{script_rand_name}.bat"
remote_run_command = remote_tempfile_path
else
local_tempfile_path = "/tmp/lab_script_#{script_rand_name}.sh"
remote_tempfile_path = "/tmp/lab_script_#{script_rand_name}.sh"
remote_run_command = "/bin/sh #{remote_tempfile_path}"
end
# write out our script locally
File.open(local_tempfile_path, 'w') {|f| f.write(command) }
# we really can't filter command, so we're gonna stick it in a script
if @tools
# copy our local tempfile to the guest
vmrunstr = "vmrun -T ws -gu #{@vm_user} -gp #{@vm_pass} " +
"copyFileFromHostToGuest \'#{@location}\' \'#{local_tempfile_path}\'" +
" \'#{remote_tempfile_path}\' nogui"
system_command(vmrunstr)
# now run it on the guest
vmrunstr = "vmrun -T ws -gu #{@vm_user} -gp #{@vm_pass} " +
"runProgramInGuest \'#{@location}\' -noWait -activeWindow \'#{remote_run_command}\'"
system_command(vmrunstr)
## CLEANUP
# delete it on the guest
vmrunstr = "vmrun -T ws -gu #{@vm_user} -gp #{@vm_pass} " +
"deleteFileInGuest \'#{@location}\' \'#{remote_tempfile_path}\'"
system_command(vmrunstr)
# delete it locally
local_delete_command = "rm #{local_tempfile_path}"
system_command(local_delete_command)
else
# since we can't copy easily w/o tools, let's just run it directly :/
if @os == "linux"
output_file = "/tmp/lab_command_output_#{rand(1000000)}"
scp_to(local_tempfile_path, remote_tempfile_path)
ssh_exec(remote_run_command + "> #{output_file}")
scp_from(output_file, output_file)
ssh_exec("rm #{output_file}")
ssh_exec("rm #{remote_tempfile_path}")
# Ghettohack!
string = File.open(output_file,"r").read
`rm #{output_file}`
else
raise "zomgwtfbbqnotools"
end
end
return string
end
def copy_from_guest(from, to)
from = filter_input(from)
to = filter_input(to)
if @tools
vmrunstr = "vmrun -T ws -gu \'#{@vm_user}\' -gp \'#{@vm_pass}\' copyFileFromGuestToHost " +
"\'#{@location}\' \'#{from}\' \'#{to}\'"
else
scp_from(from, to)
end
system_command(vmrunstr)
end
def copy_to_guest(from, to)
from = filter_input(from)
to = filter_input(to)
if @tools
vmrunstr = "vmrun -T ws -gu #{@vm_user} -gp #{@vm_pass} copyFileFromHostToGuest " +
"\'#{@location}\' \'#{from}\' \'#{to}\'"
system_command(vmrunstr)
else
scp_to(from, to)
end
end
def check_file_exists(file)
file = filter_input(file)
if @tools
vmrunstr = "vmrun -T ws -gu \'#{@vm_user}\' -gp \'#{@vm_pass}\' fileExistsInGuest " +
"\'#{@location}\' \'#{file}\' "
system_command(vmrunstr)
else
raise "Unsupported"
end
end
def create_directory(directory)
directory = filter_input(directory)
if @tools
vmrunstr = "vmrun -T ws -gu \'#{@vm_user}\' -gp \'#{@vm_pass}\' createDirectoryInGuest " +
" \'#{@location}\' \'#{directory}\' "
system_command(vmrunstr)
else
raise "Unsupported"
end
end
def cleanup
end
def running?
## Get running Vms
running = `vmrun list`
running_array = running.split("\n")
running_array.shift
running_array.each do |vmx|
if vmx.to_s == @location.to_s
return true
end
end
return false
end
end
end
end