Update typoenum.py

This commit is contained in:
Jan Rude
2014-07-14 08:11:58 +02:00
parent 7d3561f6e7
commit f122ef2046

View File

@@ -1,369 +1,786 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
################## ChangeLog ################## ################## ChangeLog ##################
## v0.1 Prototype ## ## v0.1 Prototype ##
## v0.2 Added version search for Typo3 ## ## v0.2 Added version search for Typo3 ##
## v0.3 Added version guessing ## ## v0.3 Added version guessing ##
## v0.4 Optimized requests ## ## v0.4 Optimized requests ##
## v0.5 Added support for Typo v6.X ## ## v0.5 Added support for Typo v6.X ##
## v0.6 Added extension search ## ## v0.6 Added extension search ##
## v0.7 Added version search for extensions ## ## v0.7 Added version search for extensions ##
## v0.8 Added support for TOR Service ##
## v0.8 Added support for TOR Service ##
############################################### ###############################################
############ Version information ############## ############ Version information ##############
__version__ = "0.8"
__version__ = "0.8.1"
__program__ = "Typo-Enumerator v" + __version__ __program__ = "Typo-Enumerator v" + __version__
__description__ = 'Find out the Typo3 Version, Login-URL and Extensions' __description__ = 'Find out the Typo3 Version, Login-URL and Extensions'
__author__ = "Jan Rude" __author__ = "Jan Rude"
__licence__ = "BSD Licence" __licence__ = "BSD Licence"
__status__ = "Development" # ("Prototype", "Development", "Final") __status__ = "Development" # ("Prototype", "Development", "Final")
############################################### ###############################################
################## Imports #################### ################## Imports ####################
import os import os
import re import re
import gzip import gzip
import time import time
import socket import socket
import urllib import urllib
import urllib2 import urllib2
import requests
import argparse import argparse
import datetime import datetime
from Queue import Queue from Queue import Queue
from colorama import Fore from colorama import Fore
from os.path import isfile from os.path import isfile
from operator import itemgetter from operator import itemgetter
from threading import Thread, Lock from threading import Thread, Lock
from collections import OrderedDict from collections import OrderedDict
import xml.etree.ElementTree as ElementTree import xml.etree.ElementTree as ElementTree
############################################### ###############################################
############### Global variables ############## ############### Global variables ##############
user_agent = {'User-Agent' : None} user_agent = {'User-Agent' : None}
extension_list = [] extension_list = []
verbosity = False verbosity = False
############################################### ###############################################
# Checks the Typo version # Checks the Typo version
def check_typo_version_ChangeLog(domain): def check_typo_version_ChangeLog(domain):
global verbosity
global user_agent global user_agent
try: try:
url = urllib2.Request('http://' + domain + '/typo3_src/ChangeLog', None, user_agent) url = urllib2.Request('http://' + domain + '/typo3_src/ChangeLog', None, user_agent)
f = urllib2.urlopen(url, timeout = 3.0) f = urllib2.urlopen(url, timeout = 3.0)
changelog = f.read(200) changelog = f.read(200)
f.close() f.close()
regex = re.compile("RELEASE] Release of (.*)") regex = re.compile("RELEASE] Release of (.*)")
searchVersion = regex.search(changelog) searchVersion = regex.search(changelog)
version = searchVersion.groups() version = searchVersion.groups()
print "Typo3 Version:".ljust(32) + Fore.GREEN + version[0] + Fore.RESET print "Typo3 Version:".ljust(32) + Fore.GREEN + version[0] + Fore.RESET
print "Link to vulnerabilities:".ljust(32) + "http://www.cvedetails.com/version-search.php?vendor=&product=Typo3&version=" + version[0].split()[1] print "Link to vulnerabilities:".ljust(32) + "http://www.cvedetails.com/version-search.php?vendor=&product=Typo3&version=" + version[0].split()[1]
except Exception, e: except Exception, e:
if verbosity:
print "Typo3 Version:".ljust(32) + "first check failed, trying second one..."
check_typo_version_NEWS_TXT(domain) check_typo_version_NEWS_TXT(domain)
def check_typo_version_NEWS_TXT(domain): def check_typo_version_NEWS_TXT(domain):
global verbosity
global user_agent global user_agent
try: try:
url = urllib2.Request('http://' + domain + '/typo3_src/NEWS.txt', None, user_agent) url = urllib2.Request('http://' + domain + '/typo3_src/NEWS.txt', None, user_agent)
f = urllib2.urlopen(url, timeout = 3.0) f = urllib2.urlopen(url, timeout = 3.0)
changelog = f.read(500) changelog = f.read(500)
f.close() f.close()
regex = re.compile("This document contains information about (.*) which") regex = re.compile("This document contains information about (.*) which")
searchVersion = regex.search(changelog) searchVersion = regex.search(changelog)
version = searchVersion.groups() version = searchVersion.groups()
print "Typo3 Version:".ljust(32), Fore.GREEN + version[0] + '.XX' + Fore.RED + ' (only guessable)'+ Fore.RESET print "Typo3 Version:".ljust(32), Fore.GREEN + version[0] + '.XX' + Fore.RED + ' (only guessable)'+ Fore.RESET
print "Link to vulnerabilities:".ljust(32) + "http://www.cvedetails.com/version-search.php?vendor=&product=Typo3&version=" + version[0].split()[2] print "Link to vulnerabilities:".ljust(32) + "http://www.cvedetails.com/version-search.php?vendor=&product=Typo3&version=" + version[0].split()[2]
except: except:
if verbosity:
print "Typo3 Version:".ljust(32) + "second check failed, trying third one..."
check_typo_version_NEWS_MD(domain) check_typo_version_NEWS_MD(domain)
def check_typo_version_NEWS_MD(domain): def check_typo_version_NEWS_MD(domain):
global user_agent global user_agent
try: try:
url = urllib2.Request('http://' + domain + '/typo3_src/NEWS.md', None, user_agent) url = urllib2.Request('http://' + domain + '/typo3_src/NEWS.md', None, user_agent)
f = urllib2.urlopen(url, timeout = 3.0) f = urllib2.urlopen(url, timeout = 3.0)
changelog = f.read(80) changelog = f.read(80)
f.close() f.close()
regex = re.compile("(.*) - WHAT'S NEW") regex = re.compile("(.*) - WHAT'S NEW")
searchVersion = regex.search(changelog) searchVersion = regex.search(changelog)
version = searchVersion.groups() version = searchVersion.groups()
print "Typo3 Version:\t\t", Fore.GREEN + version[0] + '.XX' + Fore.RED + ' (only guessable)'+ Fore.RESET print "Typo3 Version:\t\t", Fore.GREEN + version[0] + '.XX' + Fore.RED + ' (only guessable)'+ Fore.RESET
print "Link to vulnerabilities:".ljust(32) + "http://www.cvedetails.com/version-search.php?vendor=&product=Typo3&version=" + version[0].split()[2] print "Link to vulnerabilities:".ljust(32) + "http://www.cvedetails.com/version-search.php?vendor=&product=Typo3&version=" + version[0].split()[2]
except: except:
print "Typo3 Version:".ljust(32) + Fore.RED + "Not found" + Fore.RESET print "Typo3 Version:".ljust(32) + Fore.RED + "Not found" + Fore.RESET
# Checks the Typo login # Checks the Typo login
def check_typo_login(domain): def check_typo_login(domain):
global user_agent global user_agent
try: try:
req = urllib2.Request('http://' + domain + '/typo3/index.php', None, user_agent)
connection = urllib2.urlopen(req) return check_main_page(domain)
response = connection.read()
return check_title(response, connection.geturl())
connection.close()
except urllib2.HTTPError, e: r = requests.get('http://' + domain + '/typo3/index.php', allow_redirects=False, timeout=8.0, headers=user_agent)
if e.code == 403:
return check_title(response, connection.geturl()) statusCode = r.status_code
elif e.code == 404:
print "Typo3 Login:".ljust(32) + Fore.RED + "Typo3 is not used on this domain" + Fore.RESET httpResponse = r.text
except urllib2.URLError, e:
print str(e.reason) if statusCode == 200:
except Exception, e:
import traceback return check_title(httpResponse, r.url)
print ('generic exception: ', traceback.format_exc())
elif (statusCode == 301) or (statusCode == 302):
location = r.headers['location']
if ("http://") in location:
new = location.split("//")
new2 = new[1].split("/")
check_typo_login(new2[0])
elif ("https://") in location:
r = requests.get(location, timeout=8.0, headers=user_agent, verify=False)
statusCode = r.status_code
httpResponse = r.text
return check_title(httpResponse, r.url)
elif statusCode == 404:
return check_main_page(domain)
else:
print "Oops! Got:".ljust(32) + str(statusCode) + ": " + str(r.raise_for_status())
except requests.exceptions.Timeout:
print Fore.RED + "Connection timed out" + Fore.RESET
except requests.exceptions.TooManyRedirects:
print Fore.RED + "Too many redirects" + Fore.RESET
except requests.exceptions.RequestException as e:
print Fore.RED + str(e) + Fore.RESET
# Checks, if URL is a Typo-Login # Checks, if URL is a Typo-Login
def check_title(httpResponse, url):
def check_title(response, url):
regex = re.compile("<title>(.*)</title>", re.IGNORECASE) regex = re.compile("<title>(.*)</title>", re.IGNORECASE)
searchTitle = regex.search(httpResponse)
searchTitle = regex.search(response)
title = searchTitle.groups()[0] title = searchTitle.groups()[0]
if 'TYPO3' in title or 'TYPO3 SVN ID:' in httpResponse:
if 'TYPO3' in title or 'TYPO3 SVN ID:' in response:
print "Typo3 Login:".ljust(32) + Fore.GREEN + url + Fore.RESET print "Typo3 Login:".ljust(32) + Fore.GREEN + url + Fore.RESET
return True return True
else: else:
print "Typo3 Login:".ljust(32) + Fore.RED + "Typo3 is not used on this domain" + Fore.RESET print "Typo3 Login:".ljust(32) + Fore.RED + "Typo3 is not used on this domain" + Fore.RESET
return False return False
# Searches for installed extensions
def check_extensions(domain, input_queue, output_queue):
global user_agent def check_main_page(domain):
global verbosity
while True: req = urllib2.Request('http://' + domain, None, user_agent)
extension = input_queue.get()
connection = urllib2.urlopen(req)
response = connection.read()
connection.close()
if 'fe_typo_user' in connection.info().getheader('Set-Cookie'):
print "Typo3 Login:".ljust(32) + Fore.GREEN + "Typo3 is used, but could not find login" + Fore.RESET
return True
else:
try: try:
regex = re.compile("This website is powered by TYPO3(.*)", re.IGNORECASE)
searchHTML = regex.search(response)
searchHTML.groups()[0]
print "Typo3 Login:".ljust(32) + Fore.GREEN + "Typo3 is used, but could not find login" + Fore.RESET
return True
except:
print "Typo3 Login:".ljust(32) + Fore.RED + "Typo3 is not used on this domain" + Fore.RESET
return False
# Searches for installed extensions
def check_extensions(domain, input_queue, output_queue):
global user_agent
global verbosity
while True:
extension = input_queue.get()
try:
req = urllib2.Request('http://' + domain + '/typo3conf/ext/' + extension + "/", None, user_agent) req = urllib2.Request('http://' + domain + '/typo3conf/ext/' + extension + "/", None, user_agent)
connection = urllib2.urlopen(req) connection = urllib2.urlopen(req)
connection.close() connection.close()
print "TEST:"
check_extension_version(domain, extension, output_queue) check_extension_version(domain, extension, output_queue)
except urllib2.HTTPError, e: except urllib2.HTTPError, e:
print "CODE:", e.code
if e.code == 403: if e.code == 403:
check_extension_version(domain, extension, output_queue) check_extension_version(domain, extension, output_queue)
elif e.code == 404: elif e.code == 404:
if verbosity: if verbosity:
output_queue.put(extension.ljust(32) + Fore.RED + "not installed" + Fore.RESET) output_queue.put(extension.ljust(32) + Fore.RED + "not installed" + Fore.RESET)
pass pass
except urllib2.URLError, e: except urllib2.URLError, e:
print "CODE:", e
print str(e.reason) print str(e.reason)
except Exception, e: except Exception, e:
import traceback import traceback
print ('generic exception: ', traceback.format_exc()) print ('generic exception: ', traceback.format_exc())
input_queue.task_done() input_queue.task_done()
# Searches for version of installed extension # Searches for version of installed extension
def check_extension_version(domain, extension, output_queue): def check_extension_version(domain, extension, output_queue):
global verbosity global verbosity
global user_agent global user_agent
try: try:
url = urllib2.Request('http://' + domain + '/typo3conf/ext/' + extension + '/ChangeLog', None, user_agent) url = urllib2.Request('http://' + domain + '/typo3conf/ext/' + extension + '/ChangeLog', None, user_agent)
connection = urllib2.urlopen(url, timeout = 15.0) connection = urllib2.urlopen(url, timeout = 15.0)
changelog = connection.read(1500) changelog = connection.read(1500)
connection.close() connection.close()
regex = re.compile("(\d{1,2}\.\d{1,2}\.[0-9][0-9]?[' '\n])") regex = re.compile("(\d{1,2}\.\d{1,2}\.[0-9][0-9]?[' '\n])")
searchVersion = regex.search(changelog) searchVersion = regex.search(changelog)
version = searchVersion.groups() version = searchVersion.groups()
output_queue.put(extension.ljust(32) + Fore.GREEN + "installed (v" + version[0].split()[0] + ")" + Fore.RESET) output_queue.put(extension.ljust(32) + Fore.GREEN + "installed (v" + version[0].split()[0] + ")" + Fore.RESET)
except: except:
try: try:
regex = re.compile("(\d{2,4}[\.\-]\d{1,2}[\.\-]\d{1,4})") regex = re.compile("(\d{2,4}[\.\-]\d{1,2}[\.\-]\d{1,4})")
searchVersion = regex.search(changelog) searchVersion = regex.search(changelog)
version = searchVersion.groups() version = searchVersion.groups()
output_queue.put(extension.ljust(32) + Fore.GREEN + "installed (last entry from " + version[0] + ")" + Fore.RESET) output_queue.put(extension.ljust(32) + Fore.GREEN + "installed (last entry from " + version[0] + ")" + Fore.RESET)
except: except:
if verbosity: if verbosity:
output_queue.put(extension.ljust(32) + Fore.GREEN + "installed" + Fore.RESET + " (could not find version)")
output_queue.put(extension.ljust(32) + Fore.GREEN + "installed" + Fore.RESET + " (no version information found)")
else: else:
output_queue.put(extension.ljust(32) + Fore.GREEN + "installed" + Fore.RESET) output_queue.put(extension.ljust(32) + Fore.GREEN + "installed" + Fore.RESET)
# Output # Output
def output_thread(q): def output_thread(q):
if q.empty(): if q.empty():
print Fore.RED + "No extensions are installed" + Fore.RESET print Fore.RED + "No extensions are installed" + Fore.RESET
else: else:
while q is not q.empty(): while q is not q.empty():
try: try:
extension = q.get() extension = q.get()
print(extension) print(extension)
q.task_done() q.task_done()
except Exception, e: except Exception, e:
print "Oops! Got:", e print "Oops! Got:", e
# Loading extensions # Loading extensions
def generate_extensions_list(top): def generate_extensions_list(top):
global extension_list global extension_list
extension = 'extensions.xml' extension = 'extensions.xml'
print "\nLoading extensions..." print "\nLoading extensions..."
if not isfile(extension): if not isfile(extension):
print(Fore.RED + "File not found: " + extension + "\nAborting..." + Fore.RESET) print(Fore.RED + "File not found: " + extension + "\nAborting..." + Fore.RESET)
sys.exit(-2) sys.exit(-2)
tree = ElementTree.parse(extension) tree = ElementTree.parse(extension)
tag_dict = tree.getroot() tag_dict = tree.getroot()
exten_Dict = {} exten_Dict = {}
for extensions in tag_dict.getchildren(): for extensions in tag_dict.getchildren():
ext = {extensions.get('extensionkey'):extensions[0].text} ext = {extensions.get('extensionkey'):extensions[0].text}
exten_Dict.update(ext) exten_Dict.update(ext)
print 'Loaded ' , len(exten_Dict), ' extensions\n' print 'Loaded ' , len(exten_Dict), ' extensions\n'
if top is not None: if top is not None:
sorted_dict = sorted(exten_Dict.iteritems(), key=lambda x: int(x[1]), reverse=True) sorted_dict = sorted(exten_Dict.iteritems(), key=lambda x: int(x[1]), reverse=True)
for i in xrange(0,top): for i in xrange(0,top):
extension_list.append(sorted_dict[i][0]) extension_list.append(sorted_dict[i][0])
else: else:
for extension_name in tag_dict: for extension_name in tag_dict:
extension_list.append(extension_name.get('extensionkey')) extension_list.append(extension_name.get('extensionkey'))
# Copy used extensions in queue # Copy used extensions in queue
def copy_extensions(input_queue): def copy_extensions(input_queue):
global extension_list global extension_list
for ext in extension_list: for ext in extension_list:
input_queue.put(ext) input_queue.put(ext)
# Progressbar # Progressbar
def dlProgress(count, blockSize, totalSize): def dlProgress(count, blockSize, totalSize):
percent = int(count*blockSize*100/totalSize) percent = int(count*blockSize*100/totalSize)
sys.stdout.write("\rDownloading extentions: " + "%d%%" % percent) sys.stdout.write("\rDownloading extentions: " + "%d%%" % percent)
sys.stdout.flush() sys.stdout.flush()
# Update function # Update function
def update(): def update():
try: try:
urllib.urlretrieve('http://ter.sitedesign.dk/ter/extensions.xml.gz', 'extensions.gz', reporthook=dlProgress) urllib.urlretrieve('http://ter.sitedesign.dk/ter/extensions.xml.gz', 'extensions.gz', reporthook=dlProgress)
inf = gzip.open('extensions.gz', 'rb') inf = gzip.open('extensions.gz', 'rb')
file_content = inf.read() file_content = inf.read()
inf.close() inf.close()
outF = file("extensions.xml", 'wb') outF = file("extensions.xml", 'wb')
outF.write(file_content) outF.write(file_content)
outF.close() outF.close()
print "\n" print "\n"
os.remove('extensions.gz') os.remove('extensions.gz')
except Exception, e: except Exception, e:
print "Oops! Got:".ljust(32), e print "Oops! Got:".ljust(32), e
# Using Privoxy and TOR for all connections # Using Privoxy and TOR for all connections
def setting_up_tor(): def setting_up_tor():
try: try:
import socks import socks
except: except:
print "The module 'SocksiPy' is not installed.\nPlease install it with: sudo apt-get install python-socksipy" print "The module 'SocksiPy' is not installed.\nPlease install it with: sudo apt-get install python-socksipy"
sys.exit(-2) sys.exit(-2)
print "Setting up proxy to Privoxy on Port 8118"
print "Checking connection to TOR through Privoxy"
socks.setdefaultproxy(socks.PROXY_TYPE_HTTP, "127.0.0.1", 8118, True) socks.setdefaultproxy(socks.PROXY_TYPE_HTTP, "127.0.0.1", 8118, True)
socket.socket = socks.socksocket socket.socket = socks.socksocket
try: try:
url = urllib2.Request('https://check.torproject.org/') url = urllib2.Request('https://check.torproject.org/')
torcheck = urllib2.urlopen(url) torcheck = urllib2.urlopen(url)
response = torcheck.read() response = torcheck.read()
torcheck.close() torcheck.close()
except: except:
print "Failed to connect to Privoxy and/or TOR!\nPlease make sure they are running and configured!\nYou can start them with:\nservice privoxy start\nservice tor start\n" print "Failed to connect to Privoxy and/or TOR!\nPlease make sure they are running and configured!\nYou can start them with:\nservice privoxy start\nservice tor start\n"
sys.exit(-2) sys.exit(-2)
try: try:
regex = re.compile('Congratulations. This browser is configured to use Tor.') regex = re.compile('Congratulations. This browser is configured to use Tor.')
searchVersion = regex.search(response) searchVersion = regex.search(response)
version = searchVersion.groups() version = searchVersion.groups()
print "Connection to TOR established" print "Connection to TOR established"
except: except:
print "It seems like TOR is not used.\nAborting...\n" print "It seems like TOR is not used.\nAborting...\n"
sys.exit(-2) sys.exit(-2)
# Starting checks # Starting checks
def start(domain, top, tor):
def start(domain, top, threads):
in_queue = Queue() in_queue = Queue()
out_queue = Queue() out_queue = Queue()
regex = re.compile("(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})") regex = re.compile("(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})")
searchIP = regex.search(domain) searchIP = regex.search(domain)
if not (searchIP is None): if not (searchIP is None):
IP = searchIP.groups()[0] IP = searchIP.groups()[0]
hostname = socket.gethostbyaddr(IP) hostname = socket.gethostbyaddr(IP)
print("\n\n[*] Check for " + domain + " (" + hostname[0] + ")") print("\n\n[*] Check for " + domain + " (" + hostname[0] + ")")
else: else:
print("\n\n[*] Check for " + domain) print("\n\n[*] Check for " + domain)
if check_typo_login(domain) is True: if check_typo_login(domain) is True:
if not extension_list: if not extension_list:
generate_extensions_list(top) generate_extensions_list(top)
check_typo_version_ChangeLog(domain) check_typo_version_ChangeLog(domain)
copy_extensions(in_queue) copy_extensions(in_queue)
print '\nChecking', in_queue.qsize(), 'Extensions:\nThis may take a while...' print '\nChecking', in_queue.qsize(), 'Extensions:\nThis may take a while...'
if tor:
threads = 2
else:
threads = 10
for i in xrange(0, threads): for i in xrange(0, threads):
t = Thread(target=check_extensions, args=(domain, in_queue, out_queue)) t = Thread(target=check_extensions, args=(domain, in_queue, out_queue))
t.daemon = True t.daemon = True
t.start() t.start()
in_queue.join() in_queue.join()
t = Thread(target=output_thread, args=(out_queue,)) t = Thread(target=output_thread, args=(out_queue,))
t.daemon = True t.daemon = True
t.start() t.start()
out_queue.join() out_queue.join()
# Main # Main
def main(argv): def main(argv):
global user_agent global user_agent
global verbosity global verbosity
parser = argparse.ArgumentParser(add_help=False, usage='typoenum.py -d DOMAIN [DOMAIN ...] | -f FILE [--user_agent USER-AGENT] [--top VALUE] [-v] [--tor]') parser = argparse.ArgumentParser(add_help=False, usage='typoenum.py -d DOMAIN [DOMAIN ...] | -f FILE [--user_agent USER-AGENT] [--top VALUE] [-v] [--tor]')
group = parser.add_mutually_exclusive_group() group = parser.add_mutually_exclusive_group()
group.add_argument('-d', '--domain', dest='domain', type=str, nargs='+') group.add_argument('-d', '--domain', dest='domain', type=str, nargs='+')
group.add_argument('-f', '--file', dest='file', help='File with a list of domains') group.add_argument('-f', '--file', dest='file', help='File with a list of domains')
group.add_argument('-u', '--update', dest='update', action='store_true',help='Get/Update the extension file') group.add_argument('-u', '--update', dest='update', action='store_true',help='Get/Update the extension file')
parser.add_argument('--user_agent', dest='user_agent', default='Mozilla/5.0', metavar='USER-AGENT (default: Mozilla/5.0)') parser.add_argument('--user_agent', dest='user_agent', default='Mozilla/5.0', metavar='USER-AGENT (default: Mozilla/5.0)')
parser.add_argument('--top', type=int, dest='top', metavar='VALUE', help='Check only most X downloaded extensions (default: all)', default=None) parser.add_argument('--top', type=int, dest='top', metavar='VALUE', help='Check only most X downloaded extensions (default: all)', default=None)
parser.add_argument("-v", "--verbose", help="increase output verbosity", action="store_true")
parser.add_argument("--tor", help="using tor for connections", action="store_true") parser.add_argument('-v', '--verbose', help='increase output verbosity', action='store_true')
parser.add_argument('--tor', help='using tor for connections', action='store_true')
parser.add_argument('-t', '--threads', dest='threads', default=10, type=int, help='(default: 10)')
args = parser.parse_args() args = parser.parse_args()
if not args.domain and not args.file and not args.update: if not args.domain and not args.file and not args.update:
parser.print_help() parser.print_help()
return True return True
if args.tor: if args.tor:
setting_up_tor() setting_up_tor()
if args.update: if args.update:
update() update()
return True return True
user_agent = {'User-Agent' : args.user_agent} user_agent = {'User-Agent' : args.user_agent}
verbosity = args.verbose verbosity = args.verbose
if args.domain and not args.file: if args.domain and not args.file:
for dom in args.domain: for dom in args.domain:
start(dom, args.top, args.tor)
start(dom, args.top, args.threads)
elif not args.domain and args.file: elif not args.domain and args.file:
if not isfile(args.file): if not isfile(args.file):
print(Fore.RED + "\nFile not found: " + args.file + "\nAborting..." + Fore.RESET) print(Fore.RED + "\nFile not found: " + args.file + "\nAborting..." + Fore.RESET)
sys.exit(-2) sys.exit(-2)
else: else:
with open(args.file, 'r') as f: with open(args.file, 'r') as f:
for line in f: for line in f:
start(line.strip(), args.top, args.tor)
start(line.strip(), args.top, args.threads)
print '\n' print '\n'
now = datetime.datetime.now() now = datetime.datetime.now()
print __program__ + ' finished at ' + now.strftime("%Y-%m-%d %H:%M:%S") + '\n' print __program__ + ' finished at ' + now.strftime("%Y-%m-%d %H:%M:%S") + '\n'
return True return True
if __name__ == "__main__": if __name__ == "__main__":
import sys import sys
print('\n' + 70*'*') print('\n' + 70*'*')
print('\t' + __program__ ) print('\t' + __program__ )
print('\t' + __description__) print('\t' + __description__)
print('\t' + '(c)2014 by ' + __author__) print('\t' + '(c)2014 by ' + __author__)
print('\t' + 'Status:\t' + __status__) print('\t' + 'Status:\t' + __status__)
print('\t' + 'For legal purposes only!') print('\t' + 'For legal purposes only!')
print(70*'*' + '\n') print(70*'*' + '\n')
sys.exit( not main( sys.argv ) ) sys.exit( not main( sys.argv ) )