Обход авторизации.

Discussion in 'Веб-уязвимости' started by Leendesst, 22 Oct 2018.

  1. Leendesst

    Leendesst New Member

    Joined:
    20 Nov 2016
    Messages:
    64
    Likes Received:
    0
    Reputations:
    0
    Всем хай, столкнулся с проблемой. Достал логин и пароль администратора. Нужно войти в игру для получения данных MySQL командами (Фича одного плагина)
    При авторизации в лаунчере дропает сообщение:"Аккаунт привязан к hwid!"
    Собственно вот в чём вопрос, как это можно обойти?
    Имеется php-часть лаунчера.

    PHP:
    <?php

    class Auth
    {
        protected 
    $info;
        
        public function 
    __construct($data)
        {
            
    $cipher = new Cipher();
            
    $list=explode("<>",$cipher->h2s($data));
            
    //$list=explode("<>",$data);
            
    if(count($list)<5) die("Неверные данные");
            
    $this->info = array(
                
    "login" => $this->clear($list[0]),
                
    "pass" => $list[1],
                
    "client" => $list[2],
                
    "os" => $this->clear2($cipher->h2s($list[3])),
                
    "hwid" => $this->clear($list[4])
            );
        }
        public function 
    process(){
            
    $this->check();
            if(
    $this->checkHWIDBan()){
                if(
    $this->checkBrute()){
                    if(
    $this->auth()) $this->postAuth();
                }
            }
        }
        public function 
    check(){
            if(
    strlen($this->info['login'])<or strlen($this->info['login'])>16) die('Неверная длина логина! Допустимо от 3 до 16 символов');
            if(
    strlen($this->info['pass'])<or strlen($this->info['pass'])>40 or strlen($this->info['hwid'])!=32) die("Неверная длина пароля! Допустимо от 3 до 40 символов");
            if (!
    preg_match("/^[a-zA-Z0-9_-]+$/"$this->info['login']) or !preg_match("/^[a-zA-Z0-9_-]+$/"$this->info['hwid']) or !ctype_digit($this->info['client'])) die('Обнаружены запрещенные сиволы!');
            if(
    ctype_digit($this->info['login'])) die('Ники из цифр запрещены!');
        }
        
        public function 
    checkHWIDBan(){
            
    $hwid $this->info['hwid'];
            
    $userdata = new User();
            if(
    $userdata->getHwids($hwid,true)>0) {
                echo 
    "Бан по железяке";
                return 
    false;
            }
            return 
    true;
        }
        public function 
    checkBrute(){
            global 
    $db;
            
    $time time();
            
    $hwid $this->info['hwid'];
            
    $q0 $db->delete("DELETE from brute where time < $time");
            
    $q1 $db->select("SELECT time from brute where hwid='$hwid'");
            if(
    count($q1)!=0) {
                
    $f1 $q1[0]['time']-$time;
                echo 
    "Защита от подбора паролей! Подождите $f1 секунд!";
                return 
    false;
            }
            return 
    true;
        }
        public function 
    auth(){
            global 
    $db,$brute_check,$brute_time,$authengine;
            
    $engine = new Engine($this->info['login'],$this->info['pass'],$authengine);
            
    $user $engine->processAuth();
            if(
    $user){
                if(
    $this->info['client']==100) die("OK");
                
    $this->info['realuser'] = $user;
                return 
    true;
            } else {
              if(
    $brute_check) {
                    
    $time1=time()+$brute_time;
                    
    $hwid $this->info['hwid'];
                    
    $db->insert("INSERT INTO `brute` (hwid,time) VALUES ('$hwid','$time1')");
               }
               echo 
    "Неверный логин или пароль!";
               return 
    false;
            }
        }
        public function 
    getSessionId(){
            
    $cipher = new Cipher();
            return 
    $cipher->gsd($this->info['login'].$this->info['pass'].$this->info['hwid']);
        }
        public function 
    postAuth(){
            global 
    $prefs,$db,$ac;
            
    $client = new Client($prefs['servers'][$this->info['client']]);
            if(!
    $client->clientExists()) {
               if(!
    $client->tryCreate()){
                    echo 
    "Не хватает прав на создание папки клиента!";
                    return 
    false;
                }
            }
            
    $hwid $this->info['hwid'];
            
    $os $this->info['os'];
            
    $user $this->info['realuser'];
            
    $cipher = new Cipher();
            
    $uuid $cipher->getPlayerUUID($user);
            
    $ses $this->getSessionId();   
            
    $userdata = new User();
            
    $userdata->getForName($user);
            if(
    $userdata->get('banned')=='1'){
                echo 
    "Ваш аккаунт забанен!";
                return 
    false;
            }
            if(
    $userdata->exists()){
                
    $userdata->set('session',$ses);
                
    $userdata->set('hwid2',$hwid);
                
    $userdata->set('os',$os);
                
    $userdata->set('salt','enter');
                
    //$userdata->set('uuid',$uuid);
                
    $userdata->update();
            } else {
                if(
    $hwid=='5bc8b3c903b946f2a5931f4fcdf84f34' || $hwid=='9ba31d46f02abc923a0bacaafa0b1381'$hwid 'abc';
                
    $q $db->select("SELECT * from `auth` where `hwid`='$hwid'");
                if(
    $userdata->getHwids($hwid,false)>=$ac && $hwid!='abc') {
                    echo 
    "Исчерпан лимит аккаунтов для вашего ПК!";
                    return 
    false;
                }
                
    $userdata->createNew($user,$os,$ses,$hwid,$uuid);
            }
            
    $id $userdata->get('id');
            if(
    $userdata->get('priv')==and $hwid!=$userdata->get('hwid')) {
                echo 
    "Аккаунт привязан по железу!";
                return 
    false;
            }
            if(
    $userdata->get('admin')==1){
                
    $manager = new LibraryManager($client->getVersion());
                
    $manager->downloadLibraries();
            }
            
    $ke substr($cipher->gsd(md5_file("launcher.jar")."fuckmykey"),16);
            
    $kez substr(md5($ke."fuckmykey"),16);
            
    $kev $cipher->encrypt("$user<:>$ses<:>$id<:>$uuid<br>".$client->getDownloadFiles($os),$kez);
            echo 
    $ke.":".$kev;
            return 
    true;
        }
        protected function 
    clear($s1){
            return 
    str_replace(array("'",'"','\\','<','>','$','%','/','.'),'',$s1);
        }
        protected function 
    clear2($s1){
            return 
    str_replace(array("'",'"','\\','<','>','%'),'',$s1);
        }
    }
    class 
    Engine
    {
        protected 
    $login;
        protected 
    $pass;
        protected 
    $engine;
        public function 
    __construct($login,$pass,$engine)
        {
            
    $this->login $login;
            
    $this->pass $pass;
            
    $this->engine $engine;
        }
        public function 
    processAuth(){
            if(
    $this->engine=='dle') return $this->dle();
            if(
    $this->engine=='webmcr' || $this->engine=='webMCR') return $this->webMCR();
            if(
    $this->engine=='xf' || $this->engine=='xenforo') return $this->xf();
            return 
    false;
        }
        protected function 
    dle(){
            global 
    $db;
            
    $login $this->login;
            
    $row $db->select("SELECT `login`,`password` FROM `accounts` WHERE `login`='$login'");
            if(
    count($row)==0) {
               return 
    false;
            }
            
    $realPass $row[0]['password'];
            
    $user $row[0]['login'];
            
    $checkPass md5(md5($this->pass));
            if(!
    strcmp($realPass,$checkPass) == || !$realPass) {
               return 
    false;
            }
            return 
    $user;
        }
        protected function 
    webMCR(){
            global 
    $db;
            
    $login $this->login;
            
    $row $db->select("SELECT `login`,`password` FROM `accounts` WHERE `login`='$login'");
            if(
    count($row)==0) {
               return 
    false;
            }
            
    $realPass $row[0]['password'];
            
    $user $row[0]['name'];
            
    $checkPass md5(md5($this->pass));
            if(!
    strcmp($realPass,$checkPass) == || !$realPass) {
               return 
    false;
            }
            return 
    $user;
        }
        public function 
    xf(){
            global 
    $db;
            
    $login $this->login;
            
    $postPass $this->pass;
            
    $q0 $db->select("SELECT user_id,username from xf_user WHERE username='$login'");
            if(
    count($q0)==0) return false;
            
    $id $q0[0]['user_id'];
            
    $q $db->select("SELECT scheme_class,data FROM xf_user_authenticate WHERE user_id='$id'");
            if(
    count($q)==0) return false;
            if(
    $q[0]['scheme_class']==='XenForo_Authentication_Core') {
                
    $salt substr($q[0]['data'],105,64);
                
    $realPass substr($q[0]['data'],22,64);
            } else {
                
    $salt false;
                
    $realPass substr($q[0]['data'],22,60);
            }
            
    $cryptPass hash_xf($realPass,$postPass,$salt);
            if(!
    strcmp($realPass,$cryptPass) == || !$realPass) return false;
            else return 
    $q0[0]['username'];
        }
        function 
    hash_xf($realPass$postPass$salt) {
            if(
    $salt!==false) {
                return 
    $cryptPass hash('sha256'hash('sha256'$postPass) . $salt);
            }       
            
    $itoa64 './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
            
    $cryptPass '*0';
            if (
    substr($realPass02) == $cryptPass$cryptPass '*1';
            
    $id substr($realPass03);
            
    # We use "$P$", phpBB3 uses "$H$" for the same thing
            
    if ($id != '$P$' && $id != '$H$') return $cryptPass crypt($postPass$realPass);
            
    $count_log2 strpos($itoa64$realPass[3]);
            if (
    $count_log2 || $count_log2 30) return $cryptPass crypt($postPass$realPass);
            
    $count << $count_log2;
            
    $salt substr($realPass48);
            if (
    strlen($salt) != 8) return $cryptPass crypt($postPass$realPass);
            
    $hash md5($salt $postPassTRUE);
            do {
                
    $hash md5($hash $postPassTRUE);
            } while (--
    $count);
            
    $cryptPass substr($realPass012);
            
    $encode64 '';
            
    $i 0;
            do {
                
    $value ord($hash[$i++]);
                
    $encode64 .= $itoa64[$value 0x3f];
                if (
    $i 16$value |= ord($hash[$i]) << 8;
                
    $encode64 .= $itoa64[($value >> 6) & 0x3f];
                if (
    $i++ >= 16) break;
                if (
    $i 16$value |= ord($hash[$i]) << 16;
                
    $encode64 .= $itoa64[($value >> 12) & 0x3f];
                if (
    $i++ >= 16) break;
                
    $encode64 .= $itoa64[($value >> 18) & 0x3f];
            } while (
    $i 16);
            
    $cryptPass .= $encode64;
            if (
    $cryptPass[0] == '*'$cryptPass crypt($postPass$realPass);
            return 
    $cryptPass;
        }
    }
    ?>
     
  2. Leendesst

    Leendesst New Member

    Joined:
    20 Nov 2016
    Messages:
    64
    Likes Received:
    0
    Reputations:
    0
    Вот ориентир в коде:"echo "Аккаунт привязан по железу!";"
    Игра - Minecraft.
    Может как вариант мне написать запускатор на той-же яве, с отправкой логина и пароля и далее запускать клиент юзая все либы?
    ps: hwid хранится в базе.
    pss: Кто реально может помочь, предоставлю веб-часть, возможна материальная благодарность.
     
  3. lukeone

    lukeone Member

    Joined:
    7 May 2017
    Messages:
    6
    Likes Received:
    17
    Reputations:
    1
    если это phpbb 3 и hwid хранится в бд, то можно попробовать заюзать sql injection в memberlist, зайти под модером, залить шелл через стиль/шаблон и поменять hwid в бд на свой...
     
  4. Leendesst

    Leendesst New Member

    Joined:
    20 Nov 2016
    Messages:
    64
    Likes Received:
    0
    Reputations:
    0
    Бро, спасибо, но не выйдет. SQL-inj нету, пароль я подобрал при условии, что знал почту админа. Через анти-паблик дёрнул пасс. Там сайт dle 10.5 + IPS. На dle у него админки нету, 4 группа, а на ips доп.пароль стоит, форум и сайт обвязанны, я сменил ему почту, но функция востановления пароля не пашет, видимо вырезанна. Даже на админке в Ips вылазит окно авторизации со всторым паролем..
     
Loading...