Не так давно я обнаружил на некоторых своих сайтах wordpress внедренный во все PHP файлы eval код.
Касперский на все скрипты с таким кодом ругался и пытался их удалить. Обозначалась зараза так: Backdoor.PHP.Pioneer.a, или так: heur:Trojan.Script.Generic
Само заражение представляет собой внедрение в произвольные участки PHP скрипта сразу несколько одинаковых строк такого содержания (сокращенно):
1 |
eval(base64_decode("DQplcnJvcl9...многосимволов...n0KfQ0KfQ==")); |
Для очистки этой заразы из всех файлов на UNIX системе, был написан такой скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
<?php /** * Clear Backdoor.PHP.Pioneer.a and heur:Trojan.Script.Generic code * @version 1 (20.07.2013) * @author Roman Dmitrienko <dr-lines@yandex.ru> */ /** * Get infected files, exclude svn dirs * @return array files */ function uscanDir() { $cmd = 'grep -rl --exclude-dir=".svn" \'DQplc'.'nJvcl9\' ./*'; ob_start(); passthru($cmd.' 2>&1'); $q = ob_get_contents(); ob_clean(); $q = explode("\n", $q); array_walk($q, create_function('&$v', '$v = trim($v);')); $q = array_filter($q); return $q; } /** * Clear infected file * @param type $filename Infected file path * @return boolean clear status */ function clearFile($filename) { $ret = false; if(is_file($filename) AND is_writable($filename)) { $src = file_get_contents($filename); $part_start = preg_quote('eval(base64'.'_decode("DQ'.'plcnJv'); $part_end = preg_quote('n0KfQ'.'0KfQ=="));'); $src = preg_replace("~{$part_start}.*?{$part_end}~siu", "", $src); // PHP файл не может содержать меньше 2х символов if(strlen($src) > 2) { $f = fopen($filename, 'w+'); fwrite($f, $src); fclose($f); $ret = true; } } return $ret; } $scan = uscanDir(); ?> Заражено: <?=count($scan)?> файлов <? if(!isset($_GET['clear'])) { echo '<pre>'.print_r($scan, true).'</pre>'; ?> <div> <a href="?clear">Clear code</a> </div> <? } else { // Очистка if(is_array($scan) AND count($scan)) { ?> <table cellpadding="2" cellspacing="2" border="1"> <tr> <th>Файл</th> <th>Размер до</th> <th>Размер после</th> <th>Статус</th> </tr> <? foreach($scan AS $file) { $before = filesize($file); $act = clearFile($file); $after = filesize($file); ?> <tr> <td><?=$file?></td> <td><?=$before?></td> <td><?=$after?></td> <td><?=($act ? 'Ok' : 'No processed')?></td> </tr> <? } ?> </table> <? } } |
Просмотров : 9759
Thanks ! Saved me time ! Good job.
Это все конечно хорошо, но как найти и уничтожить сам shell, который раз в неделю на автомате заражает все сайты на Joomla? Обновлять Joomla клиент не хочет, приходится ручками удалять зараженное и восстанавливать из архива очищенное. Понятно, что версия Joomla с уязвимостью, но вот как найти тот самый троян, который запускает shell, который в свою очередь исполняет скрипт с декодированием страниц php при помощи трояна Рioneer.a? Бьюсь уже пол-года – так и не решил, но ясно одно, это не делают ручками, эта зараза происходит автоматом раз в неделю с завидной регулярностью. Есть решения?
На какой ОС стоит Joomla?
Ну это должно быть понятно, на FreeBSD конечно, версию не скажу…