Você está na página 1de 13

Microcredencial em Cibersegurança Ofensiva - M1 UD3 -

Ambiente Linux (Kali) & Ambiente Windows

1. Introdução

Um sistema operativo (SO) é uma peça fundamental de software que fornece um interface com o
hardware de um computador ou dispositivo. Os programas são escritos para utilizar esta interface e
por sua vez, são utilizados por pessoas e outros programas para executar tarefas e gerir eficazmente
os recursos do computador. Todos os computadores, telemóveis, impressoras, modems por cabo,
HDTV's, e o seu PC portátil têm alguma forma de SO.
Genericamente, os SO têm aplicações que funcionam num de dois modos: kernel ou utilizador. No
modo kernel, as aplicações têm acesso total e sem restrições a todos os recursos. No modo utilizador,
as aplicações são limitadas (por restrições do próprio CPU). Adicionalmente existem na maioria dos
SO dois tipos de contas de utilizador: administrador e utilizador limitado, o primeiro tem acesso a
modificar o kernel enquanto o segundo não.
No mundo dos computadores, o Microsoft Windows, Apple MAC OS X e o GNU/Linux são os
predominantes. O Mac OS X e o GNU/Linux são inspirados no SO conhecido como UNIX. Neste
documento pretende-se dar um enquadramento sumário sobre aspetos importantes e que vos serão
úteis acerca dos SO Linux (Kali) e Windows. A compreensão do funcionamento dos SO é essencial
para poder defender ou atacar. Nesta fase já deverão ter criado o vosso ambiente virtual, devem
assim, ir acompanhando e experimentando os comandos referidos neste documento. O objetivo
principal desta unidade didática é praticarem os principais comandos em ambiente Linux e conhecer o
Kali Linux.

2. Ambiente Windows

O Windows é o SO da Microsoft, lançado em 1985, é atualmente do conhecimento de todos pois é o


SO mais usado tanto em computadores pessoais como em aplicações domésticas/comerciais,
servidores e IoT. Portanto, é normalmente um alvo de ataque frequente pois é utilizado pela maioria
dos utilizadores (em workstations de organizações), e portanto, remunerador para os atacantes. A
arquitetura do Windows também não é famosa pela segurança, apesar de ser algo que tem vindo a
melhorar nas últimas versões (e.g., com implementação do UAC[1]). Atualmente será provável
encontrar ainda versões Windows 7, 8, 8.1, Windows 10 e Windows 11 (a última versão).
Figura 1 - Distribuição das versões de Windows entre Mar2021 e Mar2022. (Retirado de
statcounter.com)

Adicionalmente, é necessário relembrar que existem diferentes edições dentro de cada versão de
Windows, por exemplo, o Windows 10 inclui o Home, Pro, Enterprise, Education, e cada uma tem
diferentes funcionalidades de segurança (sendo o Enterprise o mais completo e usado na maioria das
organizações). O Windows Server é também diferente, permite implementar controladores de domínio
e Active Directory, e tem outras funcionalidades (também de segurança) adicionais.

2.1. Linha de Comandos Windows

Os atacantes, (e mesmo alguns defensores), raramente utilizam interfaces gráficas de utilizador (GUI)
pois são soluções menos versáteis e que não permitem a automatização (e.g., através de scripting),
por isso, nestes casos é utilizado o Command-Prompt ou PowerShell no caso do Windows ou a
Command Shell (command line access, command line interface ou CLI)) no caso do Linux, através
destas consegue-se ter controlo do sistema[2].

A linha de comandos do Windows mantém a aparência e alguns comandos que derivaram do SO MS-
DOS[3]. O PowerShell foi lançado com o Windows 7/Windows Server 2008R2 e permite comandos
para tarefas administrativas mais avançadas. Existem várias razões para se utilizar a linhas de
comandos, sendo a principal a mais rápida execução (as componentes gráficas podem ser “pesadas”
computacionalmente) e permitem a automação e orquestração de forma mais fácil, através dos
designados scripts (e.g., conjunto de comandos encadeados). Isto é válido tanto para atacantes
(executarem o ataque) ou para os administradores de rede ou utilizadores avançados (para
automatizar tarefas ou acessos remotos de administração sem interferência com o utilizador).
Veremos aqui apenas alguns dos comandos básicos do Windows.

