-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathREADME
348 lines (267 loc) · 12 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
** lcrack: Lepton's Crack **
/------------------------------------------------------------\
| Generic password hash cracker |
| |
| Copyright (C) Bernardo Reino (lepton@runbox.com) |
| and Miguel Dilaj (nekromancer@eudoramail.com) |
| |
| 20021208 |
\------------------------------------------------------------/
Credits/
-------/
To the es.comp.hackers newsgroup, especially to TyPhOoN, znôrt,
PijusMagnificus, Chachini, CastleMan, user, and all the others whom
I've forgotten to mention.
The Lotus Domino HTTP hash implementation is based partially on
code provided by Jeff Fay (jeff@sdii.com)
The SHA-1 module has been contributed by Burcin Erocal
(burcin@math.bilgi.edu.tr)
To all our beta testers out there.
Disclaimer/
----------/
THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) `AS IS' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Introduction/
------------/
Lepton's Crack is a generic password cracker, easily customizable with
a simple plug-in system. It can perform a dictionary-based (wordlist)
attack, as well as a brute-force (incremental) password scan.
For the incremental scan, the user can provide a regex-like expression
that will be enumerated, thus checking every possible combination. This
powerful feature effectively combines `shoulder-surfing' with standard
brute-forcing.
By default it comes with the following modules:
* md4 : standard MD4 hash
* md5 : standard MD5 hash
* nt4 : NT MD4/Unicode
* dom : Lotus Domino HTTP password
* sha1 : standard SHA-1 hash
* null : trivial 1-byte hash
(sample for plug-in developers :)
Installation/
------------/
The first thing to do is to run the 'configure' shell script (beware,
it is not the standard 'autoconf' stuff.. :). This simple script will
try to determine what compiler to use, which flags to set, and will
generate the 'Makefile' and 'xtn_method.[ch]' depending on what modules
are available (mod_*.[ch]).
If you want to add or delete modules, the best procedure is to type
'make distclean', then copy or remove the module files as needed, and
type './configure' again.
Compilation/
-----------/
Use the 'Makefile' generated in the previous step. Make sure you check
all the settings (compiler, flags, etc.) in the Makefile, and adjust
as needed.
Typing 'make' will generate the 'lcrack' executable file.
Usage/
-----/
The command-line usage is as follows:
usage: lcrack [-q | -v] -m <method> [<opts>] <file> ..
-o <file> : output password file
-d <file> : use word list from <file>
-t <file> : use pre-computed word list from <file>
-s <charset> : use specified charset for incremental
-s# <name> : use charset from charset.txt file
-l <lenset> : use specified length-set for incremental
-g <regex> : enumerate regex for incremental
-g# <name> : use regex from regex.txt file
-x<mode>[+|-] : activate/deactivate specified mode
mode = l : login mode
mode = f : fast word list mode
mode = s : smart word list mode
mode = b : brute-force mode
-stdin : stdin (external) mode
-rand : randomized brute-force mode
-h : display usage information and exit
<method> : hash algorithm, one of:
{ 'dom' 'md4' 'md5' 'nt4' 'null' 'sha1' }
The '-m' option sets the hashing method, and should match with
the algorithm that was used to create the input file(s).
The '-d' option enables the dictionary-attack, using the dictionary
provided. Multiple dictionaries can be specified, using multiple
'-d <file>' options. The format of the dictionary file is very
simple: one word per line :)
The '-t' option enables the table-lookup attack. The given file
is a sequence of (word, hash) pairs, where 'word' is padded to
16 bytes, and the hash is exactly 16 (binary) bytes. Obviously
this is only useful for 16-byte hashes, but if that's the case
(as it is with the Lotus Domino hash) the look-up will be
extremely fast.
To create such a table, use the include mktbl program.
By default none of the modes will be active. You can activate or deactivate
any mode at will, using the '-x' option.
With the '-s' option you can specify the character set that will
be used during the brute-force scan. The default set is 'a-z0-9'.
You can use a simple compact form to specify the set, using the '-'
character, which defines a range of characters.
Using the '-s#' option followed by a name, lcrack will use the
character set defined in the charset.txt (which will be searched
in the current directory, your home directory, the directory where
lcrack is running from, or /etc, in that order). The format of the
file is like:
--<-- charset.txt
# charset spec
alpha = a-zA-Z
alpha-numeric = a-zA-Z0-9
alpha-numeric-symbol14 = a-zA-Z0-9!-/
alpha-space = a-zA-Z\x20
printable = \x20-~
all = \x00-\xff
--<--
For example: -s 'A-M0-7aq-z' will 'expand' to the following:
'01234567ABCDEFGHIJKLMaqrstuvwxyz' (yes, it's sorted).
The '-l' option sets the password lengths that will be checked
during the brute-force scan. The syntax is similar to that of the
character set, but you must use ',' to separate groups. That is:
-l '1,2,4-6,9' will expand to { 1, 2, 4, 5, 6, 9 }
By default, the brute-forcing will try, in order, every possible
password, using the specified character set and length set. If
the '-rand' option is given, the search will try passwords in a
random fashion, instead of sequentially.
The number of possible passwords will be computed by the program
before starting, so it knows how many random passwords it should
try, *BUT* this mode will not guarantee that every password is
found, because it might happen that some word gets repeated.
Alternatively you can provide a regex-like expression, which will
(hopefully) reduce the number of passwords to test. Lepton's Crack
will enumerate the regular expression, testing each combination.
For example: -g 'abc[0-9]z' would try passwords whose first
letter is one of { a, b, c }, the second letter is a digit (0-9),
and the third, and last[*] letter, is 'z'.
You can also use wildcards '[*]', and lcrack will expand them to
a combination of symbols taken from the defined character set. In
order to use wildcards effectively, you must supply a length
parameter (or range), using the '-l' option. The wildcards will
expand and compress in a way that the total length is always one
of the specified lengths. The enumeration will generate *every*
possible combination (ie. nothing will be missed), and in a strictly
increasing-length order.
There is also support for a regex.txt file, similar to the charset.txt
above, so that you can define your favorite regex's there.
File format/
-----------/
Each password file (more than one can be specified) contains a user
entry in each line. Each entry has the following format:
Login:Hash[Comment]
Where 'Login' will be the user-name (can be anything, it is not
used by the program except in the 'login' mode).
'Hash' is the hexadecimal representation of the password hash.
Whatever comes after the hash (':comment', for example) will be
silently ignored.
Cracking/
--------/
Now, suppose you have a file containing Lotus Domino HTTP password
hashes, like this:
--<<-- passwd.txt --
abc:24572fa0a43d8203f9b18f0fc3a38bb3:ABC
root:0ae0a8c0c7e4761948a6c490cc651395:SECRET
Mike:23B3D19CE5790E51457D7D1E36EDCB10:Nekromancer
lepton:772a755d7020ed0bcafbc7b0088554b9:lepton1
piru:ae108c3142bac881d0575a372a4f4139:pirul
juan:756944e56c60f6f3c7210b698cbf7026:juanjuan
--<<--
(Note the use of the 'comment' field to store the actual password,
just for convenience :)
Now that everything is clear, here's the program output for this
simple example:
--<<--
$ ./lcrack -m dom -d words -xl+ -xf+ -xb+ -s a-z -l 1-8 passwd.txt
xtn: initialized (domino HTTP hash) module
loaded: CSET[26] = { abcdefghijklmnopqrstuvwxyz }
loaded: LSET[8] = { 1 2 3 4 5 6 7 8 }
dbg: loading 'test/dom.test'
mode: null password, loaded 6 passwords
mode: login single crack, loaded 6 passwords
found: login(abc), passwd(ABC)
found: login(juan), passwd(juanjuan)
found: login(lepton), passwd(lepton1)
mode: fast dictionary search, loaded 3 passwords
found: login(Mike), passwd(Nekromancer)
found: login(root), passwd(SECRET)
mode: incremental, loaded 1 password
Length = 1, Total = 26
Length = 2, Total = 676
Length = 3, Total = 17576
Length = 4, Total = 456976
Length = 5, Total = 11881376
found: login(piru), passwd(pirul)
Lapse: 91.676s, Checked: 8060689, Found: 6/6, Speed: 87925 passwd/s
--<<--
Some debugging output is printed on the screen, but technically it
goes to 'stderr', so it is safe to redirect 'stdout' to a file to
get all passwords there, while everything else (*and* the passwords
found) will be displayed on 'stderr'.
Performance/
-----------/
Lepton's Crack can check about 90000 Lotus Domino and about 700000
MD4/MD5/NT-MD4 passwords per second using a 850Mhz Pentium III.
Notice that the program is written in plain-ANSI C[*], and hopefully
coded with optimization in mind :), but that's entirely up to the
compiler you use.
[*] Not really, it uses gettimeofday(2) and strdup(3). The former is
used only for printing the statistics line at the end, and the
latter can be trivially implemented using malloc(3) and strcpy(3).
Proactive password auditing/
---------------------------/
Domino administrators will benefit from this program (at least that's
what we expect), because they can simply audit their entire NAB in
search for bad passwords (i.e. equal to the UserID, dictionary word,
etc.)
To make it easy to get all the hashes in a file to feed into lcrack,
the following LotusScript agent has been contributed.
(It has to be put into names.nsf, and will generate a 'hashes.txt'
file with the structure " USERID:HASH ", and if something strange
is found, for example new R5 hashes or unhashed passwords, they will
go to the 'aliens.txt' file. I discovered some unhashed passwords in
our names.nsf, and I'm still wondering what happened...)
===============================================
Dim session As New notessession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim user, pass, total As String
Dim fileNum As Integer
Dim alienfileNum As Integer
Dim fileName As String
Dim alienfileName As String
Set db = session.CurrentDatabase
Set view = db.GetView("People")
Set doc = view.GetFirstDocument
fileNum% = Freefile()
fileName$ = "hashes.txt"
Open fileName$ For Output As fileNum%
alienfileNum% = Freefile()
alienfileName$ = "aliens.txt"
Open alienfileName$ For Output As alienfileNum%
While Not(doc Is Nothing)
user = doc.ShortName(0)
pass = doc.HTTPPassword(0)
If pass = "" Goto siguiente
If Len(pass) <> 32 Goto alien
total = user & ":" & pass
Write #fileNum%, total
Goto siguiente
alien:
total = user & ":" & pass
Write #alienfileNum%, total
siguiente:
Set doc = view.GetNextDocument(doc)
Wend
Close fileNum%
Close alienfileNum%
Print "Finished..."
===============================================
NOTE: take into account that the program produces THIS:
" USERID:PASSWORD "
and you need THIS:
USERID:PASSWORD
so process the file with the filter of your preference ;-)