Старый 09.07.2010, 21:46   #1
Grey
 
Аватар для Grey
 
Регистрация: 30.06.2010
Сообщений: 38
По умолчанию Идеальный шелл (часть 1)

Идеальный шелл (часть 1)

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

Критичных требований к шеллу можно выделить только два, а именно:

1. Максимальная работоспособность.

Тут можно выделить три подпункта:

a) Минимальная зависимость конструкций языка, используемых в шелле, от версии интерпретатора и других условий.

Одно дело, сильные ограничения в системе, не позволяющие использовать все функции шелла, другое - ограничения из-за неразумного использования конструкций.
Пример такой конструкции:

PHP код:
foreach ($_GET as &$value) {
    
$value stripslashes($value);

Назначение конструкции - удаление экранирования некоторых символов при magic_quotes_gpc = On.
Неуместность такой конструкции для шелла очевидна - использование "&" для сохранения значения переменной доступно начиная только с 5 версии php.

Примером "других условий" может послужить вариант запуска php как cgi, при котором скрипту не передаются необходимые для авторизации переменные.
А значит делать авторизацию нужно c использованием куков, а не через header().

Менее критичной ошибкой может послужить не правильное построение пути директории для просмотра.
Варианта два: /var/www/site.ru/ и /var/www/site.ru. Первый вариант предпочтительнее, т.к. при open_basedir = /var/www/site.ru/ обратиться к директории по адресу /var/www/site.ru будет невозможным.

b) Максимальное количество аналогичных функций.

Чем больше ограничения в системе, тем больше нужно вариантов их обойти. Речь идет не сколько об обходе safe_mode и open_basedir, а о примитивном отключение каких либо функций (system(), exec() и т.д.)
Как показала практика отключение некоторых функций, отвечающих за определение параметров системы может не только свести работу шелла на нет, но и значительным образом затруднить работу с шеллом.
К примеру отключение функции scandir полностью лишает шелл "wso" версии 2.4 работоспособности.

Из того что может быть полезным - для определения параметров системы, нашел 3 функции (ini_get, ini_get_all, get_cfg_var):

PHP код:
if(@function_exists("ini_get")) {
    function 
my_ini_get($option) {
        return 
ini_get($option);
    }
} elseif(@
function_exists("ini_get_all")) {
    function 
my_ini_get($option) {
        
$array ini_get_all();
        return 
$array[$option]["local_value"];
    }
} elseif(@
function_exists("get_cfg_var")) {
    function 
my_ini_get($option) {
        return 
get_cfg_var($option);
    }
} else {
    function 
my_ini_get($option) {
        return 
"???";
    }

c) Минимальная зависимость определения параметров системы от числа переменных и функций.

Речь идет о излишних проверках перед использованием какой либо функции, к примеру:

