Não é possível contrabandear dados no nome de usuário usando o módulo pam personalizado - input_userauth_request: usuário inválido

0

Estou tentando obter dados em um processo chamado via ssh adicionando-o ao nome de usuário fornecido, por exemplo

ssh user@smuggledata@host

Eu escrevi um módulo PAM, no entanto

  1. O sshd já decidiu que o usuário é ruim antes de invocar o PAM
  2. embora eu tenha alterado o PAM_USER, os módulos subseqüentes ainda estão se autenticando em relação ao nome de usuário enviado.

Primeiramente, tentei executar o código com auth requisite mymodule.so e o código em pam_sm_authenticate() . Embora o código tenha sido disparado - não funcionou:

May  1 22:40:30 animal sshd[3827]: Invalid user colin@example from 127.0.0.1
May  1 22:40:30 animal sshd[3827]: input_userauth_request: invalid user colin@example [preauth]
May  1 22:40:35 animal pam_pat[3827]: Retrieved username colin@example
May  1 22:40:35 animal pam_pat[3827]: checking char c against 3 dividers
May  1 22:40:35 animal pam_pat[3827]: checking char o against 3 dividers
May  1 22:40:35 animal pam_pat[3827]: checking char l against 3 dividers
May  1 22:40:35 animal pam_pat[3827]: checking char i against 3 dividers
May  1 22:40:35 animal pam_pat[3827]: checking char n against 3 dividers
May  1 22:40:35 animal pam_pat[3827]: checking char @ against 3 dividers
May  1 22:40:35 animal pam_pat[3827]: Found divider @
May  1 22:40:35 animal pam_pat[3827]: user=colin, data=example
May  1 22:40:35 animal sshd[3827]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=127.0.0.1  user=colin
May  1 22:40:37 animal sshd[3827]: Failed password for invalid user colin@example from 127.0.0.1 port 43998 ssh2
May  1 22:41:28 animal sshd[3827]: Connection closed by 127.0.0.1 port 43998 [preauth]

Observe que, quando a execução atinge a autenticação pam_unix, ela falha, mas o usuário é relatado como o valor transformado em PAM_USER. A senha estava correta, portanto, pam_unix provavelmente não estava autenticando contra PAM_USER.

Eu também tentei com account requisite mymodule.so e o código em pam_sm_acct_mgmt() - mas o código não foi invocado:

May  1 22:57:10 animal sshd[4105]: Invalid user colin@exmple from 127.0.0.1
May  1 22:57:10 animal sshd[4105]: input_userauth_request: invalid user colin@exmple [preauth]
May  1 22:57:16 animal sshd[4105]: pam_unix(sshd:auth): check pass; user unknown
May  1 22:57:16 animal sshd[4105]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=127.0.0.1
May  1 22:57:18 animal sshd[4105]: Failed password for invalid user colin@exmple from 127.0.0.1 port 44118 ssh2
May  1 22:57:27 animal sshd[4105]: Connection closed by 127.0.0.1 port 44118 [preauth]

Olhando o código-fonte para pam_unix , ele recupera o nome de usuário de pam_get_user() , que aparentemente aponta para algo diferente de PAM_USER.

Como altero o valor que é subsequentemente usuário para autenticação?

  • como posso garantir que isso aconteça antes que qualquer outro processamento do nome de usuário ocorra?
  • existe uma maneira melhor de fazer isso do que escrever de volta para o ponteiro retornado por pam_get_user ()?

