#!/usr/bin/env python 
################################################################ 
#       .___             __          _______       .___        # 
#     __| _/____ _______|  | __ ____ \   _  \    __| _/____    # 
#    / __ |\__  \\_  __ \  |/ // ___\/  /_\  \  / __ |/ __ \   # 
#   / /_/ | / __ \|  | \/    <\  \___\  \_/   \/ /_/ \  ___/   # 
#   \____ |(______/__|  |__|_ \\_____>\_____  /\_____|\____\   # 
#        \/                  \/             \/                 # 
#                   ___________   ______  _  __                # 
#                 _/ ___\_  __ \_/ __ \ \/ \/ /                # 
#                 \  \___|  | \/\  ___/\     /                 # 
#                  \___  >__|    \___  >\/\_/                  # 
#      est.2007        \/            \/   forum.darkc0de.com   # 
################################################################ 
#
# md5 MySQL Database BruteForce AllinOne python v 1.1
# python by low1z feb2009
# idea & php design froz3n @ darkc0de
#
#	This program is free software: you can redistribute it and/or modify
#	it under the terms of the GNU General Public License as published by
#	the Free Software Foundation, either version 3 of the License, or
#	(at your option) any later version.
#
#	This program is distributed in the hope that it will be useful,
#	but WITHOUT ANY WARRANTY; without even the implied warranty of
#	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#	GNU General Public License for more details
#
#	You should have received a copy of the GNU General Public License
#	along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# darkc0de Crew 
# www.darkc0de.com 
# code low1z
# 
# Greetz to 
# d3hydr8, rsauron, baltazar, inkubus, kopele
# and the rest of the Darkc0de members 

#

import MySQLdb, sys, re, md5, time

host	 = 'YOUR-MYSQLSERVER-IP-HERE'
username = 'YOUR-MYSQLUSERNAME-HERE'
password = 'YOUR-MYSQLPASSWD-HERE'
dbname   = 'md5db'

onloadDBstatus = 0
version = '1.1_feb09'

db = MySQLdb.connect(host=host, user=username, passwd=password)

def dbconnect():
	csr = db.cursor()
	return(csr)

def timer():
	now = time.localtime(time.time())
	return time.asctime(now)

def setupdb():
	csr = dbconnect()
	try:
		csr.execute("CREATE DATABASE "+dbname)
		print "Database:", dbname, "created"
	except MySQLdb.Error, e:
		print "Error %s" % (e.args[1])
		sys.exit(1)
	try:
		csr.execute("CREATE TABLE "+dbname+".data (id INT( 255 ) NOT NULL AUTO_INCREMENT ,plain TEXT NOT NULL ,md5 VARCHAR( 255 ) NOT NULL ,PRIMARY KEY ( id ) , UNIQUE ( md5 )) ENGINE = MYISAM;")
		print "Tables in db:", dbname, "created, Database ready to use!"
	except MySQLdb.Error, e:
		print "Error %s" % (e.args[1])		
		sys.exit(1)

def insertwl():
	counter = 0
	try:
		words = open(wordlist, "r")
	except(IOError):
		print "Error: check", wordlist
		sys.exit(1)
	dupes = 0
	print "Inserting Wordlist, Skipping Dupes....may take ages"
	print "\nStart :", timer()
	for word in words.read().split('\n'):
		hash = md5.new(word).hexdigest()
		counter = counter+1
		try:
			csr = dbconnect()
			csr.execute("INSERT INTO "+dbname+".data (plain, md5)VALUES ('"+str(word)+"', '"+str(hash)+"');")
		except MySQLdb.Error, e:
			dupes = dupes+1	
	print "\nDupes :", dupes
	print "\nDone  :", timer()

def statusdb():
	try:
		csr = dbconnect()
		csr.execute("SELECT COUNT(id) AS num FROM "+dbname+".data")
		dbcount = csr.fetchone()
		return dbcount[0]
		csr.close()
	except MySQLdb.Error, e:
		print "Error %s" % (e.args[1])
		sys.exit(1)

def dropdb():
	csr = dbconnect()
	try:
		csr.execute("DROP DATABASE "+dbname)
		print "Database:", dbname, "deleted"
	except MySQLdb.Error, e:
		print "Error %s" % (e.args[1])
		sys.exit(1)	

def single(sshash):
	csr = dbconnect ()
	csr.execute("SELECT plain FROM "+dbname+".data WHERE md5 = '"+sshash+"'")	
	dset = csr.fetchone()
	if dset == None:
		print sshash, " : ", "not in DB"
	else:
		print sshash, " : ", dset[0]
	csr.close()

def multi():
	try:
		sshashs = open(md5file, "r").readlines()
		for sshash in sshashs:
			sshash = sshash.replace("\n","")
			single(sshash)
	except(IOError):
		print "Check your Filepath!!\n"

def helpme():
	print "HELP - Args\n"
	print " -h / -help      |   bring up this screen"
	print " -s / -setupdb   |   initial db installation"
	print " -w / -wordlist  |   insert wordlist into db eg. -w <wordlist.txt>"
	print " -d / -dropdb    |   delete database"
	print " -ss / -single   |   search db for given hash eg. >python md5db.py -ss <hash>"
	print " -ms / - multi   |   takes a list of md5's for cracking eg. >python md5db -ms <hashfile>"
	print " -c / -count     |   count database entries\n"
print "                 _ ___     _ _     "
print "        _ __  __| | __| __| | |__  "
print "       | '  \/ _` |__ \/ _` | '_ \ "
print "       |_|_|_\__,_|___/\__,_|_.__/ "                      
print "+--------------------------------------+"
print "| + Python/MySQL Bruteforce AllinOne + |"
print "| 				       |"
print "| + md5db11.py", version, "              |"
print "| + php & concept by froz3n            |"
print "| + python by low1z         	       |"
print "| 				       |"
print "| + use -h for help		       |"
print "+--------------------------------------+\n"
if onloadDBstatus == 1:
	try:
		print "\t",statusdb(), " Sets in DB\n"
	except MySQLdb.Error, e:
		print "Error, Database is not in place, use -s option to create it"
if len(sys.argv) <= 1:
	print "\tuse -help to get options\n"
	sys.exit(1)
for arg in sys.argv[1:]:
	if arg.lower() == "-h" or arg.lower() == "-help":
		helpme()
	if arg.lower() == "-s" or arg.lower() == "-setupdb":
		setupdb()
	if arg.lower() == "-d" or arg.lower() == "-dropdb":
		dropdb()
	if arg.lower() == "-c" or arg.lower() == "-count":
		print "\t",statusdb(), " Sets in DB\n"
	if arg.lower() == "-ss" or arg.lower() == "single":
		try:
			sshash = sys.argv[2]
			if len(sshash) != 32:
				print "invalid md5 supplied, check your input!\n"
				sys.exit(1)
			single(sshash)
		except(IndexError):
			print "Error: check hash ...\n"
	if arg.lower() == "-w" or arg.lower() == "-wordlist":
		try:
			wordlist = sys.argv[2]
			insertwl()
		except(IndexError):
			print "Error: check wordlist file\n"
	if arg.lower() == "-ms" or arg.lower() == "-multi":
		try:
			md5file = sys.argv[2]
			multi()
		except(IndexError):
			print "Error: check md5 plain import file...\n"