lab 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|