À medida que sistemas de drones mais avançados são implementados e integrados em vários setores, torna-se cada vez mais importante levar em consideração as vulnerabilidades que eles podem representar para garantir a segurança de seus aplicativos.
Desde que me interessei por segurança cibernética aeroespacial , uma coisa que sempre quis encontrar uma maneira de hackear eram os UAVs. Neste artigo, descrevo as etapas que segui para fazer engenharia reversa de drones DJI usando técnicas de monitoramento de pacotes com Wireshark e me aprofundo nos detalhes da dissecação de pacotes e como você pode desenvolver seu próprio dissecador de protocolo usando a linguagem de programação Lua.
Embora os drones de engenharia reversa não sejam uma tarefa fácil, eles ainda são vulneráveis a uma ampla gama de ameaças cibernéticas que podem resultar em graves repercussões. Ao descrever o processo que usei para fazer engenharia reversa em drones DJI para expor informações confidenciais armazenadas em pacotes de dados, espero que a pesquisa destaque as vulnerabilidades existentes para encontrar melhores alternativas para proteger os sistemas de drones existentes.
Um Veículo Aéreo Não Tripulado (UAV para abreviar) é uma aeronave que não transporta nenhum piloto ou passageiros a bordo. Na maioria das vezes, o termo é aplicado a drones, mas existem outros tipos de veículos UAV, como o Global Hawk da NASA, que é um UAV de alta altitude e longa duração destinado a fins de pesquisa. Os UAVs são usados para uma ampla variedade de aplicações, como missões de busca e salvamento, coleta de dados, aplicação militar e policial, fotografia aérea, etc. manobras, e provam custo-benefício, tornando-os amplamente preferidos para diversas aplicações comerciais e de consumo, como serviços de entrega e levantamento aéreo.
Como este artigo se aprofundará na análise forense de drones, é importante fornecer uma visão geral rápida dos componentes que compõem o DJI Phantom 4. Embora seja importante observar que os componentes alojados por um drone podem variar dependendo da marca ou versão, a maioria dos UAVs compartilha maioria significativa dos componentes.
Chassi: o chassi do drone é a estrutura física que une todos os componentes. o chassi é normalmente construído com materiais leves, como plástico ou fibra de carbono, para reduzir o desempenho geral do voo do drone, reduzindo o arrasto e o peso
Drone Motor: os drones usam motores para criar a quantidade necessária de sustentação para o vôo. a maioria dos drones geralmente tem uma configuração quadcopter que consiste em quatro motores: dois motores girando no sentido horário e dois motores girando no sentido anti-horário para equalizar a força de giro. Essa configuração existe porque a Terceira Lei de Newton afirma que para cada ação há uma reação igual e oposta, portanto, ter o mesmo número de motores anti-horário e anti-horário fornece ao drone coordenação de vôo por meio de força de giro equalizada
Drone Flight Controller: o controlador de vôo de um drone age como seu cérebro. o controlador de vôo recebe entradas de sensores a bordo do drone, como o módulo GPS, a fim de fornecer instruções específicas aos controladores eletrônicos de velocidade (ESCs) para controlar os motores
Módulo GPS: o módulo de satélite de posicionamento global (GPS) usa dois sistemas de posicionamento global diferentes para identificar a localização do drone. Usando o módulo GPS, o drone pode calcular sua geolocalização com base no tempo que levou para os sinais transmitidos chegarem de diferentes satélites
Controlador eletrônico de velocidade (ESC): os ESCs são o intermediário entre a placa de distribuição de energia do drone e os motores. Eles usam sinais do controlador de vôo para controlar a quantidade de energia alocada para um motor
Power Port Module: a porta de energia é um módulo que exibe que mede a quantidade de energia que vem da bateria e distribui essa energia para os ESCs e controlador de vôo do drone
Sensores de prevenção de obstáculos: alguns drones incluem sensores de visão estéreo em seu quadro. Esses sensores calculam a distância entre o drone e o obstáculo à frente do sensor calculando a profundidade por meio dos pixels da imagem capturados por cada sensor
Gimbal de 3 eixos: o gimbal estabiliza a câmera conectada ao drone para estabilizar a filmagem. Quando os sensores percebem movimento em qualquer eixo, eles sinalizam ao gimbal para fazer os ajustes adequados para suavizar a filmagem da câmera
Bateria do drone: as baterias fornecem energia ao drone. Algumas baterias também incluem recursos como proteção contra sobrecarga, comunicação de saída de energia, etc.
Drone Camera: a câmera do drone é usada para filmar imagens e tirar fotos. O sensor de imagem na câmera captura os raios de luz recebidos e os processa em uma imagem digital
Antenas de drone: as antenas de drone atuam como um sistema de transmissão para retransmitir informações entre o controlador e o drone
Sensor de prevenção de obstáculos ultrassônico para baixo: esses sensores são usados para calcular a altura do drone acima do solo. A altura pode ser calculada enviando um pulso de som de alta frequência de um sensor e medindo a quantidade de tempo que leva para o outro sensor recebê-lo
LED de voo: os LEDs de voo geralmente são usados para indicar a direção em que o drone está voando. Duas luzes vermelhas piscando indicam a frente do drone e luzes verdes piscando indicam a parte de trás
Joysticks: os joysticks são usados para controlar o drone, traduzindo o movimento físico dos sticks em informações que o controlador pode comunicar ao drone como direções de movimento
Placa principal do controle remoto: a placa do controle remoto recupera telemetria útil sobre o drone, como altitude, localização e imagens da câmera
Placa principal da câmera: a placa da câmera processa dados do sensor de imagem e dos motores gimbal para sintetizar imagens estáveis
Embora os UAVs sejam usados para uma ampla gama de aplicações, como qualquer outro dispositivo com um sistema de computador a bordo, eles são vulneráveis a uma série de ameaças de segurança cibernética. Algumas das ameaças de segurança cibernética mais comuns com UAVs incluem:
Acesso não autorizado: os UAVs são vulneráveis a agentes não autorizados que podem interceptar ou falsificar sinais sem fio usados para controlar o drone. Isso permite que o hacker controle o drone ou roube passivamente informações dele.
Roubo de dados: os UAVs são equipados com uma ampla variedade de sensores que coletam ativamente informações sobre seus ambientes, como fotos, vídeos e leituras de telemetria. Esses dados podem ser vulneráveis à interceptação de hackers que podem usá-los para fins nefastos
Negação de serviço: um ataque mais específico que os hackers podem empregar para hackear drones é uma negação de serviço. Isso ocorre quando um hacker lança um DOS no mesmo sistema de comunicação sem fio do drone, interrompendo sua capacidade de receber ou transmitir dados
À medida que mais vulnerabilidades de segurança são descobertas com a crescente popularidade dos UAVs, é necessário que os pesquisadores de segurança analisem forensemente os dispositivos para fins maliciosos. Um subcampo dentro da segurança cibernética chamado análise forense concentra-se na coleta e análise de dados de um ataque para fins investigativos .
Esse processo é útil em cenários de crimes da vida real, quando informações digitais de um sistema de computador são apreendidas e precisam ser investigadas. Muitas vezes, a grande maioria das informações na máquina não está relacionada ao crime e deve ser filtrada para decompor os cenários do crime.
Há uma ampla gama de aplicações ilegais de drones, como entrega de contrabando em áreas não autorizadas, entrega de drogas em fronteiras estrangeiras e vigilância não solicitada. No rescaldo de muitos desses cenários, a perícia digital é utilizada para determinar informações como a propriedade do dispositivo e quaisquer dados vinculados ao crime.
Um estudo realizado em modelos comuns de drones em várias cenas de crime demonstrou que informações como arquivos de mídia no formato de foto ou vídeo, padrões de voo, locais e informações do proprietário eram mais favoráveis ao sucesso de casos forenses digitais conduzidos por investigadores da lei. Embora os investigadores do estudo tenham conseguido filtrar as informações sobre o crime usando técnicas forenses digitais, o estudo afirmou que a legislação estadual e federal não lidou adequadamente com os regulamentos por trás da tecnologia dos drones e, consequentemente, deixa muitas partes interessadas vulneráveis. No geral, eles concluíram que a falta de ferramentas forenses e estrutura universal de drones tornou necessário o desenvolvimento de mais métodos de extração de dados.
Para desempenhar um papel no combate à falta de ferramentas forenses de UAV, demonstrarei como criei um script de dissecação de pacotes para Wireshark usando a linguagem de programação Lua para encontrar informações de rede úteis durante cenários forenses digitais. A ferramenta é uma aplicação em primeira mão de habilidades forenses digitais para coletar informações úteis sobre UAVs que podem ser usadas durante situações de investigação para coletar mais dados relacionados ao crime que ocorreu.
Packet Sniffing é o ato de interceptar e examinar pacotes de dados à medida que são transmitidos por uma rede especificada. Essa técnica é utilizada por profissionais de segurança cibernética para rastrear vulnerabilidades, diagnosticar falhas e desempenho de sua rede ou descobrir ameaças.
Em um computador, a placa de interface de rede (também conhecida como NIC) é um componente de hardware que inclui uma placa de circuito incorporada que permite que o computador faça interface com redes e execute a detecção de pacotes. O sniffing mais elaborado para fins de segurança cibernética ou hacking geralmente requer que o NIC seja colocado em modo promíscuo , o que permite que o computador recupere o tráfego de rede circundante. Usando um processo de decodificação, os sniffers podem obter acesso a informações codificadas armazenadas em pacotes de dados à medida que são transportados pela rede. O sniffing pode ser dividido em duas categorias gerais: sniffing ativo e passivo .
Farejamento Passivo
O sniffing passivo consiste em ouvir apenas os pacotes que estão sendo enviados como tráfego de rede. É freqüentemente usado como uma técnica de reconhecimento para avaliar informações pertinentes sobre o tráfego e o tipo de dados que estão sendo transmitidos por uma rede. Isso permite que os profissionais de segurança analisem a rede em busca de anomalias ou atividades suspeitas, como solução de problemas de rede (usando o tráfego de rede como uma métrica para problemas de rede) e otimização de desempenho identificando áreas de congestionamento.
Farejamento Ativo
O sniffing ativo é uma técnica utilizada em aplicativos de injeção/spoofing de pacotes cujo objetivo é obter uma resposta dos dispositivos de rede. Por exemplo, um invasor pode enviar um pacote específico para induzir um dispositivo ou aplicativo específico a responder com informações confidenciais. Isso pode ser usado para conduzir várias atividades maliciosas, como orquestrar um ataque man-in-the-middle (MiTM) e seqüestrar sessões de rede. O sniffing ativo é um pouco mais complicado de detectar do que o sniffing passivo porque foi criado para se disfarçar como o tráfego de rede ao redor. O sniffing ativo é conduzido pela entrada intencional de pacotes de protocolo de resolução de endereço (ARP) para sobrecarregar a tabela de memória de endereço de conteúdo (CAM) do switch. Isso faz com que o tráfego de rede legítimo seja transportado para portas diferentes, que servem como base para ataques de falsificação, como ARP Spoofing, ataques de protocolo de configuração de host dinâmico (DHCP) e envenenamento de DNS (sistema de nome de domínio).
Modelo OSI
O modelo OSI (conhecido como Open Systems Interconnection) é usado para conceituar como componentes díspares de uma rede se comunicam entre si. O modelo é apresentado como um modelo de sete camadas que inclui um conjunto de regras padronizadas de como diferentes dispositivos e programas podem se comunicar através da rede.
O modelo OSI pode ser segmentado em várias camadas: Aplicação, Apresentação, Sessão, Transporte, Rede, Datalink e Física.
Camada física
Isso descreve as características físicas da rede que é responsável pela conexão física entre os dispositivos, como cabeamento, conectores e sinalização. Nesta camada, os dados são transferidos via bits .
Camada de link de dados
Nesta camada, os dados são formatados em pacotes e transmitidos pela rede. A camada de enlace de dados também garante que seus dados não contenham nenhum erro interno. Os dados são transferidos usando quadros .
Camada de rede
A camada de rede lida com a maneira como os pacotes são endereçados e enviados pela rede, encontrando a maneira ideal de enviar o pacote. Nesta etapa, os endereços IP são anexados ao cabeçalho do pacote.
Camada de transporte
A camada de transporte é a transição entre as camadas de rede e de sessão. Essa camada usa protocolos de rede como UDP e TCP para determinar como transmitir dados entre aplicativos. Os dados transportados nesta camada são chamados de segmento .
Camada de Sessão
Essa camada define como os aplicativos estabelecem e mantêm conexões uns com os outros.
Camada de apresentação
A camada de apresentação converte os dados dos segmentos em um formato mais legível por humanos. Essa camada também cobre a criptografia e descriptografia de pacotes.
Camada de aplicação
A camada de aplicação é o que é usado para interagir com os usuários. Ele define os protocolos e interfaces que podem ser usados pelos aplicativos para se comunicar com a rede.
Discriminação de Informações de Pacote
Na rede, um pacote é um pequeno segmento de uma mensagem maior. Qualquer forma de dados que passa por uma rede é dividida em pacotes. Depois de passarem pela rede, esses pacotes são reconstruídos pelo dispositivo que os recebe.
Os pacotes enviados por uma rede têm o cabeçalho, a carga útil e o trailer incluídos em sua estrutura. Usarei o pacote IPv4 como exemplo para demonstrar o tipo de informação contida em um pacote.
1. Cabeçalho do Pacote
O cabeçalho do pacote é a parte inicial de um pacote. Ele contém endereçamento e outros dados necessários para que o pacote chegue ao seu destino. O cabeçalho IPv4 contém 13 campos…
- Versão: número da versão do protocolo de internet usado (ou seja, IPv4)
- Internet Header Length (IHL): comprimento de todo o cabeçalho IP
- Notificação explícita de congestionamento: informações sobre as informações de congestionamento vistas em rota
- Comprimento total: comprimento de todo o pacote IP (incluindo o cabeçalho e o corpo)
- Identificação: se o pacote IP estiver fragmentado, cada pacote conterá um número de identificação correspondente para identificar o pacote IP original ao qual pertencem
- Flags: indicação se o pacote é grande o suficiente para ser fragmentado
- Fragment Offset: posicionamento do fragmento no pacote IP
- Time to Live (TTL): o número de roteadores que o pacote deixou para atravessar para evitar o loop da rede
- Protocolo: a camada de rede no host de destino ao qual o pacote pertence (ou seja, TCP = 6, UDP = 17 e ICMP = 1)
- Header Checksum: valor da soma de verificação de todo o cabeçalho usado para confirmar que o pacote não contém erros
- Source Address: endereço de 32 bits do remetente (origem) do pacote
- Destination Address: endereço de 32 bits do Receptor (destino) do pacote
- Opções: campo opcional que pode conter informações como Record Route, Timestamps, etc
2. Carga útil
A carga útil de um pacote inclui os dados reais que o pacote pretende transportar para seu destino. No caso do pacote IPV4, o payload recebe um preenchimento de 0 bits para garantir que o pacote termine dentro da limitação de 32 bits.
3. Reboque
Às vezes, os pacotes podem conter um final para o pacote chamado trailer. Embora a estrutura do pacote IPV4 não contenha um trailer, os quadros Ethernet contêm um trailer para incluir informações de que os adaptadores de rede na Ethernet precisam para processar o quadro.
O Wireshark é um protocolo de rede amplamente utilizado e de código aberto e uma ferramenta de análise de pacotes. Ele permite que você capture pacotes de rede de fontes como sem fio (IEEE.802.11), Bluetooth, Ethernet, anéis de token, etc. O Wireshark também inclui um recurso de filtragem de pacotes que permite filtrar o fluxo de log de pacotes conforme eles são exibidos na tela .
Usando o Wireshark para análise de pacotes
A interface do Wireshark contém painéis diferentes para exibição de informações de pacotes. O painel principal exibe a lista de todos os pacotes que circulam pela rede. Se você selecionar um pacote individual, dois painéis devem aparecer perto da parte inferior da tela contendo dados de pacotes mais específicos. Os detalhes para cada uma das categorias de coluna no painel principal são os seguintes:
No.: o número do pacote no arquivo de captura
Hora: a hora em que este pacote foi capturado após o início do sniffing de pacotes
Origem: endereço IP e número da porta do dispositivo de envio
Destino: endereço IP e número da porta do dispositivo receptor
Protocolo: o tipo de pacote (ou seja, TCP, UDP, HTTP, etc.)
Informações: conteúdo mais informativo sobre o pacote que varia de acordo com o tipo de pacote capturado
Essas são as colunas informativas pré-configuradas no Wireshark, mas há muito mais colunas disponíveis para serem mostradas na ferramenta, como TTL, checksum, etc, selecionando-as nas configurações de “Colunas”.
A seção Detalhes do pacote da ferramenta mostra informações mais interpretáveis sobre o pacote, que variam dependendo do tipo de pacote. O painel inferior, Packet Bytes , mostra o conteúdo do pacote no formato hexadecimal puro.
Filtros de Captura do Wireshark
Os filtros de captura no Wireshark limitam os pacotes capturados pelo filtro inserido. Se você deve ter notado, os filtros de captura do Wireshark seguem o mesmo formato do tcpdump , que é outra ferramenta popular de captura de pacotes de rede. A sintaxe das capturas de pacotes segue as expressões de sintaxe do Berkeley Packet Filter (BPF). Alguns filtros de captura comuns para o Wireshark incluem…
Capture o tráfego apenas de e para o endereço IP 172.18.5.4:
host 172.18.5.4
Capture o tráfego de ou para um intervalo de endereços IP:
net 192.168.0.0/24
OU
net 192.168.0.0 mask 255.255.255.0
Capture o tráfego de um intervalo de endereços IP:
src net 192.168.0.0/24
OU
src net 192.168.0.0 mask 255.255.255.0
Capture o tráfego DNS (porta 53):
port 53
Capture, exceto todo o tráfego ARP e DNS:
port not 53 and not arp
Capture apenas pacotes IPv4:
ip
Capture apenas pacotes Ethernet (EAPOL):
ether proto 0x888e
O recurso de filtros de exibição no Wireshark permite restringir o tipo de pacotes mostrados na lista de pacotes capturados. Exemplos comuns de filtros de exibição incluem o seguinte:
Filtros baseados em protocolo:
Você pode filtrar o tráfego de pacotes com base no protocolo de rede
http
O exemplo acima mostra apenas pacotes com o protocolo HTTP
Filtrar pacotes por endereço (ou seja, filtragem de endereço IP):
Você pode filtrar pacotes através do endereço do remetente ou do destinatário
ip.src == xxxx
A imagem acima mostra o tráfego proveniente de um endereço IP específico
Filtros baseados em portas:
Você pode filtrar o tráfego de pacotes com base no número da porta que está sendo usado
http
O exemplo acima mostra apenas pacotes TCP com porta 80
Filtros baseados em tempo:
Você pode filtrar pacotes com base na hora em que foram capturados
frame.time >= "YYYY-MM-DD HH:MM:SS" && frame.time <= "YYYY-MM-DD HH:MM:SS
O exemplo acima mostra apenas pacotes dentro de um intervalo de tempo selecionado
Filtros baseados em conteúdo:
Você pode filtrar pacotes com base no conteúdo dos pacotes
frame contains google
O exemplo acima mostra pacotes cujo conteúdo contém a palavra-chave “google”
Enquanto o processo de análise de pacotes é usado para obter uma visão geral dos padrões de tráfego de rede, a dissecação de pacotes envolve uma abordagem muito mais restrita. A dissecação de pacotes refere-se ao processo de dissecar pacotes individuais em seus componentes distintos (ou seja, cabeçalhos, conteúdo da carga útil, etc.) para obter conhecimento valioso dos processos de rede ou do dispositivo que está sendo monitorado. Alguns aplicativos para os quais as dissecações de pacotes podem ser usadas incluem análise de protocolo e análise forense.
Para nossa sorte, o Wireshark contém um conjunto de ferramentas integrado para executar uma análise completa de pacotes em cada pacote que é transportado por uma rede. Algumas técnicas para executar a dissecação de pacotes incluem…
Decodificação de protocolo: você pode visualizar os detalhes do protocolo para cada pacote expandindo os detalhes da camada no painel de detalhes do pacote. Isso é útil para decodificar vários protocolos, como TCP, UDP, DNS, etc.
Fluxos TCP: O Wireshark também contém um recurso que exibe o fluxo TCP de todos os pacotes que passam por uma conexão TCP. Para usar este recurso, selecione um pacote que pertença a uma conexão TCP, clique com o botão direito do mouse no pacote e selecione “Follow > TCP Stream”
Codificação de cores: você também pode visualizar pacotes com base em critérios específicos, como comprimento do pacote ou tipo de protocolo. Para ver esse recurso, vá em “Exibir” e clique em “Regras de coloração”
Gráficos de fluxo: O Wireshark possui um recurso que exibe um gráfico de fluxo mostrando os detalhes de tempo e sequência de um pacote entre duas máquinas. Para configurar um gráfico de fluxo, vá em “Filtro de Conservação” e selecione a opção “TCP”. Isso cria um filtro que mostra todos os pacotes sendo passados entre duas máquinas. Em seguida, selecione “Statistics” e “TCP Stream Graphs” para criar o gráfico de fluxo
A dissecação de pacotes pode ser aplicada para analisar quais tipos de protocolos de rede estão sendo utilizados e como estão sendo usados. Para experimentar a análise de protocolo com o Wireshark, comece capturando pacotes com sua interface de rede selecionada. Então, conforme os pacotes são capturados, eles devem transmitir uma variedade de protocolos como HTTP (porta 80), HTTPS (porta 443), SSH (porta 22) e SNTMP, etc. Vamos usar HTTP para nosso exemplo de dissecação de pacotes. Comece selecionando um pacote com o protocolo HTTP atribuído a ele, como abaixo, filtrando com a palavra-chave http...
Uma vez que o pacote é selecionado, expanda o menu Transmission Control Protocol (TCP) para ver as informações relevantes para o pacote.
Depois que os detalhes do pacote são expandidos, você pode analisar diferentes campos do protocolo, como endereços IP de origem e destino, portas de origem e destino, método HTTP usado (GET, POST, DELETE, etc) e o código de resposta HTTP.
A dissecação de pacotes também pode ser usada para análise forense digital, a fim de extrair informações por trás de incidentes de rede específicos. Por exemplo, imagine uma situação em que um hacker envia informações confidenciais pela sua rede para um servidor remoto. Podemos usar filtros de exibição no Wireshark para isolar o tráfego vindo da máquina do hacker usando o endereço IP do dispositivo do hacker e o endereço IP do servidor remoto. Então, podemos usar as ferramentas de dissecação de pacotes oferecidas pelo Wireshark, como o recurso “Follow TCP Stream” para reconstruir o fluxo de dados TCP entre o hacker e o servidor remoto. Ao usar essas informações, você pode revelar informações ocultas que o hacker enviou ao servidor remoto, como a transferência de arquivos ou imagens maliciosas. Esta aplicação de dissecação de pacotes também pode ser aplicada para analisar o tráfego de rede e detectar qualquer atividade criminosa.
A engenharia reversa é o processo de desconstruir e analisar um sistema para entender como ele funciona “sob o capô” e extrair dele informações pertinentes. Esse processo geralmente é feito por meio de um processo iterativo desconstruindo aspectos específicos de um sistema, analisando suas especificações técnicas e código e executando testes específicos para examinar seus resultados. Quanto ao caso de hacking de UAV, podemos aplicar princípios de engenharia reversa para analisar o software e o firmware de um drone, extrair informações de telemetria e identificar vulnerabilidades a serem exploradas. Para este experimento de pesquisa, decidi fazer engenharia reversa do DJI Mini 2 - um drone pequeno e compacto projetado para uso recreativo desenvolvido por uma empresa popular de drones chamada DJI.
Como a espionagem passiva não retorna nenhum resultado de engenharia reversa, em vez disso, usei uma configuração de rede artificial e amigável para permitir que a comunicação sem fio entre o drone e o operador seja inspecionada e interceptável seguindo a configuração abaixo:
a) Drone: o done inicializa o processo iniciando um ponto de acesso utilizado para comunicação direta com seus pares de rede
b) MITM AP: estabelecemos uma segunda rede virtual com nossa máquina disfarçada de AP para o cliente móvel
c) Cliente MITM: o cliente MITM se conecta diretamente com o drone encaminhando as redes do AP MITM para o drone e vice-versa
d) Máquina MITM: a máquina MITM é o dispositivo usado para espionagem conectando via NAT (Network Address Translation) os AP's MITM virtuais com o NIC interno do cliente MITM
e) Operador: o operador é o dispositivo móvel que executa o aplicativo DJI que conecta via Wi-Fi o representante do drone (MITM-AP)
Configuração do ponto de acesso
Para configurar o MITM AP, usei o create_ap comando para criar um AP virtual na linha de comando da minha máquina.
sudo create_ap wlan0 wlan0 Operator 12345678 -w 2 -c 2 -m nat --freq-band 2.4 --country US
Este comando foi projetado para eliminar o número de perturbações entre a conexão focando na frequência de 2,4 GHz e estabelecendo os seguintes parâmetros:
-w 2
WPA2-PSK no modo de cifra CCMP -c 2
uso de canal desocupado arbitrário e estático -m nat
NAT para conectar entre o AP virtual e o NIC físico --freq-band 2.4
selecionando apenas a banda de 2,4 GHz --country US
colocando o código de país certo para cumprir os regulamentos locaisEspionagem de intercomunicação
Para espionagem, usei a ferramenta de linha de comando para otimizar o desempenho da rede MITM. Com o tcpdump, os pacotes de rede capturados serão armazenados em um arquivo PCAP correspondente, que pode ser posteriormente analisado por uma série de programas de análise de rede. Também implementei filtros adicionais para reduzir o alcance da saída capturada para consistir apenas em pacotes de rede relevantes entre o drone e a máquina.
sudo tcpdump --interface=ap0 -n udp host 192.168.2.1 -w /tmp/dumps/capture.pcap
-n
evita resoluções de DNS udp
ignora qualquer pacote TCP host 192.168.2.1
garante que os pacotes exibidos sejam relacionados ao dronePara realizar pesquisas forenses digitais no DJI Mini 2, tentei fazer engenharia reversa do protocolo DJI Wi-Fi analisando os pacotes de rede enviados pelo drone usando o Wireshark. Para determinar a estrutura exata do protocolo dos pacotes transmitidos pelo drone, usei o raciocínio de precisão de bits para classificar cada bit individual. Ao longo do processo, descobri que os seguintes predicados de filtro no Wireshark são os mais úteis:
!dns && !mdns && !icmp
como apenas os pacotes de rede no nível do aplicativo são relevantes para esse processo, podemos excluir os protocolos DNS, Internet Control Message Protocol (ICMP) e Multicast DNS (MDNS) de nossa pesquisa ip.src == 192.168.2.1
O endereço IP 192.168.2.1 representa o endereço IP do drone. Aqui, especificamos a origem e o destino a serem filtrados por esse IP. data.len == 1472
Neste exemplo, apenas os pacotes com comprimento de 1472 bytes são incluídos na visualização de resultados, exibindo pacotes de drones com o tamanho exato da carga útil data.data[0] == 0x00
isso compara o valor hexadecimal estático com o conteúdo da carga útil do índice inicial. Isso é útil porque a inspeção de pacotes no meio do voo se concentra nas alterações correlatas entre o protocolo e as instruções de controle do drone do operadorCom os pacotes obtidos usando o Wireshark, concentrei-me no payload do índice 0x2A até o comprimento do quadro Ethernet. Embora todo o pacote inclua informações, os bytes de dados de 0x2A até o final são suficientes para fins de engenharia reversa. Incluí a tabela de camadas do modelo Ethernet OSI abaixo para referência:
Criptografia de carga útil
Embora todo o fluxo de comunicação seja criptografado, o fluxo de dados descriptografado ainda pode comprometer a integridade da criptografia. Um método de descriptografar informações com sistemas UAV é fazer uma comparação lado a lado entre várias cargas úteis para identificar padrões. O Electronic Codebook Mode (ECB) produz uma sequência de dados determinísticos aplicando a mesma permutação pseudoaleatória a cada bloco de texto simples para criar blocos de texto cifrado repetidor. Podemos aplicar isso em nosso processo de engenharia reversa para possivelmente encontrar uma carga pseudo-aleatória ou duas cargas idênticas dentro dos pacotes UDP. Embora eu não tenha conseguido encontrar cargas idênticas, havia muitas que eram muito semelhantes entre si. Por exemplo, as imagens abaixo mostram dois pacotes onde apenas 5 bytes diferem. As duas cargas úteis são muito semelhantes e até indicam uma incrementação de uma que é evidente em um fluxo de dados não criptografado.
Raciocínio dedutivo
A principal abordagem que usei para a engenharia reversa do DJI Mini 2 foi aplicar o raciocínio dedutivo para comparar as cargas com base nas entradas correlacionadas do operador. Usando as instruções de controle direto do drone (ou seja, pouso, movimento, decolagem, etc.), forcei o operador a sinalizar o pacote de rede representativo. As instruções de controle foram capazes de sinalizar o tipo de comando e o conteúdo da carga útil. Em seguida, os pacotes foram comparados entre si usando a técnica de comparação binária mencionada acima, revelando a estrutura de comando e os valores dos parâmetros. A análise de pacotes revelou um protocolo de alto tráfego que consiste principalmente em pacotes drone-to-operator que dependiam da Unidade Máxima de Transmissão (MTU).
Raciocínio preciso de bits
Para obter mais informações sobre os dados armazenados nos pacotes transmitidos, uma técnica chamada raciocínio de precisão de bits foi usada para a análise de bits nas cargas de 56 bytes para fazer julgamentos específicos sobre a propriedade de cada pacote. Para simplificar o processo, os clusters foram usados para agregar cargas para que cada uma tenha exatamente o mesmo comprimento. Eu recomendo fortemente a leitura deste trabalho de pesquisa que se aprofunda no método de precisão de bits para drones de engenharia reversa para aprender mais sobre essa técnica. A tabela abaixo exibe uma visão geral das informações que puderam ser extraídas usando o raciocínio de precisão de bits.
Ao longo deste processo de pesquisa, aprendi que a dissecação de pacotes para reconhecimento e forense digital/engenharia reversa exige abordagens totalmente diferentes. Felizmente, a dissecação de pacotes usando reconhecimento passivo e um dissecador de comunicação de rede foi muito útil para analisar as interfaces de comunicação do DJI Mini 2.
Para começar com o processo de dissecação de pacotes, baixei os arquivos PCAP listados neste repositório de despejos de pacotes de comunicação DJI, que inclui um registro expansivo de dados de comunicação para todos os tipos de drones DJI usando o Wireshark. Depois que os arquivos PCAP foram baixados, analisei-os usando o Wireshark usando diferentes dissecadores.
Analisando Formatos de Informação
Antes de aprofundar o processo específico de dissecação de pacotes de despejos de pacotes DJI, vale a pena mencionar todos os
Comunicação UART: UART significa Universal Asynchronous Receiver-Transmitter é um protocolo serial comumente usado para transmitir informações entre dispositivos eletrônicos que utilizam o fluxo assíncrono de bits de dados sequencialmente em uma única linha de comunicação
DUML Streams: DUML significa DJI Universal Markup Language, que descreve o protocolo de código fechado para comunicação DJI. É usado para controlar as configurações internas do dispositivo ou para iniciar atualizações de firmware
Arquivos KML: Também conhecidos como Keyhole Markup Language, são arquivos XML usados para exibir especificamente dados geográficos em software de mapeamento. Os arquivos KML contêm dados sobre locais, formas, caminhos e outros recursos geográficos específicos
DAT Flight Logs: DAT significa Fita de áudio digital. Eles se referem aos dados de voo gravados armazenados em fitas de áudio digitais. Os arquivos DAT incluem informações de voo pertinentes para análise
O arquivo PCAP dentro do repositório de despejos de pacotes DJI contém um enorme despejo de logs de comunicação de vários hardwares DJI. Esse armazenamento de logs de comunicação nos permite decifrar as comunicações internas dos protocolos juntamente com um bom ponto de referência para sondar problemas de hardware dentro do hardware. Por exemplo, o primeiro arquivo de log p3x_ofdm_to_center_run1 contém um despejo de comunicação do despejo UART da placa do receptor DJI P3X. O despejo de dados apresenta uma comunicação bilateral entre um OFDM (Orthogonal Frequency Division Multiplexing) MCU (Microcontroller Unit) e FC (Flight Controller) no drone usando um cabo plano e o programa comm_serial2pcap.py .
Configurando o Wireshark
Para configurar uma dissecação de comunicação básica da DJI, usei os arquivos de dissecação de comunicação listados nas ferramentas de firmware da DJI. As ferramentas de dissecação de comunicação, disponibilizam as seguintes funcionalidades:
- Exibir campos dentro de pacotes DUML capturados de uma fonte de drone
- Mostrar campos dentro de pacotes armazenados em voo binário
- Grave arquivos DAT
- Visualize voos por meio do recurso de exportação KML
As ferramentas também permitem analisar comandos de protocolo por meio das seguintes opções:
- Arquivos PCAP baseados em fluxo DUML
- Arquivos PCAP contendo despejos de comunicação USB/Ethernet em cargas úteis DUML incorporadas
- Arquivos PCAP baseados em DAT Flight Log
Para começar a configurar seu ambiente, baixe todos os arquivos .lua listados neste link . Em seguida, dentro do Wireshark, abra o menu Sobre o Wireshark e vá para a guia Pastas .
Em seguida, clique na referência do caminho do arquivo para Personal Lua Plugins e cole todo o conteúdo do arquivo .
Uma vez configurado, atualize o Wireshark usando o comando Ctrl+Shift+L para carregar todas as ferramentas de dissecação de comunicação. Depois de carregado, abra
Preferences -> Protocols -> DLT_USER -> Edit
e faça as atribuições conforme a imagem abaixo: Depois que a tabela DLT for inicializada, vá para
Preferences -> Appearance -> Columns
e ajuste as configurações para exibir as informações de protocolo desejadas. O seguinte é um exemplo de uma maneira que pode ser configurado: Dissecação de comunicação
Das ferramentas de dissecação de comunicação, podemos extrair as seguintes informações dos protocolos de comunicação DJI:
Estrutura de arquivo de firmware: o dissecador pode delinear informações sobre a estrutura de arquivos de firmware, como cabeçalhos, seções e seções de dados
Componentes de firmware: as ferramentas também podem extrair componentes de firmware individuais, como bootloader, firmware de controle de voo, firmware de câmera, firmware de gimbal, etc.
Parâmetros de configuração: os parâmetros de configuração também podem ser analisados, fornecendo informações de configuração para componentes como câmera, controle de voo e sensores
Scripts: trechos de código e binários executáveis também podem ser descobertos no arquivo de firmware
Criptografia: dependendo da situação, o dissecador também pode descriptografar e criptografar partes de arquivos de firmware revelando informações sobre o processo de criptografia de firmware
Conteúdo do sistema de arquivos: se um arquivo de firmware incluir um sistema de arquivos, as ferramentas também podem extrair e analisar o conteúdo desse sistema de arquivos
No Wireshark, um dissecador é responsável por interpretar e decodificar protocolos de rede. Os dissecadores são úteis porque analisam os pacotes de rede capturados e extraem informações úteis deles, como a estrutura do protocolo, campos e regras de codificação, e os exibem em um formato legível por humanos.
O Wireshark também permite que você desenvolva seus próprios dissecadores personalizados usando uma linguagem de programação chamada Lua . Embora o Wireshark tenha sido escrito em C e os dissecadores para o programa sejam normalmente escritos em C, no entanto, o Wireshark também permite que os dissecadores sejam escritos na linguagem de programação Lua para tornar a curva de aprendizado menos íngreme para pessoas que são novas no desenvolvimento. Lua é uma linguagem de programação multiparadigma, procedural e funcional com recursos orientados a objetos integrados. Embora a escolha de Lua como linguagem para o desenvolvimento do dissecador comprometa a velocidade, ela é favorável na maioria das circunstâncias por causa de seu peso leve e facilidade de aprendizado.
Introdução básica à Lua
Como mencionei antes, Lua apresenta uma sintaxe de código intuitiva e simples, mantendo em mente a velocidade, a portabilidade e a integração com outros programas, tornando-o fácil de aprender sem sacrificar muita funcionalidade e desempenho. Aqui estão alguns trechos de código básicos descrevendo os recursos fundamentais da linguagem:
Variáveis e Operações
local a = 25
local b = 5
local result = a + b print (result) -- Output: 30
Declarações condicionais
local temperature = 15
local heatSetting = 0
if temperature < 0 then heatSetting = 3
elseif temperature <= 20 then heatSetting = 2
else heatSetting = 1 end
print (heatSetting) -- Output: 2
rotações
-- While Loops
local i = 0
while i < 10 do
i = i + 1
end
print (i) -- Output: 10
-- For Loops
local i = 0
-- i = first, last, delta
for i = 0 , 10 , 1 do
print (i) end
print (i) -- Output: 10
Tabelas
local new_table = {} -- Table value assignment
new_table[ 20 ] = 10
new_table[ "x" ] = "test"
ax = 10
Funções
function add (arg1, arg2)
return arg1 + arg2 end
local added_number = add( 2 , 3 ) print (added_number) -- Output: 5
Notas resumidas sobre Lua
Lua é tipada dinamicamente
O escopo é especificado como local ou global. Global é o padrão
Ponto e vírgula não são necessários, fazendo com que os espaços em branco tenham mais valor
-- denota um comentário
i = i + 1 usado para incremento variável
~= usado no lugar de !=
Os tipos são: string, number, boolean, nil, function, userdata, thread e table
Nil é usado para um não-valor
Em condicionais: nil e false são falsos, o resto são verdadeiros.
A única estrutura de dados de Lua é a tabela. Tables implementa arrays associativos. Arrays associativos podem ser indexados por números e outros tipos, como strings. Eles são dinâmicos e frequentemente chamados de objetos.
Para configurar o desenvolvimento do dissector com scripts Lua no Wireshark, clique em
Help -> About Wireshark -> Folders
. A partir daí, clique na referência da pasta Personal Lua Plugins ou Global Lua Plugins. O caminho deve se parecer com C:\Program Files\Wireshark\plugins\2.4.2 no Windows . Para criar um dissecador, inicialize um arquivo dentro desse diretório como example.lua
. O script será aplicado automaticamente assim que o Wireshark for recarregado. Você pode recarregar o Wireshark reiniciando o aplicativo ou recarregando todos os scripts Lua usando Ctrl+Shift+L . Agora que você tem tudo configurado, vou orientá-lo através de um script de dissecação rudimentar que extrai e exibe informações sobre um protocolo personalizado.
-- Create a new protocol for our custom protocol
local custom_protocol = Proto( "CustomProtocol" , "Custom Protocol" ) -- Define the fields of our custom protocol
local field1 = ProtoField.uint8( "custom_protocol.field1" , "Field 1" , base.DEC) local field2 = ProtoField. string ( "custom_protocol.field2" , "Field 2" ) -- Register the fields to the custom protocol
custom_protocol.fields = { field1, field2 } -- Create a function to dissect the packets of our custom protocol
function custom_protocol.dissector (buffer, pinfo, tree)
-- Create a subtree for our custom protocol in the Wireshark GUI
local subtree = tree:add(custom_protocol, buffer(), "Custom Protocol Data" ) -- Extract and display the values of Field 1 and Field 2
local field1_value = buffer( 0 , 1 ):uint() subtree:add(field1, buffer( 0 , 1 )):append_text( " (Value: " .. field1_value .. ")" ) local field2_value = buffer( 1 , 5 ): string () subtree:add(field2, buffer( 1 , 5 )):append_text( " (Value: " .. field2_value .. ")" ) end
-- Register our custom protocol as a dissector in Wireshark
local udp_port = DissectorTable.get( "udp.port" ) udp_port:add( 12345 , custom_protocol)
- o código começa inicializando um protocolo personalizado usando o objeto Proto chamado
CustomProtocol
field1
e field2
buffer
, pinfo
, e tree
. buffer inclui o buffer do pacote e o objeto Tvb , pinfo contém colunas da lista de pacotes e tree é a raiz da árvore - Dentro da função dissector, criamos uma subárvore dentro da seção Wireshark Packet Details mostrando nosso protocolo personalizado como um campo
- Na seção de exibição em árvore, exibimos as informações do pacote para cada um dos respectivos campos no protocolo personalizado
- Por último, atribuímos um protocolo a uma porta. Neste caso, a porta utilizada é
12345
para UDPNo geral, usando o Wireshark em conjunto com alguns dissecadores de comunicação baseados em DJI, conseguimos revelar informações confidenciais transmitidas por drones DJI por meio de seus protocolos de comunicação. Espero que este extenso processo de pesquisa tenha elucidado algumas técnicas de engenharia reversa que você pode aplicar durante seu processo de segurança cibernética para possivelmente encontrar vulnerabilidades nos sistemas existentes. Além disso, espero que este relatório tenha provado que, embora hackear drones possa ser um pouco tedioso, não é impossível. É importante continuar expandindo os limites do que se sabe atualmente sobre um sistema para destacar as falhas existentes antes que sejam percebidas por pessoas mal-intencionadas. Nesse caso, revelamos que os protocolos de drones, mesmo para grandes fabricantes de marcas confiáveis, como DJI, ainda são vulneráveis à interceptação de dados e engenharia reversa. Ao levar isso em consideração, medidas de ação construtivas podem ser tomadas para mitigar essas vulnerabilidades existentes e solidificar a segurança dos canais de comunicação dos drones.
Também publicado aqui.