-
Notifications
You must be signed in to change notification settings - Fork 4
/
generate_payloads.rb
72 lines (56 loc) · 2.21 KB
/
generate_payloads.rb
1
2
3
4
5
6
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
require 'optparse'
require 'ruby-progressbar'
require 'uri'
require 'yaml'
# Parse the options to find the callback & the target.
options = {}
OptionParser.new do |opts|
opts.banner = 'Usage: generate_payloads.rb [options]'
opts.on('-c', '--callback BASE_CALLBACK_URL', 'The BASE_CALLBACK_URL for the payloads') do |c|
options[:callback] = c
end
opts.on('-t', '--target TARGET', 'The TARGET for the payloads') do |t|
options[:target] = t
end
opts.on("-h", "--help", "Prints this help") do
puts opts
exit
end
end.parse!
# Check the required arguments.
if options[:callback].nil? || options[:target].nil?
raise OptionParser::MissingArgument.new('Missing either the callback or target. Use --help for instructions.')
end
payload_files = Dir.glob('payloads/*.yml')
payload_files.each do|filename|
# Load in the payload's YAML config.
payload_yaml = YAML.load(File.read(filename))
puts "Generating payloads for #{payload_yaml['name']}..."
# Create a new progress bar.
progress_bar = ProgressBar.create(
title: "#{payload_yaml['name']}",
total: payload_yaml['payloads'].length,
)
# Create a new output file.
output = File.open(filename.gsub('.yml', '.txt'), 'w')
# Go through each of the payload configs and convert them.
payload_yaml['payloads'].each do |payload_config|
# We support either a straight up payload or a payload config Hash.
if payload_config.is_a?(Hash)
payload = payload_config['payload']
description = (payload_config['description'].nil? ? payload : payload_config['description'])
else
payload = payload_config
description = payload
end
# Generate the query string to append to the callback URL.
query_string = "payload=#{URI::encode(description)}&target=#{URI::encode(options[:target])}"
callback_url_for_payload = "#{options[:callback]}?#{query_string}"
# Add the generated payload to the output file.
output << payload.gsub('CALLBACK_URL', callback_url_for_payload) + "\n"
# Increment the progress bar!
progress_bar.increment
end
output.close
puts "Done!"
end