Hacking ATM de baixo nível da NCR



Imagem: Sascha Kohlmann , CC BY-SA 2.0

Existem sistemas aos quais meros mortais não têm acesso por padrão. E os desenvolvedores de tais sistemas ingenuamente acreditam que estão protegidos da penetração e dos olhos perspicazes dos pesquisadores.

Tome pelo menos caixas eletrônicos (ATMs). Existem casos frequentes em que pessoas desconhecidas chegam ao caixa eletrônico, conectam um laptop, recebem dinheiro e saem sem deixar nenhum registro no sistema. E histórias recentes com " costeletas " (malware chamado Cutlet Maker ) confirmam que não há sistemas invulneráveis ​​- existem sistemas subexplorados.

Início do estudo


Há uma opinião de que a única maneira de roubar dinheiro de um caixa eletrônico é dirigir em um caminhão basculante, pegar um gancho no caixa eletrônico e rasgá-lo e depois usar um moedor, um pé de cabra e uma máquina de solda a gás. Mas existe outro método.

Após uma breve pesquisa no Ebay , eu tinha um dispensador NCR USB S1 com um firmware em minha mesa. Os objetivos foram os seguintes:

  • encontre um desvio para criptografar os comandos que o computador envia via USB para o próprio distribuidor, em particular para emitir notas de banco;
  • Aprenda como contornar a necessidade de acesso físico ao cofre para autenticação (cassette jerking) para gerar chaves de criptografia para comandos do parágrafo anterior.



Firmware


O firmware é um arquivo ELF para o processador NXP ColdFire ( Motorola 68040 , meu processador favorito), executando o VxWorks v5.5.1 .



No arquivo ELF , duas seções principais são de interesse - .text e .data :

  • Um deles contém um código que gira o tempo todo (vamos chamá-lo de firmware principal) quando o distribuidor está conectado à unidade de sistema na parte superior do caixa eletrônico.
  • O segundo é o código do carregador de inicialização empacotado com zlib (seu nome local é USB Secure Bootloader ), responsável por carregar o firmware e iniciar o código principal.

E a melhor parte é que os símbolos permanecem sem cortes no arquivo - pegue-o e procure por algo interessante.

Dispositivo interno do firmware principal


Se você dividir o código em componentes principais, obterá o seguinte esquema (na ordem de envio):

  1. Um fluxo que lida com o recebimento de pacotes USB e sua distribuição entre os serviços.
  2. Os serviços são as principais unidades executoras, cada uma delas com sua própria função e cada uma com suas próprias tarefas (classes).
  3. Classes - aqui são tarefas que um serviço específico pode executar com a ajuda de controladores.
  4. Os controladores são realmente “ trabalhadores ” ( trabalhadores ) envolvidos na validação das tarefas enviadas a eles, sua implementação e também na formação de pacotes de resposta.



Como há muito código no firmware, foi decidido começar pesquisando todos os serviços possíveis e depois procurar onde as tarefas são transferidas.

Como resultado, foram encontrados os seguintes serviços que devem fazer apenas o que estou procurando:

1) DispTranService (Dispenser Transaction Service) : trabalha com comandos criptografados, a formação de pacotes de notas, autenticação. Você pode dizer que o mais interessante está aqui.



2) securityService : após a autenticação, uma chave de sessão é gerada no lado do dispensador, que, a pedido do computador, é enviada a ele em forma criptografada. Essa chave criptografará todos os comandos importantes - emissão, formando um pacote de notas.



Posteriormente, outro serviço chamou minha atenção: UsbDownloadService . Sua tarefa é que, quando o dispensador estiver conectado ao computador e a versão do firmware do dispensador não corresponder àquela armazenada no computador ATM, alterne para o carregador de inicialização para fazer upload do firmware com o qual o sistema operacional deve funcionar (fica na pasta com o software do fornecedor no computador). Este serviço também sabe como fornecer informações sobre a versão do firmware.



Autenticação física


A autenticação física é implementada no nível mais alto e protege o ATM de simplesmente enviar comandos via USB para emitir sem autorização. Nesse caso, consiste no fato de que apenas com um cofre aberto com dinheiro é necessário fazer o seguinte:

  • remova e insira o cassete inferior,
  • comute o interruptor de alavanca na parte traseira do rack.



Mas tudo isso é necessário apenas se o nível de acesso estiver definido no máximo, ou seja, físico. Existem três deles: USB (0), lógico (1) e físico (2). Os dois restantes são usados ​​por provedores de serviços e desenvolvedores para depurar e testar o firmware. Bem, o físico é altamente recomendado pelo fornecedor para uso por padrão.

Vulnerabilidade


