lab 0.1.5 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/config/test_lab.yml +11 -0
- data/config/test_targets.yml +21 -0
- data/lib/lab/controller/dynagen_controller.rb +6 -6
- data/lib/lab/controller/remote_esx_controller.rb +51 -51
- data/lib/lab/controller/remote_esxi_controller.rb +62 -0
- data/lib/lab/controller/remote_workstation_controller.rb +12 -12
- data/lib/lab/controller/virtualbox_controller.rb +16 -16
- data/lib/lab/controller/workstation_controller.rb +9 -9
- data/lib/lab/controller/workstation_vixr_controller.rb +9 -9
- data/lib/lab/controllers.rb +1 -3
- data/lib/lab/driver/dynagen_driver.rb +32 -32
- data/lib/lab/driver/fog_driver.rb +144 -144
- data/lib/lab/driver/remote_esxi_driver.rb +177 -0
- data/lib/lab/driver/remote_workstation_driver.rb +181 -181
- data/lib/lab/driver/virtualbox_driver.rb +132 -132
- data/lib/lab/driver/vm_driver.rb +177 -177
- data/lib/lab/driver/workstation_driver.rb +218 -218
- data/lib/lab/driver/workstation_vixr_driver.rb +108 -108
- data/lib/lab/drivers.rb +1 -1
- data/lib/lab/modifier/backtrack5_modifier.rb +8 -8
- data/lib/lab/modifier/dos_modifier.rb +3 -3
- data/lib/lab/modifier/test_modifier.rb +6 -6
- data/lib/lab/version.rb +1 -1
- data/lib/lab/vm.rb +242 -242
- data/lib/lab/vm_controller.rb +217 -211
- data/src/Gemfile +4 -0
- data/src/README.md +80 -0
- data/src/Rakefile +1 -0
- data/src/TODO +15 -0
- data/src/config/test_lab.yml +11 -0
- data/src/config/test_targets.yml +21 -0
- data/src/lab.gemspec +35 -0
- data/src/lib/lab.rb +2 -0
- data/src/lib/lab/controller/dynagen_controller.rb +14 -0
- data/src/lib/lab/controller/fog_controller.rb +6 -0
- data/src/lib/lab/controller/remote_esxi_controller.rb +62 -0
- data/src/lib/lab/controller/remote_workstation_controller.rb +22 -0
- data/src/lib/lab/controller/virtualbox_controller.rb +25 -0
- data/src/lib/lab/controller/vsphere_controller.rb +18 -0
- data/src/lib/lab/controller/workstation_controller.rb +17 -0
- data/src/lib/lab/controller/workstation_vixr_controller.rb +19 -0
- data/src/lib/lab/controllers.rb +9 -0
- data/src/lib/lab/driver/dynagen_driver.rb +47 -0
- data/src/lib/lab/driver/fog_driver.rb +104 -0
- data/src/lib/lab/driver/remote_esxi_driver.rb +177 -0
- data/src/lib/lab/driver/remote_workstation_driver.rb +197 -0
- data/src/lib/lab/driver/virtualbox_driver.rb +142 -0
- data/src/lib/lab/driver/vm_driver.rb +195 -0
- data/src/lib/lab/driver/vsphere_driver.rb +120 -0
- data/src/lib/lab/driver/workstation_driver.rb +234 -0
- data/src/lib/lab/driver/workstation_vixr_driver.rb +126 -0
- data/src/lib/lab/drivers.rb +9 -0
- data/src/lib/lab/modifier/backtrack5_modifier.rb +16 -0
- data/src/lib/lab/modifier/dos_modifier.rb +14 -0
- data/src/lib/lab/modifier/test_modifier.rb +16 -0
- data/src/lib/lab/modifiers.rb +3 -0
- data/src/lib/lab/version.rb +3 -0
- data/src/lib/lab/vm.rb +269 -0
- data/src/lib/lab/vm_controller.rb +275 -0
- data/src/test/.gitkeep +0 -0
- metadata +51 -12
- data/lib/lab/driver/remote_esx_driver.rb +0 -177
data/.gitignore
ADDED
data/config/test_lab.yml
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
- vmid: metasploitable
|
2
|
+
driver: workstation
|
3
|
+
location: /opt/vm/lab/user/Metasploitable/Metasploitable.vmx
|
4
|
+
tools: false
|
5
|
+
credentials:
|
6
|
+
- user: msfadmin
|
7
|
+
pass: msfadmin
|
8
|
+
- vmid: windows2000_target
|
9
|
+
driver: workstation
|
10
|
+
location: /opt/vm/lab/vuln/msf_Win2000SP4/Windows 2000 AS.vmx
|
11
|
+
tools: true
|
12
|
+
credentials:
|
13
|
+
- vmid: windowsxp_target
|
14
|
+
driver: remote_workstation
|
15
|
+
host: vmhost
|
16
|
+
user: root
|
17
|
+
location: /opt/vm/lab/vuln/msf_WinXPSP1/Windows XP Professional.vmx
|
18
|
+
tools: true
|
19
|
+
credentials:
|
20
|
+
- user: administrator
|
21
|
+
pass: administrator
|
@@ -2,13 +2,13 @@ module Lab
|
|
2
2
|
module Controllers
|
3
3
|
module DynagenController
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
def self.running_list
|
6
|
+
raise "Unsupported"
|
7
|
+
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
def self.dir_list(basepath=nil)
|
10
|
+
raise "Unsupported"
|
11
|
+
end
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -3,60 +3,60 @@
|
|
3
3
|
|
4
4
|
module Lab
|
5
5
|
module Controllers
|
6
|
-
module
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
6
|
+
module RemoteEsxiController
|
7
|
+
|
8
|
+
# Note that 3.5 was different (vmware-vim-cmd)
|
9
|
+
VIM_CMD = 'vim-cmd'.freeze
|
10
|
+
|
11
|
+
def self.dir_list(basepath=nil)
|
12
|
+
# Does this method really even make sense for esx?
|
13
|
+
return "Unsupported :("
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.running_list(user, host)
|
17
|
+
user.gsub!(/(\W)*/, '')
|
18
|
+
host.gsub!(/(\W)*/, '')
|
19
|
+
|
20
|
+
# first get all registered vms
|
21
|
+
registered_vms = self.get_vms(user, host) || []
|
22
|
+
running_vms = []
|
23
|
+
|
24
|
+
# now let's see which ones are running
|
25
|
+
# TODO: this is ghetto, would be better not to connect repeatedly
|
26
|
+
registered_vms.each do |vm|
|
27
|
+
remote_cmd = "ssh #{user}@#{host} \"#{VIM_CMD} vmsvc/power.getstate #{vm[:id]}\""
|
28
|
+
raw = `#{remote_cmd}`
|
29
|
+
running_vms << vm if raw =~ /Powered on/
|
30
|
+
end
|
31
|
+
|
32
|
+
return running_vms
|
33
|
+
end
|
34
34
|
|
35
35
|
private
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
37
|
+
def self.get_vms(user, host)
|
38
|
+
user.gsub!(/(\W)*/, '')
|
39
|
+
host.gsub!(/(\W)*/, '')
|
40
|
+
|
41
|
+
vms = [] # array of VM hashes
|
42
|
+
remote_cmd = "ssh #{user}@#{host} \"#{VIM_CMD} vmsvc/getallvms | grep ^[0-9] | sed 's/[[:blank:]]\\{3,\\}/ /g'\""
|
43
|
+
raw = `#{remote_cmd}`.split("\n")
|
44
|
+
|
45
|
+
raw.each do |line|
|
46
|
+
# So effing ghetto
|
47
|
+
id_and_name = line.split('[datastore').first
|
48
|
+
id = id_and_name.split(' ').first
|
49
|
+
|
50
|
+
## TODO - there's surely a better way to do this.
|
51
|
+
name_array = id_and_name.split(' ')
|
52
|
+
name_array.shift
|
53
|
+
name = name_array.join(' ')
|
54
|
+
vms << {:id => id, :name => name}
|
55
|
+
end
|
56
|
+
|
57
|
+
return vms
|
58
|
+
end
|
59
|
+
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# This controller was built against:
|
2
|
+
# VMware ESX Host Agent 4.1.0 build-348481
|
3
|
+
|
4
|
+
module Lab
|
5
|
+
module Controllers
|
6
|
+
module RemoteEsxiController
|
7
|
+
|
8
|
+
# Note that 3.5 was different (vmware-vim-cmd)
|
9
|
+
VIM_CMD = 'vim-cmd'.freeze
|
10
|
+
|
11
|
+
def self.dir_list(basepath=nil)
|
12
|
+
# Does this method really even make sense for esx?
|
13
|
+
return "Unsupported :("
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.running_list(user, host)
|
17
|
+
user.gsub!(/(\W)*/, '')
|
18
|
+
host.gsub!(/(\W)*/, '')
|
19
|
+
|
20
|
+
# first get all registered vms
|
21
|
+
registered_vms = self.get_vms(user, host) || []
|
22
|
+
running_vms = []
|
23
|
+
|
24
|
+
# now let's see which ones are running
|
25
|
+
# TODO: this is ghetto, would be better not to connect repeatedly
|
26
|
+
registered_vms.each do |vm|
|
27
|
+
remote_cmd = "ssh #{user}@#{host} \"#{VIM_CMD} vmsvc/power.getstate #{vm[:id]}\""
|
28
|
+
raw = `#{remote_cmd}`
|
29
|
+
running_vms << vm if raw =~ /Powered on/
|
30
|
+
end
|
31
|
+
|
32
|
+
return running_vms
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def self.get_vms(user, host)
|
38
|
+
user.gsub!(/(\W)*/, '')
|
39
|
+
host.gsub!(/(\W)*/, '')
|
40
|
+
|
41
|
+
vms = [] # array of VM hashes
|
42
|
+
remote_cmd = "ssh #{user}@#{host} \"#{VIM_CMD} vmsvc/getallvms | grep ^[0-9] | sed 's/[[:blank:]]\\{3,\\}/ /g'\""
|
43
|
+
raw = `#{remote_cmd}`.split("\n")
|
44
|
+
|
45
|
+
raw.each do |line|
|
46
|
+
# So effing ghetto
|
47
|
+
id_and_name = line.split('[datastore').first
|
48
|
+
id = id_and_name.split(' ').first
|
49
|
+
|
50
|
+
## TODO - there's surely a better way to do this.
|
51
|
+
name_array = id_and_name.split(' ')
|
52
|
+
name_array.shift
|
53
|
+
name = name_array.join(' ')
|
54
|
+
vms << {:id => id, :name => name}
|
55
|
+
end
|
56
|
+
|
57
|
+
return vms
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -2,21 +2,21 @@ module Lab
|
|
2
2
|
module Controllers
|
3
3
|
module RemoteWorkstationController
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
def self.running_list(user, host)
|
6
|
+
user.gsub!(/(\W)*/, '')
|
7
|
+
host.gsub!(/(\W)*/, '')
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
remote_cmd = "ssh #{user}@#{host} \"vmrun list nogui\""
|
10
|
+
vm_list = `#{remote_cmd}`.split("\n")
|
11
|
+
vm_list.shift
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
return vm_list
|
14
|
+
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
def self.dir_list(basepath=nil)
|
17
|
+
vm_list = Find.find(basepath).select { |f| f =~ /\.vmx$/ }
|
18
|
+
return vm_list
|
19
|
+
end
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -2,24 +2,24 @@ module Lab
|
|
2
2
|
module Controllers
|
3
3
|
module VirtualBoxController
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
def self.running_list
|
6
|
+
vm_names_and_uuids = `VBoxManage list runningvms`
|
7
|
+
return vm_names_and_uuids.scan(/\"(.*)\" {.*}/).flatten
|
8
|
+
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
def self.config_list
|
11
|
+
vm_names_and_uuids = `VBoxManage list vms`
|
12
|
+
return vm_names_and_uuids.scan(/\"(.*)\" {.*}/).flatten
|
13
|
+
end
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
15
|
+
def self.config_list_uuid
|
16
|
+
vm_names_and_uuids = `VBoxManage list vms`
|
17
|
+
return vm_names_and_uuids.scan(/\".*\" {(.*)}/).flatten
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.dir_list(basepath=nil)
|
21
|
+
vm_list = Find.find(basepath).select { |f| f =~ /\.xml$/ }
|
22
|
+
end
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -2,16 +2,16 @@ module Lab
|
|
2
2
|
module Controllers
|
3
3
|
module WorkstationController
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
def self.running_list
|
6
|
+
vm_list = `vmrun list`.split("\n")
|
7
|
+
vm_list.shift
|
8
|
+
return vm_list
|
9
|
+
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
def self.dir_list(basepath=nil)
|
12
|
+
vm_list = Find.find(basepath).select { |f| f =~ /\.vmx$/ }
|
13
|
+
return vm_list
|
14
|
+
end
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -2,18 +2,18 @@ module Lab
|
|
2
2
|
module Controllers
|
3
3
|
module WorkstationVixrController
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
def self.running_list
|
6
|
+
vm_list = `vmrun list`.split("\n")
|
7
|
+
vm_list.shift
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
return vm_list
|
10
|
+
end
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
def self.dir_list(basepath=nil)
|
13
|
+
vm_list = Find.find(basepath).select { |f| f =~ /\.vmx$/ }
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
return vm_list
|
16
|
+
end
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
data/lib/lab/controllers.rb
CHANGED
@@ -3,8 +3,6 @@ require 'controller/virtualbox_controller'
|
|
3
3
|
require 'controller/fog_controller'
|
4
4
|
require 'controller/dynagen_controller'
|
5
5
|
require 'controller/remote_workstation_controller'
|
6
|
-
require 'controller/
|
6
|
+
require 'controller/remote_esxi_controller'
|
7
7
|
#require 'controller/qemu_controller'
|
8
8
|
#require 'controller/qemudo_controller'
|
9
|
-
|
10
|
-
|
@@ -11,37 +11,37 @@ require 'vm_driver'
|
|
11
11
|
|
12
12
|
module Lab
|
13
13
|
module Drivers
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
14
|
+
class DynagenDriver < VmDriver
|
15
|
+
def initialize(config,dynagen_config)
|
16
|
+
super(config)
|
17
|
+
@running = false
|
18
|
+
@dynagen_platform = filter_command(dynagen_config['dynagen_platform'])
|
19
|
+
end
|
20
|
+
|
21
|
+
def start
|
22
|
+
# TODO - write the location-file to a temp-file
|
23
|
+
# and set the autostart property
|
24
|
+
|
25
|
+
## start background dynamips process
|
26
|
+
system_command("dynamips -H #{@dynagen_platform} &")
|
27
|
+
system_command("dynagen #{@location}")
|
28
|
+
@running = true
|
29
|
+
end
|
30
|
+
|
31
|
+
def stop
|
32
|
+
system_command("killall dynagen")
|
33
|
+
@running = false
|
34
|
+
end
|
35
|
+
|
36
|
+
def cleanup
|
37
|
+
`killall dynagen`
|
38
|
+
`killall dynamips`
|
39
|
+
@running = false
|
40
|
+
end
|
41
|
+
|
42
|
+
def running?
|
43
|
+
return @running
|
44
|
+
end
|
45
|
+
end
|
46
46
|
end
|
47
47
|
end
|