Nota - se existirem dúvidas nas opções disponíveis para cada comando, basta escrever
"comando" /? . Existe documentação diversa na internet sobre os comandos Windows ou

Powershell[4][5].
Para abrir a linha de comandos com permissões de administração ver Figura 3.

Figura 3 - Abrir Linha de Comandos como Administrador

Deixam-se aqui alguns exemplos de comandos básicos:

dir - lista pastas (diretórios) e ficheiros

dir c:\ - lista diretórios/ficheiros da raiz do volume lógico

cd pasta - change directory: entra no diretório "pasta"

md pasta - make directory: cria o diretório "pasta"

rd pasta - remove directory: remove o diretório "pasta"

del file - delete: apaga o ficheiro "file"

tasklist - lista os processos em execução


ipconfig /all - mostra configurações de rede, incluindo MAC de cada interface

netstat -ano - mostra todas as conexões ativas, o processo e o porto

ping - permite verificar conetividade, e.g., ping www.google.com

tracert - trace route: mostra o caminho (routers) e latência até chegar a um destino, e.g.,
tracert www.google.com

Figura 3 - Exemplo de execução do comando "dir \"

Nota - É fornecido, para consulta opcional, um documento de apoio com diversos comandos
úteis em maior detalhe:

"Auxiliar - Linha de Comandos Windows.pdf" (disponível na pasta "Documentos de apoio M1").

2.2. Sistema de Ficheiros

O New Technology File System (NTFS) é o sistema utilizado atualmente pelos SO Microsoft (desde o
Windows 95). Tem funcionalidades de segurança através de permissões e criptografia (controlo de
acessos a ficheiros e pastas).

No Windows, por defeito, o C:\ é a diretoria raiz. Diferentes partições lógicas ou discos físicos podem
ter outras designações tal como E:\ , H:\ , etc.
A estrutura de diretorias, tem-se mantido igual nas diferentes versões do Windows, alguns locais
interessantes são:

C:\Program Files : diretoria com as aplicações. Pode existir a diretoria C:\Program Files
(x86) se existirem aplicações de 32-bit num sistema de 64-bit.

C:\Users : diretoria com dados dos diferentes utilizadores da máquina, por exemplo, com o
Ambiente de Trabalho.
C:\ProgramData : pasta oculta (ver com dir C:\ /AH ) com configurações dos programas.

c:\windows\system32 : uma diretoria crítica do sistema onde estão ficheiros importantes como as
Dynamic Link Library (DLL) essenciais para muitas aplicações e para o próprio sistema, diversos
aplicativos do sistema ou drivers.
C:\WINDOWS\system32\config : aqui é guardado o registo do Windows, contendo todas as
configurações do sistema, incluindo utilizadores e os hash das senhas (ficheiro SAM).

Importa falar do controlo de integridade (Mandatory Integrity Control - MIC) que atribui um nível de
integridade aos processos, não os permitindo que alterem ficheiros com nível superior de integridade.
Os níveis de integridade são:

System - serviços do SO (e.g., pasta c:\windows\system32 )

High - SO e utilizadores com privilégios

Medium - Utilizadores sem privilégios


Low - Certas aplicações com baixo privilégio (e.g., browsers)

Por defeito, os processos executados por utilizadores sem privilégios têm o nível de Integridade
Medium, mas o SO irá baixar-lhe o nível para Low quando este faz coisas como navegar na web ou a
leitura de e-mail.

Para além do controlo de integridade (que impede modificação de ficheiros), existe também o controlo
de acessos (restringe o acesso) a pastas e ficheiros através das "Discretionary Access Control Lists"
(DACLS). Cada pasta ou ficheiro tem uma lista de permissões associada. Alguns utilizadores podem
ler, escrever, ou executar, e outros nem sequer podem ler (i.e., abrir uma pasta ou ficheiro).

