以下に添付するプログラムは、匿名希望の某氏の作られたmat.c (Massive ATtack for passwdbattler)です。Monster Attack Teamの略ではありません。 自分の選んだパスワード文字列から生成できるcrypt暗号列をべろべろ弾き出 すと言う恐ろしいツールであります。(そのパスワード文字列の中では)最強 のものをお気軽につくり出すことが出来ます。
なお、匿名希望の作者とはネットワークでは大変有名な(た)という方らしい、 という噂も流れておりますが…。
では、プログラムの説明を作者御自ら語って頂きましょう。
引数はありません。暗号化されていない生のパスワード候補を2回入れて、2
回とも一致すると、可能な permutation 4096 種とその評価値がべろべろ出て
きます。後は、ファイルに入れたり sort -n |{head,tail} するだけ
:-)
2回入れたパスワードが一致しないと打ち間違いということで、一致するまで
入れなおさせられるようです:-)
最強の permutation が見つかったら、そのまま NIS サーバホストの
/etc/passwd に突っ込んじゃってくださいB-)
/* mat.c (Massive ATtack for passwdbattler) */
/* Name of the author unknown */
#include <pwd.h>
#include <strings.h>
#include <ctype.h>
#include <stdio.h>
extern char *malloc();
char *saltTable = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./";
Eval(s)
char *s;
{
int ii;
int len, total = 0;
len = strlen(s);
for (ii = 2; ii < len; ii++)
total += (isupper(s[ii]) ? (s[ii] * 16) :
(islower(s[ii]) ? (s[ii] * 8) :
(isdigit(s[ii]) ? (s[ii]) :
(-(s[ii] * 32)))));
return (total);
}
int
main()
{
char salt[2], *i, *j, *saltEnd = saltTable + strlen(saltTable), *tmp;
char password[16], encryption[32], tmpEncryption[32];
int ii, len;
while (strcpy(password, getpass("raw password:")) &&
strcmp(password, getpass("type again :")) &&
fprintf(stderr, "password incorrect; please try again\n"));
for (i = saltTable; i < saltEnd; i++) {
*salt = *i;
for (j = saltTable; j < saltEnd; j++) {
*(salt + 1) = *j;
strcpy(tmpEncryption, strcpy(encryption, crypt(password, salt)));
for (ii = 2, len = strlen(tmpEncryption); ii < len; ii++) {
tmp = crypt(tmpEncryption + ii, tmpEncryption);
*(tmpEncryption + ii) = *(tmp + ii);
}
printf("%d %s\n", Eval(tmpEncryption), encryption);
}
}
return (0);
}