dCTF 2021: Discord PingPong
Investigando um binário Go de bot do Discord e recuperando o caminho até a flag do desafio.
Writeup original do desafio: Discord PingPong.md
Esse foi chato de configurar.
Ao executar o binário, ele imprimia:
Successfully connected to Discord API
Last message in #general is: Welcome to our secret server! Only trusted bots and users have access to the secret channels. Our secret plans have been moved from here to a secret channel.
Bot is now running. Press CTRL-C to exit.
Enviar qualquer coisa pelo stdin não parecia fazer nada.
Rodar file no binário mostrou:
discordbot: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=_ZEAdEO-wvSQGBQYhkGM/xFUNbqa5yDNs4HrN4WQF/IfIgpWbUNMnt11lPcn7W/sNa0sC3hsaXC9dymZEeD, not stripped
Então, Go.
Uma busca rápida por um bot de Discord em Go me levou ao discordgo:
https://github.com/bwmarrin/discordgo
Esse repositório tem um exemplo de ping-pong:
https://github.com/bwmarrin/discordgo/blob/master/examples/pingpong/main.go
Ele também correspondia a esta string do binário:
Bot is now running. Press CTRL-C to exit.
Isso foi útil para identificar o que eu estava olhando, mas não ajudou muito além disso. Argumentos passados ao bot eram ignorados.
Solução esperada
A solução esperada aparentemente era muito mais simples: rodar strings no arquivo discordbot, extrair o token da API do Discord, entrar ou consultar o servidor secreto do Discord e pegar a flag no canal secreto.
Como resolvi
Eu já tinha tentado strings, mas a saída era enorme e filtrar tudo manualmente teria sido doloroso.
Eu sabia que a biblioteca net/http do Go respeita variáveis de ambiente de proxy por padrão. Então abri o Burp, configurei as variáveis de ambiente de proxy HTTP e HTTPS no terminal para 127.0.0.1:8080, e adicionei o certificado CA do Burp Suite em /usr/local/share/ca-certificates.
Links úteis:
- How do you add a certificate authority CA to Ubuntu?
- How to program Go to use a proxy when using a custom transport
Depois disso, as requisições do bot apareceram no Burp. A partir daí, pude rodar o discordbot, pegar o token e recuperar a flag de um dos canais usando a API do Discord.
Não tirei screenshots, e configurar tudo de novo era trabalhoso o suficiente para eu deixar por aí.