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.
Files changed (63) hide show
  1. data/.gitignore +4 -0
  2. data/config/test_lab.yml +11 -0
  3. data/config/test_targets.yml +21 -0
  4. data/lib/lab/controller/dynagen_controller.rb +6 -6
  5. data/lib/lab/controller/remote_esx_controller.rb +51 -51
  6. data/lib/lab/controller/remote_esxi_controller.rb +62 -0
  7. data/lib/lab/controller/remote_workstation_controller.rb +12 -12
  8. data/lib/lab/controller/virtualbox_controller.rb +16 -16
  9. data/lib/lab/controller/workstation_controller.rb +9 -9
  10. data/lib/lab/controller/workstation_vixr_controller.rb +9 -9
  11. data/lib/lab/controllers.rb +1 -3
  12. data/lib/lab/driver/dynagen_driver.rb +32 -32
  13. data/lib/lab/driver/fog_driver.rb +144 -144
  14. data/lib/lab/driver/remote_esxi_driver.rb +177 -0
  15. data/lib/lab/driver/remote_workstation_driver.rb +181 -181
  16. data/lib/lab/driver/virtualbox_driver.rb +132 -132
  17. data/lib/lab/driver/vm_driver.rb +177 -177
  18. data/lib/lab/driver/workstation_driver.rb +218 -218
  19. data/lib/lab/driver/workstation_vixr_driver.rb +108 -108
  20. data/lib/lab/drivers.rb +1 -1
  21. data/lib/lab/modifier/backtrack5_modifier.rb +8 -8
  22. data/lib/lab/modifier/dos_modifier.rb +3 -3
  23. data/lib/lab/modifier/test_modifier.rb +6 -6
  24. data/lib/lab/version.rb +1 -1
  25. data/lib/lab/vm.rb +242 -242
  26. data/lib/lab/vm_controller.rb +217 -211
  27. data/src/Gemfile +4 -0
  28. data/src/README.md +80 -0
  29. data/src/Rakefile +1 -0
  30. data/src/TODO +15 -0
  31. data/src/config/test_lab.yml +11 -0
  32. data/src/config/test_targets.yml +21 -0
  33. data/src/lab.gemspec +35 -0
  34. data/src/lib/lab.rb +2 -0
  35. data/src/lib/lab/controller/dynagen_controller.rb +14 -0
  36. data/src/lib/lab/controller/fog_controller.rb +6 -0
  37. data/src/lib/lab/controller/remote_esxi_controller.rb +62 -0
  38. data/src/lib/lab/controller/remote_workstation_controller.rb +22 -0
  39. data/src/lib/lab/controller/virtualbox_controller.rb +25 -0
  40. data/src/lib/lab/controller/vsphere_controller.rb +18 -0
  41. data/src/lib/lab/controller/workstation_controller.rb +17 -0
  42. data/src/lib/lab/controller/workstation_vixr_controller.rb +19 -0
  43. data/src/lib/lab/controllers.rb +9 -0
  44. data/src/lib/lab/driver/dynagen_driver.rb +47 -0
  45. data/src/lib/lab/driver/fog_driver.rb +104 -0
  46. data/src/lib/lab/driver/remote_esxi_driver.rb +177 -0
  47. data/src/lib/lab/driver/remote_workstation_driver.rb +197 -0
  48. data/src/lib/lab/driver/virtualbox_driver.rb +142 -0
  49. data/src/lib/lab/driver/vm_driver.rb +195 -0
  50. data/src/lib/lab/driver/vsphere_driver.rb +120 -0
  51. data/src/lib/lab/driver/workstation_driver.rb +234 -0
  52. data/src/lib/lab/driver/workstation_vixr_driver.rb +126 -0
  53. data/src/lib/lab/drivers.rb +9 -0
  54. data/src/lib/lab/modifier/backtrack5_modifier.rb +16 -0
  55. data/src/lib/lab/modifier/dos_modifier.rb +14 -0
  56. data/src/lib/lab/modifier/test_modifier.rb +16 -0
  57. data/src/lib/lab/modifiers.rb +3 -0
  58. data/src/lib/lab/version.rb +3 -0
  59. data/src/lib/lab/vm.rb +269 -0
  60. data/src/lib/lab/vm_controller.rb +275 -0
  61. data/src/test/.gitkeep +0 -0
  62. metadata +51 -12
  63. data/lib/lab/driver/remote_esx_driver.rb +0 -177
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
@@ -0,0 +1,11 @@
1
+ - vmid: backtrack
2
+ driver: workstation
3
+ location: /opt/vm/backtrack5/Backtrack5x64.vmx
4
+ modifiers:
5
+ - Test
6
+ credentials:
7
+ - user: root
8
+ pass: toor
9
+ os: linux
10
+ flavor: ubuntu
11
+ arch: 64
@@ -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
- def self.running_list
6
- raise "Unsupported"
7
- end
5
+ def self.running_list
6
+ raise "Unsupported"
7
+ end
8
8
 
9
- def self.dir_list(basepath=nil)
10
- raise "Unsupported"
11
- end
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 RemoteEsxController
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
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
- 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
-
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
- def self.running_list(user, host)
6
- user.gsub!(/(\W)*/, '')
7
- host.gsub!(/(\W)*/, '')
5
+ def self.running_list(user, host)
6
+ user.gsub!(/(\W)*/, '')
7
+ host.gsub!(/(\W)*/, '')
8
8
 
9
- remote_cmd = "ssh #{user}@#{host} \"vmrun list nogui\""
10
- vm_list = `#{remote_cmd}`.split("\n")
11
- vm_list.shift
9
+ remote_cmd = "ssh #{user}@#{host} \"vmrun list nogui\""
10
+ vm_list = `#{remote_cmd}`.split("\n")
11
+ vm_list.shift
12
12
 
13
- return vm_list
14
- end
13
+ return vm_list
14
+ end
15
15
 
16
- def self.dir_list(basepath=nil)
17
- vm_list = Find.find(basepath).select { |f| f =~ /\.vmx$/ }
18
- return vm_list
19
- end
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
- def self.running_list
6
- vm_names_and_uuids = `VBoxManage list runningvms`
7
- return vm_names_and_uuids.scan(/\"(.*)\" {.*}/).flatten
8
- end
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
- def self.config_list
11
- vm_names_and_uuids = `VBoxManage list vms`
12
- return vm_names_and_uuids.scan(/\"(.*)\" {.*}/).flatten
13
- end
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
- 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
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
- def self.running_list
6
- vm_list = `vmrun list`.split("\n")
7
- vm_list.shift
8
- return vm_list
9
- end
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
- def self.dir_list(basepath=nil)
12
- vm_list = Find.find(basepath).select { |f| f =~ /\.vmx$/ }
13
- return vm_list
14
- end
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
- def self.running_list
6
- vm_list = `vmrun list`.split("\n")
7
- vm_list.shift
5
+ def self.running_list
6
+ vm_list = `vmrun list`.split("\n")
7
+ vm_list.shift
8
8
 
9
- return vm_list
10
- end
9
+ return vm_list
10
+ end
11
11
 
12
- def self.dir_list(basepath=nil)
13
- vm_list = Find.find(basepath).select { |f| f =~ /\.vmx$/ }
12
+ def self.dir_list(basepath=nil)
13
+ vm_list = Find.find(basepath).select { |f| f =~ /\.vmx$/ }
14
14
 
15
- return vm_list
16
- end
15
+ return vm_list
16
+ end
17
17
  end
18
18
  end
19
19
  end
@@ -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/remote_esx_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
- 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
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