以下に添付するプログラムは、匿名希望の某氏の作られた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); }