Path: blob/master/extensions/admin_ui/controllers/authentication/authentication.rb
1154 views
#1# Copyright (c) 2006-2025 Wade Alcorn - [email protected]2# Browser Exploitation Framework (BeEF) - https://beefproject.com3# See the file 'doc/COPYING' for copying permission4#5module BeEF6module Extension7module AdminUI8module Controllers9#10# The authentication web page for BeEF.11#12class Authentication < BeEF::Extension::AdminUI::HttpController13#14# Constructor15#16def initialize17super({18'paths' => {19'/' => method(:index),20'/login' => method(:login),21'/logout' => method(:logout)22}23})2425@session = BeEF::Extension::AdminUI::Session.instance26end2728# Function managing the index web page29def index30@headers['Content-Type'] = 'text/html; charset=UTF-8'31@headers['X-Frame-Options'] = 'sameorigin'32end3334#35# Function managing the login36#37def login38username = @params['username-cfrm'] || ''39password = @params['password-cfrm'] || ''40@headers['Content-Type'] = 'application/json; charset=UTF-8'41@headers['X-Frame-Options'] = 'sameorigin'42@body = { success: false }.to_json4344config = BeEF::Core::Configuration.instance45ua_ip = config.get('beef.http.allow_reverse_proxy') ? @request.ip : @request.get_header('REMOTE_ADDR')4647# check if source IP address is permitted to authenticate48unless permitted_source?(ua_ip)49BeEF::Core::Logger.instance.register('Authentication', "IP source address (#{ua_ip}) attempted to authenticate but is not within permitted subnet.")50return51end5253# check if under brute force attack54return unless BeEF::Core::Rest.timeout?('beef.extension.admin_ui.login_fail_delay',55@session.get_auth_timestamp,56->(time) { @session.set_auth_timestamp(time) })5758# check username and password59unless username.eql?(config.get('beef.credentials.user')) && password.eql?(config.get('beef.credentials.passwd'))60BeEF::Core::Logger.instance.register('Authentication', "User with ip #{ua_ip} has failed to authenticate in the application.")61return62end6364# establish an authenticated session65@session.set_logged_in(ua_ip)66session_cookie_name = config.get('beef.extension.admin_ui.session_cookie_name') # get session cookie name67Rack::Utils.set_cookie_header!(@headers, session_cookie_name, { value: @session.get_id, path: '/', httponly: true })6869BeEF::Core::Logger.instance.register('Authentication', "User with ip #{ua_ip} has successfully authenticated in the application.")70@body = { success: true }.to_json71end7273#74# Function managing the logout75#76def logout77@body = { success: true }.to_json7879unless @session.valid_nonce?(@request)80print_error 'invalid nonce'81return82end8384unless @session.valid_session?(@request)85print_error 'invalid session'86return87end8889@headers['Content-Type'] = 'application/json; charset=UTF-8'90@headers['X-Frame-Options'] = 'sameorigin'9192# set the session to be log out93@session.set_logged_out9495# clean up UA and expire the session cookie96config = BeEF::Core::Configuration.instance97session_cookie_name = config.get('beef.extension.admin_ui.session_cookie_name') # get session cookie name98Rack::Utils.set_cookie_header!(@headers, session_cookie_name, { value: '', path: '/', httponly: true, expires: Time.now })99100ua_ip = config.get('beef.http.allow_reverse_proxy') ? @request.ip : @request.get_header('REMOTE_ADDR')101BeEF::Core::Logger.instance.register('Authentication', "User with ip #{ua_ip} has successfully logged out.")102end103104#105# Check the UI browser source IP is within the permitted subnet106#107def permitted_source?(ip)108return false unless BeEF::Filters.is_valid_ip?(ip)109110permitted_ui_subnet = BeEF::Core::Configuration.instance.get('beef.restrictions.permitted_ui_subnet')111return false if permitted_ui_subnet.nil?112return false if permitted_ui_subnet.empty?113114permitted_ui_subnet.each do |subnet|115return true if IPAddr.new(subnet).include?(ip)116end117118false119end120end121end122end123end124end125126127