Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date: Thu, 10 May 2012 00:43:48 +0200
From: Frank Dittrich <>
Subject: Re: wrapper around john to track attacks and sync files

On 05/09/2012 12:11 PM, Frank Dittrich wrote:
> On 05/09/2012 10:49 AM, Aleksey Cherepanov wrote:
>> At the moment I have wrapper that only wraps john but do not do
>> anything. I implemented it using Perl because it is a nice language
>> for such tasks, also it seems that much of the developers here know
>> it. Is it ok to use Perl? Or should I use C for that? And what
>> language should be used for final version (if it is different from
>> language for draft implementation)?
> For the draft implementation, perl is absolutely OK.
> For the final version, I am not so sure.
> Perl is still better than many other alternatives, but might not be
> available on all clients.
> Especially for Windows clients this might be a problem.
> Several scripts in the jumbo version already require perl.
> (There are even scripts in other languages, but I think Alexander tries
> to get rid of additional dependencies and prefers perl.)
> But these scripts are not really required to use john.
> So, IMO, a final version implemented in C would be preferable.

I'd like to add a few thoughts here.

I'm not saying we shouldn't consider perl for the final implementation.
In fact, if you think you need twice the time to implement the same
functionality in C, compared to a perl implementation, we'd need very
good reasons not to use perl.

Of course, it would be better to support more platforms.
But in a pen test scenario, you'd normally try to use clients
that are very similar to each other, because properly securing a zoo of
different systems isn't fun.

For the CrackMeIfYouCan contest:
If using perl means, Windows support will be more difficult (or it means
we need cygwin and are limited to 32bit), we an either live with the
fact that we might have less clients available, compared to a C
implementation, because the additional functionality we get due to
preferring perl over C easily compensates the possibly smaller number of
clients, then this might be OK.

Another way to work around the problem:
When we provide an installation media (this might be a remastered Ubuntu
live CD iso image or even an image of a recent Linux distribution
installed on an USB stick.
Then, windows users can boot from he USB stick, and run a Linux client.
Working with an installation on a USB stick usually is easier as booting
a Live CD, because it is faster, and you can have one partition which is
mounted writable, so we wouldn't need to write to the hard drive.
We'd need to provide an easy way to pick the keyboard layout during the
boot process, and we should pick a distribution with good hardware support.
An image which can be copied to a USB stick can also be a good idea in a
pen test scenario.
You could even use LUKS encrypted partitions (except the boot
partition). For the contest, you would have to disclose the LUKS
encryption key, and provide a link to a documentation how to add a new
encryption key and get rid of the old one...
I am, however, not sure if we would be able to distribute all the
software which might be needed during the contest.
(I didn't study the AMD/nvidia license terms for their OpenCL/CUDA
frameworks. May be we need to provide download instructions instead...)

The wrapper probably doesn't consume much CPU time, so picking C for
performance reasons is not necessary.

I don't know how you approach your draft implementation.

Usually you can divide the features to be implemented into must-have
features and nice-to-have features.
And you can divide them into features which are easy to implement and
features which are hard to implement. (By hard I don't just mean
time-consuming, bu rather involving difficult to solve problems where
you are not sure how to approach the implementation or whether your
ideas will work, and so on.)

For a draft implementation, I would pick hard to implement must-have
features first.

If you manage to implement them, everything is fine, because you
implemented something that will be useful. Making it even more useful
will be easy, because there are the easy to implement must-have features.
If you still have time after implementing these, you can spend your time
on the easy to implement nice-to-have features.
(But may be that by using your software you learn which other features
are needed that nobody considered during the initial draft...)

On the other hand, you find out that you didn't manage to solve the hard
problems for the must-have features in a reasonable time, you did at
least manage to avoid wasting time on easy to implement features which
will be useless unless the hard to implement must-have features are
May be you need to think about different approaches.
May be you need to think about ways how to avoid the hard-to-solve
problems. (There might be easy workarounds for the features which were
supposed to be "must-have".)
Or may be you need to revise your schedule, and reduce the number of
features you implement. If this is the case, at least you did everything
you could to find this out as early as possible, when it is still time
to adjust the schedule, and not close to the end of the project, when
all your work turns out to be useless because some urgently needed
feature isn't implemented.

As soon as you do have some code which you think might be reviewed or
tested by others, please let me know.


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.