2.3. Utilizadores e Grupos


No Windows, podemos gerir contas de utilizadores locais (i.e., não pertencentes a um domínio) através
do painel de controlo. Alternativamente pode ser usada a ferramenta LUSRMGR.MSC (pesquisa do
menu iniciar) ou do comando NET (instruções no "Auxiliar - Linha de Comandos Windows.pdf" ou usar
net help user ). Os utilizadores fazem parte de "Grupos". Os grupos têm permissões associadas.
O grupos mais comuns são:

Administrators: permissão total;


Network Configuration Operators: podem modificar definições de rede (e.g., IP, DNS, gateway);
Users: o acesso necessário para a maioria dos utilizadores.

Nota - O princípio do privilégio mínimo deve ser usado sempre. Neste sentido, todos os
utilizadores, mesmo os administradores IT, devem utilizar uma conta dentro do grupo Users no
seu dia a dia. Quando necessitam de realizar tarefas que exigem permissão, podem utilizar o
botão direito do rato e "executar como administrador" ou o RUNAS (comando para executar
como outro utilizador) que permite na linha de comandos executar comandos com a conta de
Administrators.
e.g., runas /user:Luis_Admin cmd.exe
Figura 4 - Gerir Contas de Utilizador através do Painel de Controlo

Infelizmente, muitas vezes, ou por preguiça ou por desconhecimento, os utilizadores têm privilégios de
administrador na conta de uso diário. Assim, o UAC veio mitigar (não previne pois é possível contornar
o UAC) os riscos associados. O UAC (se ativo e bem configurado) dá um aviso sempre que tentamos
fazer alguma tarefa que necessitam de privilégios de administração (mesmo estando com conta de
administrador).

Também existem permissões dadas pelo SO através de políticas de segurança (comando


secpol.msc - não disponível em versão Home). As politicas são divididas em:

Audit Policy: é usado para definir o que é registado no Event Viewer. Por exemplo, por defeito o
Windows não regista quando os utilizadores erram ao inserir a password (bom para os
atacantes...). Aqui podemos configurar para registar.
User Rights: é possível definir (dar ou retirar) permissões específicas de acesso a serviços do OS,
e.g., "Debug Programs" (associado ao grupo de Administradores), dá também possibilidade a
ataques DLL injection.
Security Options: aqui fazem-se alterações relacionadas com o complexidades de passwords,
frequência da mudança de password, etc.

3. Ambiente Linux (Kali)

O Kali é assente em Linux. O Linux é um SO open-source (se bem que algumas distribuições são
pagas para suporte) baseado em UNIX e foi originalmente desenvolvido por Linus Torvalds. A
quantidade de distribuições Linux é enorme e pode ser consultada em distrowatch.com. Para os
iniciantes em Linux, e mesmo para quem quer relembrar alguns comandos, existem diversos tutoriais
na internet[6][7].

Aqui fazemos apenas referência a alguns dos comandos mais importantes. Outros iremos ver ao longo
do curso. Introduzem-se agora os conceitos principais do Linux.

3.1. Utilizadores e Grupos


Tal como o Unix, o Linux foi concebido desde o início para suportar vários utilizadores. Cada utilizador
pode utilizar o sistema de forma independente sem afetar outros utilizadores. Um utilizador tem um
único ID numérico de utilizador (UID), um nome de utilizador, e um diretório home (normalmente
/home/[nome de utilizador] ) onde os seus ficheiros e definições são armazenados. O utilizador
root (UID 0) tem os maiores privilégios num sistema, e pode geralmente aceder a tudo. Portanto,
utilizando a conta root para além de tarefas administrativas que o exijam, é fortemente desencorajado
(tal como no Windows). O Linux e o software baseado em Linux é geralmente concebido de forma a
que possa executar a maioria das tarefas sem necessidade de acesso root, sendo fácil obter
privilégios de root quando se precisa deles.
O Linux também suporta grupos (identificados com o GID), que permitem a atribuição de permissões
ou privilégios a conjuntos de utilizadores. Veremos mais à frente como dar permissões de root a um
utilizador recém criado sem privilégios.

