Введение

Протокол для передачи файлов и прямого чата в Internet Relay Chat

Direct Client to Client (DCC) (первоначально Direct Client Connection) – это подпротокол, связанный с IRC, позволяющий пользователям напрямую соединяться друг с другом, используя IRC-сервер для установления соединения с целью обмена файлами или проведения чата без ретрансляции через сервер. После установления соединения типичный сеанс DCC функционирует независимо от IRC-сервера. Изначально разработанный для использования с ircII, он теперь поддерживается многими IRC-клиентами. Некоторые одноранговые клиенты на серверах протокола Napster также обладают возможностью отправки и получения файлов через DCC, включая TekNap, SunshineUN и Lopster. Существует вариант протокола DCC под названием SDCC (Secure Direct Client to Client), также известный как DCC SCHAT, который поддерживает зашифрованные соединения. Официальной спецификации RFC для использования DCC не существует. Соединения DCC могут быть инициированы двумя способами: наиболее распространенный способ – использование CTCP для начала сеанса DCC. CTCP отправляется от одного пользователя через сеть IRC другому пользователю. Альтернативный способ инициирования сеанса DCC – прямое подключение клиента к DCC-серверу. В этом случае трафик не проходит через сеть IRC (сторонам не требуется подключение к IRC-сети для установления соединения DCC).

История

ircII был первым IRC-клиентом, реализовавшим протоколы CTCP и DCC. Протокол CTCP был разработан Майклом Сандрофом в 1990 году для версии ircII 2.1. Протокол DCC был разработан Троем Ролло в 1991 году для версии 2.1.2, однако изначально не планировался для портирования на другие IRC-клиенты.

DCC CHAT

Служба CHAT позволяет пользователям общаться друг с другом через DCC-соединение. Трафик передается напрямую между пользователями, а не через сеть IRC. По сравнению с обычной отправкой сообщений, это снижает нагрузку на сеть IRC, позволяет отправлять большие объемы текста за один раз из-за отсутствия защиты от флуда и повышает безопасность связи, поскольку сообщение не проходит через серверы IRC (однако сообщение остается в виде обычного текста). DCC CHAT обычно инициируется с помощью CTCP-рукопожатия. Пользователь, желающий установить соединение, отправляет целевому пользователю следующий CTCP-запрос: DCC CHAT <IP-адрес> <порт>, где <IP-адрес> и <порт> – это IP-адрес и номер порта отправителя, представленные в виде целых чисел. <порт> равен 6667 для стандартного DCC CHAT. Получатель может затем подключиться к указанному порту и IP-адресу. После установления соединения протокол DCC CHAT очень прост: пользователи обмениваются сообщениями, завершающимися символами CRLF. Сообщения, начинающиеся с ASCII 001 (управляющий символ A, представленный ниже символом ^A) и слова ACTION, и заканчивающиеся другим символом ^A, интерпретируются как эмоции: [^A]ACTION машет на прощание[^A].

Доска DCC

Это расширение для DCC CHAT, позволяющее отправлять простые команды рисования, а также текстовые строки. DCC Whiteboard инициируется обменом данными, аналогичным DCC CHAT, но с заменой протокола на: DCC CHAT wboard. После установления соединения, два клиента обмениваются сообщениями, завершающимися символами CRLF. Сообщения, начинающиеся (и опционально заканчивающиеся) символом ASCII, интерпретируются как специальные команды; команда представляет собой эмоцию, а остальные вызывают отрисовку линий на поверхности доски пользователя или позволяют двум клиентам согласовать набор функций.

DCC SEND

Служба SEND позволяет пользователям отправлять файлы друг другу. Изначальная спецификация протокола обмена данными не позволяла получателю узнать общий размер файла и возобновить передачу. Это вынудило клиентов внедрять собственные расширения протокола обмена, многие из которых получили широкую поддержку. Изначальный протокол обмена состоял в том, что отправитель отправлял получателю следующий CTCP-сообщение: DCC SEND Как и в случае с DCC CHAT, и – это IP-адрес и порт, на котором отправитель будет ожидать входящее соединение. Некоторые клиенты заключают имена файлов, содержащие пробелы, в двойные кавычки. Обычно в качестве последнего аргумента добавляется размер файла: DCC SEND На этом этапе изначальная спецификация предписывала получателю либо подключиться к указанному адресу и порту и ждать данных, либо игнорировать запрос, но для клиентов, поддерживающих расширение DCC RESUME, была предусмотрена третья альтернатива – запросить у отправителя пропуск части файла, отправив ответ CTCP: DCC RESUME Если отправляющий клиент поддерживает DCC RESUME, он ответит DCC ACCEPT, и получатель сможет подключиться к указанному адресу и порту и прослушивать данные для добавления к уже существующему файлу. Данные отправляются клиенту блоками, каждый из которых клиент должен подтвердить, отправив общее количество полученных байтов в виде 32-битного целого числа в сетевом порядке байтов. Это замедляет соединения и избыточно, поскольку используется TCP. Расширение send ahead частично решает эту проблему, не дожидаясь подтверждений, но поскольку получателю все равно приходится отправлять их за каждый полученный блок, если отправитель их ожидает, проблема не решается полностью. Другое расширение, TDCC, или turbo DCC, отменяет подтверждения, но требует слегка модифицированного протокола обмена и не имеет широкой поддержки. В более ранних версиях TDCC слово SEND в протоколе обмена заменялось на TSEND; более поздние версии используют слово SEND, но добавляют после протокола обмена, что делает эту версию TSEND совместимой с другими клиентами (при условии, что они могут анализировать модифицированный протокол обмена).

Эксплойт DCC SEND

