Desvendando Usuários


Cyberguard: Linux Luminarium.

Você achou que você, o hacker, era o único habitante nesta máquina? Existem MUITOS usuários em um sistema Linux típico! A lista completa de usuários de um sistema Linux é especificada no arquivo /etc/passwd (chamado assim por razões históricas — ele não armazena mais as senhas de fato). Aqui está um exemplo extraído do container do dojo:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:101:101:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
systemd-network:x:102:103:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:103:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
mysql:x:104:105:MySQL Server,,,:/nonexistent:/bin/false
messagebus:x:105:106::/nonexistent:/usr/sbin/nologin
sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
hacker:x:1000:1000::/home/hacker:/bin/bash

São muitos usuários e muitas informações! Cada linha contém, separados por :, o nome de usuário (username), um x como marcador de posição para onde a senha costumava ficar (veremos onde ela fica de verdade mais adiante), o ID numérico do usuário (UID), o ID numérico do grupo padrão (GID), detalhes descritivos do usuário, o diretório pessoal (home directory) e a shell padrão.

Podemos ver o usuário hacker lá embaixo. Esse é você! A maior parte dos outros usuários existe por motivos históricos, são contas de serviço para suportar softwares instalados ou são contas de "utilidade" (por exemplo, o usuário nobody é utilizado para garantir que certos programas rodem sem nenhum privilégio especial).

Um usuário fundamental é o root: o administrador do sistema. O administrador do sistema possui implicações óbvias de segurança: um usuário comum como hacker que consiga, através de diversas funcionalidades do Linux, se tornar o usuário root, terá controle total sobre o sistema. Um objetivo muito frequente de invasores é justamente escalar privilégios para root, e por isso a conta root deve ser protegida a todo custo!

Neste módulo, exploraremos diversas peculiaridades sobre contas de usuários, aprenderemos os métodos formais de alternar usuários para administrar o sistema e nos divertiremos pelo caminho!


Não são apenas invasores que precisam se tornar root. Muitas vezes, você, como dono do seu próprio computador, precisa de acesso de root para administrá-lo. Tornar-se root é uma ação bastante comum entre usuários de Linux, e existem dois utilitários principais para essa finalidade: su e sudo.

Neste desafio, abordaremos o mais antigo deles: su (comando para substituir usuário — substitute user). Ele não é mais tão comumente utilizado no dia a dia moderno para elevar privilégios a root, mas é um utilitário elegante e clássico que cobriremos primeiro.

O su é um binário com bit setuid:

hacker@dojo:~$ ls -l /usr/bin/su
-rwsr-xr-x 1 root root 232416 Dec 1 11:45 /usr/bin/su
hacker@dojo:~$

Como possui o bit SUID ativado, o su executa com os privilégios de root. Rodando como root, ele tem permissão para iniciar uma shell de root! Claro que o su não é ingênuo: antes de permitir que o usuário eleve seus privilégios para root, ele verifica se o usuário sabe a senha do root:

hacker@dojo:~$ su
Password: 
su: Authentication failure
hacker@dojo:~$

Essa checagem contra uma senha global de root é justamente o que tornou o su menos comum em ambientes modernos. Sistemas modernos raramente definem senhas diretas de root, preferindo outros mecanismos (que veremos a seguir) para conceder privilégios administrativos.

Mas ESTE desafio (e somente este desafio) possui, sim, uma senha de root. Essa senha é hack-the-planet, e você deve fornecê-la ao su para se tornar root! Faça isso agora e leia a flag!

Sem nenhum argumento, o comando su iniciará uma shell como root (após a autenticação com a senha do root). No entanto, você também pode passar um nome de usuário como argumento para alternar para aquele usuário específico em vez do root. Por exemplo:

hacker@dojo:~$ su some-user
Password:
some-user@dojo:~$

Sensacional! Neste nível, você deve alternar para o usuário zardus e então executar /challenge/run. A senha de zardus é dont-hack-me. Boa sorte!

Quando você insere uma senha para o comando su, ele a compara com a senha armazenada para aquele usuário. Essas senhas costumavam ser armazenadas no /etc/passwd, mas como o /etc/passwd precisa ser um arquivo legível por todos os usuários do sistema, isso não era seguro para senhas; por isso, elas foram migradas para o /etc/shadow. Aqui está o exemplo de /etc/shadow do nível anterior:

root:$6$s74oZg/4.RnUvwo2$hRmCHZ9rxX56BbjnXcxa0MdOsW2moiW8qcAl/Aoc7NEuXl2DmJXPi3gLp7hmyloQvRhjXJ.wjqJ7PprVKLDtg/:19921:0:99999:7:::
daemon:*:19873:0:99999:7:::
bin:*:19873:0:99999:7:::
sys:*:19873:0:99999:7:::
sync:*:19873:0:99999:7:::
games:*:19873:0:99999:7:::
man:*:19873:0:99999:7:::
lp:*:19873:0:99999:7:::
mail:*:19873:0:99999:7:::
news:*:19873:0:99999:7:::
uucp:*:19873:0:99999:7:::
proxy:*:19873:0:99999:7:::
www-data:*:19873:0:99999:7:::
backup:*:19873:0:99999:7:::
list:*:19873:0:99999:7:::
irc:*:19873:0:99999:7:::
gnats:*:19873:0:99999:7:::
nobody:*:19873:0:99999:7:::
_apt:*:19873:0:99999:7:::
systemd-timesync:*:19901:0:99999:7:::
systemd-network:*:19901:0:99999:7:::
systemd-resolve:*:19901:0:99999:7:::
mysql:!:19901:0:99999:7:::
messagebus:*:19901:0:99999:7:::
sshd:*:19901:0:99999:7:::
hacker::19916:0:99999:7:::
zardus:$6$bEFkpM0w/6J0n979$47ksu/JE5QK6hSeB7mmuvJyY05wVypMhMMnEPTIddNUb5R9KXgNTYRTm75VOu1oRLGLbAql3ylkVa5ExuPov1.:19921:0:99999:7:::

