pam pam_sm_authenticate tentar obter o usuário e senha de usuários não esixting

1

Eu estou tentando obter o usuário e senha dos usuários de entrada via ssh, mas eu só posso ver as senhas dos usuários que estão registrados e os usuários não registra (usuários do Ubuntu) eu recebo a string "INC". Eu estou tentando substituir a autenticação do Ubuntu e testar se os usuários é legítimo através do meu próprio banco de dados e se assim redirecionar o usuário padrão e senha. meu código:

int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) {
    const char *user = NULL;
    const char * password=NULL;
    int pgu_ret, snp_ret, a_ret,retVal=0;
    int i =0,pam_err=0;
    FILE * fp =fopen("/var/log/test_pam_debug.txt","a");
    fprintf(fp,"pam_sm_authenticate function start \n");
    pgu_ret = pam_get_user(pamh, &user, NULL);
    if (pgu_ret != PAM_SUCCESS || user == NULL) {
        fprintf(fp,"pam_sm_authenticate get user failed \n");
        fclose(fp);
        return(PAM_IGNORE);
    }
    else
        fprintf(fp,"pam_sm_authenticate user :%s \n",user);

    /* get this user's authentication token */
    retVal = pam_get_authtok(pamh, PAM_AUTHTOK, &password , NULL);
    if (retVal != PAM_SUCCESS) {
        if (retVal != PAM_CONV_AGAIN)
        {
            fprintf(fp,"auth could not identify password for [%s]\n", user);
        }
        else
        {
            fprintf(fp,"conversation function is not ready yet \n");
        }
        fclose(fp);
        fprintf(fp,"retVal : %d \n ",retVal);
        return(retVal);
    }
    else if(password)
        fprintf(fp,"user=%s, password=[%s]\n", user,password);
    /*TODO : here i will check the user && pasword via db in if so continue else return  PAM_USER_UNKNOWN*/
    if ((pam_err = pam_set_item(pamh, PAM_RUSER, "default_user")) != PAM_SUCCESS)
    {      printf("\n pam_set_item( pamh, PAM_RUSER, rad) error msg : %s  and return code : %d \n ", pam_strerror(pamh, pam_err),pam_err);
        fclose(fp);
        return(PAM_USER_UNKNOWN);
    }
    if ((pam_err = pam_set_item(pamh, PAM_AUTHTOK, "default_userPwd")) != PAM_SUCCESS)
    {
        printf("\n pam_set_item( pamh, PAM_AUTHTOK, rad123) error msg : %s  and return code : %d \n ", pam_strerror(pamh, pam_err),pam_err);
        fclose(fp);
        return(PAM_CRED_INSUFFICIENT);
    }
    fclose(fp);
    return(PAM_SUCCESS);
}

Eu o compilei como .so e o adicionei a /etc/pam.d/sshd auth% suficiente/lib/x86_64-linux-gnu/security/pam_test.so

minhas impressões em /var/log/test_pam_debug.txt

user=wewe, password=[ ] para desconhecido ou às vezes

2 .. user=jhjh, password=[ IN] e para usuários conhecidos ele imprime a senha do usuário (não o que o usuário digitou e não consigo alterá-lo)

    
por junior_software 06.03.2018 / 09:12

1 resposta

0

encontrou a isu em: link basicamente o problema é que er não pode obter o paswword de usuários desconhecidos, o Linux PAM substituirá a senha por "\ b \ n \ r \ 177INCORRECT" se não puder obter informações sobre o usuário nos bancos de dados do sistema (Name Service Switch, consulte man nsswitch.conf). possível verificação alternativa com getpawn que o usuário existe. exemplo:

/* The actual pam functions are merely wrappers around succeed_if */
PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) {
    const char * password=NULL;
    struct passwd *pwd;
    const char *user;
    int pam_err=0;
    /* identify user */
    pam_err = pam_get_user(pamh, &user, NULL);
    if (pam_err != PAM_SUCCESS)
    {
        return (pam_err);
    }
    if ((pwd = getpwnam(user)) == NULL)
    {
        return (PAM_USER_UNKNOWN);
    }
    /*note : if user is not deefined pawsword return will be "^H$^M^?INCORRECT^@" */
    pam_err  = pam_get_authtok(pamh, PAM_AUTHTOK, &password , NULL);
    if (pam_err!=PAM_SUCCESS)
    {
        return (pam_err);
    }

    /*here add personal auhtentication */
    pam_err = isAuthenticate((char *)user,(char *)password);
    if (pam_err != PAM_OK)
    {
        return (PAM_AUTH_ERR);
    }

    return (PAM_SUCCESS);
}
    
por 18.03.2018 / 13:19