487
0x784 Переадресация IP
Другой способ дешифровать зашифрованные пакеты – заставить точ- ку доступа саму выполнить всю работу. Обычно точки доступа беспро- водной связи имеют в том или ином виде доступ к Интернету, и в та- ких случаях возможна атака с помощью переадресации IP. Перехва- тывается зашифрованный пакет, и адрес получателя в нем изменяет- ся на IP-адрес, которым управляет атакующий, без всякого дешифро- вания пакетов. Модифицированный пакет отправляется обратно точке доступа, которая расшифрует его и отправит на IP-адрес атакующего.
Модификация пакета возможна потому, что контрольная сумма вы- числяется с помощью функции CRC32 – линейной и бесключевой. Бла- годаря этому пакет можно модифицировать так, что контрольная сум- ма сохранится.
Успешность этой атаки также требует знания IP-адресов отправителя и получателя. Эту информацию легко получить, основываясь на стан- дартных схемах IP-адресации во внутренних сетях. Определить адреса можно также благодаря случаям повторного использования ключево- го потока при коллизиях IV.
Как только становится известным IP-адрес получателя, его величина поразрядно XOR-складывается с нужным IP-адресом, и эта сумма по- разрядно XOR-складывается с определенным участком зашифрован- ного пакета. В результате сложения аннулируется IP-адрес получа- теля и остается сумма адреса атакующего и ключевого потока. Чтобы контрольная сумма осталась неизменной, надо особым образом моди- фицировать IP-адрес отправителя.
Допустим, адрес отправителя – 192.168.2.57, а адрес получателя –
192.168.2.1. Атакующий владеет адресом 123.45.67.89 и хочет пере- адресовать туда трафик. Эти IP-адреса задаются в пакете в двоичном виде как старшее и младшее 16-разрядные слова. Преобразования весьма просты:
IP отправителя = 192.168.2.57
S
H
= 192 × 256 + 168 = 50 344
S
L
= 2 × 256 + 57 = 569
IP получателя = 192.168.2.1
D
H
= 192 × 256 + 168 = 50 344
D
L
= 2 × 256 + 1 = 513
Новый IP = 123.45.67.89
N
H
= 123 × 256 + 45 = 31 533
N
L
= 67 × 256 + 89 = 17 241
Контрольная сумма изменится на N
H
+ N
L
– D
H
– D
L
, поэтому ее следу- ет вычесть из определенного места в пакете. Поскольку известен адрес
4880x700 Криптология отправителя, который не имеет особого значения, можно взять млад- шее 16-разрядное слово из этого адреса:
S’L =
SL – (
NH +
NL –
DH –
DL)
S’L = 569 – (31 533 + 17 241 – 50 344 – 513)
S’L = 2652
Следовательно, новым IP-адресом отправителя становится 192.168.
10.92. Адрес отправителя в зашифрованном пакете можно модифици- ровать с помощью того же приема с XOR, после чего контрольные сум- мы должны совпасть. После отправки пакета в точку беспроводного до- ступа он будет расшифрован и направлен в 123.45.67.89, где его может взять атакующий.
Если атакующий имеет возможность управлять пакетами во всей сети класса B, не надо даже модифицировать адрес отправителя. Если пред- положить, что он управляет всем диапазоном адресов 123.45.
X.
X, то можно выбрать младшее 16-разрядное слово IP-адреса так, что не при- дется изменять контрольную сумму. Если
NL = DH + DL – NH, то кон- трольная сумма не изменится. Например:
NL =
DH +
DL –
NHNL = 50 344 + 513 – 31 533
N’L = 82 390
Новым IP-адресом получателя будет 123.45.75.124.
0x785 Атака Флурера-Мантина-Шамира (FMS)Атака Флурера-Мантина-Шамира (Fluhrer-Mantin-Shamir), или FMS- атака, чаще всего применяется против WEP и
стала популярной бла- годаря таким средствам, как AirSnort. Это совершенно поразитель- ная атака. Она основана на слабости алгоритма развертывания ключей в RC4 и использовании IV.
Есть слабые значения IV, из-за которых информация о секретном клю- че попадает в первый байт ключевого потока. Поскольку один и тот же ключ многократно используется с разными IV, собрав достаточное ко- личество пакетов со слабыми IV и зная первый байт ключевого потока, можно определить ключ. Удачно, что первый байт пакета 802.11b – это
SNAP-заголовок, который почти всегда равен 0xAA. Это означает, что первый байт ключевого потока легко получить, поразрядно прибавив к первому зашифрованному байту 0xAA.
Теперь надо найти слабые IV. Размер IV в WEP составляет 24 бита, или три байта. Слабые IV имеют вид (
A + 3,
N – 1,
X), где
A – это номер взла- мываемого байта ключа,
N = 256 (потому что RC4 действует по модулю
256), а
X может принимать любое значение. Таким образом, для взло- ма нулевого байта ключевого потока используются 256 слабых IV вида
(3, 255,
X), где
X находится в диапазоне от 0 до 255. Байты ключа надо
0x780 Атаки на WEP
489взламывать по порядку, то
есть первый байт нельзя взломать, пока не станет известен нулевой.
Собственно алгоритм взлома довольно прост. Сначала он проходит
A + 3 шагов алгоритма развертывания ключа (KSA). Это можно сде- лать, не зная ключа, потому что IV занимает первые три байта масси- ва
K. Если известен нулевой байт ключа и
A = 1, то KSA можно продол- жить, выполнив четвертый шаг, потому что станут известны первые четыре байта массива
K.
Если в результате на последнем шаге будут изменены
S[0] или
S[1], вся попытка прекращается. Проще говоря, попытку следует прекра- тить, если
j окажется меньше 2. В противном случае берем значения
j и
S[
A + 3] и вычитаем их из первого байта ключевого потока, разуме- ется, по модулю 256. Полученное значение будет верным байтом клю- ча примерно в 5% случаев и фактически случайным в остальных 95%.
Если взять достаточное количество слабых IV (с разными значения- ми
X), можно правильно определить байт ключа. Чтобы вероятность определения превысила 50%, достаточно иметь около 60 IV. Опреде- лив байт ключа, всю процедуру надо повторить для определения сле- дующего байта, и так пока не будет взломан весь ключ.
В иллюстративных целях мы масштабируем RC4, сделав
N равным 16, а не 256. Это значит, что операции будут выполняться по модулю 16, а не 256, и все массивы будут из 16 «байт» по 4 бита вместо 256 настоя- щих байт.
Предположим, что ключ равен (1, 2, 3, 4, 5) и взламывается нулевой байт ключа, то есть
A = 0. Тогда слабые IV будут иметь вид (3, 15,
X).
В данном примере
X = 2, поэтому начальное значение – (3, 15, 2, 1, 2,
3, 4, 5). Исходя из этого значения первым байтом выходного ключево- го потока станет 9.
Выход = 9
A = 0
IV = 3, 15, 2
Ключ = 1, 2, 3, 4, 5
Начальное значение = конкатенация IV и ключа
K[ ] = 3 15 2
X X X X X 3 15 2
X X X X XS[ ] = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Поскольку
ключ в данный момент неизвестен, в массив
K записывает- ся то, что известно, а в массив
S – последовательные числа от 0 до 15.
Затем
j присваивается начальное значение 0 и выполняются три пер- вые шага KSA. Напомним, что все вычисления выполняются по моду- лю 16.
490
0x700 Криптология
KSA, шаг первый:
i = 0
j = j + S[i] + K[i]
j = 0 + 0 + 3 = 3
Поменять местами S[i] и S[j]
K[ ] = 3 15 2 X X X X X 3 15 2 X X X X X
S[ ] = 3 1 2 0 4 5 6 7 8 9 10 11 12 13 14 15
KSA, шаг второй:
i = 1
j = j + S[i]+ K[i]
j = 3 + 1 + 15 = 3
Поменять местами S[i]и S[j]
K[ ] = 3 15 2 X X X X X 3 15 2 X X X X X
S[ ] = 3 0 2 1 4 5 6 7 8 9 10 11 12 13 14 15
KSA, шаг третий:
i = 2
j = j + S[i] + K[i]
j = 3 + 2 + 2 = 7
Поменять местами S[i] и S[j]
K[ ] = 3 15 2 X X X X X 3 15 2 X X X X X
S[ ] = 3 0 7 1 4 5 6 2 8 9 10 11 12 13 14 15
Полученное j не меньше 2, поэтому можно продолжить процедуру.
S[3] = 1, j = 7, и первый байт ключевого потока равен 9. Поэтому нуле- вой байт ключа должен быть равен 9 – 7 – 1 = 1.
Исходя из этих данных можно определить следующий байт ключа, выбирая IV вида (4, 15, X) и прокручивая KSA через четвертый шаг.
Пусть IV равен (4, 15, 9), а первый байт ключевого потока – 6.
Выход = 6
A = 0
IV = 4, 15,9
Ключ = 1, 2, 3, 4, 5
Начальное значение = конкатенация IV и ключа
K[ ] = 4 15 9 1 X X X X 4 15 9 1 X X X X
S[ ] = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0x780 Атаки на WEP
491
KSA, шаг первый:
i = 0
j = j + S[i] + K[i]
j = 0 + 0 + 4 = 4
Поменять местами S[i] и S[j]
K[ ] = 4 15 9 1 X X X X 4 15 9 1 X X X X
S[ ] = 4 1 2 3 0 5 6 7 8 9 10 11 12 13 14 15
KSA, шаг второй:
i = 1
j = j + S[i]+ K[i]
j = 4 + 1 + 15 = 4
Поменять местами S[i]и S[j]
K[ ] = 4 15 9 1 X X X X 4 15 9 1 X X X X
S[ ] = 4 0 2 3 1 5 6 7 8 9 10 11 12 13 14 15
KSA, шаг третий:
i = 2
j = j + S[i] + K[i]
j = 4 + 2 + 9 = 15
Поменять местами S[i] и S[j]
K[ ] = 4 15 9 1 X X X X 4 15 9 1 X X X X
S[ ] = 4 0 15 3 1 5 6 7 8 9 10 11 12 13 14 2
KSA, шаг четвертый:
i = 3
j = j + S[i] + K[i]
j = 15+ 3 + 1 = 3
Поменять местами S[i] и
S[j]
K[ ] = 4 15 9 1 X X X X 4 15 9 1 X X X X
S[ ] = 4 0 15 3 1 5 6 7 8 9 10 11 12 13 14 2
Выход – j – S[4] = key[1]
6 – 3 – 1 =2
И снова правильно определен байт ключа. Конечно, для наглядности значения X были специально подобраны. Получить подлинное пред- ставление о статистическом характере атаки полной реализации RC4 можно из следующего исходного кода.
492
0x700 Криптология
fms.c
#include
/* Поточный шифр RC4 */
int RC4(int *IV, int *key) {
int K[256];
int S[256];
int seed[16];
int i, j, k, t;
// Начальное заполнение = IV + ключ;
for(k=0; k<3; k++)
seed[k] = IV[k];
for(k=0; k<13; k++)
seed[k+3] = key[k];
// -= Алгоритм развертывания ключей (KSA) =-
// Инициализация массивов.
for(k=0; k<256; k++) {
S[k] = k;
K[k] = seed[k%16];
}
j=0;
for(i=0; i < 256; i++) {
j = (j + S[i] + K[i])%256;
t=S[i]; S[i]=S[j]; S[j]=t; // Поменять местами(S[i], S[j]);
}
// Первый этап PRGA для первого байта ключевого потока i = 0;
j = 0;
i = i + 1;
j = j + S[i];
t=S[i]; S[i]=S[j]; S[j]=t; // Поменять местами(S[i], S[j]);
k = (S[i] + S[j])%256;
return S[k];
}
int main(int argc, char *argv[]) {
int K[256];
int S[256];
int IV[3];
int key[13] = {1, 2, 3, 4, 5, 66, 75, 123, 99, 100, 123, 43, 213};
int seed[16];
0x780 Атаки на WEP
493
int N = 256;
int i, j, k, t, x, A;
int keystream, keybyte;
int max_result, max_count;
int results[256];
int known_j, known_S;
if(argc < 2) {
printf(“Usage: %s \n”, argv[0]);
exit(0);
}
A = atoi(argv[1]);
if((A > 12) || (A < 0)) {
printf(“keybyte must be from 0 to 12.\n”);
exit(0);
}
for(k=0; k < 256; k++)
results[k] = 0;
IV[0] = A + 3;
IV[1] = N - 1;
for(x=0; x < 256; x++) {
IV[2] = x;
keystream = RC4(IV, key);
printf(“Using IV: (%d, %d, %d), first keystream byte is %u\n”,
IV[0], IV[1], IV[2], keystream);
printf(“Doing the first %d steps of KSA.. “, A+3);
// Начальное заполнение = IV + ключ;
for(k=0; k<3; k++)
seed[k] = IV[k];
for(k=0; k<13; k++)
seed[k+3] = key[k];
// -= Алгоритм развертывания ключей (KSA) =-
// Инициализация массивов.
for(k=0; k<256; k++) {
S[k] = k;
K[k] = seed[k%16];
}
j=0;
for(i=0; i < (A + 3); i++) {
j = (j + S[i] + K[i])%256;
t = S[i];
494
0x700 Криптология
S[i] = S[j];
S[j] = t;
}
if(j < 2) { // Если j < 2, то S[0] или S[1] изменилось.
printf(“S[0] or S[1] have been disturbed, discarding..\n”);
} else {
known_j = j;
known_S = S[A+3];
printf(“at KSA iteration #%d, j=%d and S[%d]=%d\n”,
A+3, known_j, A+3, known_S);
keybyte = keystream - known_j - known_S;
while(keybyte < 0)
keybyte = keybyte + 256;
printf(“key[%d] prediction = %d - %d - %d = %d\n”,
A, keystream, known_j, known_S, keybyte);
results[keybyte] = results[keybyte] + 1;
}
}
max_result = -1;
max_count = 0;
for(k=0; k < 256; k++) {
if(max_count < results[k]) {
max_count = results[k];
max_result = k;
}
}
printf(“\nFrequency table for key[%d] (* = most frequent)\n”, A);
for(k=0; k < 32; k++) {
for(i=0; i < 8; i++) {
t = k+i*32;
if(max_result == t)
printf(“%3d %2d*| “, t, results[t]);
else printf(“%3d %2d | “, t, results[t]);
}
printf(“\n”);
}
printf(“\n[Actual Key] = (“);
for(k=0; k < 12; k++)
printf(“%d, “,key[k]);
printf(“%d)\n”, key[12]);
printf(“key[%d] is probably %d\n”, A, max_result);
}
Этот код осуществляет FMS-атаку на 128-разрядный WEP (104-разряд- ный ключ, 24 бита IV), используя все возможные значения X. Един-
0x780 Атаки на WEP
495
ственный аргумент – атакуемый байт ключа, а сам ключ жестко зашит в массиве key. Следующий листинг показывает компиляцию и выпол- нение кода fms.c для взлома ключа RC4.
reader@hacking:/booksrc $ gcc -o fms fms.c reader@hacking:/booksrc $ ./fms
Usage: ./fms
reader@hacking:/booksrc $ ./fms 0
Using IV: (3, 255, 0), first keystream byte is 7
Doing the first 3 steps of KSA.. at KSA iteration #3, j=5 and S[3]=1
key[0] prediction = 7 - 5 - 1 = 1
Using IV: (3, 255, 1), first keystream byte is 211
Doing the first 3 steps of KSA.. at KSA iteration #3, j=6 and S[3]=1
key[0] prediction = 211 - 6 - 1 = 204
Using IV: (3, 255, 2), first keystream byte is 241
Doing the first 3 steps of KSA.. at KSA iteration #3, j=7 and S[3]=1
key[0] prediction = 241 - 7 - 1 = 233
.:[ вывод сокращен ]:.
Using IV: (3, 255, 252), first keystream byte is 175
Doing the first 3 steps of KSA.. S[0] or S[1] have been disturbed,
discarding..
Using IV: (3, 255, 253), first keystream byte is 149
Doing the first 3 steps of KSA.. at KSA iteration #3, j=2 and S[3]=1
key[0] prediction = 149 - 2 - 1 = 146
Using IV: (3, 255, 254), first keystream byte is 253
Doing the first 3 steps of KSA.. at KSA iteration #3, j=3 and S[3]=2
key[0] prediction = 253 - 3 - 2 = 248
Using IV: (3, 255, 255), first keystream byte is 72
Doing the first 3 steps of KSA.. at KSA iteration #3, j=4 and S[3]=1
key[0] prediction = 72 - 4 - 1 = 67
Frequency table for key[0] (* = most frequent)
0 1 | 32 3 | 64 0 | 96 1 | 128 2 | 160 0 | 192 1 | 224 3 |
1 10*
| 33 0 | 65 1 | 97 0 | 129 1 | 161 1 | 193 1 | 225 0 |
2 0 | 34 1 | 66 0 | 98 1 | 130 1 | 162 1 | 194 1 | 226 1 |
3 1 | 35 0 | 67 2 | 99 1 | 131 1 | 163 0 | 195 0 | 227 1 |
4 0 | 36 0 | 68 0 | 100 1 | 132 0 | 164 0 | 196 2 | 228 0 |
5 0 | 37 1 | 69 0 | 101 1 | 133 0 | 165 2 | 197 2 | 229 1 |
6 0 | 38 0 | 70 1 | 102 3 | 134 2 | 166 1 | 198 1 | 230 2 |
7 0 | 39 0 | 71 2 | 103 0 | 135 5 | 167 3 | 199 2 | 231 0 |
8 3 | 40 0 | 72 1 | 104 0 | 136 1 | 168 0 | 200 1 | 232 1 |
9 1 | 41 0 | 73 0 | 105 0 | 137 2 | 169 1 | 201 3 | 233 2 |
10 1 | 42 3 | 74 1 | 106 2 | 138 0 | 170 1 | 202 3 | 234 0 |
11 1 | 43 2 | 75 1 | 107 2 | 139 1 | 171 1 | 203 0 | 235 0 |
12 0 | 44 1 | 76 0 | 108 0 | 140 2 | 172 1 | 204 1 | 236 1 |
13 2 | 45 2 | 77 0 | 109 0 | 141 0 | 173 2 | 205 1 | 237 0 |
14 0 | 46 0 | 78 2 | 110 2 | 142 2 | 174 1 | 206 0 | 238 1 |
15 0 | 47 3 | 79 1 | 111 2 | 143 1 | 175 0 | 207 1 | 239 1 |
16 1 | 48 1 | 80 1 | 112 0 | 144 2 | 176 0 | 208 0 | 240 0 |
496
0x700 Криптология
17 0 | 49 0 | 81 1 | 113 1 | 145 1 | 177 1 | 209 0 | 241 1 |
18 1 | 50 0 | 82 0 | 114 0 | 146 4 | 178 1 | 210 1 | 242 0 |
19 2 | 51 0 | 83 0 | 115 0 | 147 1 | 179 0 | 211 1 | 243 0 |
20 3 | 52 0 | 84 3 | 116 1 | 148 2 | 180 2 | 212 2 | 244 3 |
21 0 | 53 0 | 85 1 | 117 2 | 149 2 | 181 1 | 213 0 | 245 1 |
22 0 | 54 3 | 86 3 | 118 0 | 150 2 | 182 2 | 214 0 | 246 3 |
23 2 | 55 0 | 87 0 | 119 2 | 151 2 | 183 1 | 215 1 | 247 2 |
24 1 | 56 2 | 88 3 | 120 1 | 152 2 | 184 1 | 216 0 | 248 2 |
25 2 | 57 2 | 89 0 | 121 1 | 153 2 | 185 0 | 217 1 | 249 3 |
26 0 | 58 0 | 90 0 | 122 0 | 154 1 | 186 1 | 218 0 | 250 1 |
27 0 | 59 2 | 91 1 | 123 3 | 155 2 | 187 1 | 219 1 | 251 1 |
28 2 | 60 1 | 92 1 | 124 0 | 156 0 | 188 0 | 220 0 | 252 3 |
29 1 | 61 1 | 93 1 | 125 0 | 157 0 | 189 0 | 221 0 | 253 1 |
30 0 | 62 1 | 94 0 | 126 1 | 158 1 | 190 0 | 222 1 | 254 0 |
31 0 | 63 0 | 95 1 | 127 0 | 159 0 | 191 0 | 223 0 | 255 0 |
[Actual Key] = (1, 2, 3, 4, 5, 66, 75, 13, 99, 100, 123, 43, 213)
key[0] is probably 1
reader@hacking:/booksrc $
reader@hacking:/booksrc $ ./fms 12
Using IV: (15, 255, 0), first keystream byte is 81
Doing the first 15 steps of KSA.. at KSA iteration #15, j=251 and S[15]=1
key[12] prediction = 81 - 251 - 1 = 85
Using IV: (15, 255, 1), first keystream byte is 80
Doing the first 15 steps of KSA.. at KSA iteration #15, j=252 and S[15]=1
key[12] prediction = 80 - 252 - 1 = 83
Using IV: (15, 255, 2), first keystream byte is 159
Doing the first 15 steps of KSA.. at KSA iteration #15, j=253 and S[15]=1
key[12] prediction = 159 - 253 - 1 = 161
.:[ вывод сокращен ]:.
Using IV: (15, 255, 252), first keystream byte is 238
Doing the first 15 steps of KSA.. at KSA iteration #15, j=236 and S[15]=1
key[12] prediction = 238 - 236 - 1 = 1
Using IV: (15, 255, 253), first keystream byte is 197
Doing the first 15 steps of KSA.. at KSA iteration #15, j=236 and S[15]=1
key[12] prediction = 197 - 236 - 1 = 216
Using IV: (15, 255, 254), first keystream byte is 238
Doing the first 15 steps of KSA.. at KSA iteration #15, j=249 and S[15]=2
key[12] prediction = 238 - 249 - 2 = 243
Using IV: (15, 255, 255), first keystream byte is 176
Doing the first 15 steps of KSA.. at KSA iteration #15, j=250 and S[15]=1
key[12] prediction = 176 - 250 - 1 = 181
Frequency table for key[12] (* = most frequent)
0 1 | 32 0 | 64 2 | 96 0 | 128 1 | 160 1 | 192 0 | 224 2 |
1 2 | 33 1 | 65 0 | 97 2 | 129 1 | 161 1 | 193 0 | 225 0 |
2 0 | 34 2 | 66 2 | 98 0 | 130 2 | 162 3 | 194 2 | 226 0 |
3 2 | 35 0 | 67 2 | 99 2 | 131 0 | 163 1 | 195 0 | 227 5 |
4 0 | 36 0 | 68 0 | 100 1 | 132 0 | 164 0 | 196 1 | 228 1 |