Separados por :, o primeiro campo de cada linha é o nome de usuário e o segundo é a senha criptografada em hash. Um valor de * ou ! significa funcionalmente que o login por senha para aquela conta está desativado; um campo vazio significa que não há senha (uma falha de configuração não muito rara que permite usar su sem senha em certos cenários); e uma cadeia longa como a de Zardus ($6$bEFkpM0w/6J0n979$47ksu/JE5QK6hSeB7mmuvJyY05wVypMhMMnEPTIddNUb5R9KXgNTYRTm75VOu1oRLGLbAql3ylkVa5ExuPov1.) é o resultado do hash unidirecional (one-way hash) da senha de Zardus do nível anterior (que era dont-hack-me). Os demais campos desse arquivo têm outros significados e você pode ler mais sobre eles aqui.

Quando você digita uma senha no su, o utilitário gera o hash unidirecional dela e compara o resultado com o hash armazenado. Se os hashes coincidirem, o su concede o acesso à conta!

Mas e se você não souber a senha? Se você tiver o hash da senha, você pode quebrá-lo (crack)! Embora o arquivo /etc/shadow seja, por padrão, legível apenas pelo root, vazamentos acontecem! Por exemplo, backups frequentemente são armazenados desprotegidos ou sem criptografia em servidores de arquivos, o que já gerou inúmeros incidentes de vazamento de dados no mundo real.

Se um invasor obtiver uma cópia vazada do /etc/shadow, ele pode iniciar o processo de quebra de senhas (cracking). A quebra pode ser realizada com a famosa ferramenta John the Ripper, desta forma:

hacker@dojo:~$ john ./my-leaked-shadow-file
Loaded 1 password hash (crypt, generic crypt(3) [?/64])
Will run 32 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password1337      (zardus)
1g 0:00:00:22 3/3 0.04528g/s 10509p/s 10509c/s 10509C/s lykys..lank
Use the "--show" option to display all of the cracked passwords reliably
Session completed
hacker@dojo:~$

Aqui, o John the Ripper quebrou o hash da senha vazada de Zardus e descobriu o valor real em texto claro: password1337. Pobre Zardus!

Este nível simula exatamente esse cenário, fornecendo a você um vazamento do /etc/shadow (em /challenge/shadow-leak). Quebre a senha (isso pode levar alguns minutos), faça su para o usuário zardus e execute /challenge/run para capturar a flag!

Antigamente, um sistema Linux típico possuía uma senha para o root, que os administradores utilizavam com su para se tornarem root (após se autenticarem com a senha da sua conta de usuário comum). Porém, senhas de root são trabalhosas de gerenciar, elas (ou seus hashes!) podem vazar e não escalam bem em ambientes corporativos ou grandes parques de servidores. Para resolver isso, nas últimas décadas, o ecossistema migrou da administração via su para a administração via sudo (Curiosidade: sudo originalmente significava superuser do, mas com o tempo passou a ser interpretado como "su 'do'", e como su significa "substitute user", o significado moderno de sudo é "substitute user, do" — substituir usuário e executar).

Diferente do su, que por padrão abre uma nova shell como o usuário especificado, o sudo executa por padrão um comando específico diretamente como root:

hacker@dojo:~$ whoami
hacker
hacker@dojo:~$ sudo whoami
root
hacker@dojo:~$

Ou, em um exemplo mais relevante para capturar flags:

hacker@dojo:~$ grep hacker /etc/shadow
grep: /etc/shadow: Permission denied
hacker@dojo:~$ sudo grep hacker /etc/shadow
hacker:$6$Xro.e7qB3Q2Jl2sA$j6xffIgWn9xIxWUeFzvwPf.nOH2NTWNJCU5XVkPuONjIC7jL467SR4bXjpVJx4b/bkbl7kyhNquWtkNlulFoy.:19921:0:99999:7:::
hacker@dojo:~$

Diferente do su, que depende da senha da conta de destino (root), o sudo consulta políticas configuradas para determinar se o usuário atual tem autorização para executar comandos como root (geralmente exigindo apenas a senha do próprio usuário ou nenhuma senha). Essas políticas são definidas no arquivo /etc/sudoers e, embora estejam fora do escopo deste nível, há excelentes recursos para aprender mais sobre isso!

Portanto, o mundo adotou o sudo e deixou o su para trás na administração de sistemas. Inclusive, o Modo Privilegiado (Privileged Mode) do próprio pwn.college funciona concedendo acesso a você via sudo para elevar privilégios!

Neste nível, concederemos acesso a você via sudo, e você usará isso para ler a flag. Simples e direto!


NOTA: Após este nível, habilitaremos o Modo Privilegiado (Privileged Mode)! No ambiente de trabalho, clique no cadeado fechado para reiniciar o desafio em Modo Privilegiado e clique no cadeado aberto para retornar ao modo normal. O hostname no prompt do terminal termina com ~practice enquanto o Modo Privilegiado estiver ativo. O Modo Privilegiado dá a você acesso total ao sudo para inspecionar e depurar o ambiente, mas fornece uma flag de teste (placeholder) que não pode ser submetida para pontuação.


30-Day Scoreboard:

This scoreboard reflects solves for challenges in this module after the module launched in this dojo.

Rank Hacker Badges Score