"DCC send exploit" может относиться к двум уязвимостям: варианту ошибки переполнения буфера в mIRC, возникающей из-за имен файлов длиной более 14 символов, и ошибке проверки входных данных в некоторых маршрутизаторах производства Netgear, D-Link и Linksys, активируемой использованием определенного порта. В частности, уязвимость маршрутизатора может быть вызвана появлением фразы "" с последующими как минимум 6 символами без пробелов или переносов строк в любом месте TCP-потока на порту 6667, а не только при фактическом запросе DCC SEND. В 2000-х годах было возможно объединить несколько уязвимостей в одну строку, которая, будучи размещенной в публичном канале, могла привести к отключению множества пользователей (либо из-за сбоя IRC-клиентов, сбоя маршрутизаторов, либо из-за срабатывания излишне строгих настроек по умолчанию в антивирусном программном обеспечении).

DCC XMIT

XMIT-сервис – это модифицированная версия DCC SEND, позволяющая возобновлять передачу файлов и сокращать избыточный трафик от ACK-пакетов. XMIT не имеет широкой поддержки. Процедура установления соединения XMIT несколько отличается от процедуры установления соединения SEND. Отправитель отправляет CTCP-сообщение, предлагающее файл получателю: DCC XMIT [[[ ]]]. Квадратные скобки здесь обозначают необязательные части. Это протокол, используемый для передачи; в настоящее время определен только он. В отличие от стандартного DCC SEND, адрес может быть указан в дополнительных формах стандартной точечной нотации для IPv4, либо в шестнадцатеричной или смешанной нотации для IPv6. Чтобы оставить один из начальных параметров пустым, но указать последующий, более ранний параметр можно задать как . Если получатель не поддерживает используемый протокол, он отправит ответ CTCP следующего формата: ERRMSG DCC CHAT недоступен. CHAT используется здесь для обеспечения совместимости с сообщениями об ошибках, отправляемыми расширенным DCC CHAT. Если получатель отклоняет передачу, он отправляет следующий ответ CTCP: ERRMSG DCC CHAT отклонено. Другие ошибки сообщаются аналогичным образом. Если получатель готов и способен принять файл, он подключается к указанному адресу и порту. Дальнейшие действия зависят от используемого протокола. В случае протокола, XMIT-сервер, получив соединение, отправляет 32-битное значение времени t в сетевом порядке байтов, представляющее время модификации файла. Предположительно, основываясь на времени модификации локального файла, клиент затем отправляет еще одно 32-битное значение в сетевом порядке байтов – смещение, к которому сервер должен перейти при отправке файла. Это значение должно быть установлено в ноль, если требуется передать весь файл, или в размер локального файла, если клиент хочет возобновить предыдущую загрузку. Хотя XMIT быстрее, чем SEND, он имеет то же ограничение: невозможно определить размер файла, если он не указан в CTCP-переговорах или не известен заранее. Кроме того, из-за 32-битного смещения невозможно возобновить передачу файла размером более двух гигабайт.

Пассивный DCC

В обычном соединении DCC инициатор выступает в роли сервера, а целевое устройство – в роли клиента. Из-за повсеместного использования брандмауэров и снижения сквозной прозрачности из-за NAT инициатор может оказаться не в состоянии выступать в роли сервера. Были разработаны различные способы инициировать выполнение роли сервера на целевом устройстве:

Сервер DCC

Это расширение стандартных DCC SEND и CHAT было представлено IRC-клиентом mIRC. DCC Server имеет частичную поддержку, но не является стандартным для всех клиентов (см. Сравнение IRC-клиентов). Он позволяет инициировать DCC-соединение по IP-адресу, без использования IRC-сервера. Это достигается за счет того, что принимающий клиент выступает в роли сервера (отсюда и название), прослушивая (обычно на порту 59) запрос на установку соединения от отправителя. Для CHAT инициатор отправляет 1000, а получатель отвечает 1000, после чего обмен данными продолжается по стандартному протоколу DCC CHAT. Для SEND инициатор отправляет 1200, а получатель отвечает 1210, где – смещение в файле, с которого начинается передача. Далее передача данных происходит как обычный DCC SEND. DCC Server также поддерживает файловые серверы в стиле mIRC и DCC GET.

РДКЦ

DCC Server не предоставляет способа указать используемый порт, поэтому его необходимо согласовывать вручную, что не всегда возможно, так как одна из сторон может быть не пользователем. RDCC — это механизм установления соединения для DCC Server, который, помимо порта, предоставляет IP-адрес сервера, который клиент может не найти иным способом из-за маскировки хоста. Он не получил широкого распространения. Инициатор запрашивает порт, на котором ожидает цель, отправляя CTCP-запрос RDCC , где обозначает чат, обозначает отправку, а обозначает файловый сервер. Цель может ответить CTCP-сообщением RDCC 0 , где и имеют те же значения, что и для обычных DCC SEND и CHAT. После этого инициатор подключается к и , и происходит рукопожатие DCC Server.

DCC RSEND

Это альтернатива DCC REVERSE в клиенте KVIrc. Отправитель предлагает файл, отправляя CTCP-сообщение: DCC RSEND. Получатель может принять предложение, ответив CTCP-сообщением DCC RECV, после чего отправитель подключается к получателю и отправляет файл, как при обычной DCC SEND.

Файловые серверы (FSERV)

DCC fserve, или файловый сервер, позволяет пользователю просматривать, читать и скачивать файлы, расположенные на DCC-сервере. Обычно это реализуется посредством DCC CHAT-сессии (предоставляющей пользователю командную строку) или специальных команд CTCP для запроса файла. Файлы передаются через DCC SEND или DCC XMIT. Существует множество реализаций DCC-файловых серверов, среди которых команда FSERV в популярном клиенте mIRC.