- git
- docker
- docker-compose
git clone https://github.com/xikaos/otp-app-js
cd otp-app-js
docker-compose up
docker-compose exec app npm install
docker-compose exec app npm run serve
- Abra outro terminal no mesmo diretório, digite
docker-compose exec app node app.js
- Acesse localhost no navegador na porta 80
O objetivo da aplicação é demonstrar na prática o OTP e demonstrar possíveis ataques contra sua arquitetura e implementação.
Através de uma aplicação web que irá agir como um gerador na arquitetura do OTP, o usuário poderá validar se o seu OTP gerado corresponde com o OTP gerado no servidor com a senha correspondente. A idéia é permitir que o usuário selecione a implementação desejada; TOTP ou HOTP; insira sua senha e submeta a requisição. Também é necessário que as variáveis do servidor (janela de tempo, contador e última senha válida) sejam exibidas para o cliente por questões de demonstração.
Para que o navegador possa agir como um gerador, é necessário que uma biblioteca Javascript disponibilize essas funções, tanto para o TOTP quanto para HOTP. A biblioteca utilizada foi a lepture/otpauth.
Em relação a interface gráfica, para a geração, serão necessários:
- Input de texto para a senha do usuário
- Select do algorítmo desejado
- Botão de geração de eventos (para o HOTP)
- Botão de submissão
Para exibição das variáveis do servidor, será necessário:
- Contador (HOTP)
- Contador Janela de Tempo (TOTP)
- Última senha válida (ambos)
Para permitir a autenticação, alguns endpoints serão necessários. Eles podem ser divididos entre endpoints de geração e endpoints de validação.
Para permitir a obtenção dos parâmetros do servidor, é necessário que dois endpoints existam, sendo eles:
GET /api/hotp/params
- Busca o contador no servidor.GET /api/totp/params
- Busca a janela de tempo no servidor.
Através destes endpoints, o código Javascript poderá exibir os parâmetros da implementação OTP utilizada. Ambos os endpoints irão retornar a última senha OTP válidada.
Para efetivamente autenticar o usuário, os seguintes endpoints são necessários:
POST /api/hotp/validate
- Através do parâmetroemail
enviado em formato JSON, o servidor localiza opassword
correspondente (localizado em app.js) e computa o OTP. Esse OTP então é comparado com o OTP calculado localmente pelo usuário, retornando se este é válido ou não.POST /api/totp/auth
- Exatamente a mesma coisa que o endpoint anterior.
Caso o usuário tenha enviado a senha correta, os endpoints irão retornar código 200 e caso contrário, irão retornar código 401.
É necessário que alguns ataques sejam realizados de forma a demonstrar vulnerabilidades da arquitetura do sistema OTP e de suas implementações. Eles podem ser divididos entre essas duas categorias, respectivamente:
Elaborar um cenário de bruteforce. É improvável que na demonstração feita durante a aprensentação isso seja viável, de forma que os ataques serão mais focados na implementação.
Alguns cenários envolvendo a implementação do gerador OTP no cliente e no servidor podem ser explorados.
- Inclusão deu um arquivo Javascript malicioso que implanta um keylogger no input de passphrase.
- Acesso as variáveis de geração do OTP através da extensão de debug do Vue.
- Encontrar mais umas duas ou três.
- DOS.
- Comprometimento do servidor e debug das variáveis.
- Mais um tá tri.