As passwords dos utilizadores do Linux são geridas através de um esforço conjunto dos ficheiros
/etc/passwd e /etc/shadow , que fornecem ao SO um meio de armazenar informação sobre as
contas e credenciais. O ficheiro /etc/passwd tem de ser legível por todos os utilizadores do sistema
porque vários programas precisam de procurar informação genérica dos utilizadores, por isso as
passwords mantém-se privadas no ficheiro protegido /etc/shadow (que só o root pode ler).

O Linux também oferece ferramentas que permitem a realização de tarefas administrativas a partir do
utilizador normal sem conceder à conta permissões desnecessárias. Estas duas ferramentas são o su
e o sudo . O comando su é utilizado para mudar completamente para a conta root. O comando sudo
é concebido para deixar um utilizador executar um único comando como root (ou qualquer outro
utilizador), em vez de ter de mudar completamente para uma shell de root.

3.2. Aplicações e Serviços


Existem duas categorias de software que funcionam em cima do sistema operativo: aplicações e
serviços (normalmente chamados daemons no Linux). As aplicações são iniciadas pelo utilizador, que
interage com as mesmas, e depois as fecha. Por exemplo, ao utilizar o seu Linux na VM, abre o
Firefox, procura algo no google.com e depois fecha o navegador. Isto é uma aplicação. Serviços, por
outro lado, normalmente começam quando o computador arranca e funcionam até o computador se
desligar. Um exemplo de um serviço seria o serviço HTTP a correr num dos servidores da Google, ao
qual o navegador web se liga.

Tipicamente, no arranque do PC, a BIOS do computador inicia o boot loader, um programa no


dispositivo de arranque (e.g., disco ou pen live). O boot loader carrega o kernel para a memória. O
kernel monta as partições de disco necessárias para executar o sistema e arranca
o sistema init , agora conhecido como systemd . O systemd inicia os serviços baseados em
configurações pré-definidas.

Como dizemos ao sistema operativo quais os serviços que devem ser ativados na fase de arranque?
Fazemo-lo utilizando o systemctl , a interface de gestão para o systemd e pode ser utilizada para
iniciar, parar, ativar, desativar e configurar serviços.

3.3. Ficheiros e Permissões

O Linux tem uma estrutura específica de diretórios, diferente do Windows. No Linux não existem letras
paras as Unidades Lógicas (e.g., c: ), é tudo relativo à diretoria raiz "/". As Unidades Lógicas e
sistemas de ficheiros podem ser "montados" numa diretoria do Linux.
Diretórios importantes:

/bin & /usr/bin - têm programas executáveis;

/sbin & /usr/sbin - têm programas executáveis que utilizadores não root não precisam ter
acesso;

/lib & /usr/lib - têm bibliotecas (semelhante aos DLL´s no Windows);

/etc - contém ficheiros de configuração para o sistema e para outros softwares instalados;

/usr - Contém ficheiros para programas instalados no sistema;

/var - Contém dados variáveis utilizados por programas, tais como registos (logs). O registo
padrão de um serviço web é /var/www/
/boot - contém o kernel do Linux;

/home - tem as diretorias dos utilizadores (ficheiros pessoais);

/root - o home do root;

/mnt & /media - onde ficam "montados" os discos e unidades lógicas, como pen USB;

dev - tem ficheiros que representam os dispositivos de hardware (tudo no Linux é representado
por um ficheiro!).

As permissões dos ficheiros e o proprietário dos mesmos, funcionam em conjunto para controlar os
privilégios do sistema de ficheiros.
No Linux, cada ficheiro e diretório é propriedade de um utilizador específico e de um grupo específico.
O proprietário é sempre capaz de alterar as permissões do ficheiro. Os utilizadores podem alterar o
grupo de qualquer ficheiro que possuam (usando chgrp ), mas apenas o root pode mudar o utilizador
que é proprietário de um ficheiro (usando chown ).

