CHƢƠNG 3 : BẺ KHĨA MẠNG KHƠNG DÂY
3.1. Bẻ khóa mạng khơng dây sử dụng giao thức bảo mật WEP
3.1.1. Bẻ khóa sử dụng véc-tơ IV trùng lặp
Nhƣ đã trình bày trong Chƣơng 2, giao thức bảo mật WEP có nhƣợc điểm rất lớn đó là véc-tơ khởi tạo IV, do IV đƣợc gửi đi cùng gói tin dƣới dạng không mã hõa, với 2 véc tơ khởi tạo giống nhau sẽ cho ra cùng một khóa. Số lƣợng véc-tơ IV là hạn chế do độ dài của IV là 3 byte, điều này dẫn tới sự trùng lặp của IV. Véc-tơ IV bị trùng lặp tạo ra lỗ hổng trong WEP. Xét ví dụ sau đây:
Giả sử Kẻ tấn cơng bắt đƣợc 2 gói tin có cùng IV là C1 và C2 nhƣ vậy 2 gói tin này sẽ có cùng chuỗi khóa Ks = IV||Key
Gọi P1 là bản rõ của C1, tƣơng tự P2 là bản rõ của C2
o C1 = P1 Ks
o C2 = P2 Ks
Khi đó nếu đem C1 C2 ta làm triệt tiêu Ks
o C1 C2 = (P1 Ks) (P2 Ks) = (P1 P2) (Ks Ks) = P1 P2
o Nếu biết đƣợc P1 hoặc P2 ta sẽ biết đƣợc Ks C1 P1 = (P1 Ks) P1 = Ks Có một số cách đơn giản để biết đƣợc P1 nhƣ
Nếu mạng khơng dây kết nối với mạng bên ngồi
o Kẻ tấn công sẽ gửi gói tin Ping dùng giao thức ICMP đến máy Client trong mạng, nhƣ vậy gói tin giữa AP và Client là các gói ICMP đã biết.
o Bắt gói tin từ Client đến AP sau đó sửa một số bit sao cho ICV vẫn đúng. Gói tin đã đƣợc chỉnh sửa đƣợc gửi đến AP.
o AP nhận gói tin, do ICV vẫn đúng nên AP tiến hành giải mã. Nhƣng do một số bit đã thay đổi nên q trình giải mã có lỗi, AP thơng báo lỗi đến Client, và gói tin thơng báo lỗi là đã biết.
Nhƣ vậy kẻ tấn cơng có thể dễ dàng lấy đƣợc các chuỗi khóa Ks tƣơng ứng với các IVs, kẻ tấn công không biết đƣợc bản rõ của khóa bí mật nhƣng biết đƣợc chuỗi khóa để mã hóa và giải mã các gói tin tƣơng ứng với các IV. Kẻ tấn cơng có thể sử dụng chuỗi khóa này vƣợt qua bƣớc xác thực để tham gia vào mạng, đồng thời có thể gửi gói tin và giải mã các gói tin trong mạng.
Phƣơng pháp bẻ khóa sử dụng véc-tơ IV trùng lặp là phƣơng pháp tấn công thụ động, kẻ tấn cơng chỉ cần bắt các gói tin trao đổi trong mạng để thu thập các IV, với số lƣợng khoảng 16.777.216 trƣờng hợp có thể của IV, trung bình khoảng từ 8 đến 10 tiếng sẽ dùng hết số IV này. Phƣơng pháp tấn công này khá đơn giản, nhƣng cần thời gian khá lâu để có thể bắt đƣợc các gói tin chứa IV trùng nhau. Một phƣơng pháp tấn công khác sử dụng thống kê và dựa trên các giả thiết về chuỗi khóa yếu, thực hiện bẻ khóa trong thời gian rất ngắn sẽ đƣợc trình bày trong phần tiếp theo.
3.1.2. Bẻ khóa sử dụng phương pháp thống kê
trƣớc đó. Hơn nữa, tồn tại các chuỗi khóa yếu trong đó các phần tử trong S tuân theo một quy luật nào đó, từ đó có xây dựng lại khóa từ những byte khóa đã biết.
Khi sử dụng kỹ thuật thống kê để bẻ khóa WEP, mỗi byte của khóa về cơ bản đƣợc xử lý riêng. Sử dụng toán học thống kê, với khả năng một byte nhất định trong các khố đƣợc đốn chính xác lên tới 15% khi các vector khởi tạo đúng (IV) đƣợc bắt cho một byte quan trọng đặc biệt. Về cơ bản, một vài IV nhất định "rị rỉ" khóa WEP bí mật cho riêng byte khóa. Đây là nền tảng cơ bản của kỹ thuật thống kê.
Bằng cách sử dụng một loạt các kiểm tra thống kê đƣợc gọi là các cuộc tấn công của FMS (tấn công bởi Fluhrer, Mantin và Shamir) và Korek, các phiếu (votes) đƣợc tích lũy cho các byte có khả năng là khóa cho mỗi byte khóa của chuỗi khóa bí mật WEP. Các byte khóa đƣợc tích lũy nhiều phiếu hơn thì càng có khả năng là byte khóa chính xác. FMS là cuộc tấn cơng quan trọng đầu tiên, tấn cơng dựa vào các IV nhằm tìm ra một mối quan hệ nào đó. Tuy nhiên cuộc tấn công này không mạnh bằng các cuộc tấn công theo phƣơng pháp thông kê đƣợc đƣa ra bởi Korek. Vì vậy các cuộc tấn cơng của Korek sẽ đƣợc trình bày trong phần tiếp theo của luận văn.
Với mỗi cuộc tấn công một số tiền xử lý đƣợc thực hiện. Giả sử chúng ta tấn cơng byte khóa thứ n (3 byte đầu tiên là IV, đặt n – 1 = p, byte khóa đầu
tiên có chỉ số là 0). Thuật tốn KSA chạy cho tới khi đạt đƣợc byte khóa chƣa biết này (cần p bƣớc), cho ta một xấp xỉ của trạng thái trong cuối cùng (mà ta kí hiệu là S). Trong khi thực hiện quá trình này chúng ta ghi lại tất cả các giá trị của j và sử dụng thông tin này để xây dựng một bảng chứa vị trí của mỗi phần tử trong S, bảng này đƣợc kí hiệu là Si.
Xấp xỉ dựa trên cơng thức tính tỷ lệ thành cơng, biểu diễn xác suất một số phần tử của trạng thái trong khơng thay đổi trong phần cịn lại của KSA. Do vậy sau p bƣớc chúng ta muốn ƣớc lƣợng xác suất mà q phần tử không thay
đổi (khi đến PRGA). Chúng ta có thể ƣớc tính xác suất này bằng: (
)
khóa kết quả đƣợc tạo ra bởi PRGA, nhóm thứ hai dựa trên byte khóa kết quả thứ nhất và thứ hai. Nhóm thứ ba bao gồm các phƣơng pháp ngƣợc để làm giảm khơng gian tìm kiếm, cũng đƣợc biết đến nhƣ là các cuộc tấn công ngƣợc “inverted attacks”. Phần tiếp theo của luận văn sẽ trình bày về các cuộc tấn cơng đại diện cho mỗi nhóm đó.
3.1.3. Cuộc tấn công thứ nhất Korek A_s5_1:
Xác suất thành công là: (253
256)256-p ≈ 5.07% (p = 3)
Cuộc tấn công đầu tiên này là sự tổng hợp của các cuộc tấn cơng FMS cổ điển trƣớc đó. Do đó các IV đƣợc chọn có các tính chất sau:
1. S[1] < p. Điều kiện này để tối đa các khả năng mà phần đầu tiên của
trạng thái trong không thay đổi.
2. (S[1] + S[S[1]]) mod 256 = p. Byte kết quả đầu tiên của khóa dịng (kí hiệu o1) sẽ phụ thuộc vào các giá trị đã biết và giá trị của byte khóa mục tiêu.
3. Si[o1] ≠ 1
4. Si[o1] ≠ S[S[1]]
Điều kiện 3 và 4 để các giá trị trong S[1] hoặc S[S[1]] không bị ghi đè lên. Nhƣ đã thấy ở trên, các tính chất này dẫn tới hai loại trạng thái trong cho một cuộc tấn công trên K[3]:
0 1 ….. ….
3 0 ….. ….
0 1 2 …..
X 2 1 …..
Chúng ta đi vào ví dụ cụ thể để hiểu rõ hơn. Giả sử ta nhận đƣợc một IV nhƣ sau:
Và ta đang tìm giá trị của K[3] (trong trƣờng hợp này bằng Si[o1] – S[p] –
jp-1 = Si[o1] – 7).
Khởi tạo: i0 = 0, j0 = 3 Bƣớc 1: i1 = 1, j1 = 3 (lƣu ý rằng: 255 + 1 = 0) Bƣớc 2: i2 = 2, j2 = 6 Bƣớc 3: i3 = 3, j3 = 7 + K[3] Bƣớc 4:
(S3 biểu diễn trạng thái trong tại bƣớc thứ 3)
Giả sử rằng các phần tử đầu của trạng thái trong sẽ không thay đổi trong phần cịn lại của KSA, ta có:
S[1] = 0 và S[0] = 3 do vậy o1 = S[ S[1] + S[S[1]] ] = S[3] = S3[7 + K[3]]. Vì j3 = 7 + K[3] = j2 + S[3] + K[3] (theo thuật toán KSA), nên
0 1 2 3 4 …... N-1 0 1 2 3 4 ….. N-1 0 1 2 3 4 5 6 ….. 3 1 2 0 4 5 6 ….. 0 1 2 3 4 5 6 ….. 3 0 2 1 4 5 6 ….. 0 1 2 3 4 5 6 ….. 3 0 2 1 4 5 6 ….. 0 1 2 3 4 5 6 ….. 3 0 6 S3[7+K[3]] 4 5 2 …..
o1 = S3[7 + K[3]] = S3[j2 + S[3] + K[3]] Do đó byte khóa bị tấn cơng có thể đƣợc tính tốn nhƣ sau:
K[3] = Si[o1] - S[3] - j2 (với Si[o1] là chỉ số của o1 trong trạng thái trong đƣợc tính tốn tại bƣớc p – 1)
Tổng quát: K[p] = Si[o1] – S[p] – jp-1[12].
3.1.4. Cuộc tấn công thứ hai: Korek A_s13:
Xác suất thành công là: (254
256)256-p ≈ 13.75% (p = 3)
Trong cuộc tấn công thứ hai này, một thủ thuật đƣợc sử dụng trong PRGA. Nếu kết thúc sau KSA với một trạng thái trong là: S[1] = p và S[p] = 0, PRGA sẽ đổi chỗ những giá trị này dẫn tới kết quả o1 = p. Để đạt đƣợc
điều này thì cần những điều kiện sau:
1. S[1] = p. Điều kiện này cho phép PRGA nhắm mục tiêu cho phần tử
thứ p trong trạng thái trong có giá trị bằng p. 2. o1 = p.
Giả sử rằng byte kết quả đầu tiên là p, giả định rằng sau khi PRGA trao đổi giá trị p sẽ đƣợc ở vị trí p, và jp =0.
Xét ví dụ cụ thể sau: Giả sử IV:
Với K[3] là mục tiêu (trong ví dụ này K[3] = Si[0] – S[p] – jp-1 = 63). Sau
đó theo KSA ta có: Khởi tạo: i0 = 0, j0 = 6 Bƣớc 1: 6 252 193 0 1 2 3 4 5 6 ….. 0 1 2 3 4 5 6 ….. 0 1 2 3 4 5 6 ….. 6 1 2 3 4 5 0 …..
i1 = 1, j1 = 3 (nhớ rằng 6+252+1 = 3)
Bƣớc 2:
i2 = 2, j2 = 198
Bƣớc 3:
i3 = 3, j3 = 199 + K[3]
(chú ý rằng ta đang đi tìm giá trị của K[3])
Trƣớc khi kiểm tra xem bƣớc 4 làm gì ta đi phân tích hành vi của PRGA. Biết rằng sau KSA ta có S[1] = p (=3), nên để có o1 = p (=3) ta phải có S[p] = 0:
i= 1 và j = S[1] = 3
Bƣớc 1 của PRGA: nhắc lại rằng trƣớc khi byte kết quả đƣợc đƣa ra thì một trao đổi đƣợc thực hiện.
Điều kiện này sẽ thiết lập o1 là: S[S[1] + S[3]] = S[0+3] = S[3] = 3 = p.
Do đó ta biết rằng j3 = Si[0] – là chỉ số của phần tử thứ 0 tại bƣớc thứ 3
của KSA (do S[3] = 0) và tổng quát hơn jp = Si[0], điều này dẫn tới giá trị của
0 1 2 3 4 5 6 ….. 6 3 2 1 4 5 0 ….. 0 1 2 3 4 5 6 ….. 6 3 198 1 4 5 0 ….. 0 1 2 3 4 5 6 ….. 6 3 198 0 4 5 1 ….. 0 1 2 3 4 5 6 ….. 6 0 198 3 4 5 1 …..
K[3] = Si[0] – S[3] – j2 = 6-1-198 = 63 (vì -193 = 62 module 256), có thể tổng
quát lên K[p] = Si[0] – S[p] – jp-1.[12]
3.1.5. Cuộc tấn công thứ 9: Korek A_s3
Xác suất thành công là: (253
256)256-p ≈ 5.13% (p = 4)
Với cuộc tấn công này ta bắt đầu với nhóm thứ hai trong các cuộc tấn công bởi Korek. Cuộc tấn công này phụ thuộc nhiều vào cuộc tấn công FMS, cho ta thấy rằng việc khai thác thông tin không chỉ từ o1 mà còn ở byte kết quả thứ hai o2. Các IV đƣợc lựa chọn cho ta các trạng thái trong trong KSA, cùng với các điều kiện sau:
1. S[1] ≠ 2. Nếu S[1] = 2 ta sẽ mất đi giá trị mà S[2] chứa trong bƣớc trao
đổi đầu tiên của PRGA. Khi đó j đầu tiên của PRGA sẽ bằng 2. Vì vậy j thứ hai sẽ bằng 2 cộng với giá trị đƣợc chứa trong S[2]. Do đó ta sẽ
khơng có o2 = S[4] (S[p]).
2. S[2] ≠ 0 để tránh tình huống mà hai j đầu tiên giống hệt nhau trong
PRGA (nhắc lại rằng j thứ hai bằng j thứ nhất cộng với S[2] ), khi đó o2 sẽ buộc phải bằng 0.
Trong bƣớc đầu tiên của PRGA, S[1] = α vì vậy j = α. Điều này sẽ thiết lập α vào S[α]. Trong bƣớc thứ hai nếu ta có S[2] = 0, j sẽ không thay
đổi giá trị. Sau khi trao đổi đƣợc thực hiện chúng ta có o2 = S[0+α] = 0.
3. S[2] + S[1] < p. Với các điều kiện trƣớc, điều này làm hạn chế giá trị
của j trong bƣớc thứ hai của PRGA. Ta đặt mục tiêu này để có thể dự đoán một xác suất cao hơn cho giá trị của S[j].
4. (S[2] + S[S[2] + S[1] ])mod 256 = p để đƣa giá trị của S[p] vào o2, với o2 = S[(S[2] + S[S[2] + S[1] ])mod 256].
5. Si[o2] ≠ 1 và Si[o2] ≠ 2 và Si[o2] ≠ S[1] + S[2]. Ta bỏ qua các trƣờng hợp này vì điều này có nghĩa là các giá trị này đã đƣợc thay đổi.
Các trạng thái trong đƣợc lựa chọn cho một cuộc tấn cơng trên K[4] có hai khả năng sau:
0 1 2 3 …
0 1 2 … …
X 0 2 … …
Nếu ta chọn trƣờng hợp đầu tiên của trạng thái trong để xác định giá trị của K[4] (ở đây K[4] = Si[o2] – S[p] – jp-1 = Si[o2] - 10).
Giả định rằng IV: Với K[3] = 3 ta có: Khởi tạo: i0 = 0, j0 = 3 Bƣớc 1: i1 = 1, j1 = 3 (nhớ rằng 255 + 1 = 0) Bƣớc 2: i2 = 2, j2 = 2 (nhớ rằng 3 + 253 + 2 = 2) Bƣớc 3: i3 = 3, j3 = 6 3 255 253 0 1 2 3 4 5 6 ….. 0 1 2 3 4 5 6 ….. 0 1 2 3 4 5 6 ….. 3 1 2 0 4 5 6 ….. 0 1 2 3 4 5 6 ….. 3 0 2 1 4 5 6 ….. 0 1 2 3 4 5 6 ….. 3 0 2 1 4 5 6 …..
Bƣớc 4:
i4 = 4, j4 = 10 + K[4]
Nhớ rằng ta đang đi tìm giá trị của K[4] Bƣớc 5:
S4 biểu diễn trạng thái trong trong bƣớc thứ 4. Bây giờ chúng ta sẽ xem PRGA thực hiện nhƣ thế nào:
i =1 và j = S[1] = 0
Bƣớc 1:
(byte kết quả đầu tiên có khả năng cao là o1 = S[3] nếu giá trị trong S[0]
không thay đổi).
Bƣớc 2: i = 2 và j = S[2] = 2
Byte kết quả thứ hai sẽ là o2 = S[ S[2] + S[S[2] + 0] ]= S[4] = S4[ 10 +
K[4]]. Do vậy ta có thể khơi phục K[4] = Si[o2] – S[4] – j3 và tổng quát K[p] = Si[o2] – S[p] – jp-1. Chú ý rằng Si[o2] là chỉ số của o2 trong trạng thái trong
đƣợc tính tốn tại bƣớc p (bƣớc 4 trong ví dụ) và S[p] đƣợc thực hiện trong
cùng trạng thái trong (bƣớc p)[12]. 0 1 2 3 4 5 6 ….. 3 0 2 6 4 5 1 ….. 0 1 2 3 4 5 6 ….. 3 0 2 6 S4[10+K[4]] 5 1 ….. 0 1 2 3 4 5 6 ….. 0 3 2 ? S4[10+K[4]] ? ? ….. 0 1 2 3 4 5 6 ….. 0 3 2 ? S4[10+K[4]] ? ? …..
3.1.6. Cuộc tấn công thứ 17: Korek A_neg
Cuộc tấn cơng cuối cùng tƣơng ứng với nhóm cuối cùng của các cuộc tấn cơng bởi Korek: làm giảm kích thƣớc khơng gian tìm kiếm. Trong phần này Korek xác định bốn trƣờng hợp và các byte khóa nào bị loại ra trong các trƣờng hợp đó.
3.1.6.1. Trường hợp 1
Trƣờng hợp đầu tiên lọc các trƣờng hợp mà tại bƣớc thứ p của KSA nhƣ
sau:
0 1 2 3 …
? 2 0 ? …
Theo trạng thái trong này và nếu S[1], S[2] khơng thay đổi giá trị sau đó
trong KSA, chúng ta sẽ có đƣợc kết quả đầu tiên bằng 2. Bƣớc 1 của PRGA: Trƣớc khi đổi chỗ:
0 1 2 3 … ? 2 0 ? …
i = 1 và j = S[1] = 2
Sau khi đổi chỗ: 0 1 2 3 …
? 0 2 ? …
o1 = S[0 + 2] = 2
Do đó nếu ta thấy o1 = 2 với ƣớc tính nhƣ trên của KSA, ta có thể suy ra
rằng giá trị của jp đã khơng thay đổi S[1] và S[2]. Do đó trong trƣờng hợp này ta có thể từ chối một số byte theo công thức sau:
K[p] ≠ 1 – S[p] – jp-1 và K[p] ≠ 2 – S[p] – jp-1.
3.1.6.2. Trường hợp 2
Nhóm thứ hai vẫn có điều kiện S[2] = 0. Tuy nhiên chúng ta tìm kiếm
byte kết quả thứ hai và ta chọn giá trị o2 = 0, chúng ta có thể tóm lại các điều kiện nhƣ sau:
1. S[2] = 0. 2. o2 = 0.
3. S[1] ≠ 2 hoặc o1 ≠ 2.
Chúng ta đi vào phân tích trƣờng hợp đầu tiên S[1] ≠ 2, sau đó tại bƣớc
0 1 2 3 …
? α 0 ? …
Với α ≠ 2
Chú ý rằng ở đây α ≠ 0 do S[2] = 0. Theo PRGA chúng ta sẽ nhận đƣợc: Bƣớc 1 của PRGA:
Trƣớc khi đổi chỗ:
0 1 2 3 … α … ? α 0 ? … ? …
i = 1 và j = S[1] = α
Sau khi đổi chỗ:
0 1 2 3 … α … ? ? 0 ? … α …
Ta không xét đến giá trị của o1 tại thời điểm này.
Bƣớc 2 của PRGA: Trƣớc khi đổi chỗ:
0 1 2 3 … α … ? ? 0 ? … α …
i = 2 và j = α + S[2] = α
Sau khi đổi chỗ:
0 1 2 3 … α … ? ? α ? … 0 …
o2 = S[α + 0] = 0 (tƣơng ứng với yêu cầu của chúng ta)
Dễ dàng thấy rằng giá trị trong S[2] nên đƣợc giữ khơng thay đổi, do vậy byte khóa làm cho S[2] thay đổi nên đƣợc loại bỏ. Vậy K[p] ≠ 2 – S[p] – jp – 1.
Bây giờ nếu ta xét trƣờng hợp o1 ≠ 2, ta có thể kiểm tra bằng cách phân tích những gì sảy ra khi ta có S[1] = 2 tại cùng một thời điểm (điều này là có thể vì điều kiện của chúng ta là “hoặc”). Nhìn vào nhóm đầu tiên của các trƣờng hợp ta thấy rằng tình huống này sẽ khơng đem lại cho chúng ta nhiều thông tin (knowledge).
3.1.6.3. Trường hợp 3
Nhóm thứ ba thay đổi điều kiện chọn, bây giờ ta quan tâm đến trƣờng hợp
S[1] = 1. Nếu S[1] khơng thay đổi, nó sẽ buộc giá trị trong S[2] đƣợc đƣa ra
trong byte kết quả đầu tiên, do đó điều kiện thứ hai là o1 = S[2].
0 1 2 3 …
? 1 o1 ? …
Dễ dàng thấy rằng nếu S[1] không thay đổi và bằng 1, thì bƣớc đầu tiên
thay đổi thì các byte khóa làm thay đổi chúng sẽ bị loại bỏ, tức là K[p] ≠ 1 –
S[p] – jp-1 và K[p] ≠ 2 – S[p] – jp-1.
3.1.6.4. Trường hợp 4
Nhóm cuối cùng của việc giảm các byte khóa đƣợc đƣa ra bởi Korek liên quan đến trƣờng hợp giá trị 0 và 1 đƣợc giữ tại phần đầu tiên của trạng thái trong: S[1] = 0 và S[0] = 1. Nếu hai giá trị này không thay đổi sau các bƣớc
tính tốn trƣớc đó của KSA, chúng sẽ cho kết quả trong PRGA để tạo ra o1 = 1 (o1 = 1 là tiêu chí để xác định trƣờng hợp này).
Bƣớc 1 của PRGA: Trƣớc khi đổi chỗ:
0 1 2 … 1 0 ? …
i = 1 và j = S[1] = 0
Sau khi đổi chỗ: 0 1 2 … 1 0 ? …
Sau đó o1 = S[0 + 1] = 1
Vì vậy S[0] và S[1] cần phải khơng thay đổi khi đến PRGA.Tuy nhiên, ở đây cả hai đều sai do thực tế nếu ta thiết lập jp = 0 ta vẫn sẽ nhận một kết quả