De qual versão o Bash solta privilégios?

5

Eu tenho tentado fazer algum ataque de bufferoverflow, e eu pensei que poderia usar system("/bin/bash") para obter um shell de root.

Então eu leio a documentação para system() .

Diz:

system() will not, in fact, work properly from programs with set-user-ID or set-group-ID privileges on systems on which /bin/sh is bash version 2, since bash 2 drops privileges on startup.

O sistema que estou recebendo tem uma versão bash 4.3, e quando eu uso um system("/bin/bash") , eu não obtenho privilégios de root (claro que o programa inicial que eu estou atacando começa com privilégios de root). Minha pergunta é: o sistema soltará privilégios apenas na versão 2 do bash, ou será descartado para qualquer bash que tenha uma versão > 2?

EDIT: /bin/bash apenas descarta privilégios, enquanto /bin/dash ou /bin/sh não.

Depois de ler os comentários de @ StéphaneChazelas, EDIT2:

  • verifique este link para mais explicações e precisão sobre o bash dropping privilégios.
  • A opção -p pode ser usada para manter os privilégios quando o bash aparecer.
por Nark 21.06.2018 / 11:03

1 resposta

2

Versão atual

Versões recentes do bash eliminarão privilégios, a menos que tenha sido iniciado com -p . Da seção de bash (1) descrevendo o modo privilegiado:

If the shell is started with the effective user (group) id not equal to the real user (group) id, and the -p option is not supplied, [...] the effective user id is set to the real user id. If the -p option is supplied at startup, the effective user id is not reset. Turning this option off causes the effective user and group ids to be set to the real user and group ids.

Versões históricas

Você perguntou "De qual versão ...?". A parte de system() que você cita foi inalterada desde a primeira revisão disponível no repositório git ativo (versão 1.70) . Isso foi verificado em 2004, e os comentários indicam que ele foi modificado pela última vez em 2001.

A versão 3 do Bash foi lançada em 2004 . Isso significa que o bash 2 teria sido a versão atual / mais recente no momento. Então, efetivamente, está dizendo "... bash versão 2 ou superior / mais recente", ou seja. este tem sido o caso desde versão 2.

Para confirmar por si mesmo, você poderia tentar construir algumas versões intermediárias e testá-las, ou consultar o bash repositório git . As linhas responsáveis são:

  if (running_setuid && privileged_mode == 0)
    disable_priv_mode ();

Eles estão lá desde versão 2.0 . Olhando para trás para versão 1.14.7 , o bash somente descartar privilégios quando o modo privilegiado foi explicitamente desativado com +p :

    case 'p':
      if (on_or_off == '+')
      {
        setuid (current_user.uid);
        setgid (current_user.gid);
        current_user.euid = current_user.uid;
        current_user.egid = current_user.gid;
      }
    
por 18.07.2018 / 12:25