A seguir, é descrita a vulnerabilidade crítica (já corrigida pelo fornecedor no momento da publicação do artigo), que possibilitou a execução de qualquer comando do distribuidor, incluindo saque em dinheiro, se houvesse acesso à área de serviço, mas sem acesso ao cofre (por exemplo, através do orifício no painel frontal do caixa eletrônico).



Como se viu, o UsbDownloadService aceita comandos que não exigem criptografia. Parece tentador. Mas de repente tudo fica mais protegido, e o nome Secure Bootloader será recompensado?

(Spoiler: não justificado!)

Precisamos ir mais fundo


Como já mencionado, na seção .data há um código do carregador compactado, que durante muito tempo não me interessou, e meus colegas não prestaram atenção ao examinar o firmware.



Enquanto o gerenciador de inicialização era um mistério, a questão permanecia em aberto: como o software no computador inunda o firmware? De fato, no firmware principal, nada desse tipo foi encontrado.



Portanto, o carregador de inicialização é descompactado, carregado no IDA no deslocamento 0x100000 - agora você pode investigar ... Somente não há caracteres!

Não importa: comparar o firmware principal com o código do carregador de inicialização, ler a folha de dados do controlador - e uma certa imagem começa a surgir.



Aconteceu que o upload do firmware, embora pareça protegido, não é realmente assim. Tudo que você precisa saber é como preenchê-lo corretamente.

Muito esforço e tempo foram gastos na compreensão completa desse processo (para obter mais detalhes, consulte o relatório “O Blackbox está morto - viva o Blackbox! ” Na conferência do Black Hat 2018 em Las Vegas). Por que vale a pena soldar a memória NVRAM, carregando um backup nela com o objetivo de "raspar" todo o controlador ... Agradecemos ao colega Alexei por sua paciência!

Como resultado, obtivemos o seguinte algoritmo para fazer upload de firmware no dispensador:

1) Gere um par de chaves RSA e preencha a chave pública no controlador.



2) Escreva as seções .data e .text em seqüência do ELF para seus endereços físicos nos cabeçalhos das seções.



3) Calcule o SHA-1 a partir dos dados gravados, criptografe o hash com uma chave privada e envie para o controlador.



4) Calcule e envie a soma de todas as palavras gravadas do firmware.



Depois disso, se tudo for contado e gravado com sucesso, o firmware principal será carregado.

Aconteceu que, ao escrever o firmware, há apenas uma limitação: a versão do firmware não deve ser menor que a atual. Mas ninguém está nos impedindo de alterar a versão do firmware em seus próprios dados.

Como resultado, meu firmware especial com correções antisegurança foi carregado e iniciado com sucesso!

Neste ponto, o código principal do firmware foi bem estudado, foram encontrados comandos para a emissão de notas. Agora eles podem ser enviados sem criptografia e o distribuidor os executará com prazer.



Edição


Depois de tudo o que experimentou durante o estudo (por exemplo, um caixa eletrônico real " emparedado "), o resultado foi tão agradável e compensador pelos esforços que eu queria repetir o algoritmo com outro grande fornecedor.



O caixa eletrônico mais real começou a movimentar-se de maneira contundente e ansiosa, compartilhando conosco novas notas crocantes (neste caso, "embalagens de doces" de fornecedores). Nenhuma mágica foi aplicada: apenas um laptop, um cérebro e um cabo USB.

Conclusões


Mais uma vez, estávamos convencidos de que, guiados pelo princípio de segurança através da obscuridade , é impossível fornecer proteção adequada. A propriedade do código ou firmware não significa que, em um determinado momento, um invasor não tenha acesso a ele e não tire proveito das vulnerabilidades encontradas. Tudo o que é necessário para a implementação de objetivos egoístas pode ser adquirido na presença de uma certa quantia de dinheiro.

Os desenvolvedores devem lidar com o código e os guardas de segurança devem protegê-lo. É por isso que a abordagem mais produtiva parece ser a cooperação com empresas de segurança da informação com experiência suficiente para garantir a segurança de vários sistemas que ajudarão a criar proteção adequada em cada caso.

O PS Vendor confirmou a vulnerabilidade (também foi encontrada uma lacuna em outro modelo - S2 ), declarado como corrigido na correção de fevereiro de 2018.

Lista CVE:


Agradecimentos


Antes de mim, meus colegas - Dima Sklyarov e Misha Tsvetkov - já haviam trabalhado no firmware (embora sem um quadro de distribuição). Suas conquistas me ajudaram muito no estudo, pelo qual muito obrigado a eles! Em relação ao hardware, Aleksei Stennikov me ajudou muito.

Source: https://habr.com/ru/post/pt419839/


All Articles