104 lines
4.2 KiB
Ruby
104 lines
4.2 KiB
Ruby
#
|
|
# Copyright (c) 2006-2024 Wade Alcorn - wade@bindshell.net
|
|
# Browser Exploitation Framework (BeEF) - https://beefproject.com
|
|
# See the file 'doc/COPYING' for copying permission
|
|
#
|
|
module BeEF
|
|
module Extension
|
|
module Qrcode
|
|
module QrcodeGenerator
|
|
BeEF::API::Registrar.instance.register(BeEF::Extension::Qrcode::QrcodeGenerator, BeEF::API::Server, 'pre_http_start')
|
|
|
|
def self.pre_http_start(_http_hook_server)
|
|
require 'uri'
|
|
require 'qr4r'
|
|
|
|
fullurls = []
|
|
|
|
# get server config
|
|
configuration = BeEF::Core::Configuration.instance
|
|
beef_proto = configuration.beef_proto
|
|
beef_host = configuration.beef_host
|
|
beef_port = configuration.beef_port
|
|
|
|
# get URLs from QR config
|
|
configuration.get('beef.extension.qrcode.targets').each do |target|
|
|
# absolute URLs
|
|
if target.lines.grep(%r{^https?://}i).size.positive?
|
|
fullurls << target
|
|
# relative URLs
|
|
else
|
|
|
|
# Retrieve the list of network interfaces from BeEF::Core::Console::Banners
|
|
interfaces = BeEF::Core::Console::Banners.interfaces
|
|
|
|
# Check if the interfaces variable is nil, indicating that network interfaces are not available
|
|
if interfaces.nil?
|
|
print_error "[QR] Error: Network interfaces information is unavailable."
|
|
print_error "[QR] Error: This will be acceptable during testing."
|
|
else
|
|
# If interfaces are available, iterate over each network interface
|
|
interfaces.each do |int|
|
|
# Skip the loop iteration if the interface address is '0.0.0.0' (which generally represents all IPv4 addresses on the local machine)
|
|
next if int == '0.0.0.0'
|
|
# Construct full URLs using the network interface address, and add them to the fullurls array
|
|
# The URL is composed of the BeEF protocol, interface address, BeEF port, and the target path
|
|
fullurls << "#{beef_proto}://#{int}:#{beef_port}#{target}"
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
return unless fullurls.empty?
|
|
|
|
img_dir = 'extensions/qrcode/images'
|
|
begin
|
|
Dir.mkdir(img_dir) unless File.directory?(img_dir)
|
|
rescue StandardError
|
|
print_error "[QR] Could not create directory '#{img_dir}'"
|
|
end
|
|
|
|
data = ''
|
|
fullurls.uniq.each do |target|
|
|
fname = ('a'..'z').to_a.sample(8).join
|
|
qr_path = "#{img_dir}/#{fname}.png"
|
|
begin
|
|
Qr4r.encode(
|
|
target, qr_path, {
|
|
pixel_size: configuration.get('beef.extension.qrcode.qrsize'),
|
|
border: configuration.get('beef.extension.qrcode.qrborder')
|
|
}
|
|
)
|
|
rescue StandardError
|
|
print_error "[QR] Could not write file '#{qr_path}'"
|
|
next
|
|
end
|
|
|
|
print_debug "[QR] Wrote file '#{qr_path}'"
|
|
BeEF::Core::NetworkStack::Handlers::AssetHandler.instance.bind(
|
|
"/#{qr_path}", "/qrcode/#{fname}", 'png'
|
|
)
|
|
|
|
data += "#{beef_proto}://#{beef_host}:#{beef_port}/qrcode/#{fname}.png\n"
|
|
data += "- URL: #{target}\n"
|
|
# Google API
|
|
# url = URI::Parser.new.escape(target,Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
|
|
# w = configuration.get("beef.extension.qrcode.qrsize").to_i * 100
|
|
# h = configuration.get("beef.extension.qrcode.qrsize").to_i * 100
|
|
# data += "- Google API: https://chart.googleapis.com/chart?cht=qr&chs=#{w}x#{h}&chl=#{url}\n"
|
|
# QRServer.com
|
|
# url = URI::Parser.new.escape(target,Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
|
|
# w = configuration.get("beef.extension.qrcode.qrsize").to_i * 100
|
|
# h = configuration.get("beef.extension.qrcode.qrsize").to_i * 100
|
|
# data += "- QRServer API: https://api.qrserver.com/v1/create-qr-code/?size=#{w}x#{h}&data=#{url}\n"
|
|
end
|
|
|
|
print_info 'QR code images available:'
|
|
print_more data
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|