# hellfire.b : /keydb/password decoder # # by: dalai(dalai@swbt.net) # http://www.swbt.net/~dalai implement hellfire; include "sys.m"; sys: Sys; include "draw.m"; draw: Draw; include "bufio.m"; bufio: Bufio; Iobuf: import bufio; include "string.m"; str: String; include "arg.m"; arg: Arg; include "keyring.m"; keyring: Keyring; include "security.m"; pass: Password; hellfire: module { init: fn(ctxt: ref Draw->Context, argv: list of string); usage: fn(); finish: fn(temp: array of byte); }; init(nil: ref Draw->Context, argv: list of string) { sys = load Sys Sys->PATH; draw = load Draw Draw->PATH; bufio = load Bufio Bufio->PATH; str = load String String->PATH; arg = load Arg Arg->PATH; pass = load Password Password->PATH; keyring = load Keyring Keyring->PATH; sys->print("\nhellfire, by dalai(dalai@swbt.net)\n"); sys->print("A Traumatized Production.\n"); if(argv == nil) usage(); dfile := pfile := uid := ""; arg->init(argv); while((tmp := arg->opt()) != 0) case tmp{ 'd' => dfile = arg->arg(); 'u' => uid = arg->arg(); * => usage(); } if(dfile == nil || uid == nil) usage(); dfd := bufio->open(dfile, bufio->OREAD); if(dfd == nil){ sys->print("Could not open %s.\n", dfile); exit; } pw := pass->get(uid); if(pw == nil){ sys->print("Could not get entry for %s.\n", uid); exit; } sys->print("Cracking...\n\n"); pwbuff2 := array[keyring->SHAdlen] of byte; pwbuff := array[keyring->SHAdlen] of byte; # try some common passwords for(n := 1; n < 4; n++){ if(n == 1) pwbuff = array of byte "password"; if(n == 2) pwbuff = array of byte uid; if(n == 3) pwbuff = array of byte ""; keyring->sha(pwbuff, keyring->SHAdlen, pwbuff2, nil); temp1 := string pwbuff2; temp2 := string pw.pw; if(temp2 == temp1){ finish(pwbuff); } } # if not, try the dictionary for(dentry := "" ; ;){ dentry = dfd.gets('\n'); if(dentry == nil) break; if(dentry[len dentry-1] == '\n'){ heh := ""; (heh, nil) = str->splitl(dentry, "\n"); dentry = heh; } pwbuff = array of byte dentry; keyring->sha(pwbuff, keyring->SHAdlen, pwbuff2, nil); temp1 := string pwbuff2; temp2 := string pw.pw; if(temp2 == temp1){ finish(pwbuff); } } sys->print("done.\n"); sys->print("Have a nice day.\n"); exit; } finish(pwbuff: array of byte) { sys->print("Password is \"%s\"\n", string pwbuff); sys->print("Have a nice day.\n"); exit; } usage() { sys->print("usage: hellfire -d dictionary -u user\n"); exit; }