int tryLogin(sLogin** psLogin, _NCP_DATA* _psSessionData, char* szPassword) { unsigned int i; int iRet; short int NCPErrorCode = 0; char *pErrorMsg = NULL; char ErrorCode[12]; int object_type = NCP_BINDERY_USER; char *szTemp = NULL; short int ncpErrorCode[] = { 0xFFFF, /* UNKNOWN_ERROR_CODE */ 0x0000, /* STATUS_SUCCESS */ 0xFD63, /* STATUS_LOGON_FAILURE */ 0xFDA7, /* SPECIFIED_BINARY_OBJECT_DOES_NOT_EXIST */ /* include/ncp/ncplib.h */ 0x8998, /* NWE_VOL_INVALID */ 0x899B, /* NWE_DIRHANDLE_INVALID */ 0x89C5, /* NWE_LOGIN_LOCKOUT */ 0x89D3, /* NWE_Q_NO_RIGHTS */ 0x89D5, /* NWE_Q_NO_JOB */ //0x89D6, /* NWE_Q_NO_JOB_RIGHTS */ 0x89D6, /* NWE_PASSWORD_UNENCRYPTED */ 0x89D7, /* NWE_PASSWORD_NOT_UNIQUE */ 0x89D8, /* NWE_PASSWORD_TOO_SHORT */ 0x89D9, /* NWE_LOGIN_MAX_EXCEEDED */ 0x89DA, /* NWE_LOGIN_UNAUTHORIZED_TIME */ 0x89DB, /* NWE_LOGIN_UNAUTHORIZED_STATION */ 0x89DC, /* NWE_ACCT_DISABLED */ 0x89DE, /* NWE_PASSWORD_INVALID */ 0x89DF, /* NWE_PASSWORD_EXPIRED */ 0x89E9, /* NWE_BIND_MEMBER_ALREADY_EXISTS */ 0x89FB, /* NWE_NCP_NOT_SUPPORTED */ 0x89FC, /* NWE_SERVER_UNKNOWN */ 0x89FD, /* NWE_CONN_NUM_INVALID */ 0x89FF, /* NWE_SERVER_FAILURE */ }; char *ncpErrorMsg[] = { "UNKNOWN_ERROR_CODE", "STATUS_SUCCESS", "STATUS_LOGON_FAILURE", "SPECIFIED_BINARY_OBJECT_DOES_NOT_EXIST", "NWE_VOL_INVALID", "NWE_DIRHANDLE_INVALID", "NWE_LOGIN_LOCKOUT", "NWE_Q_NO_RIGHTS", "NWE_Q_NO_JOB", //"NWE_Q_NO_JOB_RIGHTS", "NWE_PASSWORD_UNENCRYPTED", "NWE_PASSWORD_NOT_UNIQUE", "NWE_PASSWORD_TOO_SHORT", "NWE_LOGIN_MAX_EXCEEDED", "NWE_LOGIN_UNAUTHORIZED_TIME", "NWE_LOGIN_UNAUTHORIZED_STATION", "NWE_ACCT_DISABLED", "NWE_PASSWORD_INVALID", "NWE_PASSWORD_EXPIRED", "NWE_BIND_MEMBER_ALREADY_EXISTS", "NWE_NCP_NOT_SUPPORTED", "NWE_SERVER_UNKNOWN", "NWE_CONN_NUM_INVALID", "NWE_SERVER_FAILURE" }; memset(&ErrorCode, 0, 12); // NCP_BINDERY_NAME_LEN 48 // NCPFS_MAX_CFG_USERNAME 256 // NetWare 5 case insensitive??? size_t l = strlen(szPassword); if (l >= sizeof(_psSessionData->spec.password)) { ncp_close(_psSessionData->conn); writeError(ERR_ERROR, "[%s] Password too long. Max length 48 characters.", MODULE_NAME); iRet = MSTATE_EXITING; return(iRet); } memset(_psSessionData->spec.password, 0, sizeof(_psSessionData->spec.password)); memcpy(_psSessionData->spec.password, szPassword, l); /* Upper-case password */ szTemp = _psSessionData->spec.password; while(*szTemp != '\0') { *szTemp = toupper((unsigned char) *szTemp); szTemp++; } NCPErrorCode = ncp_login_conn(_psSessionData->conn, _psSessionData->spec.user, object_type, _psSessionData->spec.password); /* Locate appropriate NCP code message */ pErrorMsg = ncpErrorMsg[0]; /* UNKNOWN_ERROR_CODE */ for (i = 0; i < sizeof(ncpErrorCode)/2; i++) { if (NCPErrorCode == ncpErrorCode[i]) { pErrorMsg = ncpErrorMsg[i]; break; } } switch (NCPErrorCode & 0x0000FFFF) { case 0x0000: /* Success */ (*psLogin)->iResult = LOGIN_RESULT_SUCCESS; iRet = MSTATE_EXITING; break; case 0x89F0: /* Incorrect password - BIND Authenticator */ case 0x89FF: /* Incorrect password - NWE_SERVER_FAILURE */ case 0xFD63: /* Incorrect password - NDS Authenticator */ writeError(ERR_DEBUG_MODULE, "[%s] Incorrect password. Error code: %X", MODULE_NAME, NCPErrorCode); (*psLogin)->iResult = LOGIN_RESULT_FAIL; iRet = MSTATE_RUNNING; break; default: writeError(ERR_DEBUG_MODULE, "[%s] Failed to open connection. Error code: %X", MODULE_NAME, NCPErrorCode); sprintf(ErrorCode, "0x%8.8X:", NCPErrorCode); (*psLogin)->pErrorMsg = malloc( strlen(ErrorCode) + strlen(pErrorMsg) + 1); memset((*psLogin)->pErrorMsg, 0, strlen(ErrorCode) + strlen(pErrorMsg) + 1); strncpy((*psLogin)->pErrorMsg, ErrorCode, strlen(ErrorCode)); strncat((*psLogin)->pErrorMsg, pErrorMsg, strlen(pErrorMsg)); (*psLogin)->iResult = LOGIN_RESULT_ERROR; iRet = MSTATE_EXITING; break; } setPassResult((*psLogin), szPassword); return(iRet); }
int start_ncp(int s, unsigned long int ip, int port, unsigned char options, char *miscptr, FILE * fp) { char* login; char* pass; char context[256]; unsigned int ncp_lib_error_code; struct sockaddr_in remote_ip; char *empty = ""; int object_type = NCP_BINDERY_USER; _NCP_DATA* session; memset(&remote_ip, 0, sizeof(remote_ip)); memcpy(&remote_ip.sin_addr.s_addr, &ip, 4); remote_ip.sin_family = AF_INET; session = malloc(sizeof(_NCP_DATA)); memset(session, 0, sizeof(_NCP_DATA)); login=empty; pass=empty; if (strlen(login = hydra_get_next_login()) == 0) { login = empty; } else { if (miscptr) { if (strlen(miscptr)+strlen(login) > sizeof(context)) { return 4; } memset(context, 0, sizeof(context)); strncpy(context, login, strlen(login)); strncpy(context+strlen(login), miscptr, sizeof(miscptr)+1); login=context; } } //login and password are case insensitive //str_upper(login); if (strlen(pass = hydra_get_next_password()) == 0) pass = empty; ncp_lib_error_code = ncp_find_conn_spec3(inet_ntoa((struct in_addr) remote_ip.sin_addr), login, "", 1, getuid(), 0, &session->spec); if (ncp_lib_error_code) { free(session);return 1;} ncp_lib_error_code = NWCCOpenConnByName(NULL, session->spec.server, NWCC_NAME_FORMAT_BIND, NWCC_OPEN_NEW_CONN, NWCC_RESERVED, &session->conn); if (ncp_lib_error_code) { free(session);return 1;} memset(session->spec.password, 0, sizeof(session->spec.password)); memcpy(session->spec.password, pass, strlen(pass)+1); //str_upper(session->spec.password); ncp_lib_error_code = ncp_login_conn(session->conn, session->spec.user, object_type, session->spec.password); switch (ncp_lib_error_code & 0x0000FFFF) { case 0x0000: /* Success */ #ifdef NCP_DEBUG printf("Connection success (%s / %s). Error code: %X\n", login, pass, ncp_lib_error_code); #endif ncp_close(session->conn); hydra_report_found_host(port, ip, "ncp", fp); //ok hydra_completed_pair(); if (memcmp(hydra_get_next_pair(), &HYDRA_EXIT, sizeof(HYDRA_EXIT)) == 0) return 3; //exit free(session); return 2; //next break; case 0x89DE: /* PASSWORD INVALID */ case 0x89F0: /* BIND WILDCARD INVALID */ case 0x89FF: /* NO OBJ OR BAD PASSWORD */ case 0xFD63: /* FAILED_AUTHENTICATION */ case 0xFDA7: /* NO_SUCH_ENTRY */ #ifdef NCP_DEBUG printf("Incorrect password (%s / %s). Error code: %X\n", login, pass, ncp_lib_error_code); #endif ncp_close(session->conn); hydra_completed_pair(); if (memcmp(hydra_get_next_pair(), &HYDRA_EXIT, sizeof(HYDRA_EXIT)) == 0) { free(session); return 2; //next } break; default: #ifdef NCP_DEBUG printf("Failed to open connection. Error code: %X\n",ncp_lib_error_code); #endif if (session->conn != NULL) ncp_close(session->conn); break; } free(session); return 1; //reconnect }