Notes
"Usem linux… porque no linux não tem vírus?"
Notas baseadas na live "Segurança em Linux — Christiano Linuxman | ROADSEC@HOME#37" da Roadsec, no YouTube.
Identificação de usuários
usuár. | núme. |
---|---|
root | 0 |
syst. | 1 a 999 |
comum | 1000 a 65535 |
Permissões
ação | núme. |
---|---|
read | 4 |
write | 2 |
execute | 1 |
total | 7 |
Manipulação de arquivos
Tudo no linux é arquivo ou pasta. A ordem de permissão de manipular esses arquivos é:
dono | . | grupo | . | outras |
---|---|---|---|---|
7(rwx) | 7(rwx) | 7(rwx) |
A hierarquia de permissões se da por:
- Pasta
- Arquivo
- Arquivo
Umask
umask
- user mask - 0 022
A umask
influencia na permissão de criação de diretórios e arquivos. A umask
é um padrão a nível de kernel.
Toda vez que criarmos uma pasta/arquivo, será subtraído a nossa umask
(022) da permissão máxima (777), e o resultado será a permissão desta pasta/arquivo.
mkdir mateus_pasta
7rwx 5r-x 5r-x
No caso do arquivo, será subtraído mais 1 bit de cada permissão (111).
touch arquivo
6rw- 4r-- 4r--
O
d
junto com as perimções indica que o arquivo é um diretório.
Permissões especiais
Existem também as permissões especiais de usuário, representado pelo primeiro número da umask
0022.
permission | n.º | power |
---|---|---|
SUID BIT | 4 | rodar binários com o poder de root |
SGID BIT | 2 | PDC |
STICK BIT | 1 | define que só quem pode deletar um arquivo é o dono |
Imagine o cenário que precisamos que alguém execute o comando shutdown
, porem não queremos passar a senha de root. Podemos dar a permissão SUID BIT para o binário shutdown
:
$ chmod 4755 /sbin/shutdown
Assim, qualquer usuário pode executar o comando shutdown
com poder de root sem precisar ser root.
O mito
- (P.) Arquivos criados pelo usuário têm a permissão 644.
- (P.) Um vírus é um binário com poder de execução.
- (1) Um usuário não pode criar um binário naturalmente.
- (2, 3) ∴ Sem binários, sem vírus.
Manipulando arquivos no lugar certo
Libs
Para cada comando no linux, precisamos de bibliotecas para funcionarem (equivalentes a DLLs do Windows). Então como sei as libs necessárias para rodar um determinado comando? É só usar o comando ldd
.
Ambiente Ubuntu 20.04 no KataCoda
Agora executando o comando ldd
nos binários cat
e wget
:
Há uma semelhança notável entre os 3 binários, a biblioteca libc.so.6
.
A maioria dos comandos linux usam essa biblioteca para funcionarem. Mas se mudarmos o nome desse arquivo e tentarmos executar o ls
?
O sistema sentou. Bem, para resolver isso é só dar o mv
de volta…
Inicialização do Linux
No linux temos 6 tipos de runlevel, são eles:
n.º | command |
---|---|
0 | shutdown |
1 | modo de segurança |
2 | multi-usuário/sem gráfico (debian) |
3 | multi-usuário |
4 | personalização |
5 | multi-usuário/gráfico |
6 | reboot |
Então se eu souber qual é o primeiro processo, que é o init
e chamar o runlevel 0 a máquina irá desligar.
Estamos no level 5, podemos conferir isso rodando o comando runlevel
:
O N significa que não ouve nenhuma alteração de um runlevel dês da última inicialização. Podemos alterar esses runlevel, e eles estão associados a nossas pastas, se irmos ate a pasta /etc
teremos uma pasta para cada runlevel:
Na pasta rc5.d
, por exemplo, temos alguns processos que não irão subir, iniciador pela letra K (kill), e alguns que irão subir, iniciados pela letra S (start), neste determinado runlevel (5).
No arquivo /etc/inittab
, na segunda linha temos:
id:5:initdefault
Oque aconteceria se mudarmos esse número de 5 para 6, e desligarmos, logo após, alguém ligar o PC para navegar na internet? A sequência é:
id:5:initdefault
- Botão Power
- BIOS/MBR
- gerenciador de boots (grub2)
- kernel
- init
- DM
- DE (onde estamos)
- DM
- init
- kernel
- gerenciador de boots (grub2)
- BIOS/MBR
id:6:initdefault
- Botão Power
- BIOS/MBR
- gerenciador de boots (grub2)
- kernel
- init = 6 (reboot)
- kernel
- gerenciador de boots (grub2)
- BIOS/MBR
Caímos em um loop.
Privilege Escalation
Vamos tentar fazer um ataque de privilege escalation em um Linux, usando as permissões como área de exploração.
Primeiro vamos pesquisar na raiz do sistema, todo arquivo que tenha a permissão 4000, com o comando find / -perm -4000 2>/dev/null
:
Obteremos vários resultados úteis, mas o que queremos é o cpulimit:
O cpulimit tem a permissão SUID BIT, ou seja, quando executa-lo ele irá trabalhar como root. Sendo assim, podemos criar uma pasta na raiz executando o comando cpulimit -l 100 -r mkdir /pasta
, mesmo como um usuário comum:
Bem, se podemos executar um binário como root, e se usarmos isso para dar permissão SUID BIT também no binário bash
?
- Dou permissão SUID BIT para o binário bash
- Movo o binário para minha pasta
- Certifico que ele tem as permissões necessárias
- Por fim executo o binário
referências
Segurança em Linux - Christiano Linuxman | ROADSEC@HOME#37: https://www.youtube.com/watch?v=AzB5BNDTXOk