#!/usr/bin/python3 # # [Program] # # CUPP 3.2.2-alpha # Common User Passwords Profiler # # # # [Author] # # Muris Kurgas aka j0rgan # j0rgan [at] remote-exploit [dot] org # http://www.remote-exploit.org # http://www.azuzi.me # # # # [License] # # 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 # 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, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # See 'docs/LICENSE' for more information. import sys import os import ftplib import configparser import urllib.request, urllib.parse, urllib.error import gzip import csv # Reading configuration file... config = configparser.ConfigParser() config.read(os.path.join(os.path.dirname(__file__), "cupp.cfg")) years = config.get("years", "years").split(",") chars = config.get("specialchars", "chars").split(",") numfrom = config.getint("nums", "from") numto = config.getint("nums", "to") wcfrom = config.getint("nums", "wcfrom") wcto = config.getint("nums", "wcto") threshold = config.getint("nums", "threshold") # 1337 mode configs, well you can add more lines if you add it to config file too. # You will need to add more lines in two places in cupp.py code as well... a = config.get("leet", "a") i = config.get("leet", "i") e = config.get("leet", "e") t = config.get("leet", "t") o = config.get("leet", "o") s = config.get("leet", "s") g = config.get("leet", "g") z = config.get("leet", "z") # for concatenations... def concats(seq, start, stop): for mystr in seq: for num in range(start, stop): yield mystr + str(num) # for sorting and making combinations... def komb(seq, start, special=""): for mystr in seq: for mystr1 in start: yield mystr + special + mystr1 # print list to file counting words def print_to_file(filename, unique_list_finished): f = open(filename, "w") unique_list_finished.sort() f.write(os.linesep.join(unique_list_finished)) f = open(filename, "r") lines = 0 for line in f: lines += 1 f.close() print( "[+] Saving dictionary to \033[1;31m" + filename + "\033[1;m, counting \033[1;31m" + str(lines) + " words.\033[1;m" ) print( "[+] Now load your pistolero with \033[1;31m" + filename + "\033[1;m and shoot! Good luck!" ) if len(sys.argv) < 2 or sys.argv[1] == "-h": print(" ___________ ") print(" \033[07m cupp.py! \033[27m # Common") print(" \ # User") print(" \ \033[1;31m,__,\033[1;m # Passwords") print(" \ \033[1;31m(\033[1;moo\033[1;31m)____\033[1;m # Profiler") print(" \033[1;31m(__) )\ \033[1;m ") print( " \033[1;31m ||--|| \033[1;m\033[05m*\033[25m\033[1;m [ Muris Kurgas | j0rgan@remote-exploit.org ]\r\n\r\n" ) print(" [ Options ]\r\n") print(" -h You are looking at it baby! :)") print(" For more help take a look in docs/README") print(" Global configuration file is cupp.cfg\n") print(" -i Interactive questions for user password profiling\r\n") print(" -w Use this option to improve existing dictionary,") print(" or WyD.pl output to make some pwnsauce\r\n") print(" -l Download huge wordlists from repository\r\n") print(" -a Parse default usernames and passwords directly from Alecto DB.") print(" Project Alecto uses purified databases of Phenoelit and CIRT") print(" which where merged and enhanced.\r\n") print(" -v Version of the program\r\n") exit() elif sys.argv[1] == "-v": print("\r\n \033[1;31m[ cupp.py ] v3.2.2-alpha\033[1;m\r\n") print(" * Hacked up by j0rgan - j0rgan@remote-exploit.org") print(" * http://www.remote-exploit.org\r\n") print(" Take a look ./README.md file for more info about the program\r\n") exit() elif sys.argv[1] == "-w": if len(sys.argv) < 3: print("\r\n[Usage]: " + sys.argv[0] + " -w [FILENAME]\r\n") exit() fajl = open(sys.argv[2], "r") listic = fajl.readlines() linije = 0 for line in listic: linije += 1 listica = [] for x in listic: listica += x.split() print("\r\n *************************************************") print(" * \033[1;31mWARNING!!!\033[1;m *") print(" * Using large wordlists in some *") print(" * options bellow is NOT recommended! *") print(" *************************************************\r\n") conts = input( "> Do you want to concatenate all words from wordlist? Y/[N]: " ).lower() if conts == "y" and linije > threshold: print("\r\n[-] Maximum number of words for concatenation is " + str(threshold)) print("[-] Check configuration file for increasing this number.\r\n") conts = input( "> Do you want to concatenate all words from wordlist? Y/[N]: " ).lower() conts = conts cont = [""] if conts == "y": for cont1 in listica: for cont2 in listica: if listica.index(cont1) != listica.index(cont2): cont.append(cont1 + cont2) spechars = [""] spechars1 = input( "> Do you want to add special chars at the end of words? Y/[N]: " ).lower() if spechars1 == "y": for spec1 in chars: spechars.append(spec1) for spec2 in chars: spechars.append(spec1 + spec2) for spec3 in chars: spechars.append(spec1 + spec2 + spec3) randnum = input( "> Do you want to add some random numbers at the end of words? Y/[N]:" ).lower() leetmode = input("> Leet mode? (i.e. leet = 1337) Y/[N]: ").lower() kombinacija1 = list(komb(listica, years)) kombinacija2 = [""] if conts == "y": kombinacija2 = list(komb(cont, years)) kombinacija3 = [""] kombinacija4 = [""] if spechars1 == "y": kombinacija3 = list(komb(listica, spechars)) if conts == "y": kombinacija4 = list(komb(cont, spechars)) kombinacija5 = [""] kombinacija6 = [""] if randnum == "y": kombinacija5 = list(concats(listica, numfrom, numto)) if conts == "y": kombinacija6 = list(concats(cont, numfrom, numto)) print("\r\n[+] Now making a dictionary...") print("[+] Sorting list and removing duplicates...") komb_unique1 = list(dict.fromkeys(kombinacija1).keys()) komb_unique2 = list(dict.fromkeys(kombinacija2).keys()) komb_unique3 = list(dict.fromkeys(kombinacija3).keys()) komb_unique4 = list(dict.fromkeys(kombinacija4).keys()) komb_unique5 = list(dict.fromkeys(kombinacija5).keys()) komb_unique6 = list(dict.fromkeys(kombinacija6).keys()) komb_unique7 = list(dict.fromkeys(listica).keys()) komb_unique8 = list(dict.fromkeys(cont).keys()) uniqlist = ( komb_unique1 + komb_unique2 + komb_unique3 + komb_unique4 + komb_unique5 + komb_unique6 + komb_unique7 + komb_unique8 ) unique_lista = list(dict.fromkeys(uniqlist).keys()) unique_leet = [] if leetmode == "y": for ( x ) in ( unique_lista ): # if you want to add more leet chars, you will need to add more lines in cupp.cfg too... x = x.replace("a", a) x = x.replace("i", i) x = x.replace("e", e) x = x.replace("t", t) x = x.replace("o", o) x = x.replace("s", s) x = x.replace("g", g) x = x.replace("z", z) unique_leet.append(x) unique_list = unique_lista + unique_leet unique_list_finished = [] unique_list_finished = [x for x in unique_list if len(x) > wcfrom and len(x) < wcto] print_to_file(sys.argv[2] + ".cupp.txt", unique_list_finished) fajl.close() exit() elif sys.argv[1] == "-i": print("\r\n[+] Insert the information about the victim to make a dictionary") print("[+] If you don't know all the info, just hit enter when asked! ;)\r\n") # We need some information first! name = input("> First Name: ").lower() while len(name) == 0 or name == " " or name == " " or name == " ": print("\r\n[-] You must enter a name at least!") name = input("> Name: ").lower() name = str(name) surname = input("> Surname: ").lower() nick = input("> Nickname: ").lower() birthdate = input("> Birthdate (DDMMYYYY): ") while len(birthdate) != 0 and len(birthdate) != 8: print("\r\n[-] You must enter 8 digits for birthday!") birthdate = input("> Birthdate (DDMMYYYY): ") birthdate = str(birthdate) print("\r\n") wife = input("> Partners) name: ").lower() wifen = input("> Partners) nickname: ").lower() wifeb = input("> Partners) birthdate (DDMMYYYY): ") while len(wifeb) != 0 and len(wifeb) != 8: print("\r\n[-] You must enter 8 digits for birthday!") wifeb = input("> Partners birthdate (DDMMYYYY): ") wifeb = str(wifeb) print("\r\n") kid = input("> Child's name: ").lower() kidn = input("> Child's nickname: ").lower() kidb = input("> Child's birthdate (DDMMYYYY): ") while len(kidb) != 0 and len(kidb) != 8: print("\r\n[-] You must enter 8 digits for birthday!") kidb = input("> Child's birthdate (DDMMYYYY): ") kidb = str(kidb) print("\r\n") pet = input("> Pet's name: ").lower() company = input("> Company name: ").lower() print("\r\n") words = [""] words1 = input( "> Do you want to add some key words about the victim? Y/[N]: " ).lower() words2 = "" if words1 == "y": words2 = input( "> Please enter the words, separated by comma. [i.e. hacker,juice,black], spaces will be removed: " ).replace(" ", "") words = words2.split(",") spechars = [""] spechars1 = input( "> Do you want to add special chars at the end of words? Y/[N]: " ).lower() if spechars1 == "y": for spec1 in chars: spechars.append(spec1) for spec2 in chars: spechars.append(spec1 + spec2) for spec3 in chars: spechars.append(spec1 + spec2 + spec3) randnum = input( "> Do you want to add some random numbers at the end of words? Y/[N]:" ).lower() leetmode = input("> Leet mode? (i.e. leet = 1337) Y/[N]: ").lower() print("\r\n[+] Now making a dictionary...") # Now me must do some string modifications... # Birthdays first birthdate_yy = birthdate[-2:] birthdate_yyy = birthdate[-3:] birthdate_yyyy = birthdate[-4:] birthdate_xd = birthdate[1:2] birthdate_xm = birthdate[3:4] birthdate_dd = birthdate[:2] birthdate_mm = birthdate[2:4] wifeb_yy = wifeb[-2:] wifeb_yyy = wifeb[-3:] wifeb_yyyy = wifeb[-4:] wifeb_xd = wifeb[1:2] wifeb_xm = wifeb[3:4] wifeb_dd = wifeb[:2] wifeb_mm = wifeb[2:4] kidb_yy = kidb[-2:] kidb_yyy = kidb[-3:] kidb_yyyy = kidb[-4:] kidb_xd = kidb[1:2] kidb_xm = kidb[3:4] kidb_dd = kidb[:2] kidb_mm = kidb[2:4] # Convert first letters to uppercase... nameup = name.title() surnameup = surname.title() nickup = nick.title() wifeup = wife.title() wifenup = wifen.title() kidup = kid.title() kidnup = kidn.title() petup = pet.title() companyup = company.title() wordsup = [] wordsup = list(map(str.title, words)) word = words + wordsup # reverse a name rev_name = name[::-1] rev_nameup = nameup[::-1] rev_nick = nick[::-1] rev_nickup = nickup[::-1] rev_wife = wife[::-1] rev_wifeup = wifeup[::-1] rev_kid = kid[::-1] rev_kidup = kidup[::-1] reverse = [ rev_name, rev_nameup, rev_nick, rev_nickup, rev_wife, rev_wifeup, rev_kid, rev_kidup, ] rev_n = [rev_name, rev_nameup, rev_nick, rev_nickup] rev_w = [rev_wife, rev_wifeup] rev_k = [rev_kid, rev_kidup] # Let's do some serious work! This will be a mess of code, but... who cares? :) # Birthdays combinations bds = [ birthdate_yy, birthdate_yyy, birthdate_yyyy, birthdate_xd, birthdate_xm, birthdate_dd, birthdate_mm, ] bdss = [] for bds1 in bds: bdss.append(bds1) for bds2 in bds: if bds.index(bds1) != bds.index(bds2): bdss.append(bds1 + bds2) for bds3 in bds: if ( bds.index(bds1) != bds.index(bds2) and bds.index(bds2) != bds.index(bds3) and bds.index(bds1) != bds.index(bds3) ): bdss.append(bds1 + bds2 + bds3) # For a woman... wbds = [wifeb_yy, wifeb_yyy, wifeb_yyyy, wifeb_xd, wifeb_xm, wifeb_dd, wifeb_mm] wbdss = [] for wbds1 in wbds: wbdss.append(wbds1) for wbds2 in wbds: if wbds.index(wbds1) != wbds.index(wbds2): wbdss.append(wbds1 + wbds2) for wbds3 in wbds: if ( wbds.index(wbds1) != wbds.index(wbds2) and wbds.index(wbds2) != wbds.index(wbds3) and wbds.index(wbds1) != wbds.index(wbds3) ): wbdss.append(wbds1 + wbds2 + wbds3) # and a child... kbds = [kidb_yy, kidb_yyy, kidb_yyyy, kidb_xd, kidb_xm, kidb_dd, kidb_mm] kbdss = [] for kbds1 in kbds: kbdss.append(kbds1) for kbds2 in kbds: if kbds.index(kbds1) != kbds.index(kbds2): kbdss.append(kbds1 + kbds2) for kbds3 in kbds: if ( kbds.index(kbds1) != kbds.index(kbds2) and kbds.index(kbds2) != kbds.index(kbds3) and kbds.index(kbds1) != kbds.index(kbds3) ): kbdss.append(kbds1 + kbds2 + kbds3) # string combinations.... kombinaac = [pet, petup, company, companyup] kombina = [name, surname, nick, nameup, surnameup, nickup] kombinaw = [wife, wifen, wifeup, wifenup, surname, surnameup] kombinak = [kid, kidn, kidup, kidnup, surname, surnameup] kombinaa = [] for kombina1 in kombina: kombinaa.append(kombina1) for kombina2 in kombina: if kombina.index(kombina1) != kombina.index(kombina2) and kombina.index( kombina1.title() ) != kombina.index(kombina2.title()): kombinaa.append(kombina1 + kombina2) kombinaaw = [] for kombina1 in kombinaw: kombinaaw.append(kombina1) for kombina2 in kombinaw: if kombinaw.index(kombina1) != kombinaw.index(kombina2) and kombinaw.index( kombina1.title() ) != kombinaw.index(kombina2.title()): kombinaaw.append(kombina1 + kombina2) kombinaak = [] for kombina1 in kombinak: kombinaak.append(kombina1) for kombina2 in kombinak: if kombinak.index(kombina1) != kombinak.index(kombina2) and kombinak.index( kombina1.title() ) != kombinak.index(kombina2.title()): kombinaak.append(kombina1 + kombina2) komb1 = list(komb(kombinaa, bdss)) komb1 += list(komb(kombinaa, bdss, "_")) komb2 = list(komb(kombinaaw, wbdss)) komb2 += list(komb(kombinaaw, wbdss, "_")) komb3 = list(komb(kombinaak, kbdss)) komb3 += list(komb(kombinaak, kbdss, "_")) komb4 = list(komb(kombinaa, years)) komb4 += list(komb(kombinaa, years, "_")) komb5 = list(komb(kombinaac, years)) komb5 += list(komb(kombinaac, years, "_")) komb6 = list(komb(kombinaaw, years)) komb6 += list(komb(kombinaaw, years, "_")) komb7 = list(komb(kombinaak, years)) komb7 += list(komb(kombinaak, years, "_")) komb8 = list(komb(word, bdss)) komb8 += list(komb(word, bdss, "_")) komb9 = list(komb(word, wbdss)) komb9 += list(komb(word, wbdss, "_")) komb10 = list(komb(word, kbdss)) komb10 += list(komb(word, kbdss, "_")) komb11 = list(komb(word, years)) komb11 += list(komb(word, years, "_")) komb12 = [""] komb13 = [""] komb14 = [""] komb15 = [""] komb16 = [""] komb21 = [""] if randnum == "y": komb12 = list(concats(word, numfrom, numto)) komb13 = list(concats(kombinaa, numfrom, numto)) komb14 = list(concats(kombinaac, numfrom, numto)) komb15 = list(concats(kombinaaw, numfrom, numto)) komb16 = list(concats(kombinaak, numfrom, numto)) komb21 = list(concats(reverse, numfrom, numto)) komb17 = list(komb(reverse, years)) komb17 += list(komb(reverse, years, "_")) komb18 = list(komb(rev_w, wbdss)) komb18 += list(komb(rev_w, wbdss, "_")) komb19 = list(komb(rev_k, kbdss)) komb19 += list(komb(rev_k, kbdss, "_")) komb20 = list(komb(rev_n, bdss)) komb20 += list(komb(rev_n, bdss, "_")) komb001 = [""] komb002 = [""] komb003 = [""] komb004 = [""] komb005 = [""] komb006 = [""] if spechars1 == "y": komb001 = list(komb(kombinaa, spechars)) komb002 = list(komb(kombinaac, spechars)) komb003 = list(komb(kombinaaw, spechars)) komb004 = list(komb(kombinaak, spechars)) komb005 = list(komb(word, spechars)) komb006 = list(komb(reverse, spechars)) print("[+] Sorting list and removing duplicates...") komb_unique1 = list(dict.fromkeys(komb1).keys()) komb_unique2 = list(dict.fromkeys(komb2).keys()) komb_unique3 = list(dict.fromkeys(komb3).keys()) komb_unique4 = list(dict.fromkeys(komb4).keys()) komb_unique5 = list(dict.fromkeys(komb5).keys()) komb_unique6 = list(dict.fromkeys(komb6).keys()) komb_unique7 = list(dict.fromkeys(komb7).keys()) komb_unique8 = list(dict.fromkeys(komb8).keys()) komb_unique9 = list(dict.fromkeys(komb9).keys()) komb_unique10 = list(dict.fromkeys(komb10).keys()) komb_unique11 = list(dict.fromkeys(komb11).keys()) komb_unique12 = list(dict.fromkeys(komb12).keys()) komb_unique13 = list(dict.fromkeys(komb13).keys()) komb_unique14 = list(dict.fromkeys(komb14).keys()) komb_unique15 = list(dict.fromkeys(komb15).keys()) komb_unique16 = list(dict.fromkeys(komb16).keys()) komb_unique17 = list(dict.fromkeys(komb17).keys()) komb_unique18 = list(dict.fromkeys(komb18).keys()) komb_unique19 = list(dict.fromkeys(komb19).keys()) komb_unique20 = list(dict.fromkeys(komb20).keys()) komb_unique21 = list(dict.fromkeys(komb21).keys()) komb_unique01 = list(dict.fromkeys(kombinaa).keys()) komb_unique02 = list(dict.fromkeys(kombinaac).keys()) komb_unique03 = list(dict.fromkeys(kombinaaw).keys()) komb_unique04 = list(dict.fromkeys(kombinaak).keys()) komb_unique05 = list(dict.fromkeys(word).keys()) komb_unique07 = list(dict.fromkeys(komb001).keys()) komb_unique08 = list(dict.fromkeys(komb002).keys()) komb_unique09 = list(dict.fromkeys(komb003).keys()) komb_unique010 = list(dict.fromkeys(komb004).keys()) komb_unique011 = list(dict.fromkeys(komb005).keys()) komb_unique012 = list(dict.fromkeys(komb006).keys()) uniqlist = ( bdss + wbdss + kbdss + reverse + komb_unique01 + komb_unique02 + komb_unique03 + komb_unique04 + komb_unique05 + komb_unique1 + komb_unique2 + komb_unique3 + komb_unique4 + komb_unique5 + komb_unique6 + komb_unique7 + komb_unique8 + komb_unique9 + komb_unique10 + komb_unique11 + komb_unique12 + komb_unique13 + komb_unique14 + komb_unique15 + komb_unique16 + komb_unique17 + komb_unique18 + komb_unique19 + komb_unique20 + komb_unique21 + komb_unique07 + komb_unique08 + komb_unique09 + komb_unique010 + komb_unique011 + komb_unique012 ) unique_lista = list(dict.fromkeys(uniqlist).keys()) unique_leet = [] if leetmode == "y": for ( x ) in ( unique_lista ): # if you want to add more leet chars, you will need to add more lines in cupp.cfg too... x = x.replace("a", a) x = x.replace("i", i) x = x.replace("e", e) x = x.replace("t", t) x = x.replace("o", o) x = x.replace("s", s) x = x.replace("g", g) x = x.replace("z", z) unique_leet.append(x) unique_list = unique_lista + unique_leet unique_list_finished = [] unique_list_finished = [x for x in unique_list if len(x) < wcto and len(x) > wcfrom] print_to_file(name + ".txt", unique_list_finished) exit() elif sys.argv[1] == "-a": url = config.get("alecto", "alectourl") print("\r\n[+] Checking if alectodb is not present...") if os.path.isfile("alectodb.csv.gz") == 0: print("[+] Downloading alectodb.csv.gz...") webFile = urllib.request.urlopen(url) localFile = open(url.split("/")[-1], "wb") localFile.write(webFile.read()) webFile.close() localFile.close() f = gzip.open("alectodb.csv.gz", "rt") data = csv.reader(f) usernames = [] passwords = [] for row in data: usernames.append(row[5]) passwords.append(row[6]) gus = list(set(usernames)) gpa = list(set(passwords)) gus.sort() gpa.sort() print( "\r\n[+] Exporting to alectodb-usernames.txt and alectodb-passwords.txt\r\n[+] Done." ) f = open("alectodb-usernames.txt", "w") f.write(os.linesep.join(gus)) f.close() f = open("alectodb-passwords.txt", "w") f.write(os.linesep.join(gpa)) f.close() f.close() sys.exit() elif sys.argv[1] == "-l": ftpname = config.get("downloader", "ftpname") ftpurl = config.get("downloader", "ftpurl") ftppath = config.get("downloader", "ftppath") ftpuser = config.get("downloader", "ftpuser") ftppass = config.get("downloader", "ftppass") if os.path.isdir("dictionaries") == 0: os.mkdir("dictionaries") print(" \r\n Choose the section you want to download:\r\n") print(" 1 Moby 14 french 27 places") print(" 2 afrikaans 15 german 28 polish") print(" 3 american 16 hindi 29 random") print(" 4 aussie 17 hungarian 30 religion") print(" 5 chinese 18 italian 31 russian") print(" 6 computer 19 japanese 32 science") print(" 7 croatian 20 latin 33 spanish") print(" 8 czech 21 literature 34 swahili") print(" 9 danish 22 movieTV 35 swedish") print(" 10 databases 23 music 36 turkish") print(" 11 dictionaries 24 names 37 yiddish") print(" 12 dutch 25 net 38 exit program") print(" 13 finnish 26 norwegian \r\n") print(" \r\n Files will be downloaded from " + ftpname + " repository") print( " \r\n Tip: After downloading wordlist, you can improve it with -w option\r\n" ) # List of files to download: arguments = { 1: ( "Moby", ( "mhyph.tar.gz", "mlang.tar.gz", "moby.tar.gz", "mpos.tar.gz", "mpron.tar.gz", "mthes.tar.gz", "mwords.tar.gz", ), ), 2: ("afrikaans", ("afr_dbf.zip",)), 3: ("american", ("dic-0294.tar.gz",)), 4: ("aussie", ("oz.gz",)), 5: ("chinese", ("chinese.gz",)), 6: ( "computer", ( "Domains.gz", "Dosref.gz", "Ftpsites.gz", "Jargon.gz", "common-passwords.txt.gz", "etc-hosts.gz", "foldoc.gz", "language-list.gz", "unix.gz", ), ), 7: ("croatian", ("croatian.gz",)), 8: ("czech", ("czech-wordlist-ascii-cstug-novak.gz",)), 9: ("danish", ("danish.words.gz", "dansk.zip")), 10: ( "databases", ("acronyms.gz", "att800.gz", "computer-companies.gz", "world_heritage.gz"), ), 11: ( "dictionaries", ( "Antworth.gz", "CRL.words.gz", "Roget.words.gz", "Unabr.dict.gz", "Unix.dict.gz", "englex-dict.gz", "knuth_britsh.gz", "knuth_words.gz", "pocket-dic.gz", "shakesp-glossary.gz", "special.eng.gz", "words-english.gz", ), ), 12: ("dutch", ("words.dutch.gz",)), 13: ( "finnish", ("finnish.gz", "firstnames.finnish.gz", "words.finnish.FAQ.gz"), ), 14: ("french", ("dico.gz",)), 15: ("german", ("deutsch.dic.gz", "germanl.gz", "words.german.gz")), 16: ("hindi", ("hindu-names.gz",)), 17: ("hungarian", ("hungarian.gz",)), 18: ("italian", ("words.italian.gz",)), 19: ("japanese", ("words.japanese.gz",)), 20: ("latin", ("wordlist.aug.gz",)), 21: ( "literature", ( "LCarrol.gz", "Paradise.Lost.gz", "aeneid.gz", "arthur.gz", "cartoon.gz", "cartoons-olivier.gz", "charlemagne.gz", "fable.gz", "iliad.gz", "myths-legends.gz", "odyssey.gz", "sf.gz", "shakespeare.gz", "tolkien.words.gz", ), ), 22: ("movieTV", ("Movies.gz", "Python.gz", "Trek.gz")), 23: ( "music", ( "music-classical.gz", "music-country.gz", "music-jazz.gz", "music-other.gz", "music-rock.gz", "music-shows.gz", "rock-groups.gz", ), ), 24: ( "names", ( "ASSurnames.gz", "Congress.gz", "Family-Names.gz", "Given-Names.gz", "actor-givenname.gz", "actor-surname.gz", "cis-givenname.gz", "cis-surname.gz", "crl-names.gz", "famous.gz", "fast-names.gz", "female-names-kantr.gz", "female-names.gz", "givennames-ol.gz", "male-names-kantr.gz", "male-names.gz", "movie-characters.gz", "names.french.gz", "names.hp.gz", "other-names.gz", "shakesp-names.gz", "surnames-ol.gz", "surnames.finnish.gz", "usenet-names.gz", ), ), 25: ( "net", ( "hosts-txt.gz", "inet-machines.gz", "usenet-loginids.gz", "usenet-machines.gz", "uunet-sites.gz", ), ), 26: ("norwegian", ("words.norwegian.gz",)), 27: ( "places", ( "Colleges.gz", "US-counties.gz", "World.factbook.gz", "Zipcodes.gz", "places.gz", ), ), 28: ("polish", ("words.polish.gz",)), 29: ( "random", ( "Ethnologue.gz", "abbr.gz", "chars.gz", "dogs.gz", "drugs.gz", "junk.gz", "numbers.gz", "phrases.gz", "sports.gz", "statistics.gz", ), ), 30: ("religion", ("Koran.gz", "kjbible.gz", "norse.gz")), 31: ("russian", ("russian.lst.gz", "russian_words.koi8.gz")), 32: ( "science", ( "Acr-diagnosis.gz", "Algae.gz", "Bacteria.gz", "Fungi.gz", "Microalgae.gz", "Viruses.gz", "asteroids.gz", "biology.gz", "tech.gz", ), ), 33: ("spanish", ("words.spanish.gz",)), 34: ("swahili", ("swahili.gz",)), 35: ("swedish", ("words.swedish.gz",)), 36: ("turkish", ("turkish.dict.gz",)), 37: ("yiddish", ("yiddish.gz",)), } filedown = input("> Enter number: ") filedown.isdigit() while filedown.isdigit() == 0: print("\r\n[-] Wrong choice. ") filedown = input("> Enter number: ") filedown = str(filedown) while int(filedown) > 38 or int(filedown) < 0: print("\r\n[-] Wrong choice. ") filedown = input("> Enter number: ") filedown = str(filedown) def downloader(): ftp.login(ftpuser, ftppass) ftp.cwd(ftppath) # retrieve a file from FTP def retr_binary_file(ftp, dire, filename): def handleDownload(block): f.write(block) print(".", end="") f = open(dire + filename, "wb") print("\r\n[+] downloading " + filename + "...") # ftp.retrbinary("RETR " + filename, f.write) ftp.retrbinary("RETR " + filename, handleDownload) f.close() print(" done.") # retrieve a list of files def retr_file_list(ftp, dire, file_list): for f in file_list: retr_binary_file(ftp, dire, f) # create the directory if it doesn't exist def mkdir_if_not_exists(dire): if not os.path.isdir(dire): os.mkdir(dire) # download the files intfiledown = int(filedown) if intfiledown in arguments: print("\r\n[+] connecting...\r\n") ftp = ftplib.FTP(ftpurl) downloader() ftp.cwd(arguments[intfiledown][0]) dire = "dictionaries/" + arguments[intfiledown][0] + "/" mkdir_if_not_exists(dire) print(arguments[int(filedown)][0]) files_to_download = arguments[intfiledown][1] # download the files retr_file_list(ftp, dire, files_to_download) print("[+] files saved to " + dire) ftp.quit() exit() else: print("[-] leaving.") exit() else: print("\r\n[Usage]: " + sys.argv[0] + " [OPTIONS] \r\n") print("[Help]: " + sys.argv[0] + " -h\r\n") exit()