#-*- coding: utf-8 -*- __module_name__ = "CrackMe" __module_version__ = "0.3 beta" __module_description__ = "X-Chat2 plugin Hashes look up." __module_author__ = "Sorcier_FXK " ##CrackMe XChat2 plugin ## Latest version here : http://project.kalkulators.org/download/xchat2_crackme_0.3.tar.gz ## Stand alone version here : http://project.kalkulators.org/ // not released at the moment ## Last update : 29 August 2011 ## All depencies are included in archive ## ## dependencies : python mhash, python phpass, pycrypto ## ## https://github.com/exavolt/python-phpass ## ## How to update 0.2.1b to 0.3 ? ## Download archive, open archive and extract xchat2_crackme.py in your /home/user/.xchat2/ ## Create those folders: ## /home/user/.xchat2/crackme/ ## /home/user/.xchat2/crackme/db/ ## /home/user/.xchat2/crackme/download/ ## /home/user/.xchat2/crackme/output/ ## ## How to install ? ## Be carefull : Automatic installation mode is only for linux package. (not released) ## Only manual installation at the moment. This plugin has tested only ## under linux (Ubuntu). Feedbacks are welcomes :) ## ## Automatic: ## Run "install.sh" with root privileges, load "xchat_crackme.py" in XChat2, ## ready. ## Manual: ## Install dependencies (phpass folder & crypto.py are in archive), copy ## "crypto.py" file and 'phpass' folder in your /usr/lib/python2.6/ directory ## (for Ubuntu) , install python-mhash & py-crypto via apt-get/aptitude ## load "xchat2_crackme.py" in XChat2, ready. Type in Xchat2 /crackme config init ## Done, you are ok. ## ## Thanks to : ## ## Yiannis, owner of md5this.com, for add his db in crackme plugin and ## maker wordlist from websites (mode /harverster grab) :) ## ## ##TODO for validate 0.4 version ## ## recode /hash with 'dynamic motor' ## add filter module ## -add filter {MD5}b64 -> hex MD5 ## -add filter {SHA}b64 -> hex sha1(pass.salt) (for soloris & linux ldap) ## ##TODO for validate 0.3 version. ## ## add password generator --> ok ## use sqlite3 for captured plaintexts & not found hashes --> in progress ## add hashlists manager --> in progress ## add MySQL module ## add new hash types for /whatis ## import to pastebin.com API --> ok ## export to pastebin.com API --> ok ## add salt support in /hash function --> ok ## add b64 encoder/decoder --> ok ## add ROT13 encoder/decoder --> ok ## add harvester to collect plaintext from any sources --> in progress ## add new charsets in /password function --> ok ## Remove old look up function, add newest at cracker.kalkulators.org API --> ok ## add lm look up support via /pwdump switch --> ok ## ##TODO for validate 0.2 version. ## ## add hash calculator --> ok ## /whatis => identification hashes module --> ok ## /len => string length --> ok ## Remplace all "syntax error" messages by "man page" --> ok ## ##TODO list for dev in 0.3 version. ## ## Bug in harvest mode with google dork ## ## ##BUG Tracker ## ## Ver Comment ## 0.2.1 bug in function /len with espace char --> Fixed ## 0.2.1 DB down crash thread --> Fixed ## 0.2.1 MD5This.com db added, see "Thanks to:" section. ## 0.2 TMTO's API's modified, don't works, --> Fixed ## 0.1 command without parameter (ie: '/ntlm') -> crash plug in --> Fixed import warnings def fxn(): warnings.warn("deprecated", DeprecationWarning) import sets with warnings.catch_warnings(): warnings.simplefilter("ignore") fxn() import xchat, urllib, urllib2, crypt, random, phpass, hashlib import base64, sqlite3, time, re, simplejson, ast from threading import Thread from crypto import HashMaker class Pastebin(object): prefix_url = 'http://pastebin.com/' subdomain_url = 'http://%s.pastebin.com/' # % paste_subdomain api_url = 'http://pastebin.com/api_public.php' paste_expire_date = ('N', '10M', '1H', '1D', '1M') paste_format = ( 'abap', 'actionscript', 'actionscript3', 'ada', 'apache', 'applescript', 'apt_sources', 'asm', 'asp', 'autoit', 'avisynth', 'bash', 'basic4gl', 'bibtex', 'blitzbasic', 'bnf', 'boo', 'bf', 'c', 'c_mac', 'cill', 'csharp', 'cpp', 'caddcl', 'cadlisp', 'cfdg', 'klonec', 'klonecpp', 'cmake', 'cobol', 'cfm', 'css', 'd', 'dcs', 'delphi', 'dff', 'div', 'dos', 'dot', 'eiffel', 'email', 'erlang', 'fo', 'fortran', 'freebasic', 'gml', 'genero', 'gettext', 'groovy', 'haskell', 'hq9plus', 'html4strict', 'idl', 'ini', 'inno', 'intercal', 'io', 'java', 'java5', 'javascript', 'kixtart', 'latex', 'lsl2', 'lisp', 'locobasic', 'lolcode', 'lotusformulas', 'lotusscript', 'lscript', 'lua', 'm68k', 'make', 'matlab', 'matlab', 'mirc', 'modula3', 'mpasm', 'mxml', 'mysql', 'text', 'nsis', 'oberon2', 'objc', 'ocaml-brief', 'ocaml', 'glsl', 'oobas', 'oracle11', 'oracle8', 'pascal', 'pawn', 'per', 'perl', 'php', 'php-brief', 'pic16', 'pixelbender', 'plsql', 'povray', 'powershell', 'progress', 'prolog', 'properties', 'providex', 'python', 'qbasic', 'rails', 'rebol', 'reg', 'robots', 'ruby', 'gnuplot', 'sas', 'scala', 'scheme', 'scilab', 'sdlbasic', 'smalltalk', 'smarty', 'sql', 'tsql', 'tcl', 'tcl', 'teraterm', 'thinbasic', 'typoscript', 'unreal', 'vbnet', 'verilog', 'vhdl', 'vim', 'visualprolog', 'vb', 'visualfoxpro', 'whitespace', 'whois', 'winbatch', 'xml', 'xorg_conf', 'xpp', 'z80' ) # Submit a code snippet to Pastebin @classmethod def submit(cls, paste_code, paste_name = None, paste_subdomain = None, paste_private = None, paste_expire_date = None, paste_format = None): # Code snippet to submit argv = { 'paste_code' : str(paste_code) } # Name of the poster if paste_name is not None: argv['paste_name'] = str(paste_name) # Custom subdomain if paste_subdomain is not None: paste_subdomain = str(paste_subdomain).strip().lower() argv['paste_subdomain'] = paste_subdomain # Is the snippet private? if paste_private is not None: argv['paste_private'] = int(bool(int(paste_private))) # Expiration for the snippet if paste_expire_date is not None: paste_expire_date = str(paste_expire_date).strip().upper() if not paste_expire_date in cls.paste_expire_date: raise ValueError, "Bad expire date: %s" % paste_expire_date # Syntax highlighting if paste_format is not None: paste_format = str(paste_format).strip().lower() if not paste_format in cls.paste_format: raise ValueError, "Bad format: %s" % paste_format argv['paste_format'] = paste_format # Make the request to the Pastebin API fd = urllib.urlopen(cls.api_url, urllib.urlencode(argv)) try: response = fd.read() finally: fd.close() del fd # Return the new snippet URL on success, raise exception on error if argv.has_key('paste_subdomain'): prefix = cls.subdomain_url % paste_subdomain else: prefix = cls.prefix_url if not response.startswith(prefix): raise RuntimeError, response return response def db_sqlite(param, data): if param[0] == 'init.config': try: start_point = ".xchat2/crackme/db/config.db" link = start_point con = sqlite3.connect(link) con.isolation_level = None cur = con.cursor() cur.execute('''create table config(output_dir text, input_dir text)''') cur.execute('''create table mod(mod_name text, mod_ver text, mod_ip text, mod_port text)''') cur.execute('''create table hashlist(h_id int,h_name text, h_type text, h_date text, h_lastup text, h_qty int, h_qty_lastup int, h_list text)''') cur.execute("""insert into config values ('.xchat2/crackme/output/', '.xchat2/crackme/download/')""") return True except: return False cur.close() if param[0] == 'init': print "[>]" + 60 * "-" print "[>] Initialization of config.db." param[0] = 'init.config' statut = db_sqlite(param, data) if statut == True: print "[>] Success ! config.db is now initialized." else: print "[>] Error ! Check your paths & rights." if param[0] == 'read.config': try: start_point = ".xchat2/crackme/db/config.db" link = start_point con = sqlite3.connect(link) con.isolation_level = None cur = con.cursor() cur.execute('''select * from config''') r_query = [] for raw in cur: for x in raw: r_query.append(x) cur.close() return r_query except: return False if param[0] == 'read.config.input_path': try: start_point = ".xchat2/crackme/db/config.db" link = start_point con = sqlite3.connect(link) con.isolation_level = None cur = con.cursor() cur.execute('''select input_dir from config''') r_query = [] for raw in cur: for x in raw: r_query.append(x) cur.close() return r_query except: return False if param[0] == 'read.hashlist.info': try: start_point = ".xchat2/crackme/db/config.db" link = start_point con = sqlite3.connect(link) con.isolation_level = None cur = con.cursor() cur.execute('''select h_name, h_type, h_date, h_lastup, h_qty, h_qty_lastup from hashlist''') r_query = [] for raw in cur: r_query.append(raw) cur.close() return r_query except: return False if param[0] == 'read.hashlist.search': try: start_point = ".xchat2/crackme/db/config.db" link = start_point con = sqlite3.connect(link) con.isolation_level = None cur = con.cursor() cur.execute('''select h_name, h_type, h_date, h_lastup, h_qty, h_qty_lastup from hashlist where h_name like "%s"''' % ('%' + data[0] + '%')) r_query = [] for raw in cur: r_query.append(raw) cur.close() return r_query except: return False if param[0] == 'write.config.output_path': try: start_point = ".xchat2/crackme/db/config.db" link = start_point con = sqlite3.connect(link) con.isolation_level = None cur = con.cursor() cur.execute('''update config set output_dir="%s"''' % data[0]) cur.close() return True except: return False if param[0] == 'write.config.input_path': try: start_point = ".xchat2/crackme/db/config.db" link = start_point con = sqlite3.connect(link) con.isolation_level = None cur = con.cursor() cur.execute('''update config set input_dir="%s"''' % data[0]) cur.close() return True except: return False if param[0] == 'write.hashlist': #try: start_point = ".xchat2/crackme/db/config.db" link = start_point con = sqlite3.connect(link) con.isolation_level = None cur = con.cursor() cur.execute('''insert into hashlist values ("%s", "%s", "%s", "%s", "%s", %s, %s, "%s")''' % (data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7])) cur.close() # return True #except: # return False if param[0] == 'read': if len(param) == 2 and param[1] == 'config': param = ['read.config'] statut = db_sqlite(param, data) return statut if len(param) == 3 and param[1] == 'config' and param[2] == 'input_path': param = ['read.config.input_path'] statut = db_sqlite(param, data) return statut if len(param) == 3 and param[1] == 'hashlist' and param[2] == 'info': param = ['read.hashlist.info'] statut = db_sqlite(param, data) return statut if len(param) == 3 and param[1] == 'hashlist' and param[2] == 'search': param = ['read.hashlist.search'] statut = db_sqlite(param, data) return statut else: print "[>] Error DB, check your paths & your rights." return False if param[0] == 'write': if len(param) == 2 and param[1] == 'hashlist': param == ['write.hashlist'] statut = db_sqlite(param, data) return statut if len(param) == 3 and param[1] == 'config' and param[2] == 'output_path': param = ['write.config.output_path'] statut = db_sqlite(param, data) return statut if len(param) == 3 and param[1] == 'config' and param[2] == 'input_path': param = ['write.config.input_path'] statut = db_sqlite(param, data) return statut else: print "[>] Error DB, check your paths & your rights." return False def run_md5(hashes): print "[>]\0034 Looking for MD5 %s...\0034" % hashes log = open('.xchat2/crackme/crackme_wl.txt', 'a+') Thread(None, md5_lookup, None, (hashes, log), {}).start() def run_ntlm(hashes): log = open('.xchat2/crackme/crackme_wl.txt', 'a+') print "[>]\0034 Looking for NTLM %s... \0034" % hashes Thread(None, ntlm_lookup, None, (hashes, log,), {}).start() def run_lm(hashes): log = open('.xchat2/crackme/crackme_wl.txt', 'a+') print "[>]\0034 Looking for LM %s... \0034" % hashes Thread(None, lm_lookup, None, (hashes, log,), {}).start() def run_sha1(hashes): log = open('.xchat2/crackme/crackme_wl.txt', 'a+') print "[>]\0034 Looking for SHA-1 %s...\0034" % hashes Thread(None, sha1_lookup, None, (hashes, log,), {}).start() def md5_lookup(hashes, log): try: f = urllib2.urlopen('http://cracker.kalkulators.org/API/md5/json/%s/' % hashes) data = ast.literal_eval(f.read()) if data['status'] == 'found': if data['website'] == 'tmto (base64 encoded string)': result = base64.b64decode(data['value']) data['website'] = 'TMTO' else: result = data['value'] print "[>] \0033[MD5] %s\0033 : %s:%s" % (data['website'],hashes, result) else: result = 'Not found' print "[>] \0033[MD5] %s\0033 : %s" % (hashes, result) if result != 'Not found': log.write(result+"\n") log.close() except: print "[>] cracker.kalkulators.org API appear down for the moment..." def sha1_lookup(hashes, log): try: f = urllib2.urlopen('http://cracker.kalkulators.org/API/sha1/json/%s/' % hashes) data = ast.literal_eval(f.read()) if data['status'] == 'found': result = data['value'] print "[>] \0033[SHA1] %s\0033 : %s:%s" % (data['website'],hashes, result) else: result = 'Not found' print "[>] \0033[SHA1] %s\0033 : %s" % (hashes, result) if result != 'Not found': log.write(result+"\n") log.close() except: print "[>] cracker.kalkulators.org API appear down for the moment..." def ntlm_lookup(hashes, log): try: f = urllib2.urlopen('http://cracker.kalkulators.org/API/ntlm/json/%s/' % hashes) data = ast.literal_eval(f.read()) if data['status'] == 'found': result = data['value'] print "[>] \0033[NTLM] %s\0033 : %s:%s" % (data['website'],hashes, result) else: result = 'Not found' print "[>] \0033[NTLM] %s\0033 : %s" % (hashes, result) if result != 'Not found': log.write(result+"\n") log.close() except: print "[>] cracker.kalkulators.org API appear down for the moment..." def lm_lookup(hashes, log): try: f = urllib2.urlopen('http://cracker.kalkulators.org/API/lm/json/%s/' % hashes) data = ast.literal_eval(f.read()) if data['status'] == 'found': result = data['value'] print "[>] \0033[LM] %s\0033 : %s:%s" % (data['website'],hashes, result) else: result = 'Not found' print "[>] \0033[LM] %s\0033: %s" % (hashes, result) if result != 'Not found': log.write(result+"\n") log.close() except: print "[>] cracker.kalkulators.org API appear down for the moment..." def crackme(word, word_eol, userdata): if len(word) == 1: print "[>]" + 60 * "-" print "[>] CrackMe Xchat2 plugin by Sorcier_FXK" print "[>] sorcierfxk@kalkulators.org" print "[>] Version : %s" % __module_version__ print "[>] Latest version here : http://project.kalkulators.org/download/xchat2_crackme_0.3.tar.gz" print "[>] Project Kalkulator's Knights" print "[>] http://project.kalkulators.org" print "[>]" print "[>] Reverse lookup" print "[>] /md5 Looking for MD5 hash on public DB's" print "[>] /ntlm Looking for NTLM hash on public DB's" print "[>] /sha1 Looking for SHA-1 hash on public DB's" print "[>] /pwdump Looking for LM/NTLM hashes on public DB's" print "[>] /pwdump Looking for LM hashes on public DB's" print "[>] /lm Looking for LM hashes on public DB's" print "[>]" print "[>] Tools" print "[>] /whatis Identify hash type" print "[>] /len Chain length" print "[>] /hash Hash calculator" print "[>] /password Generate random password" print "[>] /import Import hashlist from pastebin" print "[>] /export Export string or text file to pastebin.com" print "[>] /harvester Harvest plaintext (from file, URL...)" print "[>] /hashlist Manage your hashlists" print "[>] /b64 To encode/decode Base64 string" print "[>] /rot13 To encode/decode ROT13 string" print "[>]" print "[>] Options" print "[>] /crackme This page" print "[>] /crackme config View configuration's page" print "[>]" print "[>] MAN PAGES :" print "[>] To Man page's access, type command (ie: /hash, /ntlm...) without parameter" elif len(word) == 2 and word[1] == 'config': statut = db_sqlite(['read', 'config'], [' ']) statut = list(statut) print "[>]" + 60 * "-" print "[>] Actual configuration of CrackMe :" print "[>] Output path : %s" % statut[0] print "[>] Input path : %s" % statut[1] print "[>]" print "[>] To change your Output path type : /crackme config output_path /your/new/path/" print "[>] To change your Input path type : /crackme config input_path /your/new/path/" elif len(word) == 3 and word[1] == 'config' and word[2] == 'init': param = ['init',' '] data = [] db_sqlite(param, data) elif len(word) == 4 and word[1] == 'config' and word[2] == 'output_path': param = ['write', 'config', 'output_path'] dat = word[3] data = [] if dat[len(dat)-1] != '/': data.append(dat + '/') else: data.append(dat) statut = db_sqlite(param, data) if statut == True: print "[>] Configuration updated." else: print "[>] Error with DB." elif len(word) == 4 and word[1] == 'config' and word[2] == 'input_path': param = ['write', 'config', 'input_path'] dat = word[3] data = [] if dat[len(dat)-1] != '/': data.append(dat + '/') else: data.append(dat) statut = db_sqlite(param, data) if statut == True: print "[>] Configuration updated." else: print "[>] Error with DB." else: print "[>] Error incorrect parameter : %s" % word[1] print "[>] Type /crackme for more informations." return xchat.EAT_XCHAT def md5(word, word_eol, userdata): if len(word) > 1: hashes = word[1] Thread(None, run_md5, None, (hashes,), {}).start() else: print "[>]" + 60 * "-" print "[>] Man page : /md5" print "[>] Syntax informations : /md5 " print "[>] Looking for md5 on public db's" print "[>] Remplace by your md5 hash" print "[>]" print "[>] Kalkulator's Knight Web Cracker" print "[>] http://cracker.kalkulators.org" return xchat.EAT_XCHAT def ntlm(word, word_eol, userdata): if len(word) > 1: hashes = word[1] Thread(None, run_ntlm, None, (hashes,), {}).start() else: print "[>]" + 60 * "-" print "[>] Man page : /ntlm" print "[>] Syntax informations : /ntlm " print "[>] Looking for ntlm hash on public db's" print "[>] Remplace by your ntlm hash" print "[>]" print "[>] Kalkulator's Knight Web Cracker" print "[>] http://cracker.kalkulators.org" return xchat.EAT_XCHAT def pwdump(word, word_eol, userdata): if len(word) > 1: hashes = word[1] hashes = hashes.split(':') if len(hashes) == 2: Thread(None, run_lm, None, (hashes[0],), {}).start() Thread(None, run_ntlm, None, (hashes[1],), {}).start() else: Thread(None, run_lm, None, (hashes[0].lower(),), {}).start() else: print "[>]" + 60 * "-" print "[>] Man page : /pwdump" print "[>] Man page : /lm" print "[>] Syntax informations : /pwdump " print "[>] : /pwdump " print "[>] : /lm " print "[>] Looking for pwdump hash format on public db's" print "[>] Replace by your hashes (LM & NTLM)" print "[>] Replace by your LM hash" print "[>]" print "[>] Kalkulator's Knight Web Cracker" print "[>] http://cracker.kalkulators.org" return xchat.EAT_XCHAT def sha1(word, word_eol, userdata): if len(word) > 1: hashes = word[1] Thread(None, run_sha1, None, (hashes,), {}).start() else: print "[>]" + 60 * "-" print "[>] Man page : /sha1" print "[>] Syntax informations : /sha1 " print "[>] Looking for sha1 hash on public db's" print "[>] Remplace by your sha1 hash" print "[>]" print "[>] Kalkulator's Knight Web Cracker" print "[>] http://cracker.kalkulators.org" return xchat.EAT_XCHAT def length(word, word_eol, userdata): if len(word) > 1: hashes = word_eol[1] print "[>]" + 60 * "-" print "[>] String : %s" % hashes print "[>] length : %s" % len(hashes) else: print "[>]" + 60 * "-" print "[>] Man page : /len" print "[>] Syntax informations : /len " print "[>] To calculate length" print "[>] Your chain here" return xchat.EAT_XCHAT def edbase64(word, word_eol, userdata): if len(word) > 2: if word[1] == 'encode': print "[>]" + 60 * "-" print "[>] Base64 encoder" print "[>] String : %s" % word[2] print "[>] Encoded : %s" % base64.b64encode(word[2]) elif word[1] == 'decode': try: data = base64.b64decode(word[2]) print "[>]" + 60 * "-" print "[>] Base64 decoder" print "[>] String : %s" % word[2] print "[>] Decoded : %s" % data except: print "[>] Error, your string is not Base64 encoded" else: print "[>] Error, parameters : 'encode' or 'decode'" else: print "[>]" + 60 * "-" print "[>] Man page : /b64" print "[>] Syntax informations : /b64 " print "[>] To encode or decode string to Base64" print "[>] 'encode' or 'decode'" print "[>] Your chain here" return xchat.EAT_XCHAT def rot13(word, word_eol, userdata): if len(word) > 2: if word[1] == 'encode': print "[>]" + 60 * "-" print "[>] ROT13 encoder" print "[>] String : %s" % word_eol[2] print "[>] Encoded : %s" % word_eol[2].encode('rot13') elif word[1] == 'decode': try: data = word_eol[2].decode('rot13') print "[>]" + 60 * "-" print "[>] ROT13 decoder" print "[>] String : %s" % word_eol[2] print "[>] Decoded : %s" % data except: print "[>] Error, your string is not Base64 encoded" else: print "[>] Error, parameters : 'encode' or 'decode'" else: print "[>]" + 60 * "-" print "[>] Man page : /rot13" print "[>] Syntax informations : /rot13 " print "[>] To encode or decode string to ROT13" print "[>] 'encode' or 'decode'" print "[>] Your chain here" return xchat.EAT_XCHAT def export_data(word, word_eol, userdata): Thread(None, export_data_run, None, (word, word_eol, userdata), {}).start() return xchat.EAT_XCHAT def export_data_run(word, word_eol, userdata): if len(word) == 3: if word[1] == 'file': print "[>]" + 60 * "-" print "[>] Export to pastebin.com" try: file_in = open(word[2], 'r') data = file_in.read() try: url = Pastebin.submit(paste_code = data, paste_name = "CrackMe") print "[>] Link : %s" % url except: print "[>] Error pastebin.com down ?" except: print "[>] Error with your path/file, check your rights." else: print "[>] Error Incorect parameter." print "[>] Parameters : file" elif len(word) == 2: print "[>]" + 60 * "-" print "[>] Export to pastebin.com" try: url = Pastebin.submit(paste_code = word_eol[1], paste_name = "CrackMe") print "[>] Link : %s" % url except: print "[>] Error pastebin.com down ?" else: print "[>]" + 60 * "-" print "[>] Man page : /export" print "[>] Syntax informations : /export " print "[>] : /export " print "[>] To export string/text file to pastebin.com" print "[>] WARNING : Max size is 10Mb" print "[>] Your text" print "[>] *Optionnal* See table below" print "[>] *Optionnal* File path (ie : /media/usb1/myfile.txt)" print "[>]" print "[>] Compatible pastebin table :" print "[>] Pastebin Parameter ie" print "[>] pastebin.com - /export file /home/user/test.txt" print "[>]" print "[>] Parameters list :" print "[>] Parameter info ie" print "[>] file to specificy output path/file /export file /path/file.txt" return xchat.EAT_XCHAT def import_data(word, word_eol, userdata): Thread(None, import_data_run, None, (word, word_eol, userdata), {}).start() return xchat.EAT_XCHAT def import_data_run(word, word_eol, userdata): error_lvl = 0 ## Import from pastebin.com to .txt file (user define file name & path) if len(word) == 4: if word[1] == "pb": link = word[2].split('/') link = link[3] output_path = word[3] print "[>]" + 60 * "-" print "[>] Import from pastebin.com %s" % word[2] try: f = urllib2.urlopen('http://pastebin.com/download.php?i=%s' % link) data = f.read() if 'jkUAIOE8owUXu8UXIhRLB9oHJsWBfOgJbZzncqHoF4A' in data: error_lvl = 1 if error_lvl < 1: try: out = open(output_path, 'w') out.write(data+'\n') print "[>] Output : %s" % output_path print "[>] Import : Success" except: print "[>] Error with your path/file, check your rights." print "[>] Import : Echec !" except: print "[>] Error with your URL, maybe site down." print "[>] Import : Echec !" ## Import to pastebin.com to .txt file (with random file name) elif len(word) == 3: if word[1] == "pb": link = word[2].split('/') link = link[3] print "[>]" + 60 * "-" print "[>] Import from pastebin.com %s" % word[2] try: f = urllib2.urlopen('http://pastebin.com/download.php?i=%s' % link) data = f.read() if 'jkUAIOE8owUXu8UXIhRLB9oHJsWBfOgJbZzncqHoF4A' in data: error_lvl = 1 if error_lvl < 1: try: output_path = db_sqlite(['read', 'config', 'input_path'], [' ']) file_name = "%spb-%s.txt" % (output_path[0], link) out = open(file_name, 'w') out.write(data+'\n') print "[>] Output in your default folder : %s" % file_name print "[>] Import : Success" except: print "[>] Error with your path/file, check your rights." print "[>] Import : Echec !" except: print "[>] Error with your URL, maybe site down." print "[>] Import : Echec !" else: print "[>]" + 60 * "-" print "[>] Man page : /import" print "[>] Syntax informations : /import " print "[>] To import hashlist from pastebin of your choice." print "[>] See table below" print "[>] URL of your post" print "[>] *Optionnal* Output path (ie : /media/usb1/mypast.txt)" print "[>]" print "[>] Compatible pastebin table :" print "[>] Pastebin Parameter ie" print "[>] pastebin.com pb /importe pb" if error_lvl == 1: print "[>] Error unknow pastebin ID." return xchat.EAT_XCHAT def password(word, word_eol, userdata): charset_dico = {1:'abcdefghijklmnopqrstuvwxyz', 2:'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 3:'0123456789', 4:'abcdefghijklmnopqrstuvwxyz0123456789', 5:'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 6:'abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYZ', 7:'abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 8:'abcdefghijklmnopqrstuvwxyz0123456789!:/;.,?@=+-}])[({%&*$', 9:'abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!:/;.,?@=+-}])[({%&*$', 10:'0123456789abcdef'} if len(word) > 2: try: charset = int(word[1]) length = int(word[2]) try: multi = int(word[3]) except: multi = 1 if charset < 9 or charset > 0: charset = charset_dico[charset] print "[>]" + 60 * "-" print "[>] Charset :", charset print "[>] Length :", length result = '' for y in xrange(multi): for x in xrange(length): a = random.randint(1, len(charset)-1) result = result + charset[a] print "[>] Random password :", result result = '' except: print "[>] Parameters error, check your syntax or type /password for man page" else: print "[>]" + 60 * "-" print "[>] Man page : /password" print "[>] Syntax informations : /password " print "[>] To generate one or many random passwords." print "[>] Number of charset, see table below" print "[>] Password length" print "[>] Number of generated password, default is '1'" print "[>]" print "[>] Charsets :" print "[>] [1] Lower a -> z" print "[>] [2] Upper A -> Z" print "[>] [3] Decimal 0 -> 9" print "[>] [4] Lower + decimal a -> 9" print "[>] [5] Upper + decimal A -> 9" print "[>] [6] Lower + upper a -> Z" print "[>] [7] Lower + upper + decimal a -> A -> 9" print "[>] [8] abcdefghijklmnopqrstuvwxyz0123456789!:/;.,?@=+-}])[({%&*$" print "[>] [9] abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!:/;.,?@=+-}])[({%&*$" print "[>] [10] Hexadecimal 0 -> f" return xchat.EAT_XCHAT def hashlist(word, word_eol, userdata): if len(word) == 2: if word[1] == "info": param = ['read', 'hashlist', 'info'] data = [] statut = db_sqlite(param, data) if statut == [] or statut == False: print "[>] Error, you don't have hashlist for the moment." else: print "[>]" + 60 * "-" print "[>] List of your hashlists :" print "[>] Name Type N# full N# left Success rate" count = 0 stat = [] for x in statut: x = list(x) count = count + 1 if int(x[4]) == int(x[5]): percent = 0 stat.append(percent) else: percent = (100 / int(x[4])) * int(x[5]) stat.append(percent) print "[>] %0016s %14s %09d %09d %11.2f" % (x[0], x[1], x[4], x[5], percent) global_stat = 0 for x in stat: global_stat = global_stat + x global_stat = global_stat / count print "[>] Total hashlist : %s" % count print "[>] Total reversed : %.2f" % global_stat, "%" elif len(word) == 2 and word[1] == 'search': print "[>]" + 60 * "-" print "[>] Search hashlist :" print "[>] /hashlist search " print "[>] Remplace by you request (max 16 char)" elif len(word) == 3 and word[1] == 'search': print "[>]" + 60 * "-" print "[>] Hashlist :" print "[>] Search : %s" % word[2] if len(word[2]) > 16: print "[>] Error, 16 char maximum please." else: param = ['read', 'hashlist', 'search'] data = [] data.append(word[2]) statut = db_sqlite(param, data) if statut != []: print "[>] List of your hashlists :" print "[>] Name Type N# full N# left Success rate" count = 0 stat = [] for x in statut: x = list(x) count = count + 1 if int(x[4]) == int(x[5]): percent = 0 stat.append(percent) else: percent = (100 / int(x[4])) * int(x[5]) stat.append(percent) print "[>] %0016s %14s %09d %09d %11.2f" % (x[0], x[1], x[4], x[5], percent) global_stat = 0 for x in stat: global_stat = global_stat + x global_stat = global_stat / count print "[>] Total hashlist : %s" % count print "[>] Total reversed : %.2f" % global_stat, "%" else: print "[>] No result found." elif len(word) == 5 and word[1] == 'add': error_lvl = 0 link = word[4].split('/') link = link[3] print "[>]" + 60 * "-" print "[>] Import from pastebin.com %s" % word[3] #try: f = urllib2.urlopen('http://pastebin.com/download.php?i=%s' % link) datas = f.read() if 'jkUAIOE8owUXu8UXIhRLB9oHJsWBfOgJbZzncqHoF4A' in datas: error_lvl = 1 if error_lvl < 1: # try: data2 = datas.split('\n') param = ['write.hashlist'] ran_int = random.randint(100000, 9999999) timing = time.asctime( time.localtime(time.time())) data = [str(link)+str(ran_int), word[2], word[3], timing, timing, len(data2), len(data2), datas] statut = db_sqlite(param, data) print statut #output_path = db_sqlite(['read', 'config', 'input_path'], [' ']) #file_name = "%spb-%s.txt" % (output_path[0], link) #out = open(file_name, 'w') #out.write(data+'\n') #print "[>] Output in your default folder : %s" % file_name #print "[>] Import : Success" # except: # print "[>] Error with your path/file, check your rights." # print "[>] Import : Echec !" #except: # print "[>] Error with your URL, maybe site down." # print "[>] Import : Echec !" else: print "[>]" + 60 * "-" print "[>] Man page : /hashlist" print "[>] Syntax informations : /hashlist " print "[>] To manage your hashlists." print "[>] See table below" print "[>]" print "[>] List of parameters :" print "[>] Parameter info ie" print "[>] info Show general infos of your /hashlist info" print "[>] hashlists" print "[>] search For search hashlist /hashlist search for more info" print "[>] add_pb For add hashlist from /hashlist add_pb " print "[>] Pastebin.com" print "[>] add_file For add hashlist from /hashlist add_file " print "[>] a file" print "[>] delete Delete hashlist /hashlist delete " return xchat.EAT_XCHAT def harvester(word, word_eol, userdata): ## Thanks to Toxic (md5this.com) for grab mode ## Original source code here : http://md5this.com/wordextract.py def StripTags(text): finished = 0 while not finished: finished =1 start = text.find("<") if start >= 0: stop = text[start:].find(">") if stop >= 0: text = text[:start] + text[start+stop+1:] finished = 0 return text def grabber(min_len, max_len, target, output_file): print "[>] Retrieving Source:", target source = StripTags(urllib2.urlopen(target).read()) words = re.findall("\w+", source) words = list(sets.Set(words)) l = len(words) print "[>] Found:", l, "words" print "[>] Trimming words to length" for word in words: if not min_len <= len(word) <= max_len: words.remove(word) print "[>] Removed:", l-len(words), "words" print "[>] Writing:", len(words), "words to", output_file file = open(output_file,"a") for word in words: file.writelines(word+"\n") file.close() print "[>] Task complete" def google_api(start, query): query = urllib.urlencode({'q' : query}) url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&rsz=8&start=%s&%s' % (start, query) search_results = urllib.urlopen(url) json = simplejson.loads(search_results.read()) return json def catch_urls(json): results = json['responseData']['results'] catched_urls = [] for i in results: if i not in catched_urls: catched_urls.append(i['url']) return catched_urls def dorky(gdork): sorted_urls = [] num_cycle = 0 count = 0 while count < 1: num_cycle = num_cycle + 1 start = 0 #dork = 'back filetype:sql' json = google_api(start, gdork) #for x in json['responseData']['cursor']['pages']: # print x print "-" * 50 print "Cycle numbers : %s" % num_cycle print "Dork : %s" % gdork currentPageIndex = json['responseData']['cursor']['currentPageIndex'] print "Current page index : %s" % currentPageIndex estimatedResultCount = json['responseData']['cursor']['estimatedResultCount'] print "Result numbers : %s" % estimatedResultCount pages = json['responseData']['cursor']['pages'] num_pages = len(json['responseData']['cursor']['pages']) print "Page numbers : %s" % num_pages if num_pages > 1: catched_urls = catch_urls(json) index_num = num_pages * 7 for start in xrange(0, index_num, 8): json = google_api(start, gdork) catched_urls_tmp = catch_urls(json) catched_urls = catched_urls + catched_urls_tmp for x in catched_urls: if x not in sorted_urls: sorted_urls.append(x) print "Num catched URLs : %s" % len(sorted_urls) #for x in sorted_urls: # print x time.sleep(120) count = count + 1 if len(word) >= 5 and word[1] == 'grab': min_len = int(word[2]) max_len = int(word[3]) target = word[4] if target[:7] != 'http://': target = 'http://' + target if len(word) == 5: file_name = random.randint(100000,999999) output_file = ".xchat2/crackme/output/wl-" + str(file_name) + ".txt" else: output_file = word[5] Thread(None, grabber, None, (min_len, max_len, target, output_file,), {}).start() if len(word) == 3 and word[1] == 'dork': Thread(None, dorky, None, (word[2],), {}).start() else: print "[>]" + 60 * "-" print "[>] Man page : /harvester" print "[>] Syntax informations : /harvester " print "[>] To harvest plaintext from many sources." print "[>]" print "[>] Mode grab : To harvest plaintexts from web sites" print "[>] ie : /harvester grab " print "[>] Minumum length word" print "[>] Maximum length word" print "[>] Your web site target" print "[>] Output path & file name, if missing plugin put file in :" print "[>] /home/user/.xchat2/crackme/output/ folder" print "[>]" print "[>] Mode dork : To use Google Dork" print "[>] ie : /harvester dork " print "[>] Type your dork here (ie : filetype:sql)" return xchat.EAT_XCHAT def whatis(word, word_eol, userdata): if len(word) > 1: stat = {'md5':0, 'md4':0, 'md2':0, 'sha1':0, 'sha224':0, 'sha256':0, 'sha384':0, 'sha512':0, 'mysql3':0, 'mysql5':0, 'ntlm':0, 'md5unix':0, 'sha256unix':0, 'sha512unix':0, 'lm':0, 'md5wp':0, 'md5phpbb3':0, 'desunix':0, 'pwdump':0} hashes = word[1] def is_hexa(hashes): ishexa = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'] for x in xrange(len(hashes)): if hashes[x] not in ishexa: return False break return True def is_md(hashes): hashes_l = len(hashes) hexa = is_hexa(hashes) if hashes_l == 32 and hexa == True: stat['md5'] = stat['md5'] + 1 stat['md4'] = stat['md4'] + 1 stat['md2'] = stat['md2'] + 1 stat['ntlm'] = stat['ntlm'] + 1 stat['lm'] = stat['lm'] + 1 return True else: return False def is_sha(hashes): hashes_l = len(hashes) hexa = is_hexa(hashes) if hashes_l == 40 and hexa == True: stat['sha1'] = stat['sha1'] + 1 stat['mysql5'] = stat['mysql5'] + 1 return True if hashes_l == 56 and hexa == True: stat['sha224'] = stat['sha224'] + 1 return True if hashes_l == 64 and hexa == True: stat['sha256'] = stat['sha256'] + 1 return True if hashes_l == 96 and hexa == True: stat['sha384'] = stat['sha384'] + 1 return True if hashes_l == 128 and hexa == True: stat['sha512'] = stat['sha512'] + 1 return True else: return False def is_unix(hashes): if hashes[:3] == '$1$' and len(hashes) == 34 and len(hashes[3:11]) == 8: stat['md5unix'] = stat['md5unix'] + 1 return True if hashes[:3] == '$5$': stat['sha256unix'] = stat['sha256unix'] + 1 return True if hashes[:3] == '$6$': stat['sha512unix'] = stat['sha512unix'] + 1 return True else: return False def is_salted(hashes): hashes_l = len(hashes) hexa = is_hexa(hashes) if hashes_l == 13: if hexa == False: stat['desunix'] = stat['desunix'] + 1 return True if hashes_l == 34: if hashes[:3] == '$P$': stat['md5wp'] = stat['md5wp'] + 1 return True if hashes[:3] == '$H$': stat['md5phpbb3'] = stat['md5phpbb3'] + 1 return True else: return False else: return False def is_classic(hashes): hashes_l = len(hashes) hexa = is_hexa(hashes) if hexa == True: if len(hashes) == 16: stat['lm'] = stat['lm'] + 1 stat['mysql3'] = stat['mysql3'] + 1 return True else: return False elif hexa == False: try: check = str(hashes[:32]) + str(hashes[33:]) except: return False if len(check) == 64: stat['pwdump'] = stat['pwdump'] + 1 return True else: return False else: return False def type_md(hashes): print "[>]" + 60 * "-" print "[>] Hash : %s" % hashes print "[>] Length : 32" print "[>] Probable hash type : MD2, MD4, MD5, LM, NTLM" print "[>] Recommended tool(s) : Oclhashcat, Hashcat, Jtr, PasswordsPro, BarsWF, Cain." print "[>] You can use : /md5 %s" % hashes print "[>] You can use : /ntlm %s" % hashes def type_sha(hashes): print "[>]" + 60 * "-" print "[>] Hash : %s" % hashes print "[>] Length : %s" % len(hashes) if len(hashes) == 40: print "[>] Probable hash type : SHA1, MySQL5" print "[>] Recommanded tool(s) : Oclhashcat, Hashcat, Jtr, PasswordsPro, Cain." print "[>] You can use : /sha1 %s" % hashes if len(hashes) == 56: print "[>] Probable hash type : SHA-224" print "[>] Recommanded tool(s) : ?" if len(hashes) == 64: print "[>] Probable hash type : SHA-256" print "[>] Recommanded tool(s) : Jtr, PasswordsPro, Hashcat" if len(hashes) == 96: print "[>] Probable hash type : SHA-384" print "[>] Recommanded tool(s) : Jtr" if len(hashes) == 128: print "[>] Probable hash type : SHA-512, Whirlpool" print "[>] Recommanded tool(s) : Jtr" def type_unk(hashes): print "[>]" + 60 * "-" print "[>] Hash : %s" % hashes print "[>] Length : %s" % len(hashes) print "[>] Hexa : %s" % is_hexa(hashes) print "[>] Probable hash type : ?" print "[>] Recommanded tool(s) : ?" def type_unix(hashes): print "[>]" + 60 * "-" print "[>] Hash : %s" % hashes print "[>] Length : %s" % len(hashes) print "[>] Salt : %s" % hashes[3:11] print "[>] Salt length : %s" % len(hashes[3:11]) if hashes[:3] == '$1$': print "[>] Probable hash type : md5(unix)" print "[>] Recommanded tool(s) : Oclhashcat+, Hashcat, Jtr, PasswordsPro" if hashes[:3] == '$5$': print "[>] Probable hash type : sha256(unix)" print "[>] Recommanded tool(s) : Jtr" if hashes[:3] == '$6$': print "[>] Probable hash type : sha512(unix)" print "[>] Recommanded tool(s) : Jtr" def type_salted(hashes): print "[>]" + 60 * "-" print "[>] Hash : %s" % hashes print "[>] Length : %s" % len(hashes) if len(hashes) == 13 and is_hexa(hashes) == False: print "[>] Probable hash type : des(unix)" print "[>] Recommanded tool(s) : PasswordsPro" if len(hashes) == 34: if hashes[:3] == '$P$': print "[>] Probable hash type : PHPass, md5(wordpress)" print "[>] Recommanded tool(s) : Hashcat, Jtr, PasswordsPro" if hashes[:3] == '$H$': print "[>] Probable hash type : md5(phpbb3)" print "[>] Recommanded tool(s) : Hashcat, Jtr, PasswordsPro" def type_classic(hashes): print "[>]" + 60 * "-" print "[>] Hash : %s" % hashes print "[>] Length : %s" % len(hashes) if len(hashes) == 16: if is_hexa(hashes) == True: print "[>] Probable hash type : Mysql3 (old_password), LM" print "[>] Recommanded tool(s) : Oclhashcat, Hashcat, Jtr, PasswordsPro" if len(hashes) == 65: if hashes[32] == ':': lmntlm = hashes.split(':') print "[>] LM hash : %s" % lmntlm[0] print "[>] NTLM hash : %s" % lmntlm[1] print "[>] Probable hash type : Pwdump format, LM:NTLM" print "[>] Recommanded tool(s) : Oclhashcat, Hashcat, Jtr, PasswordsPro" ismd = is_md(hashes) issha = is_sha(hashes) isunix = is_unix(hashes) issalted = is_salted(hashes) isclassic = is_classic(hashes) #print ismd, issha, isunix, issalted, isclassic ##Only for debug #print stat ##Only for debug if ismd == True and issha == False and isunix == False and issalted == False and isclassic == False: type_md(hashes) if ismd == False and issha == True and isunix == False and issalted == False and isclassic == False: type_sha(hashes) if ismd == False and issha == False and isunix == True and issalted == False and isclassic == False: type_unix(hashes) if ismd == False and issha == False and isunix == False and issalted == True and isclassic == False: type_salted(hashes) if ismd == False and issha == False and isunix == False and issalted == False and isclassic == True: type_classic(hashes) if ismd == False and issha == False and isunix == False and issalted == False and isclassic == False: type_unk(hashes) else: print "[>]" + 60 * "-" print "[>] Man page : /whatis" print "[>] Syntax informations : /whatis " print "[>] Hash types identification" print "[>] Remplace by your unknow hash" return xchat.EAT_XCHAT def calculator(word, word_eol, userdata): Thread(None, calculator_run, None, (word, word_eol, userdata), {}).start() return xchat.EAT_XCHAT def calculator_run(word, word_eol, userdata): list_type = ['md5', 'md2', 'md4', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'ntlm', 'md5(unix)', 'sha256(unix)', 'sha512(unix)', 'crc32', 'crc32b', 'lm', 'mysql3', 'mysql5', 'haval256', 'haval224', 'haval192', 'haval160', 'haval128', 'tiger160', 'tiger128', 'tiger', 'ripemd320', 'ripemd256', 'ripemd160', 'ripemd128', 'whirlpool', 'ghost', 'snefru256', 'snefru128', 'md5(wordpress)', 'md5(pass.salt)', 'md5(salt.pass)', 'md2(pass.salt)', 'md2(salt.past)', 'md4(pass.salt)', 'md4(salt.pass)', 'sha1(pass.salt)', 'sha1(salt.pass)', 'sha224(pass.salt)', 'sha224(salt.pass)', 'sha256(pass.salt)', 'sha256(salt.pass)', 'sha384(pass.salt)', 'sha384(salt.pass)', 'sha512(pass.salt)', 'sha512(salt.pass)',] salt_list = ['md5(pass.salt)', 'md5(salt.pass)', 'md2(pass.salt)', 'md2(salt.pass)', 'md4(pass.salt)', 'md4(salt.pass)', 'sha1(pass.salt)', 'sha1(salt.pass)', 'sha224(pass.salt)', 'sha224(salt.pass)', 'sha256(pass.salt)', 'sha256(salt.pass)', 'sha384(pass.salt)', 'sha384(salt.pass)', 'sha512(pass.salt)', 'sha512(salt.pass)', ] if len(word) > 2: password = word[2] type_h = word[1] if len(word) >= 4: if type_h in salt_list: if len(word) == 4: salt = word[3] ite = 1 isint = True elif len(word) == 5: salt = word[3] ite = word[4] else: try: ite = word[3] except: ite = 1 isint = True if len(word) == 3: try: ite = word[3] except: ite = 1 isint = True if ite != 1: try: ite = int(ite) isint = True except: isint = False if type_h in list_type and isint == True: if type_h == 'lm': data = password for x in xrange(ite): data = HashMaker.lm(data) if type_h == 'mysql5': data = password for x in xrange(ite): data = HashMaker.mysql5(data) if type_h == 'mysql3': data = password for x in xrange(ite): data = HashMaker.mysql3(data) if type_h == 'whirlpool': data = password for x in xrange(ite): data = HashMaker.whirlpool(data) if type_h == 'ghost': data = password for x in xrange(ite): data = HashMaker.ghost(data) if type_h == 'snefru256': data = password for x in xrange(ite): data = HashMaker.snefru256(data) if type_h == 'snefru128': data = password for x in xrange(ite): data = HashMaker.snefru128(data) if type_h == 'crc32b': data = password for x in xrange(ite): data = HashMaker.crc32b(data) if type_h == 'crc32': data = password for x in xrange(ite): data = HashMaker.crc32(data) if type_h == 'haval256': data = password for x in xrange(ite): data = HashMaker.haval256(data) if type_h == 'haval224': data = password for x in xrange(ite): data = HashMaker.haval224(data) if type_h == 'haval192': data = password for x in xrange(ite): data = HashMaker.haval192(data) if type_h == 'haval160': data = password for x in xrange(ite): data = HashMaker.haval160(data) if type_h == 'haval128': data = password for x in xrange(ite): data = HashMaker.haval128(data) if type_h == 'tiger160': data = password for x in xrange(ite): data = HashMaker.tiger160(data) if type_h == 'tiger128': data = password for x in xrange(ite): data = HashMaker.tiger128(data) if type_h == 'tiger': data = password for x in xrange(ite): data = HashMaker.tiger(data) if type_h == 'ripemd320': data = password for x in xrange(ite): data = HashMaker.ripemd320(data) if type_h == 'ripemd256': data = password for x in xrange(ite): data = HashMaker.ripemd256(data) if type_h == 'ripemd160': data = password for x in xrange(ite): data = HashMaker.ripemd160(data) if type_h == 'ripemd128': data = password for x in xrange(ite): data = HashMaker.ripemd128(data) if type_h == 'md4': data = password for x in xrange(ite): data = HashMaker.md4(data) if type_h == 'md2': data = password for x in xrange(ite): data = HashMaker.md2(data) if type_h == 'sha512': data = password for x in xrange(ite): data = HashMaker.sha512(data) if type_h == 'sha384': data = password for x in xrange(ite): data = HashMaker.sha384(data) if type_h == 'sha256': data = password for x in xrange(ite): data = HashMaker.sha256(data) if type_h == 'sha224': data = password for x in xrange(ite): data = HashMaker.sha224(data) if type_h == 'sha1': data = password for x in xrange(ite): data = HashMaker.sha1(data) if type_h == 'md5': data = password for x in xrange(ite): data = HashMaker.md5(data) if type_h == 'md5(unix)': data = password for x in xrange(ite): salt = '$1$' chain = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' for x in xrange(8): a = random.randint(1,62) salt = salt + chain[a-1] salt = salt + '$' data = crypt.crypt(data, salt) if type_h == 'sha256(unix)': data = password for x in xrange(ite): salt = '$5$' chain = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' for x in xrange(8): a = random.randint(1,62) salt = salt + chain[a-1] salt = salt + '$' data = crypt.crypt(data, salt) if type_h == 'sha512(unix)': data = password for x in xrange(ite): salt = '$6$' chain = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' for x in xrange(8): a = random.randint(1,62) salt = salt + chain[a-1] salt = salt + '$' data = crypt.crypt(data, salt) if type_h == 'md5(wordpress)': t_hasher = phpass.PasswordHash(8, False) data = password for x in xrange(ite): data = t_hasher.hash_password(data) if type_h == 'md5(pass.salt)': data = password data = data + salt for x in xrange(ite): data = HashMaker.md5(data) print data if type_h == 'md5(salt.pass)': data = password date = salt+data for x in xrange(ite): data = HashMaker.md5(data) if type_h == 'md2(pass.salt)': data = password data = data + salt for x in xrange(ite): data = HashMaker.md2(data) if type_h == 'md2(salt.pass)': data = password date = salt+data for x in xrange(ite): data = HashMaker.md2(data) if type_h == 'md4(pass.salt)': data = password data = data + salt for x in xrange(ite): data = HashMaker.md4(data) if type_h == 'md4(salt.pass)': data = password date = salt+data for x in xrange(ite): data = HashMaker.md4(data) if type_h == 'sha1(pass.salt)': data = password data = data + salt for x in xrange(ite): data = HashMaker.sha1(data) if type_h == 'sha1(salt.pass)': data = password date = salt+data for x in xrange(ite): data = HashMaker.sha1(data) if type_h == 'sha224(pass.salt)': data = password data = data + salt for x in xrange(ite): data = HashMaker.sha224(data) if type_h == 'sha224(salt.pass)': data = password date = salt+data for x in xrange(ite): data = HashMaker.sha224(data) if type_h == 'sha256(pass.salt)': data = password data = data + salt for x in xrange(ite): data = HashMaker.sha256(data) if type_h == 'sha256(salt.pass)': data = password date = salt+data for x in xrange(ite): data = HashMaker.sha256(data) if type_h == 'sha384(pass.salt)': data = password data = data + salt for x in xrange(ite): data = HashMaker.sha384(data) if type_h == 'sha384(salt.pass)': data = password date = salt+data for x in xrange(ite): data = HashMaker.sha384(data) if type_h == 'sha512(pass.salt)': data = password data = data + salt for x in xrange(ite): data = HashMaker.sha512(data) if type_h == 'sha512(salt.pass)': data = password date = salt+data for x in xrange(ite): data = HashMaker.sha512(data) if type_h == 'ntlm': data = password for x in xrange(ite): data = hashlib.new('md4', data.encode('utf-16le')).hexdigest() print "[>]" + 60 * "-" print "[>] String : %s" % password if type_h in salt_list: print "[>] Salt : %s" % salt print "[>] Type : %s" % type_h print "[>] Round(s) : %s" % ite print "[>] Hash : %s" % data elif isint == True: print "[>]" + 60 * "-" print "[>] \0034Syntax error, unknow hash type\0034 %s" % type_h print "[>] Complet information here : /hash" else: print "[>]" + 60 * "-" print "[>] \0034Syntax error, unknow round value\0034 %s" % ite print "[>] Complet information here : /hash" else: print "[>]" + 60 * "-" print "[>] Man page : /hash" print "[>] Syntax informations : /hash " print "[>] To calculate hash" print "[>] : anyone in the Type list" print "[>] : Type your chain here" print "[>] : Round numbers" print "[>] : ie: (simple md5 aka md5() ) /hash md5 my_password" print "[>] : (triple md5 aka md5(md5(md5))) ) /hash md5 my_password 3" print "[>] Type list :" print "[>] crc32, crc32b, ghost, haval128, haval160, haval192, haval224," print "[>] haval256, lm,md2, md4, md5, md5(unix), ntlm, mysql3, mysql5," print "[>] ripemd128, ripemd160, ripemd256,ripemd320, sha1, sha224," print "[>] sha256, sha256(unix), sha384, sha512, sha512(unix), snefru128," print "[>] snefru256, tiger, tiger128, tiger160, whirlpool, md5(wordpress)" print "[>] md5(pass.salt), md5(salt.pass), md4(pass.salt), md4(salt.pass)," print "[>] md2(pass.salt), md2(salt.pass),'sha1(pass.salt)', 'sha1(salt.pass)'," print "[>] 'sha224(pass.salt)', 'sha224(salt.pass)', 'sha256(pass.salt)'," print "[>] 'sha256(salt.pass)', 'sha384(pass.salt)', 'sha384(salt.pass)'," print "[>] 'sha512(pass.salt)', 'sha512(salt.pass)'" return xchat.EAT_XCHAT print "[>] CrackMe Plugin Version %s loaded" % __module_version__ xchat.hook_command("crackme", crackme, help="/crackme : General informations on CrackMe Xchat2 plugin") xchat.hook_command("md5", md5, help="/md5 : Submit MD5 hash on public DBs") xchat.hook_command("ntlm", ntlm, help="/ntlm : Submit NTLM hash on public DBs") xchat.hook_command("lm", pwdump, help="/lm : Submit LM hash on public DBs") xchat.hook_command("pwdump", pwdump, help="/pwdump : Submit LM & NTLM hashes on public DBs") xchat.hook_command("sha1", sha1, help="/sha1 : Submit SHA-1 hash on public DBs") xchat.hook_command("whatis", whatis, help="/whatis : Statistical hashes identifier") xchat.hook_command("len", length, help="/len : Chain length") xchat.hook_command("hash", calculator, help="/hash : Hash calculator, type /hash for more info") xchat.hook_command("password", password, help="/password : Random password generator, type /password for more info") xchat.hook_command("b64", edbase64, help="/b64 : Encoder/Decoder Base64") xchat.hook_command("rot13", rot13, help="/rot13 : Encoder/Decoder ROT13") xchat.hook_command("import", import_data, help="/import : Import hashlist from pastebin website, type /import for more info") xchat.hook_command("export", export_data, help="/export : Export hashlist from pastebin website, type /export for more info") xchat.hook_command("hashlist", hashlist, help="/hashlist : Hashlists manager") xchat.hook_command("harvester", harvester, help="/harvester : Harvester mode, type /harvester for more informations")