Tokens TOTP no pulso com um relógio “burro” inteligente
(blog.singleton.io)- Um projeto de hacking que coloca uma placa de substituição Sensor Watch em um Casio F-91W comum para ver códigos 2FA TOTP do Google e do Github no pulso
- Mantém o LCD, os botões e o buzzer piezoelétrico originais, trocando apenas a placa ARM Cortex M0+, e executa mostradores programáveis e apps utilitários sem Bluetooth
- O mostrador TOTP funciona extraindo o Base32 secret de um QR code, convertendo-o para bytes hexadecimais, inserindo-o em
totp_face.ce recompilando omovement - O mostrador ratemeter criado junto calcula a velocidade por minuto a partir do intervalo entre acionamentos do botão ALARM; acima de 500/min exibe
Hi, abaixo de 1/min exibeLo - A combinação de bateria com duração de vários meses, caixa Casio original, emulador wasm baseado na web e árvore de código-fonte modificável permite transformar o F-91W em uma pequena plataforma de hacking de pulso
Transformando o Casio F-91W em um relógio programável
- Sensor Watch é uma placa lógica que substitui o movimento de quartzo original do Casio F-91W
- O F-91W é um relógio de quartzo clássico que, segundo se sabe, vendeu cerca de 90 milhões de unidades
- A nova placa aproveita os componentes originais
- O display LCD original
- Botões
- Buzzer piezoelétrico
- A placa é programável e baseada em ARM Cortex M0+
- O projeto Sensor Watch oferece um conjunto de mostradores fáceis de modificar e pequenos apps utilitários chamados “complications”
- Não há rádio Bluetooth, mas os pontos fortes são a caixa leve do relógio, bateria com duração de vários meses e uma estrutura que pode ser recompilada diretamente
Recursos criados em menos de uma hora
- A troca da placa, a configuração dos secrets de 2FA e a criação de um novo mostrador foram concluídas em cerca de 1 hora
- Foi configurado para permitir ver no pulso os códigos OTP das contas do Google e do Github
- Foi criado um novo mostrador ratemeter, que pode ser usado como medidor de remadas no remo ou medidor de cadência
- Há um emulador baseado em wasm, o que facilita testar no computador, e também é possível executar builds pessoais diretamente em uma página web
Fluxo de mostradores oferecido pelo relógio
- Pressionar o botão MODE uma vez leva ao mostrador de token 2FA
- No mostrador 2FA, o botão ALARM alterna entre os tokens do Google e do Github
- Pressionar o botão MODE novamente leva ao mostrador ratemeter recém-criado
- No ratemeter, pressiona-se o botão ALARM periodicamente para medir a velocidade por minuto do alvo que está sendo acompanhado
- Este build também inclui vários mostradores padrão
- Relógio mundial
- Calculadora de nascer/pôr do sol
- Indicador de fase da lua
- Saída em tempo real do sensor de temperatura interno do relógio
- Seletor de configuração de 24 horas
- Modo de configuração de hora/data
- A árvore de código-fonte do
movementdo Sensor Watch também contém outros mostradores, como pulsometer e orrery - O processo de upgrade do módulo do F-91W está documentado no blog de John Graham-Cumming
Como configurar o mostrador TOTP
- O mostrador TOTP gera uma senha descartável baseada em tempo, usando a hora atual como fonte de unicidade
- Pode ser usado para gerar códigos de autenticação em duas etapas para login em vários sites, como Google e Github
- O botão ALARM alterna entre os sites e os TOTP secrets configurados
- Há suporte a vários sites e secrets, mas é preciso extrair o secret do QR code e inseri-lo diretamente no código-fonte do mostrador
-
Procedimento para adicionar um TOTP secret
- Obtenha o TOTP secret ou QR code no site para o qual deseja gerar códigos
- Se houver apenas o QR code, é possível extrair o secret no site de Stefan Sundin
- O resultado da extração é uma string alfanumérica de cerca de 32 caracteres, que é o TOTP secret codificado em Base32
- Para colocar o secret no código do mostrador, é preciso converter Base32 para bytes hexadecimais em cryptii.com
- O TOTP secret deve ser inserido em letras maiúsculas
- Depois de adicionar os bytes hexadecimais convertidos ao código-fonte do mostrador TOTP, recompile o
movement
-
Pontos de modificação em
totp_face.c- É possível remover a chave de demonstração; para adicionar uma nova chave ao fim da lista, incremente o valor de
num_keysem 1 - Adicione os bytes hexadecimais convertidos ao fim do array
keys[]- Coloque
0xantes de cada byte e separe-os por vírgulas - Também é preciso adicionar uma vírgula após o último byte existente
- Coloque
- No fim do array
key_sizes[], adicione o tamanho do secret inserido, ou seja, a quantidade de bytes hexadecimais recém-adicionados - No fim do array
timesteps[], adicione o item30 - No array
labels[][2], adicione o rótulo a ser exibido- Para uma conta Google, é possível usar um rótulo como
{ 'g', 'o' }
- Para uma conta Google, é possível usar um rótulo como
- É possível remover a chave de demonstração; para adicionar uma nova chave ao fim da lista, incremente o valor de
Implementação do mostrador ratemeter
- O código do mostrador ratemeter está no pull request enviado ao projeto principal
- A maior parte da implementação fica dentro da função de loop principal chamada
ratemeter_face_loop - Essa função trata eventos de entrada dos botões e eventos de tick do relógio
- O mostrador pode solicitar uma periodicidade de ticks para medições de intervalo ou tratamento de animações
- O
movementfornece a função utilitáriawatch_display_string- É uma função que tenta exibir strings alfanuméricas nos elementos limitados de 7+ segmentos do display Casio
- O problema de mapear strings arbitrárias para uma tela limitada, e suas exceções, está organizado na documentação
-
Comportamento por evento
EVENT_ACTIVATE- Quando o mostrador é ativado, exibe
RAna área de indicação do dia da semana
- Quando o mostrador é ativado, exibe
EVENT_MODE_BUTTON_UP- Ao pressionar o botão MODE, avança para o próximo mostrador
EVENT_LIGHT_BUTTON_DOWN- Ao pressionar o botão LIGHT, acende a luz LED
EVENT_ALARM_BUTTON_DOWN- Ao pressionar o botão ALARM, calcula a velocidade por minuto a partir do intervalo entre este acionamento e o anterior
- Inicializa o contador de ticks armazenado no estado do mostrador
- Solicita a periodicidade rápida de ticks com
RATEMETER_FACE_FREQUENCY - Essa constante é definida como 1/16 de segundo
EVENT_TICK- Exibe a velocidade atual no display
- Se a velocidade for 0, exibe apenas
ra - Se for mais rápida que 500/min, exibe
ra Hi - Se for mais lenta que 1/min, exibe
ra Lo - Caso contrário, exibe a velocidade calculada no formato
ra %-3d pn - Por fim, incrementa o contador de ticks
Informações de compra e afiliação
- O Sensor Watch está disponível na Oddly Specific Objects
- Não há relação de afiliação com a Oddly Specific Objects
1 comentários
Comentários no Hacker News
É incômodo inserir o segredo TOTP em uma página web qualquer
No Linux, as ferramentas
base32eodtalvez já estejam instaladas, e no Ubuntu elas vêm no pacotecoreutilsFora isso, o projeto é excelente, mas o design do relógio é meio feio
https://gchq.github.io/CyberChef/
https://i.imgur.com/9MYqLvj.png
Dá para desativar rapidamente XHR para verificar se não há nenhum comportamento inesperado do lado do servidor
Se às vezes você vir um símbolo estranho de ⌍ na demo, isso é um “7 pequeno”
Isso acontece porque este relógio liga em conjunto os segmentos superior e inferior do primeiro e do terceiro dígito, ou seja, os segmentos A e D
https://joeycastillo.github.io/Sensor-Watch-Documentation/wi...
É realmente impressionante o quanto de eficiência colocaram nesse display
No uso normal, essas posições só precisam mostrar de 0 a 5, e o primeiro dígito em um relógio só precisa de 0, 1 e 2, mas o cronômetro vai até 59:59.99
Esses dígitos não precisam distinguir os segmentos A e D, e em teoria não haveria problema se o cronômetro fosse até 69:59.99, mas aparentemente acharam que “uma hora” já era suficiente
Os números 8 e 9 também acendem os segmentos de cima e de baixo, então na prática o único problema é o 7
Finalmente apareceu um conteúdo que me faz vir ao HN
O F-91W provavelmente tem o mesmo formato do A158W[1], e o A158W é um relógio absurdamente bonito pelo preço
Combina com tudo, é estiloso sem chamar atenção, então acabo usando mais do que relógios mais caros
Se você estiver preocupado com a pulseira de metal puxar os pelos do braço, isso só aconteceu umas duas vezes em um ano, bem menos do que em outras pulseiras metálicas baratas
Se quiser uma alternativa mais “smoky”, o A168WGG[2] tem uma tonalidade cinza gunmetal na pulseira, o mostrador é escurecido, e o illuminator ilumina só as letras
Mas o A168 é só um pouquinho maior que o A158, então não sei se o mesmo módulo interno encaixa igual; por outro lado, sendo maior, talvez até haja mais espaço
Já que estamos falando de relógios, para trabalho eu uso um GA-B2100-1AJF[3] com pulseira preta
Para um G-Shock, ele é bem estiloso e tem muitos recursos mesmo sem ser um smartwatch
O modelo com Bluetooth tem cores e contraste tonal melhores no mostrador do que os modelos mais baratos, então é mais fácil combinar com a roupa
[1] https://www.amazon.com/Casio-A158WA-1-Water-Resistant-Digita... [2] https://www.amazon.com/dp/B08195YQLQ/ [3] https://www.amazon.com/dp/B09YG8F41Y/
A placa Sensor Watch precisa de peças doadas de um módulo Casio 593 original
Você pode ver a lista de relógios compatíveis aqui
https://www.sensorwatch.net/docs/
Relógios que não funcionam mesmo com a mesma disposição de 3 botões, porque usam outro movimento: A168W, A700W, LA680W, B650W
Em geral, se for um Casio digital de 3 botões e tiver uma boa luz de fundo “illuminator” em vez de iluminação lateral, então não é um 593 e não vai funcionar
Eu realmente adoro este projeto e literalmente uso todo dia
Há pouco tempo implementei uma nova interface para definir códigos TOTP direto no código-fonte, então por causa disso a explicação deste post já não está mais correta
Agora funciona assim
static totp_t credentials[] = {CREDENTIAL(2F, "JBSWY3DPEHPK3PXP", SHA1, 30),CREDENTIAL(AC, "JBSWY3DPEHPK3PXP", SHA1, 30),};https://github.com/joeycastillo/Sensor-Watch/blob/main/movem...
Também adicionei calibração do usuário para que o medidor de pulso possa ser usado como medidor de frequência respiratória para asma, e isso já ajudou a salvar vidas
Há também calibração e compensação de temperatura, o que melhora a precisão do relógio para algo em torno de 10 segundos por ano
A comunidade está crescendo, e muita gente entrou para hackear o firmware
Recentemente alguém até fez um jogo de corrida infinita para este relógio
https://github.com/joeycastillo/Sensor-Watch/pull/419
Os mantenedores também são pessoas realmente ótimas
Se você está procurando um excelente projeto open source em que valha a pena investir tempo, este é perfeito
Não consegui encontrar isso na documentação
Se for preciso recompilar e regravar o relógio de pulso, o uso de TOTP parece ficar bem limitado
Muito legal
Sempre quis que alguém fizesse algo assim também para os relógios calculadora da Casio
https://www.casio-intl.com/asia/en/calc/products/SL-760LC-BK...
Seria ótimo se isso também funcionasse com tokens SecurID
Muito interessante
Eu trabalho na Nixon e adoraria tentar algo assim também em um relógio digital da Nixon; se o autor quiser escrever um post parecido, talvez eu consiga arranjar alguns relógios grátis
Por que eu não consigo usar isso no meu smartwatch mais inteligente?
Dá vontade de voltar para os antigos Casio
https://github.com/ch1bo/garmin-otp-authenticator
Isso é realmente bom, e eu já pensei em fazer algo parecido com um smartwatch burro, mas do ponto de vista de segurança operacional, fico em dúvida se é ok deixar o TOTP tão visível e de acesso tão fácil assim
O que acontece se você perder o relógio ou ele for roubado?
Eu coloco rótulos para não ficar óbvio de qual serviço se trata
O Pebble praticamente não tem trava nem segurança, mas no fim das contas isso é só o segundo fator de autenticação
Se alguém já souber a minha senha aleatória gerada, tiver investigado a ponto de descobrir que eu posso ter TOTP no pulso, e ainda conseguir roubar meu relógio, então eu já perdi de qualquer forma, e acho que esse risco vale a conveniência