Como eu hackeei modernas máquinas de venda automática

"Batendo e chutando" o pacote de App de sua mais ampla empresa de distribuição europeia.

Matteo Pisani 12 de outubro

PREFÁCIO

Indiscutivelmente, Vending Machines são objetos de culto. Pedaços deliciosos de hackers , sempre. No começo, eles trabalhavam off-line apenas com moedas e , em seguida, os modelos de chaves / cartões NFC começaram a se espalhar. Se eu disser " COGES ", tenho certeza que tempos melhores virão à mente de alguém. Mas… Em um monte de anos, as coisas mudaram radicalmente. Você distrai e, um momento depois, encontra o mundo superado por coisas conectadas à internet …

HISTÓRIA

Um dia eu decidi interromper me temperando na caverna de morcego e dirigir a minha cidade natal para adquirir alguma luz solar, assim eu fui para a Universidade para saudar um professor velho.

“Vá tomar um café!” – disse ele – e começamos a conversar enquanto caminhávamos pelo corredor principal.

Chegou uma vez …

Eu: “deixa eu pagar, eu tenho moedas!”.
Ele: “espere, espere! deixe-me usar o App da Vending Machine para pagar, o café ficará mais barato ”.

BLE + NFC

Cérebro: “Mmm… Carteiras virtuais são coisas legais…”.

Excelente.

HOT-POT

Alma: "Eu te desafio a invadir isso!"

~ $ White Hat interior voz: "apenas dá um tapinha no ombro se não houver recompensa pelo bounty".
~ $ Cinza Chapéu voz interior: "ok, eu vou fazer isso apenas para fins educacionais".
~ $ Preto Chapéu voz interior: "Vamos homem, vamos estragar que HEAP, grande Júpiter!".

Mais tarde naquele dia …

Pwnie express.

ANÁLISE

Escusado será dizer que eu peguei o meu smartphone Android com raiz suja (com USB Debugging Enabled ), instalei o aplicativo alvo da Play Store e joguei o * .apk original no meu laptop via adb .

 # adb pull /data/app/com.sitael.vending-1/base.apk ./Argenta.apk 

Eu decompilei o * .apk com apktool

 # apktool d ./Argenta.apk -o ./Argenta 

e extraiu fontes de Java com jadx

 # jadx ./Argenta.apk 

Em primeiro lugar, tornei o * .apk debuggable editando o arquivo AndroidManifest.xml adicionando a propriedade android:debuggable="true" ao application <tag>

Então, eu reconstruí o * .apk

 # apktool b ./Argenta 

criou uma nova chave com keytool

 # keytool -genkey -v -keystore Argenta.keystore -alias Argenta -keyalg RSA -keysize 2048 -valididade 10000 

assinou o * .apk com jarsigner usando a chave gerada

 # jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore Argenta.keystore Argenta.apk Argenta 

Por fim, eu o alinhei com zip para torná-lo viável

 # zipalign -v 4 Argenta.apk Argenta-signed.apk 

e eu instalei o final * .apk

 # adb install ./Argenta-signed.apk 

Eu corri o aplicativo no smartphone e comecei a olhar para logs com logcat , filtrando-os através do nome do pacote

 # adb logcat --pid = `adb shell pidof -s com.sitael.vending` 

Nada de especial encontrado, então eu comecei a vasculhar os códigos-fonte procurando informação suculenta .

Olhando melhor no arquivo AndroidManifest.xml , encontrei referências ao RushOrm

Então, a primeira pesquisa por palavra-chave foi db_name

Legal. Eu iniciei o Root Explorer no telefone procurando por argenta.db

Encontrado. Então eu puxei para o meu laptop com adb

 # adb pull /data/data/com.sitael.vending/databases/argenta.db ./ 

e tentei abri-lo com um DB Browser para SQLite

Obviamente, foi protegido por senha

ENGENHARIA REVERSA

Volte para os códigos-fonte, olhou para RushAndroidConfig.java

onde encontrei os métodos usados para configurar o banco de dados.
Minha atenção foi capturada por this.encryptionKey = getDeviceId(context);

Eu mudei para a sua definição e…

Descobriu que o aplicativo alvo usava o IMEI do telefone (*#06#) como chave de criptografia para o banco de dados SQLite .

Abracadabra.

Boom baby.

Após alguns segundos de inspeção, abri na tabela UserWallets

e editou as alterações na escrita do campo walletCredit

então eu empurrei o banco de dados com crédito bombeado de volta para o telefone

 # adb pull ./argenta.db /data/data/com.sitael.vending/databases/argenta.db 

VEREDITO

Enquanto isso, enquanto eu me sentia como "Robin Hood" (referência nostálgica e explícita ao código de fraude do Age Of Empires para +1000 de ouro ) desenvolvi um utilitário Android para rapidamente descarregar / restaurar / adulterar o banco de dados do Aplicativo alvo rapidamente.

então voltei para a minha universidade novamente para testar o Hack

Querido Diário…

CONCLUSÃO

Da conta de crédito zero , eu poderia:

> Inflar o crédito do aplicativo.
> Compre coisas.
> Receba o crédito restante atualizado.
> Volte para o estado de crédito zero.
> Inflar o crédito novamente.
> Comece de novo.

Com uma inspeção de macro de todas as fontes revertidas , encontrei uma grande porção de código limposem ofuscação – que não significou nenhuma contra-medida adotada para proteger os dados do usuário e tornar o aplicativo seguro .

Um mês atrás…

A voz interior do meu White Hat pegou o telefone e chamou a empresa por trás dessa vergonha para relatar a vulnerabilidade. Eu gentilmente sugeri que eles lançassem a arquitetura atual e desenvolvessem uma arquitetura melhor e mais segura do zero.

Hocus falso.

Texto original en inglés.