ברוכים הבאים לאזור הבלוגים הטכנולוגיים של ITsafe



קריאה מהנה


אתגר חומרית ZeroNights

Neste blog, apresentarei a solução que eu e Nikita Krutin encontramos ao desafio cyber de hardware que ocorreu na conferência ZeroNights.

No dia 16 de novembro de 2019, a ZeroNights Cyber ​​Conference foi realizada em Moscou, uma conferência de segurança da informação altamente recomendada e interessante.

Durante a conferência, houve um desafio cyber de hardware muito interessante que me chamou a atenção, o desafio era uma barreira de estacionamento elétrica no qual podia ser aberta com um botão, como na seguinte foto:
Modelo de barreira de estacionamento conectada a um Arduino
Os participantes do desafio deveriam descobrir como o portão elétrico funcionava e abri-lo remotamente sem precisar pressionar o botão.

Para resolver o desafio primeiro, entenderemos como o sistema funciona, consideramos que o modelo possui dois "Arduino Uno".

  • O primeiro está conectado a um botão e um monitor e contém um transmissor de RF.
  • O outro está conectado a barreira e contém um receptor de RF.

Quando o botão é pressionado, o primeiro Arduino envia uma senha para o segundo Arduino e, se a senha estiver correta, a barreira de estacionamento é aberta.

Um transmissor e receptor básico são assim:
Componentes de RF baratos que atualizam em 433Mhz
Depois de entendermos como o modelo funciona, precisamos planejar nossa estratégia de ação e entender como podemos decifrar a senha para abrir a barreira.

Dividimos nossa estratégia em 3 partes:


parte 1 - Testando o modelo

Construímos um modelo simples do Arduino que funcionará como um sniffer no qual exibirá todas as senhas enviadas pelo console. Para fazer isso, usaremos as seguintes partes:

  • Arduino Uno
  • Breadboard
  • Breadboard
  • RF receiver

Este material foi fornecido pelos organizadores do desafio, você pode escolher entre o HackRF e o Arduino (escolhemos o Arduino).

Depois de conectar todas as peças, construímos nosso modelo.

Imagem da fase de desenvolvimento do modelo:
Dois computadores ligados a um android e a uma antena RF
Apertamos o botão da barreira três vezes e capturamos as mensagens enviadas, que eram essas:
Código criptografado que recebemos
Se examinarmos mais de perto as mensagens, elas parecerão divididas em duas partes, como a seguir:

  • 4 primeiros bytes constituem um contador de pacotes.
  • o 0x7d6 = 2006
  • o 0x7d7 = 2007
  • o 0x7d8 = 2008
  • 8 bytes que são basicamente código para impedir ataques de replay.

Parte 2 - Decifrando a lógica

Depois de entendermos a lógica, agora precisamos pensar em como podemos decifrar a senha. Sabemos que há algum contador e uma chave igual em todos os pacotes.

Além disso, cada pacote enviado é diferente do pacote anterior, mas ao mesmo tempo a barreira consegue decodificar as informações com relativa facilidade e abrir rapidamente.

Com base nessas informações, tivemos um palpite e assumimos que a senha fazia parte de um protocolo de hash e, portanto, tentamos todos ou pelo menos esses (md5, sha1, sha256 e alguns outros que estavam no módulo hashlib)

Vamos pegar o contador, que na verdade é aquele que causa com que a senha constantemente esteja mudando, e conectamos caracteres aleatórios.

Em seguida, executamos a operação de hash md5 no resultado e verificaremos se ela contém a parte dos 8 bytes que provavelmente são 8 bytes dentro da operação de hash.

Foi assim que o código a seguir foi escrito:
Código em python que utiliza hashlib e verifica md5
Este código produziu o seguinte resultado:

[+] The password is: 1339 in 0.640000104904s

portanto os caracteres D0 87 FF 2E 43 E6 95 65 são basicamente os primeiros 8 bytes da operação de hash md5.

E o dado enviado do transmissor para o receptor é:

counter(4 bytes) + (first 8 bytes of MD5(counter + secret key))


Parte 3 - Abrindo o portão

Depois que conseguimos receber pacotes de informações do componente do transmissor e decodificar a senha. O próximo passo é escrever um trecho de código que você possa capturar os dados do primeiro pacote enviado pelo transmissor ao clicar no botão para poder receber o contador.

Em seguida, adicionaremos o número 1339 ao contador e faremos o hash MD5.

Então, basicamente, escrevemos o código a seguir para capturar o primeiro pacote:
Código em C
em seguida o seguinte código que pega a senha 1339 com o contador e o envia a barreira de estacionamento:
Código em C
Rodamos o código em loop e, portanto, a barreira de estacionamento ficou aberta todo o momento em que o código rodava.
Foto demonstrando a barreira abrindo
basicamente, assim, resolvemos o desafio e ganhamos um prêmio valioso 😊

Quer aprender a fazer coisas assim, de uma olhada em nossos cursos.

Share this post