commit f41579c99b825ebbfc307e1d0292796f327fbef1
parent c23980ce73e41bec5438745d5ed8d4f07ebf39df
Author: Michael Constantine Dimopoulos <31562759+MichaelDim02@users.noreply.github.com>
Date: Thu, 25 Jan 2018 16:31:42 +0000
Add files via upload
Diffstat:
| A | colloide100.py | | | 425 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 425 insertions(+), 0 deletions(-)
diff --git a/colloide100.py b/colloide100.py
@@ -0,0 +1,425 @@
+#!/usr/bin/python
+#
+# MCD's Colloide v1.0.0
+# Thessaloniki, GREECE 2017 - greekhacking.gr
+# Michael Constantine Dimopoulos
+# GNU General Public Lisence
+# Pronounced: Kow Lawd
+#
+# DO NOT USE FOR MALICIOUS PURPOSES!
+# THE DEVELOPER HAS NO RESPONSIBLITY FOR ANY DAMAGE CAUSED!
+#
+#
+# _.:' VERSION DIARY ':._
+#
+# In version 0.1:
+# Program is working!
+# In version 0.2:
+# Minor bugs fixed
+# Updated the links file
+# In version 0.3:
+# Major bug fixed
+# Minor bugs fixed as well
+# Updated the links file
+# Added option / argument parsing
+# Added legals
+# In version 0.4:
+# Minor bugs fixed
+# General stracture has been updated
+# Wordlist option added - Only links.txt could be used before this update
+# Added ASCII logo
+# Added the sexy ASCII wolf
+# In version 0.5 MAJOR RELEASE
+# Minor bugs fixed
+# Major bug fixed
+# Updated ASCII logo
+# Updated ASCII wolf
+# Program has been released to the masses!
+# In version 0.6:
+# Minor bugs fixed
+# Option to save the pages into a txt page added
+# Added some comments to help contributors read the code
+# Added a function that checks whether the URL is valid or not
+# In version 0.7:
+# One major bug fixed
+# Minor bugs fixed as well
+# In version 0.8:
+# Added colors
+# In version 0.8.5
+# Added status code next to links
+# Added more link wordlists, more specific to each language
+# In version 0.9:
+# Added status code method
+# In version 0.9.5
+# Quick robots.txt check added
+# In version 1.0.0
+# Directory option added (-f) to search inside of a particular dir
+# Fixed major bug in the status method (false status code retrieved)
+# Removed status code from the urlerror method
+# Red when unauthorized or forbidden in the status method
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+#
+# Project on GitHub:
+# http://yamechanic.com/C3vc
+# Website:
+# http://yamechanic.com/C41V
+#
+# Report bugs: anivsante2@gmail.com
+# or /issues if you use github
+#
+# # # # # # # # # # # # # # # # # # # # # # # #
+
+# MODULES / LIBRARIES:
+
+from __future__ import print_function #because some print functions print quotation marks and commas
+#SYSTEM MODULES#
+import sys
+import os
+import argparse
+#NETWORK MODULES#
+import httplib
+import socket
+import urllib2
+import requests
+from urllib2 import Request, urlopen, URLError, HTTPError
+#STYLE MODULES#
+import colorama
+from colorama import Fore, Back, Style
+
+# CODE:
+
+def banner(): #banner with logo - patorjk.com
+ print("MCD's")
+ print("_________ .__ .__ .__ .___ ")
+ print("\_ ___ \ ____ | | | | ____ |__| __| _/____ ")
+ print("/ \ \/ / _ \| | | | / _ \| |/ __ |/ __ \ ")
+ print("\ \___( <_> ) |_| |_( <_> ) / /_/ \ ___/")
+ print(" \______ /\____/|____/____/\____/|__\____ |\___ >")
+ print(" \/ \/ \/ ")
+ print("MCD's")
+ print("Colloide v 1.0.0")
+ print("Michael C. Dimopoulos 2017")
+ print("www.greekhacking.gr\n\n")
+def opts():
+ print(" --robots Check for robots.txt file")
+ print(" -u --URL The URL to the website")
+ print(" -c --content Display contents of robots.txt")
+ print(" -d --dump Dump the contents to a text file\n")
+ print(" --status Use the HTTP status code method (Faster)")
+ print(" --urlerror Use the HTTP/URL error method (More reliable)")
+ print(" -h --help Display the help panel (Shown right now)")
+ print(" -u --URL The URL to the website")
+ print(" -f --folder Directory to search in")
+ print(" -p --pages Path to the wordlist with the page names / links")
+ print(" -l --legals License & legal disclaimer")
+ print(" -s --save Save pages on a text file (name of the file)")
+ print(" -L --limit Add limit to the pages (Integer)")
+ print(" -v --verbose Show all attempts\n\n")
+def legals():
+ #License
+ print("MCD's Colloide version 1.0.0 is free software. It can be re-distributed ")
+ print("and / or modified under the terms of the GNU General Public License")
+ print("as published by the Free Software Foundation; For more information")
+ print("read the GNU General Public License that comes")
+ print("along with this program.\n\n")
+ #Disclaimer
+ print("[!] Legal Disclaimer [!]")
+ print("Information distributed by this tool may be used maliciously.")
+ print("The developer has no responsibility for any damage caused by")
+ print("this script or any unauthorized use of it.\n")
+def wolf():
+ #prints the ASCII colloide wolf
+ print(" ___________________ , ,")
+ print("[ COLLOIDE MISSION! ] |\---/| __--__")
+ print(" / [ ,:',. (`. ")
+ print(" __.-'| / | `'_. .|")
+ print(" __ ___.-' \__) | _ : () _ |")
+ print(" .-' ' : : _/ | . . |")
+ print(" / , . . _ | ':_) ,_|'")
+ print(" : ; : : _/ -- ")
+ print(" | | .' __: / ")
+ print(" | : /'----'| \ | __________")
+ print(" \ |\ | | /| |_______,-----'")
+ print(" '.'| /__,----| \ | ")
+ print("_______| /|.' '.l \\\_")
+ print(" || || '-'")
+ print(" '-''-'\n")
+def robots_check():
+ print("MCD's Colloide v1.0.0")
+ print("Report bugs: anivsante2@gmail.com")
+ print("Robots.txt check function\n")
+ print("INFO:")
+ print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
+ print("URL = ", URL)
+ robots_link = "http://"+URL+"/robots.txt"
+ robots_value = False #robots_value - if it has been found or not
+ try:
+ IP = socket.gethostbyname(URL)
+ print("IP = ", IP)
+ robot = urllib2.urlopen(robots_link)
+ print("robots = True")
+ robots_value = True
+ #robots_value - if it has been found or not
+
+ #if it encouters url error or httperror / exception robots.txt doesn't exist and it prints false
+ #WARNING: This could also mean the given URL is not correct
+ #so it is prevented like so:
+ except socket.gaierror:
+ print("[!] Incorrect URL address")
+ except URLError as e:
+ print("robots = False")
+ robots_value = False
+ except HTTPError as e:
+ print("robots = False")
+ robots_value = False
+ print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n")
+ if robots_value == True:
+ contentspage = robot.read()
+ #the content that will be dumped / displayed
+ if content:
+ print("CONTENT:")
+ print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n")
+ print(contentspage)
+ print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
+ if dump:
+ dump_name = "robots_%s.txt" % URL
+ rf = open(dump_name, "w+")
+ rf.write(str(contentspage))
+ rf.close()
+ print("\nCONTENT DUMPED AT: ", dump_name)
+
+def scan_start():
+ print(Fore.RED + Style.BRIGHT + "[!] Report bugs: anivsante2@gmail.com \n" + Style.RESET_ALL)
+ #OR https://github.com/MichaelDim02/colloide.py/issues
+ print(Fore.RED + Style.BRIGHT + "[!] Press Ctrl + C to terminate the process.\n" + Style.RESET_ALL)
+
+def check_names(infile): #Checking the path to the wordlist
+ if os.path.exists(infile):
+ if status_method:
+ banner() #calls the banner function
+ wolf() #calls the sexy ASCII wolf wallpaper
+ statusfindAdmin() #calls the function that basically does the job
+ elif error_method:
+ banner()
+ wolf()
+ findAdmin()
+ else: #in case wordlist cant be found
+ banner()
+ opts()
+ print(Fore.RED + Style.BRIGHT + "[-] Invalid path to the wordlist. File could not be found.\n" + Style.RESET_ALL)
+# THIS IS THE STATUS CODE METHOD
+def statusfindAdmin():
+ if txt:
+ tfilename = txt
+ f = open(str(tfilename) ,'w+')
+ f.write("MCD's Colloide v1.0.0\n")
+ f.write("Michel Constantine Dimopoulos\n")
+ f.write("Thessaloniki, Greece 2017\n")
+ f.write("greekhacking.gr\n")
+ print("\n")
+ scan_start()
+ try:
+ IP = socket.gethostbyname(URL)
+ print(Fore.RED + Style.BRIGHT + "[!] Attacking host: ", IP, " - ", URL, "\n" + Style.RESET_ALL)
+ if txt:
+ f.write("Attacking:\n")
+ f.write("\n")
+ f.write(str(URL))
+ f.write("\n")
+ f.write(str(IP))
+ f.write("\n\n")
+ except socket.gaierror:
+ print(Fore.RED + Style.BRIGHT + "[!] Invalid URL address. Connection could not be established;\n" + Style.RESET_ALL)
+ sys.exit(0)
+ fi = open(links,"r");
+ found = 0
+ while (found <= int(limit)):
+ try:
+ sub_link = fi.readline() #Page name
+ if not sub_link:
+ break
+ link = URL #website name
+ req_link = "http://"+link+"/"+sub_link #Final link for attempt
+ if directory:
+ req_link = "http://"+link+directory+sub_link
+ req = Request(req_link)
+ con_link = link + "/" + sub_link
+ con_ = requests.head(req_link)
+ int_status_code_ = con_.status_code
+ status_code_ = str(int_status_code_)
+ notworking = "[ATTEMPT] - "+ status_code_ + " - " + req_link
+ unauth = "[ANAUTHORIZED] - "+ status_code_+ " - " + req_link
+ forbid = "[FORBIDDEN] - " + status_code_ + " - " + req_link
+ if status_code_.startswith("4"):
+ if ver:
+ if int_status_code_ == 401:
+ print(Fore.RED + unauth.rstrip() + Style.RESET_ALL)
+ elif int_status_code_ == 403:
+ print(Fore.RED + forbid.rstrip() + Style.RESET_ALL)
+ else:
+ print(Fore.GREEN + notworking.rstrip() + Style.RESET_ALL)
+ #notworking.rstrip() So it does not print lines between attempt output line
+ #identifies links that show up HTTP error
+ else:
+ if ver != True:
+ print("[+] Link Found" + " - " + status_code_ +" -"+ " -> " + req_link + "")
+ # if verbose if off
+ if ver:
+ print("\n[+] Link Found" + " - " + status_code_ +" -"+ " -> " + req_link + "")
+ #because in verbose mode failed attempts don't have \n at the end
+ found = found + 1
+ if txt:
+ f = open(str(tfilename) ,'a')
+ f.write(req_link + "\n")
+ else:
+ pass
+ except KeyboardInterrupt:
+ print(Fore.RED + Style.BRIGHT + "\n[!] Process has been terminated - Ctrl + C has been pressed.\n" + Style.RESET_ALL)
+ if txt:
+ print("All working pages have been saved at: ", tfilename, "\n")
+ sys.exit(0)
+ if found > int(limit):
+ print(Fore.RED + Style.BRIGHT + "[!] Process has been terminated due to the limitation that has been set\n" + Style.RESET_ALL)
+ if txt:
+ print("All working pages have been saved at: ", tfilename, "\n")
+ f.close()
+# THIS IS THE HTTP/URL ERROR METHOD
+def findAdmin():
+ if txt:
+ tfilename = txt
+ f = open(str(tfilename) ,'w+')
+ f.write("MCD's Colloide v1.0.0\n")
+ f.write("Michel Constantine Dimopoulos\n")
+ f.write("Thessaloniki, Greece 2017\n")
+ f.write("greekhacking.gr\n")
+ print("\n")
+ scan_start()
+ try:
+ IP = socket.gethostbyname(URL)
+ print(Fore.RED + Style.BRIGHT + "[!] Attacking host: ", IP, " - ", URL, "\n" + Style.RESET_ALL)
+ if txt:
+ f.write("Attacking:\n")
+ f.write("\n")
+ f.write(str(URL))
+ f.write("\n")
+ f.write(str(IP))
+ f.write("\n\n")
+ except socket.gaierror:
+ print(Fore.RED + Style.BRIGHT + "[!] Invalid URL address. Connection could not be established;\n" + Style.RESET_ALL)
+ sys.exit(0)
+ fi = open(links,"r");
+ found = 0
+ while (found <= int(limit)):
+ try:
+ sub_link = fi.readline() #Page name
+ if not sub_link:
+ break
+ link = URL #website name
+ req_link = "http://"+link+"/"+sub_link #Final link for attempt
+ if directory:
+ req_link = "http://"+link+directory+sub_link
+ req = Request(req_link)
+ if ver:
+ notworking = "[ATTEMPT] - " + req_link
+ #notworking.rstrip() So it does not print lines between attempt output line
+ #identifies links that show up HTTP error
+ try:
+ response = urlopen(req)
+ except HTTPError as e:
+ if ver:
+ print(Fore.GREEN + notworking.rstrip() + Style.RESET_ALL)
+ continue
+ except URLError as e:
+ if ver:
+ print(Fore.GREEN + notworking.rstrip() + Style.RESET_ALL)
+ continue
+ else: #prints working link
+ if ver != True:
+ print("[+] Link Found" + " -> " + req_link + "")
+ # if verbose if off
+ if ver:
+ print("\n[+] Link Found" + " -> " + req_link + "")
+ #because in verbose mode failed attempts don't have \n at the end
+ found = found + 1
+ if txt:
+ f = open(str(tfilename) ,'a')
+ f.write(req_link + "\n")
+ else:
+ pass
+ except KeyboardInterrupt:
+ print(Fore.RED + Style.BRIGHT + "\n[!] Process has been terminated - Ctrl + C has been pressed.\n" + Style.RESET_ALL)
+ if txt:
+ print("All working pages have been saved at: ", tfilename, "\n")
+ sys.exit(0)
+ if found > int(limit):
+ print(Fore.RED + Style.BRIGHT + "[!] Process has been terminated due to the limitation that has been set\n" + Style.RESET_ALL)
+ if txt:
+ print("All working pages have been saved at: ", tfilename, "\n")
+
+#Argument parsing
+parser = argparse.ArgumentParser()
+parser.add_argument("--robots", action="store_true", help="Check for robots.txt file")
+parser.add_argument("-d", "--dump", action="store_true", help="Dump the contents to a text file")
+parser.add_argument("-c", "--content", action="store_true", help="Display the contents of robots.txt")
+#robots exclusive
+parser.add_argument("--status", action="store_true", help="Use the HTTP status code method")
+parser.add_argument("--urlerror", action="store_true", help="Use the HTTP/URL error method")
+parser.add_argument("-u", "--URL", help="The URL to the website")
+parser.add_argument("-f", "--folder", help="Directory to search in (must end and start with '/')")
+parser.add_argument("-p", "--pages", help="Path to the wordlist with the page names / links")
+parser.add_argument("-l", "--legals", action='store_true', help="License & legal disclaimer")
+parser.add_argument("-s", "--save", help="Save all working pages on a text file")
+parser.add_argument("-L", "--limit", help="Add limit to the pages. Integer", default="10")
+parser.add_argument("-v", "--verbose", help="Show all attempts", action="store_true")
+
+#Declaring Argument Variables
+args = parser.parse_args()
+status_method = args.status
+error_method = args.urlerror
+links = args.pages
+URL = args.URL
+directory = args.folder
+txt = args.save
+limit = args.limit
+ver = args.verbose
+#robots exclusive options / arguments
+robots = args.robots
+dump = args.dump
+content = args.content
+
+if error_method:
+ status_method = False
+ robots = False
+elif error_method == False:
+ status_method = True
+ robots = False
+elif error_method == False and status_method == False:
+ robots = True
+
+if args.URL and args.pages:
+ check_names(links)
+elif args.robots and args.URL:
+ robots_check()
+elif args.legals:
+ banner()
+ legals()
+else:
+ banner()
+ opts()
+print("Usage: python colloide100.py --[method] -u [URL] -p [WORDLIST] -s [TEXT FILE] -L [NUMBER] -v")
+print("Robots: ptyhon colloide100.py --robots -u [URL] -d -c")
+
+#
+# MCD's
+# Colloide v1.0.0
+# Can be modified
+# Can be distributed commercially
+# Can be distributed non-commercially
+# Under the terms of the GNU general public license (2007)
+# Michael Constantine Dimopoulos
+# Project on GitHub:
+# http://yamechanic.com/C3vc
+# Website:
+# http://yamechanic.com/C41V
+#
+# # # # # # # # # # # # # # # # # # # # # # # # #