
Shellshock
Shellshock
Baixe os arquivos docker-compose.yml e poc.py Certifique-se de instalar a biblioteca requests via pip install requests !!! Para quem usa uv, coloque a biblioteca requests dentro do venv usando uv!!!
| Descrição Oficial da CVE |
|---|
| Nas versões do GNU Bash anteriores à 4.3, havia um problema no processamento de strings após definições de funções em valores de variáveis de ambiente. Usando esta vulnerabilidade, um atacante remoto poderia executar código arbitrário através de um ambiente manipulado. Esta vulnerabilidade foi encontrada na funcionalidade ForceCommand do OpenSSH sshd, nos módulos mod_cgi e mod_cgid do servidor HTTP Apache, em scripts executados por clientes DHCP não especificados, e em várias situações onde a execução do Bash e a definição de variáveis de ambiente ocorrem através de limites de privilégios diferentes. Também é conhecida como "ShellShock". Nota: A correção inicial para este problema estava incorreta, e o CVE-2014-7169 foi designado para resolver a vulnerabilidade que ainda persistia mesmo após a correção incorreta. |

| Configuração do Ambiente |
|---|
Configuração do Dockerfile
| SO | servidor web | versão bash |
|---|---|---|
| Debian 10 | Apach | 4.2.37(1) |

O Dockerfile foi escrito para manter o servidor web em execução ao executar o comando docker compose up.
Como o SO, Apache, etc. do Dockerfile foram baixados de repositórios externos, foi colocado uma tag na imagem construída, enviada para o Docker Hub, e essa imagem foi especificada no arquivo docker-compose.yml para garantir que não haja problemas mesmo se a origem for deletada.

| Condição de Vulnerabilidade |
|---|
É necessário um shell Bash que possua a vulnerabilidade Shellshock. Eu baixei e usei a versão bash 4.2.37(1).

Além disso, como o código precisa ser registrado em uma variável de ambiente e então o bash deve ser invocado para executar o código, deve existir um programa que possa invocar o bash. Baixei o programa CGI que era usado para processar requisições dos clientes no servidor web. De acordo com a especificação CGI (RFC 3875), o servidor web é projetado para colocar todas as informações de cabeçalho enviadas pelo navegador em variáveis de ambiente do Linux para processamento.
Sob essa condição, o servidor web envia a requisição e as informações do cabeçalho são armazenadas em variáveis de ambiente (de acordo com a especificação CGI). O ataque é completado quando o CGI invoca o shell Bash que possui a vulnerabilidade de executar strings após definições de funções em variáveis de ambiente.
Requisição (enviar código embutido no cabeçalho User-Agent) -> CGI invoca bash -> Conexão reverse shell
| Procedimento de Reprodução |
|---|

| Resultado |
|---|
O terminal que estava escutando no passo 2 do procedimento de reprodução se conecta ao shell bash dentro do contêiner, permitindo executar comandos como whoami, id, etc.

| Causa da Vulnerabilidade |
|---|
'''
if (privmode == 0 && read_but_dont_execute == 0 && STREQN ("() {", string, 4))
{
string_length = strlen (string);
temp_string = (char *)xmalloc (3 + string_length + char_index);
strcpy (temp_string, name);
temp_string[char_index] = ' ';
strcpy (temp_string + char_index + 1, string);
parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST);
// 이하 생략
'''
A causa da vulnerabilidade está na função initialize_shell_variables no arquivo variables.c do código do shell bash. Essa função é muito longa, então apenas a parte essencial foi cortada.
'''
if (privmode == 0 && read_but_dont_execute == 0 && STREQN ("() {", string, 4))
'''
O if acima verifica se os primeiros 4 caracteres são "() {" usando STREQN ("() {", string, 4). Se coincidir, é tratado como uma função. Surpreendentemente, não há filtragem adicional na string, o que causou o problema.
'''
strcpy (temp_string, name);
temp_string[char_index] = ' ';
strcpy (temp_string + char_index + 1, string);
''' O código acima é o processo de combinar nome e valor. Como string foi verificada acima, ela começa com "() {" e name é o nome da variável de ambiente.
Assim, o nome e o valor da variável de ambiente são combinados e passados para o código abaixo para análise. Como o filtro só verificava "() {" acima, comandos como whoami, id, pwd podem ser adicionados após a função e serão todos executados.
'''
parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST);
'''
| Medidas de Mitigação |
|---|
| Atualize o Bash para uma versão segura contra a vulnerabilidade Shellshock. |
| Não utilize programas que invocam o shell Bash. |