atualização O código (com o pam_get_user () adicionado:

    char *submitted_name;
    char work_bufr[PAT_BUFR];
    char log_entry[PAT_BUFR];
    int an_int;
    char dividers[]="@%+";
    int num_dividers;
    char *cursor;
    char divider_found[]="0";
    const char *debug_user;

    openlog("pam_pat",  LOG_CONS | LOG_PID | LOG_NDELAY, LOG_AUTH);
    /* retrieve a copy of the submitted username */
    if (PAM_SUCCESS != pam_get_item(pamh, PAM_USER, (void *) &submitted_name) || !(submitted_name)) {
      syslog (LOG_ERR, "Failed to retrieve username from pam");
      closelog();
      return(PAM_IGNORE);
    }
    syslog (LOG_ERR, "Retrieved username %s", submitted_name);
    strncpy(work_bufr, submitted_name, PAT_BUFR);
    submitted_name=work_bufr;
    /* search for dividers and split string */
    cursor=submitted_name;
    an_int=PAT_BUFR;
    num_dividers=(int)strlen(dividers);
    while (--an_int && '
ssh user@smuggledata@host
'!=*cursor) { syslog(LOG_ERR, "checking char %c against %d dividers", (int)*cursor, num_dividers); for (int x=0; x<num_dividers; x++) { if (*cursor==dividers[x]) { syslog(LOG_ERR, "Found divider %c", *cursor); an_int=0; *divider_found=*cursor; *cursor='
May  1 22:40:30 animal sshd[3827]: Invalid user colin@example from 127.0.0.1
May  1 22:40:30 animal sshd[3827]: input_userauth_request: invalid user colin@example [preauth]
May  1 22:40:35 animal pam_pat[3827]: Retrieved username colin@example
May  1 22:40:35 animal pam_pat[3827]: checking char c against 3 dividers
May  1 22:40:35 animal pam_pat[3827]: checking char o against 3 dividers
May  1 22:40:35 animal pam_pat[3827]: checking char l against 3 dividers
May  1 22:40:35 animal pam_pat[3827]: checking char i against 3 dividers
May  1 22:40:35 animal pam_pat[3827]: checking char n against 3 dividers
May  1 22:40:35 animal pam_pat[3827]: checking char @ against 3 dividers
May  1 22:40:35 animal pam_pat[3827]: Found divider @
May  1 22:40:35 animal pam_pat[3827]: user=colin, data=example
May  1 22:40:35 animal sshd[3827]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=127.0.0.1  user=colin
May  1 22:40:37 animal sshd[3827]: Failed password for invalid user colin@example from 127.0.0.1 port 43998 ssh2
May  1 22:41:28 animal sshd[3827]: Connection closed by 127.0.0.1 port 43998 [preauth]
'; if (PAM_SUCCESS==pam_set_item(pamh, PAM_USER, submitted_name)) { ++cursor; syslog (LOG_ERR, "user=%s, data=%s",submitted_name,cursor); setenv("PAM_PAT_DIVDR", divider_found, 1); setenv("PAM_PAT_DATA", cursor, 1); if (PAM_SUCCESS == pam_get_user(pamh, &debug_user, NULL)) { syslog (LOG_ERR, "pam_get_user() found %s", debug_user); } closelog(); return(PAM_IGNORE); } else { syslog (LOG_ERR, "Failed to update username"); } } } cursor++; } syslog (LOG_ERR, "Extended username not found."); closelog(); return(PAM_IGNORE); }
    
por symcbean 02.05.2017 / 00:24

2 respostas

0

input_userauth_request () é uma função do sshd que solicita o nome de usuário.

Para ler pam_ldap (onde o nome de usuário que está sendo autenticado não é necessariamente conhecido para o sistema local) a mensagem "sshd [xxx]: input_userauth_request: invalid user ..." aparece quando a biblioteca LDAP NSS não está instalada ou não está configurada. A partir disso, deduzo que o sshd primeiro tenta validar o nome de usuário antes de passar para o PAM (WTF?). Então, para evitar este erro inicial, eu preciso escrever um módulo NSS (presumivelmente implementando o getpwnam (), mas eu espero ter que separar o sshd para descobrir como ele funciona).

erk!

(e ainda não estou confiante de que isso consertará o problema)

    
por 02.05.2017 / 23:11
0

A página man de pam_get_user(3) diz que obtém seu valor do usuário obtido por pam_start(3) . Essa função, por sua vez, diz que os elementos em sua estrutura podem ser configurados usando pam_set_item(3) . A página man para esta terceira função fornece uma referência explícita para alterar o nome de usuário que está sendo testado para autenticação.

The pam_set_item function allows applications and PAM service modules to access and to update PAM informations of item_type. For this a copy of the object pointed to by the item argument is created. The following item_types are supported [...]

PAM_USER The username of the entity under whose identity service will be given. That is, following authentication, PAM_USER identifies the local entity that gets to use the service. Note, this value can be mapped from something (eg., "anonymous") to something else (eg. "guest119") by any module in the PAM stack. As such an application should consult the value of PAM_USER after each call to a PAM function.

    
por 02.05.2017 / 00:40