Skip to content
This repository was archived by the owner on Oct 22, 2020. It is now read-only.

Commit deffe3f

Browse files
committed
Add ability to use dots in module and payload file names
1 parent 58fc9b4 commit deffe3f

File tree

4 files changed

+83
-55
lines changed

4 files changed

+83
-55
lines changed

lib/cli/auto_complete.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def refresh_autocomplete_options
2828

2929
if mod.exploit_module?
3030
opts_hash['payload'] = {}
31-
Wpxf::Payloads.payload_list.each { |p| opts_hash['payload'][p] = {} }
31+
Wpxf::Payloads.payload_list.each { |p| opts_hash['payload'][p[:name]] = {} }
3232
end
3333
end
3434

@@ -39,8 +39,8 @@ def refresh_autocomplete_options
3939
def build_cmd_list
4040
cmds = {}
4141
permitted_commands.each { |c| cmds[c] = {} }
42-
Wpxf::Auxiliary.module_list.each { |m| cmds['use'][m] = {} }
43-
Wpxf::Exploit.module_list.each { |m| cmds['use'][m] = {} }
42+
Wpxf::Auxiliary.module_list.each { |m| cmds['use'][m[:name]] = {} }
43+
Wpxf::Exploit.module_list.each { |m| cmds['use'][m[:name]] = {} }
4444
cmds['show'] = {
4545
'options' => {},
4646
'advanced' => {},

lib/cli/context.rb

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
module Cli
22
# A context which modules will be used in.
33
class Context
4-
def initialize
5-
end
6-
74
def class_name(path_name)
85
return path_name if path_name !~ /_/ && path_name =~ /[A-Z]+.*/
96
path_name.split('_').map(&:capitalize).join
@@ -14,22 +11,7 @@ def verbose?
1411
end
1512

1613
def load_module(path)
17-
match = path.match(/(auxiliary|exploit)\/(.+)/i)
18-
raise 'Invalid module path' unless match
19-
20-
type = match.captures[0]
21-
name = class_name(match.captures[1])
22-
23-
begin
24-
if type.eql? 'auxiliary'
25-
@module = Wpxf::Auxiliary.const_get(name).new
26-
elsif type.eql? 'exploit'
27-
@module = Wpxf::Exploit.const_get(name).new
28-
end
29-
rescue NameError
30-
raise 'Invalid module name'
31-
end
32-
14+
@module = Wpxf.load_module(path)
3315
@module_path = path
3416
@module
3517
end
@@ -45,19 +27,7 @@ def reload
4527
end
4628

4729
def load_payload(name)
48-
clsid = class_name(name)
49-
50-
if Wpxf::Payloads.const_defined?(clsid)
51-
payload_class = Wpxf::Payloads.const_get(clsid)
52-
if payload_class.is_a?(Class)
53-
self.module.payload = payload_class.new
54-
else
55-
fail "\"#{name}\" is not a valid payload"
56-
end
57-
else
58-
fail "\"#{name}\" is not a valid payload"
59-
end
60-
30+
self.module.payload = Wpxf::Payloads.load_payload(name)
6131
self.module.payload.check(self.module)
6232
self.module.payload
6333
end

modules/modules.rb

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,40 @@
11
module Wpxf
2-
def self.underscore(module_name)
3-
module_name.gsub(/::/, '/').
4-
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
5-
gsub(/([a-z\d])([A-Z])/,'\1_\2').
6-
tr("-", "_").
7-
downcase
2+
def self.build_module_list(namespace, id_prefix = '')
3+
modules = namespace.constants.select do |c|
4+
namespace.const_get(c).is_a? Class
5+
end
6+
7+
modules.map do |m|
8+
klass = namespace.const_get(m)
9+
filename = klass.new.method(:initialize).source_location[0]
10+
{
11+
class: klass,
12+
name: "#{id_prefix}#{File.basename(filename, '.rb')}"
13+
}
14+
end
15+
end
16+
17+
def self.load_module(name)
18+
match = name.match(/(auxiliary|exploit)\/(.+)/i)
19+
raise 'Invalid module path' unless match
20+
21+
type = match.captures[0]
22+
list = type == 'auxiliary' ? Wpxf::Auxiliary.module_list : Wpxf::Exploit.module_list
23+
24+
mod = list.find { |p| p[:name] == name }
25+
raise "\"#{name}\" is not a valid module" if mod.nil?
26+
mod[:class].new
827
end
928

1029
module Auxiliary
1130
def self.module_list
12-
modules = Wpxf::Auxiliary.constants.select do |c|
13-
Wpxf::Auxiliary.const_get(c).is_a? Class
14-
end
15-
16-
modules.map { |m| "auxiliary/#{Wpxf.underscore(m.to_s)}" }
31+
@@modules ||= Wpxf.build_module_list(Wpxf::Auxiliary, 'auxiliary/')
1732
end
1833
end
1934

2035
module Exploit
2136
def self.module_list
22-
modules = Wpxf::Exploit.constants.select do |c|
23-
Wpxf::Exploit.const_get(c).is_a? Class
24-
end
25-
26-
modules.map { |m| "exploit/#{Wpxf.underscore(m.to_s)}" }
37+
@@modules ||= Wpxf.build_module_list(Wpxf::Exploit, 'exploit/')
2738
end
2839
end
2940

@@ -37,11 +48,13 @@ def self.payload_count
3748
end
3849

3950
def self.payload_list
40-
payloads = Wpxf::Payloads.constants.select do |c|
41-
Wpxf::Payloads.const_get(c).is_a? Class
42-
end
51+
@@payloads ||= Wpxf.build_module_list(Wpxf::Payloads)
52+
end
4353

44-
payloads.map { |p| Wpxf.underscore(p.to_s) }
54+
def self.load_payload(name)
55+
payload = payload_list.find { |p| p[:name] == name }
56+
raise "\"#{name}\" is not a valid payload" if payload.nil?
57+
payload[:class].new
4558
end
4659
end
4760
end

spec/modules_spec.rb

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
require_relative 'spec_helper'
2+
require 'modules'
3+
4+
describe Wpxf do
5+
describe '.build_module_list' do
6+
it 'builds an array of hashes containing the modules for the specified namespace' do
7+
result = Wpxf.build_module_list(Wpxf::Exploit, 'exploit/')
8+
expect(result[0]).to include(:class, :name)
9+
10+
mod = result.find { |m| m[:name] == 'exploit/admin_shell_upload' }
11+
expect(mod).to_not be_nil
12+
expect(mod[:class]).to be Wpxf::Exploit::AdminShellUpload
13+
end
14+
end
15+
end
16+
17+
describe 'Wpxf::Auxiliary' do
18+
describe '.module_list' do
19+
it 'builds an array of hashes containing the auxiliary modules' do
20+
list = Wpxf::Auxiliary.module_list
21+
expect(list).to_not be_nil
22+
expect(list[0]).to include(:class, :name)
23+
end
24+
end
25+
end
26+
27+
describe 'Wpxf::Exploit' do
28+
describe '.module_list' do
29+
it 'builds an array of hashes containing the exploit modules' do
30+
list = Wpxf::Exploit.module_list
31+
expect(list).to_not be_nil
32+
expect(list[0]).to include(:class, :name)
33+
end
34+
end
35+
end
36+
37+
describe 'Wpxf::Payloads' do
38+
describe '.payload_list' do
39+
it 'builds an array of hashes containing the module payloads' do
40+
list = Wpxf::Payloads.payload_list
41+
expect(list).to_not be_nil
42+
expect(list[0]).to include(:class, :name)
43+
end
44+
end
45+
end

0 commit comments

Comments
 (0)