fbpx

PHP-FPM + Nginx – Remote Code Execution

 

PHP-FPM + Nginx – Remote Code Execution

# PHuiP-FPizdaM

## O que é isso

Esta é uma exploração de um bug no php-fpm (CVE-2019-11043). Em certas configurações nginx + php-fpm, é possível disparar o bug a partir do exterior. Isso significa que um usuário da web pode obter execução de código se você tiver uma configuração vulnerável (consulte [abaixo] (# a lista completa de pré-condições)).

## O que é vulnerável

Se um servidor da web executar nginx + php-fpm e o nginx tiver uma configuração como

“ “
local ~ [^ /] \. php (/ | $) {

fastcgi_split_path_info ^ (. +? \. php) (/.*) $;
fastcgi_param PATH_INFO $ fastcgi_path_info;
fastcgi_pass php: 9000;

}
“ “

que também não possui nenhuma verificação de existência de script (como `try_files`), provavelmente você pode hacká-lo com este sploit.

#### A lista completa de pré-condições
1. Nginx + php-fpm, `localização ~ [^ /] \. Php (/ | $)` deve ser encaminhado para php-fpm (talvez o regexp possa ser mais rígido, consulte [# 1] (https: // github .com / neex / phuip-fpizdam / Issues / 1)).
2. A diretiva `fastcgi_split_path_info` deve estar lá e conter um regexp começando com` ^ `e terminando com` $ `, para que possamos quebrá-lo com um caractere de nova linha.
3. Deve haver uma atribuição de variável `PATH_INFO` através da instrução` fastcgi_param PATH_INFO $ fastcgi_path_info; `. Inicialmente, pensamos que ele está sempre presente no arquivo `fastcgi_params`, mas não é verdade.
4. Nenhuma existência de arquivo verifica como `try_files $ uri = 404` ou` if (-f $ uri) `. Se o Nginx descarta solicitações para scripts não existentes antes do encaminhamento do FastCGI, nossas solicitações nunca chegam ao php-fpm. Adicionar isso também é a maneira mais fácil de corrigir.
5. Essa exploração funciona apenas para o PHP 7+, mas o bug em si está presente nas versões anteriores (veja [abaixo] (# about-php5)).

## Isso não é conhecido por ser vulnerável por anos?

Há muito tempo, o php-fpm não restringia as extensões dos scripts, o que significa que algo como `/ avatar.png / some-fake-shit.php` poderia executar o` avatar.png` como um script PHP. Esse problema foi corrigido por volta de 2010.

O atual não requer upload de arquivo, funciona nas versões mais recentes (até a correção chegar) e, o mais importante, a exploração é muito mais interessante.

## Como executar

Instale-o usando
“ “
acesse github.com/neex/phuip-fpizdam
“ “

Se você receber erros estranhos de compilação, verifique se está usando go> = 1.13. Execute o programa usando `phuip-fpizdam [url]` (assumindo que você tenha o `$ GOPATH / bin` dentro do seu` $ PATH`, caso contrário, especifique o caminho completo para o binário). Uma boa saída é assim:

“ “
2019/10/01 02:46:15 O código de status base é 200
2019/10/01 02:46:15 Código de status 500 para qsl = 1745, adicionando como candidato
2019/10/01 02:46:15 O alvo é provavelmente vulnerável. QSLs possíveis: [1735 1740 1745]
2019/10/01 02:46:16 Parâmetros de ataque encontrados: –qsl 1735 –pisos 126 –skip-detect
2019/10/01 02:46:16 Tentando definir “session.auto_start = 0” …
2019/10/01 02:46:16 Detect () retornou parâmetros de ataque: –qsl 1735 –pisos 126 –skip-detect <- REMEMBER THIS
2019/10/01 02:46:16 Realizando ataque usando as configurações do php.ini …
2019/10/01 02:46:40 Sucesso! Conseguiu executar um comando anexando “? A = / bin / sh + -c + ‘which + what’ &” aos URLs
2019/10/01 02:46:40 Tentando limpar / tmp / a …
2019/10/01 02:46:40 Feito!
“ “

Depois disso, você pode começar a anexar `? A = <seu comando>` a todos os scripts PHP (você pode precisar de várias tentativas).

## Ambiente de recreio

Se você deseja reproduzir o problema ou brincar com a exploração localmente, faça o seguinte:

1. Clone este repositório e vá para o diretório `reprodutor`.
2. Crie a imagem do docker usando `docker build -t reproduce-cve-2019-11043 .`. Demora muito tempo, pois clona internamente o repositório php e o constrói a partir da fonte. No entanto, será mais fácil dessa maneira se você desejar depurar a exploração. A revisão criada é a logo antes da correção.
2. Execute a janela de encaixe usando `docker run –rm -ti -p 8080: 80 reproduce-cve-2019-11043`.
3. Agora você tem http://127.0.0.1:8080/script.php, que é um arquivo vazio.
4. Execute a exploração usando `phuip-fpizdam http: //127.0.0.1: 8080 / script.php`
5. Se estiver tudo bem, você poderá executar comandos anexando `? A =` ao script: http://127.0.0.1:8080/script.php?a=id. Tente várias vezes, pois apenas alguns funcionários do php-fpm estão infectados.

## Sobre o PHP5

O buffer underflow no php-fpm está presente no PHP versão 5. No entanto, essa exploração utiliza uma otimização usada para armazenar variáveis ​​FastCGI, [_fcgi_data_seg] (https://github.com/php/php-src/blob/5d6e923 /main/fastcgi.c#L186). Essa otimização está presente apenas no php 7, portanto, essa exploração específica funciona apenas para o php 7. Pode haver outra técnica de exploração que funcione no php 5.

## Créditos

Anomalia original descoberta por [d90pwn] (https://twitter.com/d90pwn) durante o CTF do mundo real. Cláusula raiz encontrada por mim (Emil Lerner), bem como a maneira de definir as opções do php.ini. O conjunto final de opções do php.ini é encontrado por [beched] (https://twitter.com/ahack_ru).

Nota do EDB: Faça o download ~ https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/47553.zip

11 de novembro de 2019

Sobre nós

A Linux Force Brasil é uma empresa que ama a arte de ensinar. Nossa missão é criar talentos para a área de tecnologia e atender com excelência nossos clientes.

CNPJ: 13.299.207/0001-50
SAC:         0800 721 7901

[email protected]

Comercial  Comercial: (11) 3796-5900

Suporte:    (11) 3796-5900
[email protected]

Copyright © Linux Force Security  - Desde 2011.