/* * See if signature of ciphertext (from passwd file) matches the hack * produced by the uaf_encode routine (starts with $V$) */ static int valid(char *ciphertext, struct fmt_main *self ) { struct uaf_hash_info pwd; if (!initialized) { uaf_init(); initialized = 1; } if (strncmp(ciphertext, "$V$", 3)) return 0; /* no match */ if ( strlen ( ciphertext ) < (UAF_ENCODE_SIZE-1) ) return 0; if (!uaf_hash_decode(ciphertext, &pwd)) return 0; #ifdef VMS_DEBUG fprintf(stderr, "/VMS_STD/ get_salt decoded '%s' to %x/%x-%x-%x-%x-%x" " %ld\n", ciphertext, pwd.salt, pwd.alg, pwd.username.r40[0], pwd.username.r40[1], pwd.username.r40[2], pwd.username.r40[3], pwd.flags); #endif if (pwd.alg < 1 || pwd.alg > 3) return 0; return 1; }
static void fmt_vms_init ( struct fmt_main *self ) { #ifdef _OPENMP omp_t = omp_get_max_threads(); self->params.min_keys_per_crypt *= omp_t; omp_t *= OMP_SCALE; self->params.max_keys_per_crypt *= omp_t; #endif /* Init bin 2 hex table for faster conversions later */ saved_key = mem_calloc_tiny(sizeof(*saved_key) * self->params.max_keys_per_crypt, MEM_ALIGN_WORD); crypt_out = mem_calloc_tiny(sizeof(*crypt_out) * self->params.max_keys_per_crypt, sizeof(uaf_qword)); if (!initialized) { uaf_init(); initialized = 1; } }
static void process_file(char *infile) { int i, status, lnum, is_raw; FILE *listf, *rawf; char line[4096], *lf, *username, *suffix, *directory, *prefix; char encoded[UAF_ENCODE_SIZE], *result; struct uaf_hash_info pwd, pwd2; struct uaf_account_info acct; struct uaf_rec rec; /* raw record */ uaf_qword null_hash; is_raw = 1; #ifdef VMS if (strcmp(infile, "$") == 0) { is_raw = 0; infile = "SYSUAF.LIS"; spawn_authorize(infile); } else if (infile[0] == '~') { is_raw = 0; infile = "useruaf.lis"; single_user(infile, &argv[1][1]); } else if ((infile[0] != '/') && (0 != strncmp(infile, "./", 2))) { is_raw = 0; } #endif if (is_raw) { rawf = fopen(infile, "rb"); listf = (FILE *) 0; } else { listf = fopen(infile, "r"); rawf = (FILE *) 0; } if (!listf && !rawf) { fprintf(stderr, "File open failure on '%s'\n", infile); if (rawf) fclose(rawf); return; } /* * Convert each input line to a corresponding passwd file line. */ uaf_init(); UAF_QW_SET(null_hash, 0); lnum = 0; while (1) { char *priv_summary; if (is_raw) { /* * Input file is raw UAF file records, call function in uaf_encode * module to extract passwword and other information. */ if (1 != fread(&rec, sizeof(rec), 1, rawf)) break; status = uaf_extract_from_raw(&rec, sizeof(rec), &pwd, &pwd2, &acct, &prefix, &priv_summary); } else { /* * Input is a authorize utility brief listing, trim carriage control. */ if (!fgets(line, sizeof(line), listf)) break; lf = strchr(line, '\n'); if (lf) *lf = '\0'; lnum++; if (strlen(line) < 21) continue; /* line too short, ignore */ /* * Extract summary data and username from line. */ prefix = ""; if (strlen(line) > 69) { directory = &line[69]; if (strcmp(directory, "Disuser") == 0) prefix = "/disuser"; if (strcmp(directory, "Expired") == 0) prefix = "/expired"; } if (strlen(line) > 59) { priv_summary = &line[59]; for (i = 0; priv_summary[i]; i++) { if (priv_summary[i] == ' ') { priv_summary[i] = '\0'; break; } } } else { priv_summary = "unknown"; } username = &line[21]; for (i = 0; username[i]; i++) { if (username[i] == ' ') { username[i] = '\0'; break; } } /* * Use $GETUAI to get info needed to populate fields of passwd file * line. Be lazy and use dummy string for home_dir (to avoid dealing * with colon in VMS file specification). */ if (strcmp(username, "Username") == 0) continue; /* header line */ status = uaf_getuai_info(username, &pwd, &pwd2, &acct); } if (status & 1) { /* * Output user data as passwd-like text line. */ if (UAF_QW_EQL(pwd2.hash, null_hash)) suffix = ""; else suffix = ".1"; /* flag as primary of 2 */ result = uaf_hash_encode(&pwd, encoded); fprintf(stdout, "%s%s:%s:%d:%d:%s:/%s%s%s/%s:%s\n", colon_blow(pwd.username.s), suffix, result, acct.uic[0], acct.uic[1], colon_blow(acct.owner), (pwd.flags & UAI$M_PWDMIX) ? "Users" : "USERS", prefix[0] ? "/" : "", prefix, priv_summary, colon_blow(acct.shell)); if (suffix[0] == '.') { /* * secondary password present. */ result = uaf_hash_encode(&pwd2, encoded); fprintf(stdout, "%s%s:%s:%d:%d:%s:/%s%s%s/%s:%s\n", colon_blow(pwd.username.s), suffix, result, acct.uic[0], acct.uic[1], colon_blow(acct.owner), (pwd. flags & UAI$M_PWDMIX) ? "Users" : "USERS", prefix[0] ? "/" : "", prefix, priv_summary, colon_blow(acct.shell)); } } else { fprintf(stderr, "Error fetching UAF information, %s\n", prefix); return; } } if (is_raw) fclose(rawf); else fclose(listf); }