[PoC] "Mouse logger" que funciona no Wayland

O plano de ataque

O Linux lista todos os dispositivos do computador em um device, ou seja em um arquivo em /dev então teoricamente tudo que a gente precisa fazer é ler o dispositivo do mouse e traduzir em algo legível, o mouse é representado por /dev/input/mice

Curiosidade: É o mesmo que rato em inglês

Lendo o mouse

Você deve ter imaginado que seria basicamente:

cat /dev/input/mice

E de fato é isso mesmo, mas dá esse erro:

cat: /dev/input/mice: Permissão negada

Isso acontece porque o usuário comum não pode ler os devices diretamente inclusive o mouse,vamos tentar com root:

sudo cat /dev/input/mice

Mexa o mouse, agora deve ter aparecido um monte de linhas tipo assim:

(�(�8��8��8��8��8��8��8��8��8��

8��8��8��8��8��8��8��8��8��8��8��8��8��8��8��8�
�8��8��8��8��8��8��8��8��8��8��8��8��8��8��8��8��8��8��8��   

Se ocorreu isso, vitória!

Decodificando

Ok, lemos o mouse mas isso é ilegível, como deixar isso visível a humanos? Isso pode ser encontrado na resposta desse post vou apenas colocar ele em português:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char** argv) {
    int fd, bytes;
    unsigned char dados_do_mouse[3];

    const char *dispositivo = "/dev/input/mice";

    // Abre o mouse para leitura
    fd = open(dispositivo, O_RDWR);
    if(fd == -1) {
        printf("Execute como root por favor\n");
        return -1;
    }

    int botao_esquerdo, botao_do_meio, botao_direito;
    signed char x, y;
    
    // Lê o mouse
    while(1) {
        bytes = read(fd, dados_do_mouse, sizeof(dados_do_mouse));

        // Traduz as informações
        if(bytes > 0) {
            botao_esquerdo = dados_do_mouse[0] & 0x1;
            botao_direito = dados_do_mouse[0] & 0x2;
            botao_do_meio = dados_do_mouse[0] & 0x4;

            x = dados_do_mouse[1];
            y = dados_do_mouse[2];
            printf("movendo %d pixels horizontalmente | movendo %d pixels verticalmente | botão esquerdo = %d | botão do meio = %d | botão direito = %d\n", x, y, botao_esquerdo, botao_do_meio, botao_direito);
        }   
    }
    return 0; 
}

Compile com:

gcc mouse-logger.c -o mouse-logger

Agora executando:

sudo ./mouse-logger

Agora a saída deve ser parecida com:

movendo 1 pixels horizontalmente | movendo 2 pixels verticalmente | botão esquerdo = 0 | botão do meio = 0 | botão direito = 0
movendo 1 pixels horizontalmente | movendo 2 pixels verticalmente | botão esquerdo = 0 | botão do meio = 0 | botão direito = 0
movendo 0 pixels horizontalmente | movendo 0 pixels verticalmente | botão esquerdo = 1 | botão do meio = 0 | botão direito = 0
movendo 0 pixels horizontalmente | movendo 0 pixels verticalmente | botão esquerdo = 0 | botão do meio = 0 | botão direito = 0
movendo 0 pixels horizontalmente | movendo 1 pixels verticalmente | botão esquerdo = 0 | botão do meio = 0 | botão direito = 0
movendo 1 pixels horizontalmente | movendo 1 pixels verticalmente | botão esquerdo = 0 | botão do meio = 0 | botão direito = 0
movendo 0 pixels horizontalmente | movendo 1 pixels verticalmente | botão esquerdo = 0 | botão do meio = 0 | botão direito = 0

Bom, é isso, só queria mostrar essa PoC

1 Curtida

Até onde eu sei, isso ainda é menos pior que o Xorg, já que precisa de acesso root para esse keylogger funcionar. E o invasor já ter root é, como dizem, perdeu playboy

A diferença prática do X pro Wayland é basicamente:

  • Precisar de acesso root
  • Não acessar (por esse meio) as coordenadas
    De resto é igual, poderia programar ações de acordo com o número de cliques ou ações por exemplo