mesma criptografia com / etc / shadow

3

Estou fazendo uma ferramenta de gui para algum script de detecção de malware no linux para permitir que administradores de servidores analisem o resultado desse script dentro da web.

como eu sei que a criptografia usada em / etc / shadow é strong, eu gostaria de usar a mesma senha em root no meu aplicativo e verificar as alterações em / etc / shadow e sincronizar a senha root em db e permitir que a admin para login usando credenciais raiz.

Eu vou desenvolver isso em PHP. Eu queria saber o que exatamente a criptografia está sendo usada nisso e é possível implementar a mesma coisa em php, de modo que eu possa permitir que as pessoas façam login com credenciais de root no meu gui em php?

    
por Hector 08.11.2014 / 13:03

4 respostas

2

O valor no campo de senha começa com $XY$ , onde X é um número ou é um dos dois DES (Padrão ou Estendido, dependendo do tamanho).

O

DES é raramente suportado, porque não é mais seguro. O Y é opcional, dependendo do X designa o seguinte (após o segundo $ ):

1 : CRYPT_MD5 ( Y vazio) 2 : CRYPT_BLOWFISH ( Y pode ser a , x ou y ) 5 : CRYPT_SHA256 6 : CRYPT_SHA512

É mais provável que você encontre o $6$ hoje em dia e o cálculo é feito com base repetidamente (padrão 5000 vezes) aplicando res = sha(res + salt) começando com res = password . O sal segue o segundo $ até um terceiro $ a menos que haja um número diferente de ciclos também pode ser especificado e então é armazenado antes do sal:

$6$salt$result
$6$rounds=N$salt$result

(onde o primeiro implica 5000 rodadas).

Você pode, é claro, implementar isso sozinho, mas eu verificaria se a criptografia do PHP suporta a especificação do algoritmo a ser usado, ou caso contrário, procure chamar mkpasswd (por exemplo, no pacote whois no Ubuntu)

Dado que tudo isso funciona, eu recomendo não usar a conta root e a senha para isso nem mesmo por HTTPS. Se o seu PHP é comprometido, injetar algo que espiona a senha do sistema seria muito fácil.

    
por 08.11.2014 / 14:00
1

I can be able to let people login with root credentials to my gui in php?

Se você quer dizer que o processo da GUI tem credenciais raiz, então sim. Esse é um requisito. passwd e outras coisas que fazem isso < o setuid bit definido e é de propriedade do root. Para obter instruções sobre como fazer isso com o php veja aqui .

Primeiro, certifique-se de que um fato básico sobre senhas seja claro - acho que você provavelmente já sabe disso, mas: As senhas não estão armazenadas no sistema. Um deles é um deles. Um hash unidirecional é uma string que pode ser criada usando um algoritmo de criptografia de uma string de origem (por exemplo, uma senha real), mas a origem não pode ser recriada a partir do hash .

Isso significa que, mesmo que alguém consiga /etc/shadow , não é possível reconstruir as senhas dos usuários. A criptografia é unidirecional, não pode ser revertida. No entanto, você pode pegar uma string, criptografá-la da mesma maneira e compará-la ao hash. É assim que a autenticação por senha acontece.

A estrutura da string hash em /etc/shadow é explicada em a boa resposta de Anthon . Abaixo está o processo básico de autenticação demonstrado em C. O PHP tem um wrapper para getpwnam() ou você poderia analisar e armazenar /etc/shadow . Para entender o que o crypt() faz com a string (como Anthon menciona, ele inclui uma indicação do algoritmo usado e o "salt" para criar o hash), veja NOTES - > Glibc observa em man 3 crypt . O crypt() do PHP parece funcionar da mesma maneira, embora o documento seja menos claro.

As únicas funções significativas são getpwnam() e crypt() , todo o resto é apenas uma entrada básica, saída e manipulação de string.

#define _XOPEN_SOURCE // Important.
#include <errno.h>
#include <crypt.h>
#include <shadow.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main (int argc, const char *argv[]) {
    if (argc < 2) {
        puts("Username required.");
        return 1;
    }

// Get shadow password.
    struct spwd *spw = getspnam(argv[1]);
    if (!spw) {
        if (errno == EACCES) puts("Permission denied.");
        else if (!errno) puts("No such user.");
        else puts(strerror(errno));
        return 1;
    }

// Read password from user.
    fprintf(stderr, "%s> ", argv[1]);
    char buffer[4096];
    int len = read(0, buffer, 4095);
    // Ditch the newline.
    buffer[len - 1] = '
gcc --std=c99 whatever.c -o testpw -lcrypt
'; // Hash and report. char *hashed = crypt(buffer, spw->sp_pwdp); printf("%s\n%s\n", spw->sp_pwdp, hashed); if (!strcmp(spw->sp_pwdp, hashed)) puts("Password matched."); else puts("Password DID NOT match."); return 0; }

Você pode compilar isso:

./testpw me

Você precisa executá-lo como root ou receberá "Permissão negada". Você precisa especificar um nome de usuário real:

#define _XOPEN_SOURCE // Important.
#include <errno.h>
#include <crypt.h>
#include <shadow.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main (int argc, const char *argv[]) {
    if (argc < 2) {
        puts("Username required.");
        return 1;
    }

// Get shadow password.
    struct spwd *spw = getspnam(argv[1]);
    if (!spw) {
        if (errno == EACCES) puts("Permission denied.");
        else if (!errno) puts("No such user.");
        else puts(strerror(errno));
        return 1;
    }

// Read password from user.
    fprintf(stderr, "%s> ", argv[1]);
    char buffer[4096];
    int len = read(0, buffer, 4095);
    // Ditch the newline.
    buffer[len - 1] = '
gcc --std=c99 whatever.c -o testpw -lcrypt
'; // Hash and report. char *hashed = crypt(buffer, spw->sp_pwdp); printf("%s\n%s\n", spw->sp_pwdp, hashed); if (!strcmp(spw->sp_pwdp, hashed)) puts("Password matched."); else puts("Password DID NOT match."); return 0; }

Nota: o eco não está desativado, portanto, a senha ficará visível quando você digitá-lo.

    
por 08.11.2014 / 14:50
0

Para a estrutura do / etc / shadow, veja o link quanto à criptografia, tenho certeza que o Linux usa o algoritmo Crypt (veja link e link )

    
por 08.11.2014 / 13:19
0

As senhas não são criptografadas. Eles são misturados com sal.

O formato usado em /etc/passwd ou /etc/shadow suporta uma ampla gama de diferentes algoritmos de hash tendo uma especificação de algoritmo como parte da cadeia. Tanto a geração da string com hash quanto a verificação são feitas usando a função crypt , que seleciona automaticamente o algoritmo apropriado com base na string de entrada.

Existe uma função crypt em php, mas, para o seu caso de uso, eu não recomendaria usá-la.

A execução de código em um servidor da Web com privilégios de root é extremamente perigosa. Leva apenas um pequeno erro antes que o seu sistema esteja vulnerável a ataques.

Em vez disso, recomendo que seu script php ganhe apenas privilégios de root executando um dos utilitários suid padrão no sistema, que pode conceder privilégios de root se receber a senha de root. O comando su pode ser o mais adequado para você.

Se o sistema foi configurado de forma que a senha raiz hash seja armazenada em /etc/passwd , seu script poderia lê-lo e usar criptografia para validar a senha digitada pelo usuário. Mas não há muitos motivos para isso, e não funcionará se /etc/shadow for usado. Em vez disso, basta passar a senha que o usuário digitou para su e aprender com a resposta de su se a senha estava correta.

    
por 08.11.2014 / 19:12

Tags