O Linux tem três tipos de permissões num ficheiro: ler, escrever, e executar. A permissão de leitura
permite a leitura do conteúdo de ficheiros, e o conteúdo de diretórios a serem listados. A permissão de
escrita permite que o conteúdo de um ficheiro seja modificado, e permite aos utilizadores
adicionar, remover e renomear ficheiros num diretório (note que mesmo com permissão de escrita de
um ficheiro, não se pode apagá-lo sem permissão de escrita no diretório!). Permissões de execução
permitem que um ficheiro seja executado como um programa ou script de shell.

3.3. Instalação de Software


Vamos discutir diferentes formas de instalar software no Linux, diretamente da fonte (com código fonte
é necessário compilar) ou de um pacote de instalação disponível nos repositórios do Kali (são
específicos da distribuição) o que é muito mais simples.

Instalar com código fonte


Após descarregar-mos o código de determinada aplicação, na shell, navegamos para o local onde
foi descarregado o código fonte e fazemos os seguintes comandos:

$ ./configure
$ make
$ sudo make install

A fonte normalmente tem o ficheiro "configure" que ao ser executado verifica o SO e o software já
instalado e configura o "Makefile" que vai ser utilizado pelo "make" no passo seguinte. o "make" usa o
compilador instalado no SO para criar os ficheiros binários. Finalmente o "make install" copia os
binários criados para as diretorias apropriadas no SO (que tipicamente necessitam de acesso root
para serem escritas).
Estes comandos podem ser realizados numa única linha:

$ ./configure && make && make install

O && é um operador condicional que diz "SE o primeiro comando tem sucesso, ENTÃO executa o
comando seguinte".

Para desinstalar, no mesmo diretório da fonte, fazer make uninstall (se disponível o que nem
sempre acontece).

Gestor de pacotes
Distribuições baseadas em Linux Debian (o caso do Kali) usam o formato de pacotes DEV com o
gestor APT. Em qualquer caso, o pacote é um único ficheiro que contém a aplicação completa, pré-
compilada para a distribuição e processador. O pacote pode ser instalado utilizando a interface
gráfica de utilizador, ou a partir da linha de comandos (ver Secção 3.5.2).

3.5. Configuração do Kali

3.5.1 Adicionar novo utilizador

No caso do Kali, ao contrário de um "Linux" normal, a maioria das ferramentas requer privilégios root
para poder funcionar. No entanto, há riscos de usar a conta root durante uma utilização rotineira. Por
exemplo, considere que navega na Internet em sítios ("mais duvidosos") à procura de exploits e
depara-se com um site malicioso que explora uma vulnerabilidade do browser e lança uma remote
shell no Kali - está a dar ao atacante acesso root no seu sistema.

A fim de proporcionar uma camada adicional de segurança, terá de criar uma conta normal que não
tem privilégios root. Isto pode ser feito através da execução do seguinte comando $adduser
[username] , depois basta seguir os passos (ver Figura 5).
Figura 5 - Adicionar novo utilizador no Kali

O utilizador recém criado, não tem permissões para elevar privilégios de root. Para verificar, troque
para o novo utilizador com
$su [username] . Depois tente fazer $sudo su e deve obter o mesmo que na Figura 6.

Figura 6 - A conta criada não tem permissões de *root*

Para adicionar o novo utilizador ao grupo de sudoers (permissão root), volte ao utilizador root ( $su
kali ) e faça o comando
$sudo usermod -a -G sudo [username] . Neste comando, -a adiciona ao -G grupo sudo o
[username] .
Depois de adicionar o utilizador ao grupo sudo , é ainda necessário dar-lhe acesso à shell, com o
comando
$sudo chsh -s /bin/bash [username]
O comando chsh é usado para alterar a shell de login o parâmetro -s especifica a shell.
Neste momento, o novo utilizador já tem permissões de root e tem acesso à shell de login (ver Figura
7).
Figura 7 - A conta criada tem permissões de *root*

3.5.2. Atualizações

No tutorial de instalação do laboratório, já efetuaram $apt update && apt upgrade . O apt é o
gestor de atualizações. Este comandos permitem atualizar o sistema. É ainda possível atualizar a
distribuição para a última versão com $apt update && apt full-upgrade .

