ברוכים הבאים לאזור הבלוגים הטכנולוגיים של 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.

Compartilhe este post

אודות הצוות

צוות האתר מתעסק באבטחת מידע מזה שנים ועובד בחברות מפתח בתחום הסייבר, אנחנו מנסים להשתתף באתגרים ולומדים כל יום דברים חדשים.