Apostila 1 - Módulo 2
Apostila 1 - Módulo 2
Apostila 1 - Módulo 2
Bash Script
Prof. Renato Costa do Carmo Fonseca
2024
SUMÁRIO
Capítulo 1. 4
Capítulo 2. 15
Capítulo 3. 20
Capítulo 4. 35
4.2. Bibliotecas 37
Capítulo 5. 44
Capítulo 6. 50
2
6.3. Construindo o Código – Segunda Parte 53
Capítulo 7. 55
7.1. Introdução 55
Capítulo 8. 64
Referências 67
3
Capítulo 1. Introdução à Lógica de Programação
As primeiras Linguagens de Programação datam de antes de 1940.
Entre 1943 e 1946, o cientista alemão Konrad Zuse desenvolveu a
linguagem Plankalkül, considerada por muitos como a primeira linguagem
de programação de alto nível.
4
conjunto de instruções, concatenadas em uma sequência lógica que faz
sentido para aquele objetivo.
5
1.2.3. Fase 3 – Saída de Dados
1.3.1. Constantes
6
Tomando como exemplo o algoritmo da média de notas, apresentado
no item anterior, a Constante seria o número de alunos na turma (5).
1.3.2. Variáveis
Por sua vez, as Variáveis são valores em memória que podem ser
manipulados ao decorrer da execução do código. Entretanto, vale destacar
que, mesmo com esta possibilidade de alternância de valores, uma variável
só pode armazenar um valor a cada instante.
7
Dentro dos algoritmos, os Operadores são os elementos que nos
permitem lidar com os dados de entrada, de forma a alcançar os objetivos de
saída. Podemos incrementar, decrementar, comparar, avaliar etc.
Adição +
Subtração -
Divisão /
Multiplicação *
Exponenciação **
Operador Símbolo
Igual a == ou =
8
Diferente de <> ou !=
A=B Falso
A != B Verdadeiro
A>B Verdadeiro
A<B Falso
A >= B Verdadeiro
A <= B Falso
9
Como exemplo de aplicabilidade, consideremos as variáveis A, B e C,
onde A = 3, B = 6 e C = 1. Vamos comparar as variáveis entre si, aplicando os
Operadores Relacionais, e depois submetemos os resultados aos
Operadores Lógicos.
Expressões Resultado
10
IF MEDIA >= 7 THEN
RESULTADO = “TURMA ACIMA DA MÉDIA”
ELSE
RESULTADO = “TURMA ABAIXO DA MÉDIA”
Traduzindo este código em um parágrafo didático, teremos: “SE o
valor da variável MEDIA for maior ou igual à 7, ENTÃO a variável RESULTADO
recebe o texto TURMA ACIMA DA MÉDIA. SENÃO, a variável RESULTADO
recebe o texto TURMA ABAIXO DA MÉDIA”.
11
marcador “;”, definimos o valor inicial da variável, que, neste caso, é 1. Na
segunda atribuição, definimos a quantidade máxima de repetições que
serão executadas, nossa condição de saída que é 5. Na terceira atribuição,
definimos o padrão de incremento da variável, que, neste caso, é de +1 em
cada Loop.
NOME = “FELIPE”
WHILE (NOME != “PAULA”) {
print (“QUAL O SEU NOME?”)
NOME = INPUT()
}
print(“Obrigado”+ NOME)
12
diferente da palavra “PAULA”, as funções dentro da estrutura de repetição
serão executadas. Considerando que na primeira linha a variável NOME
recebeu a palavra “FELIPE”, diferente de “PAULA”, a estrutura de repetição
acontecerá.
13
2
Capítulo 2. Introdução ao Framework
Conceitualmente, o termo Framework quer dizer uma estrutura
combinada de recursos, voltada para auxiliar a execução de determinada
tarefa. Frameworks podem ser aplicados para diversas finalidades, incluindo
o desenvolvimento de software.
15
2.1.2. NIST CSF – Cybersecurity Framework
16
Entre no diretório criado e, com o comando “pip install virtualenv”, instale o
pacote “virtualenv”. Este pacote vai permitir criar ambientes virtuais
exclusivos para o desenvolvimento.
17
Na linha 1, temos a importação de elementos da biblioteca Flask. Na
linha 3, definimos, na variável “f”, a própria da instância Flask. Na linha 4,
associamos a rota que orienta o ponto base onde os arquivos do projeto
serão consultados pelo navegador. Na linha 5, temos uma função do código
que vai trazer o conteúdo da página. Na linha 6, dentro da função “raiz()”,
temos o texto que vai ser retornado na página. Por fim, na linha 8, temos o
comando que efetivamente executa o código.
18
3
Capítulo 3. Introdução à Linguagem Python
Criada em 1991 pelo programador holandês Guido Van Rossumem,
a linguagem de programação Python foi desenvolvida com a finalidade de
ser simples e de fácil compreensão. Entretanto, a linguagem Python é muito
poderosa e versátil, podendo ser aplicada com inúmeras finalidades.
20
traga o Python, acesse o terminal do Kali e digite o comando “sudo apt install
python -y” para iniciar a instalação. Ao término, execute o comando
“python”. Se o resultado for o mesmo da imagem a seguir, significa que a
instalação foi bem-sucedida.
21
o ambiente de estudo do seu ambiente de testes. Além disso, caso algum
problema mais grave aconteça durante a fase de instalação do Python, ou
de desenvolvimento e teste dos códigos, basta descartar a VM e criar outra.
22
Depois de instalado, clique no menu Iniciar e procure por “Python
3.10 (64-bit)”, caso seu sistema seja na versão 64 bits. Conforme imagem a
seguir, um novo prompt de comando será mostrado:
23
3.2. Nosso primeiro Script
A partir de agora, vamos iniciar nossa jornada na construção dos
scripts em Python, onde o primeiro vai imprimir, na tela, o nosso nome. Com
o comando “mkdir Scripts”, vamos criar a pasta para guardar nossos códigos.
Execute o comando “ls -l” para identificar se ela foi criada.
24
Nesta nova caixa, digite os comandos conforme a imagem a seguir.
Observe que seu nome deve estar entre aspas:
25
execute o arquivo através do comando “python nome.py”. A execução do
script imprime, no terminal, o conteúdo da variável “nome”.
26
Na linha 3, a variável “hoje” recebe o resultado da função
“datetime.date.today()”. Aplicando a biblioteca “datetime” e o classmethod
“date.today()”, o resultado da função retorna à data local atual, com ano, mês
e dia.
27
3.3. Estruturas de Decisão e Repetição
Aproveitando o script criado, vamos trabalhar as estruturas de
Decisão e Repetição. As de Decisão são “if”, “elif” e “else”. As de Repetição
são “while” e “for”.
28
serão impressos no terminal. Observe que é mantida a impressão do
conteúdo da variável “resultado”, independente do resultado. A imagem a
seguir traz a execução do código.
29
repetitiva na cadeia de decisão. A imagem a seguir traz o resultado de
execução do código:
30
Por sua vez, a biblioteca “getpass” oferece a possibilidade de que o
conteúdo digitado no terminal não apareça para o usuário. Semelhante, por
exemplo, ao que acontece quando, no sistema operacional Linux, digitamos
a senha na linha de comando.
31
foi autorizado, já que o usuário digitou a senha correta, e o endereço IP
guardado na variável “ip_address”. Aqui, vale destacar que o loop “while” é
encerrado. Por fim, nas linhas 12 e 13, temos o código, caso o usuário digite
a senha errada, e onde o loop “while” retorna ao início.
32
no range portas, execute o seguinte código....”. Nessa estrutura, o script
vai correr todos os itens dentro da variável “porta” e para cada um deles
executar as linhas de código subsequentes.
33
4
Capítulo 4. Construção de Códigos em Python
4.1. Reverse Shell
Os sistemas de segurança estão cada vez mais eficientes, atentos a
tudo e a todos. Técnicas de exploração de vulnerabilidades a partir do mundo
externo são alternativas relativamente fáceis de detecção, diminuindo as
chances de sucesso.
35
Em um cenário hipotético, do lado esquerdo da figura, temos a
máquina do atacante conectada à internet. No centro da imagem, temos o
dispositivo firewall que protege e faz a interface entre o barramento e a
internet. Esse barramento representa a rede interna do ambiente onde estão
a máquina alvo e outros servidores.
4.2. Bibliotecas
Antes de iniciar a construção efetiva do script para o “Reverse Shell”,
vamos entender um pouco sobre as bibliotecas e suas aplicações para o
código.
36
Além dessas bibliotecas padrões, outras também podem ser
importadas para compor as funções que o código precisa. É o caso da
“socket” e da “datetime” que aplicamos no capítulo anterior. Para importar
uma biblioteca ao código, no início do script, entramos com o comando
“import nomedabiblioteca”. Mais detalhes sobre bibliotecas em Python no
link https://docs.python.org/3/library/.
37
Na linha 8, definimos a função “conexao”, que vai permitir ao script
escutar por demandas de conexões vindas de fora, além de possibilitar o
envio de comandos para a máquina alvo. Ainda através desta função, vamos
receber os resultados dos comandos digitados pelo atacante.
38
e envia, para a máquina remota, a palavra “sair”. Isso acontece através dos
comandos da linha 16, utilizando a função “send()” associada ao socket
remoto “s_remoto”. Neste ponto, observe que associamos ao termo “sair” a
função “encode()”. Isso faz com que a palavra “sair” seja codificada em bytes
inteligíveis para a transmissão à máquina alvo.
39
4.4. Reverse Shell – Segunda Parte
A partir deste ponto, vamos criar a segunda parte do código já no
editor de Python dentro do Windows 10. No editor, crie um novo arquivo e
salve como “reverse_client.py”. Entre com o código conforme imagem a
seguir:
40
Na linha 11, entramos na estrutura de decisão, avaliando se o
comando recebido inclui o termo “sair”. Caso positivo, o socket é encerrado,
na linha 12, bem como o loop “while” com o recurso “break”, linha 13.
Observem que, na linha 11, associamos à variável “comando” a função
“decoce()”, que vai transformar os bytes recebidos em uma linha linguagem
inteligível.
41
Na sequência, já no lado do Windows 10, vamos rodar a segunda
parte do código. No menu superior do terminal de edição, cliquem “ Run >
Run Module”:
42
5
Capítulo 5. Introdução à Linguagem Bash Script
Assim como o Shell, o Bash (Bourne Again Shell) é um programa
interpretador de comandos que faz a ligação entre o usuário e o Kernel do
sistema operacional. Por sua vez, o Kernel é quem acessa os elementos de
hardware da máquina. Juntos, Bash e Kernel oferecem ao usuário uma
interface bastante eficiente de execução de comandos.
44
Para sair do modo de inserção, pressione a tecla “Esc” no teclado.
Neste momento, observe que a linha de execução de comandos do editor
passa para a parte inferior do console. Digite o comando “:wq” para salvar o
arquivo e sair da ferramenta.
45
de disco do sistema e, na linha 9, executamos o comando “w”, que vai trazer
detalhes sobre os usuários logados na máquina.
46
dentro da estrutura de repetição “FOR”. Entre com as linhas de código,
conforme imagem a seguir:
47
48
6
Capítulo 6. Construção de Código Ofensivo em Bash Script
Como parte em qualquer projeto de teste de intrusão, a fase inicial
de reconhecimento do alvo talvez seja a mais importante de todas. Através
dela, vamos obter as características operacionais do objeto de ataque, bem
como identificar pontos de vulnerabilidade que possam ser explorados.
50
do “ifconfig” serão filtrados pelo termo “broadcast”. Por sua vez, o conteúdo
decorrente deste filtro será submetido à ferramenta “cut”, onde, através do
delimitador “n”, vamos restringir o resultado ao campo 2. Na sequência,
aplicamos novamente a ferramenta “cut” com o delimitador “ ” e novamente
o campo 2. Por fim, uma terceira aplicação do “cut” com delimitador “.” e
campos 1,2 e 3 vai trazer o endereço de rede que estamos buscando.
51
Por padrão, na linha 1, temos o código que define a execução via
Bash. Na linha 4, importamos o primeiro conjunto de comandos que vimos
no item 6.1 anterior. A diferença é que, ao final da linha, temos o elemento
“>”, que vai guardar no arquivo “rede” os resultados do comando.
52
6.3. Construindo o Código – Segunda Parte
Nesta segunda parte, vamos levar os resultados da primeira parte
para dentro da ferramenta NMAP, com o objetivo de fazer a varredura de
portas. Editando o arquivo “network” com o “vi”, digite o código conforme
imagem a seguir:
53
7
Capítulo 7. Introdução à Engenharia Reversa
7.1. Introdução
Os ataques de códigos maliciosos estão cada vez mais refinados e
complexos, tornando o trabalho das equipes de segurança um desafio árduo.
Em alguns casos, dependendo do resultado do ataque, as vítimas não
“gastam” esforços na investigação do código.
55
7.2. Ferramenta Ghidra
Felizmente, existem ferramentas que auxiliam no trabalho de
Engenharia Reversa. Neste item, vamos conhecer um pouco da ferramenta
GHIDRA (https://ghidra-sre.org/), fazendo sua instalação no Windows 10
virtualizado.
56
terminal de inicialização vai aparecer na tela e, na sequência, o console de
interação da ferramenta.
57
Clicando em “OK”, o Ghidra inicia a importação. A janela seguinte
traz detalhes sobre o processo e algumas informações adicionais.
Novamente clicando em “OK”, seguimos para próxima etapa.
58
Como pista inicial para a investigação, vamos buscar pelo termo
“Invalid Passwor!”, já que aparece no terminal quando digitamos uma senha
incorreta. No console do Ghidra, vamos dar dois cliques no arquivo que
queremos verificar e um novo terminal do “CodeBrowser” será mostrado.
Uma janela de análise informa que o arquivo crackme0x00.exe ainda não foi
analisado e pergunta se queremos analisá-lo:
59
Nas duas linhas destacadas, temos valores de “strings” bastante
interessantes. Na primeira, vemos o termo “Invalid Password”, e, na
segunda, algo ainda melhor: a expressão “Password OK”. Vamos avançar com
a segunda linha e dar um duplo clique nela. Neste momento, notem que, na
janela “Listing”, a ferramenta marca em azul uma linha com a mesma
referência de localização (00404041).
60
Para depurar este elemento “TEST”, vamos selecionar sua linha
respectiva e, no menu superior, clicar em “Window>Decompiler”. A janela do
“Decompiler” traz uma estrutura de código com elementos que já
conhecemos de outros capítulos. Vamos analisar as linhas 11 a 21:
61
Ao executar o código novamente, e entrar com o valor “250382”,
comprovamos que a função era mesmo de subtração.
62
8
Capítulo 8. Códigos Maliciosos
Também conhecidos com malwares, os códigos maliciosos são
softwares, ou pedaços de código, desenvolvidos para danificar, perturbar,
roubar ou infligir qualquer má ação em dados, redes ou dispositivos finais.
Boa parte dos vírus são espalhados através de unidades USB, CDs, e-
mails e compartilhamentos de rede.
64
Podem ser encontrados em jogos online, instaladores de aplicativos
e arquivos/programas baixados da internet. Normalmente se instalam e
atuam em background sem a percepção do usuário.
8.1.3. Worms
8.1.4. Ransomware
65
condição para também extorquir as empresas pela não divulgação dos
dados.
Tipos de
Descrição
Malware
Aplicado para obter informações sem o consentimento ou conhecimento da
Spyware
vítima. Os dados são enviados para outro destino.
66
Referências
[1] Lógica de Programação – A Construção de Algoritmos e Estruturas de
Dados - Forbellone, André Luiz Villar – MAKRON – 1993.
[3] Penetration Testing with the Bash shell – Get Started with Shell for
Penetration Testing – MAKAN, Keith – 2014.
[5] Python for Offensive PenTest: A practical guide to ethical hacking and
penetration testing using Python – KHRAIS, Hussam – 2018.
67