3.5.3. Comandos e ficheiros úteis

Diversos
chmod - altera permissões de um ficheiro, e.g., para poder executar um script ( chmod 755
[script] );
ls -l - lista os diretórios e ficheiros vendo as permissões com -l ;
cd - tal como no Windows, permite mudar de diretório;
pwd - permite verificar qual o caminho do diretório onde se encontra atualmente;
cat - imprime para o ecrã o conteúdo de um ficheiro (e.g., cat \etc\passwd );
$passwd alterar password do user atual;

Controlo manual de serviços (/etc/init.d)


/etc/init.d/[serviço] start , opção start, stop, restart, force-reload, e.g.,
/etc/init.d/networking restart

Pesquisa de ficheiros
locate - usado para localizar um ficheiro. Antes de usar tem de se fazer $updatedb e só depois
pesquisar $locate [file]
find - pesquisar de forma intensa em pastas e subpastas mesmo sem definir o nome exato do
ficheiro, e.g., $find / -name fiche*

Ficheiros de configuração de rede


/etc/network/interfaces - configurar manualmente definições de placas de rede, e.g., nano
/etc/network/interfaces ,
/etc/network/resolv.conf - alterar servidor de DNS

Aplicativos úteis
ps - lista o estado dos processos
netstat - estatísticas de rede
grep - muito útil para filtrar resultados que contenham uma condição, e.g., netstat -ant |
grep 80 (verifica ligações onde aparece a string '80'). cat /etc/shadow | grep luis (pesquisa
pela hash do user luis).
Existem diversos comandos. Para uma lista exaustiva ou função específica, uma pesquisa na internet
costuma dar sempre bons resultados, pois existe uma grande comunidade de utilizadores e de partilha
de informação. O comando man também pode ser usado para obter informação de apoio a outro
comando, por exemplo, para obter informação sobre o ls faríamos man ls .

3.5.4. Scripting no Kali

Podemos criar scripts em Bash (Bash é a shell mais popular, mas há outras, e.g., sh, ou zsh).
Em Bash, a primeira linha tem que ser #!/bin/bash .

Começamos por abrir um ficheiro novo com o comando $nano script1.sh . Na figura abaixo têm um
exemplo muito simples de um script básico, podem replicar para testarem e se ambientarem ao nano
ou ao Bash.

Figura 8 - Exemplo simples de um script em *bash*

Quando se utiliza o nano , no final para sair basta fazer ctrl + X e depois salvar com Y .
Note-se que, no final temos de tornar o script executável com chmod 755 script1.sh (ver mais em
[^15]).
Para executar o script faz-se ./script1

Esta foi uma pequena introdução. Existem diversos recursos na internet para aprender a programar
em Bash. Hoje em dia, devido à sua versatilidade, o Python é também uma ferramenta para scripting e
não só, muito popular entre a comunidade hacker.

Apesar de ser útil, ao longo do curso vamos maioritariamente usar ferramentas do Kali e não é
fundamental saberem programar em Bash ou Python.

Notas Finais
Esta é uma súmula dos sistemas Kali e Windows. Há muito mais informação que podia ser adicionada
ou mais detalhada, mas para o objetivo pretendido, este documento tem a informação suficiente e
necessária. Contudo, os manuais e tutoriais disponíveis na internet são também uma preciosa ajuda
em diversas circunstâncias.

1. https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-
user-account-control-works ↩︎

2. https://www.geeksforgeeks.org/difference-between-terminal-console-shell-and-command-line/ ↩︎
3. https://pt.wikibooks.org/wiki/MS-DOS/Lista_de_comandos ↩︎

4. https://bytescout.com/blog/windows-command-prompt-commands.html#12 ↩︎

5. https://docs.microsoft.com/pt-pt/powershell/scripting/overview?view=powershell-7 ↩︎
6. http://www.ee.surrey.ac.uk/Teaching/Unix/ ↩︎

7. https://www.golinuxcloud.com/linux-commands-cheat-sheet/ ↩︎

Você também pode gostar