PHP код:
if(@function_exists("system") && $safe_mode == "off") {
    
system($exec);

Будем считать что значение переменной $safe_mode определяется до использования этой конструкции.
Но не важно насколько качественно определяется параметр safe_mode - его не правильное определение (к примеру заблокированы все возможные функции для определения значения параметров) не даст возможность выполнять команды и тем самым сократит функциональность шелла.

Для определения возможности использования какой либо функции, лучше ограничиться проверкой с помощью какой то одной функции (причем функция не должна зависеть от версии php, а вероятность отключения этой функции должна быть минимальна).
Я остановился на function_exists: доступна начиная с 4 версии php, её отключение крайне мало вероятно т.к. она применяется в очень большом количестве различных cms. Кстати возвращать false она будет не только в случае более ранней версии php, чем требует проверяемая функция, но и в случае если функция была отключена принудительно.
Кстати сказать в случаях когда отключены все функции через которые можно было бы определить параметры системы, для хоть какого то ориентирования в среде, можно использовать function_exists:

PHP код:
$function_names = array("system""exec", .......); // Как можно больший список имён функций

function my_existing_functions() {
global 
$function_names;
    echo(
"<table width='100%'>");
    foreach(
$function_names as $function_name) {
        echo(
"<tr><td>{$function_name}</td><td>"); if(@!function_exists($function_name)) { echo("no "); } echo("exists"); echo("</td></tr>");
    }
    echo(
"</table>");

Следует упомянуть, что использование функции function_exists допустимо только для определения доступности какой либо функции для вызова, а вот определять параметры системы через неё не корректно. Пример такой ошибки - утверждение о Safe_mode = On при недоступности функций для выполнения команд (system, exec и т.д.). Дело в том, что проверяемые функции могут быть просто отключены, а сам по себе Safe_mode = Off, таким образом будет выведена не точная информация, что так же не допустимо - шелл должен выводить только достоверные данные, а не вводить в заблуждение.

2. Минимальное количество оставляемых следов.

Тут можно выделить 2 подпункта:

a) Записи в логах.

Здесь главным является предотвращение возникновения ошибок, т.к. логи ошибок просматриваются в первую очередь в отличие от на порядки больших по объёму логах с посещениями.
При правильной настройки системы логи с ошибками имеют минимальный размер и в полне возможно что ошибки с залитого шелла будут единственными, а это гарантия спалить шелл.

Далее... Достаточное весомое замечание, сделанное BlackSun - не оправданное использование метода передачи данных POST.
Пример простой - шелл замаскированный под картинку. Запись в логах с обращением к картинки методом POST не может не вызвать подозрений.
С другой стороны предавать данные методом GET ещё более не разумно - по логам можно будет спалить не только шелл, но и действия которые на нем выполнялись.
Помимо замечания, BlackSun предложил и выход, а именно передача данных через cookie, с пример такой реализации можно ознакомиться в теме:

https://rdot.org/forum/showthread.php?t=65

Очень советую ознакомиться с заметкой от .Slip (она так же поможет не наследить в логах):

https://rdot.org/forum/showthread.php?p=2170

Нельзя не упомянуть и про функцию phpinfo() - она оставляет характерные записи в логах:

Код:
127.0.0.1 - - [09/Jul/2010:22:51:35 +0400] "GET /1/test.php HTTP/1.1" 200 52278
127.0.0.1 - - [09/Jul/2010:22:51:36 +0400] "GET /1/test.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2524
127.0.0.1 - - [09/Jul/2010:22:51:36 +0400] "GET /1/test.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2146
Решение проблемы предложил che:

PHP код:
function ob_phpinfo(){
    
ob_start();
    
ob_implicit_flush (0);
    
phpinfo();
    
$info=ob_get_contents();
    
ob_end_clean();
    
$info=preg_replace('#<img border="0" src="(.*?)" \/>#si','',$info);
    print(
$info);

Кстати, как аналог phpinfo() можно сделать самописную функцию, работающую через функции (ini_get, ini_get_all, get_cfg_var) и другие функции для определения других параметров системы (версии php и т.д.). Не следует забывать и о выводе массивов $_SERVER и $_ENV - они несут в себе много ценной информации.

Примеры таких аналогов:

https://rdot.org/forum/showthread.php?p=2249

b) Следы в директории с шеллом.

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

© Grey
thanks: che, oRb, BlackSun

Последний раз редактировалось Grey; 25.07.2011 в 11:47..
Grey вне форума   Ответить с цитированием
Старый 09.07.2010, 22:42   #2
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию

Цитата:
К примеру отключение функции scandir полностью лишает шелл "wso" работоспособности.
аналог:

PHP код:
if(!function_exists('scandir')){
   function 
scandir($d ,$s=0){
      
$dh opendir($d);
      while (
false !== ($f readdir($dh)))
      
$fs[] = $f;
      
$s?sort($fs):rsort($fs);
      return 
$fs;
   }

Pashkela вне форума   Ответить с цитированием
Старый 09.07.2010, 23:24   #3
che
 
Аватар для che
 
Регистрация: 05.07.2010
Сообщений: 145
Репутация: 166
По умолчанию

была идея сделать модульный шелл

1. основа шелла (на основе wso или r57), с минимальным функционалом ( листинг, аплоад, редактирование)
2. указываем шеллу где лежат модули (http://mysite.com/shell/modules/)
3. загружаем нужный модуль, чтобы его постоянно не качать сохраняем в папку tmp маскируем под файл сессии
4. работаем с нужным модулем

плюсы
основа шелла будет минимально весить
лубой знающий пхп может накодить свой модуль и без геморроя встроить его

минусы
задолбаешся реализовывать
che вне форума   Ответить с цитированием
Старый 09.07.2010, 23:33   #4
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию

che, да и работать он будет далеко не везде. url_fopen off и всё, приехали.
Qwazar вне форума   Ответить с цитированием
Старый 09.07.2010, 23:47   #5
che
 
Аватар для che
 
Регистрация: 05.07.2010
Сообщений: 145
Репутация: 166
По умолчанию

а чё мешает через курл, сокеты
che вне форума   Ответить с цитированием
Старый 10.07.2010, 01:06   #6
nikp
Banned
 
Регистрация: 05.07.2010
Сообщений: 201
Репутация: 183
По умолчанию

Скрипт не должен показывать в теле подозрительные сигнатуры, типа:
password=md5
eval(base64_decode

Не использовать сессию, остаются следы работы.

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

- второй основной, комфортно выполняет наиболее востребованные операции.

- третий специализированный, например, заточенный на работу с различными БД.

Внешний вид не должен быть "хакерским", чтобы не привлекать внимание, если работаешь, например в офисе.

Последний раз редактировалось nikp; 10.07.2010 в 21:18..
nikp вне форума   Ответить с цитированием
Старый 10.07.2010, 22:49   #7
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию

Цитата:
Сообщение от che Посмотреть сообщение
а чё мешает через курл, сокеты
А так же запросами через некоторые субд с определёнными правами, или при чтении из сессий Да, конечно, но такой лоадер будет весить не меньше шелла без лоадера, но с нужным функционалом.
Qwazar вне форума   Ответить с цитированием
Старый 11.07.2010, 00:41   #8
Jokester
 
Аватар для Jokester
 
Регистрация: 01.07.2010
Сообщений: 250
Репутация: 155
По умолчанию

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

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

Заливаем -> Сливаем базу\бекконект\бинд\рип -> протрояниваемся\протачива мся(если рут не вышел и доступ нужен) -> убиваем шелл


Ну и исходя из этого функционал и беспалевность.
Jokester вне форума   Ответить с цитированием
Старый 13.07.2010, 08:41   #9
it's my
 
Регистрация: 06.07.2010
Сообщений: 39
Репутация: 11
По умолчанию

неполный списочек шеллов:
Код:
FaTaLisTiCz_Fx Shell
c99 Shell
r57 1.40 Shell
r57 2.0 Shell
c100 Shell
Macker's Private Shell
LOSTDC Shell
g00nshell v1.3 final Shell
c100 Unlimited Shell
Safe0ver Bypass Shell
StressBypass Shell
BLaSTER Kral Shell
ErneBypass Shell
Lolipop Shell
Liz0zimBypass Shell
Zehir4 Asp Shell
Tool Asp Shell
Sim Attacker Shell
MysqL Shell
EFSO Asp Shell
Remview Shell
Small PHP Web Shell
Nst Shell
iskorpitx Shell
Cpanel Shell
ASPYDrvsInfo Asp Shell
Php Bypass Shell
CGI TelneT
Root to "dc.pl"
Ex0 Shell
Sosyete Safe Mode On Bypass Shell
The Image Shell
Megabor Shell
Root Shell
ZX Shell
Small Shell
SpyGrup Shell
Soldier of allah Shell
Magiccoder Shell
Zaco Shell
FTP Search
Cyber Warrior Shell
Beyaz_Hacker Shell
Angel Shell
Tryag Shell
Fatal Shell
5.2.9 PHP Shell
Worse Linux Shell
WinX Shell
Uploader Shell
Sniper Sa Shell
Sim Shell
Simple CMD Shell
Simple PHP Backdoor Shell
Safe Mode Bypass Shell
S72 Shell
Ru24 Post Shell
PWS Shell
Private I2Lue Shell
CPHP Remote View Shell
PHP Jackal Shell
PHP Include-W Shell
PHP Backdoor Shell
Phantasma Shell
PH Vayv Shell
Nst View Shell
Nix Remote Shell
Network File Manager Shell
Ncc Shell
Mysql Tool Shell
Mysql Web Interface 0.8 Shell
Mysql Interface v1.0 Shell
My Shell
Moroccan Spamers Shell
Matamu Shell
Load Shell
Liz0zim Shell
Lama Shell
Kadot Universal Shell
Jsp Shell
Iron Shell
Hxps Shell
H4ntu Shell
GFS-SH Shell
GFS-Ver Shell
Dx Shell
DTool Pro Shell
Dive 1.0 Shell
Dc3 Security Crew Shell
Cyber Shell
CTT Shell
Crystal Shell
Backup Sql Shell
Azrail PHP Shell
Ayyildiz Shell
Antichat Shell
Ajax PHP Command Shell
линк забыл указать
http://tools.th3-0utl4ws.com/shells/index.html
it's my вне форума   Ответить с цитированием
Старый 16.07.2010, 16:03   #10
The matrix
 
Аватар для The matrix
 
Регистрация: 05.07.2010
Сообщений: 39
Репутация: 46
По умолчанию

Встречал еще такой FAIL.
Шелл не должен индексироваться поисковиками. Иначе есть риск не только раскрыть шелл, но и заиметь левых владельцев.
То есть проверять $_SERVER['HTTP_USER_AGENT'], и отшивать гугл ботов и прочую нечисть.Например данный косяк замечал у старых версий r57.
The matrix вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot