Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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
}