|
|
Message-Id: <8B499A42-7B1D-4447-A8F8-D8E099E2D9DC@auckland.ac.nz>
Date: Mon, 11 Feb 2008 15:59:43 +1300
From: Russell Fulton <r.fulton@...kland.ac.nz>
To: john-users@...ts.openwall.com
Subject: Re: extracting hashes from openldap for cracking
On 10/02/2008, at 6:09 PM, RB wrote:
> You should use that same Perl script to base64 decode them:
>
> {crypt}$1$FB98YJtW$/c5B1Uv5Q6nFUorti5Z4e1
> {crypt}$1$7tlOuzrV$qJhfuBZcB9w8Z38gg0Yl3.
> {crypt}$1$nOba6Dat$ZGI1XKaXEfDZadTRrnXxB0
> {crypt}$1$txtofhsU$huV7EEoOtvjdh9wLEKuz7.
>
> http://www.openldap.org/faq/data/cache/347.html
>
> Those come out as FreeBSD MD5 on my system (less the '{crypt}', of
> course), and made it through single-crack and wordlist modes without
> breaking.
Works like a charm -- and I'm not going to admit how many accounts
I've broken so far except to say that it was pretty bad. I've found
out that our service desk have been resetting passwords using simple
passwords and telling users to change them. Sigh... The interface
that the service desk used to reset passwords did not enforce
complexity rules as does the password change interface used by the
users :(
But then that's why we have audit tools like JTR. This is yet another
illustration of the problem of important but non urgent stuff not
getting done. So to help anyone else out there who wants to audit
openldap password here are a couple of simple perl scripts that I used
to get the hashes out of ldap and into something that JTR could
understand. They almost certainly will not work for you out of the
box because we use modified schema but the guts of the stuff is all
there. In particular we use upi (Unique Public Identifier) for
account names.
ldap2pw
#! /usr/biun/perl -w
use strict;
use MIME::Base64;
while( <> && ! eof) { # need eof since we will hit eof on the
other <>
chomp;
my( $uid, $passw, $cn, $dn);
$cn = $uid = '';
while( <> ) { # get an object
chomp;
last if /^\s*$/; # object have blank lines between then
if( /^cn: (.+)/ ) {
$cn = $1;
} elsif( /^dn: (.+)/ ) {
$dn = $1;
} elsif( /^userP\w+:: (.+)/) {
$passw= substr( decode_base64($1), 7); # assuming {crypt}
} elsif( /^uid: (.+)/) {
$uid = $1;
}
}
print "$uid\:$passw\:\:\:$cn\n" if defined $passw; # only output
if object has password
}
run ladp search:
ldapsearch -D "<dn for root>" -w xxxxxx -b "<base dn for users>" ""
userpassword uid cn | ldap2pw > ldap.pw
then feed ldap.pw to john
once you have a long list of account you want to disable feed the
output from John to:
while( <> ) {
chomp;
my( $pass, $acc ) = /(\S+)\s+\(([^)]+)\)/;
print "$acc :"
system("ldappasswd -D \"<dn for root>\" -w yyyyyyy \"uid=
$acc,<base dn for user>\"");
}
--
To unsubscribe, e-mail john-users-unsubscribe@...ts.openwall.com and reply
to the automated confirmation request that will be sent to you.
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.