以上討論的是欺騙兩臺(tái)主機(jī) , 假如我能讓局域網(wǎng)中每一臺(tái)主機(jī)的ARP高速緩存中關(guān)于其它任意一個(gè)主機(jī)所對(duì)應(yīng)的MAC地址都為我的MAC地址(04:04:04:04) , 則本局域網(wǎng)中所有數(shù)據(jù)包我都能捕捉到!
6. 程序設(shè)計(jì)思路
使用到的函數(shù)包
libpcap : 捕捉ARP數(shù)據(jù)包 。
libnet : 獲得本機(jī)的MAC地址和IP地址;構(gòu)造和發(fā)送ARP欺騙包 。
這兩個(gè)的函數(shù)包的使用在網(wǎng)上資料很多 , 本文中不介紹 。
主要數(shù)據(jù)結(jié)構(gòu)
程序中有兩個(gè)全局變量 , MYIP代表本機(jī)的IP地址 , MYMAC代表本機(jī)的MAC地址 。
程序中維護(hù)一個(gè)存放主機(jī)信息的鏈表:
typedef strUCt host HOST;
struct host
{
unsigned long ip; // IP地址
unsigned char mac[6]; // MAC地址
int mac_flag;// 0:MAC為空 , 1:MAC不為空
HOST * next;
};
把握本局域網(wǎng)中每一臺(tái)主機(jī)的IP地址和MAC地址信息 。
利用libpcap捕捉網(wǎng)絡(luò)中的ARP請(qǐng)求/應(yīng)答包 , 最大限度的提取相關(guān)信息 。如在第五節(jié)中的B對(duì)A的ARP請(qǐng)求包 , 我們可以提取出關(guān)于B的完整信息(2.2.2.2 , 02:02:02) , 也獲得了關(guān)于A的部分信息(1.1.1.1 , null) 。在知道網(wǎng)絡(luò)中有主機(jī)A的情況下 , 我們可以構(gòu)造并發(fā)送對(duì)A的ARP請(qǐng)求包 , 捕捉A的ARP應(yīng)答包 , 從而完整把握A的信息 。同理 , 我們也可以捕捉TCP/UDP等數(shù)據(jù)包 , 從中提取信息 。
創(chuàng)建一個(gè)向鏈表增加主機(jī)信息的函數(shù):add_host(ip , mac) , 每收到一個(gè)ARP請(qǐng)求/應(yīng)答包 , 都執(zhí)行add_host( )兩次:add_host(發(fā)送端IP , 發(fā)送端MAC) , add_host(目的端IP , 目的端MAC) 。
在收到ARP應(yīng)答包時(shí) , 首先檢查發(fā)送端的IP和MAC , 假如IP不是自己的 , 但MAC是自己的 , 則說(shuō)明此應(yīng)答包是本機(jī)構(gòu)造的ARP欺騙包 , 程序忽略 。
對(duì)于正常的ARP請(qǐng)求包和應(yīng)答包 , add_host(ip , mac )中IP或MAC只要有一個(gè)是自己的(ip == MYIPmac ==MYMAC) , 則程序忽略 。顯然 , 沒(méi)有必要自己欺騙自己 。
add_host(ip , mac)遍歷主機(jī)鏈表 , 假如IP存在 , 且MAC不空 , 則把MAC地址寫入;假如不存在 , 則增加一個(gè)HOST節(jié)點(diǎn) , 寫入IP地址 , 假如MAC不空 , 則也把MAC地址寫入 。注重到這樣一個(gè)情況:在ARP請(qǐng)求包中 , 目的MAC地址是沒(méi)有意義的 , 所以我們只寫入IP地址 , 而MAC地址用NULL來(lái)表示 。這是我們收集網(wǎng)絡(luò)拓樸結(jié)構(gòu)的一種被動(dòng)方法 。
函數(shù)add_host( )邏輯設(shè)計(jì)MYIP = IP(d) , MYMAC = MAC(d)
代碼如下:
void add_host(u_long ip, u_char * mac)
{
HOST * new = NULL;
HOST * cur = NULL;
if( (ip == MYIP)(mac && mac_equal(mac, MYMAC)) )
return;
//遍歷鏈表查詢IP地址
for(cur = head; cur; cur = cur->next)
{
if( ip == cur->ip )
{
if( mac ) // MAC地址不空 , 則寫入
{
memcpy(cur->mac, mac, ETHER_ADDR_LEN);
cur->mac_flag = 1;
}
return;
}
}
if(cur == NULL) // 鏈表中沒(méi)有此IP地址
{
new = (HOST *)malloc(sizeof(HOST));
new->ip = ip;
if( mac )
{
memcpy(new->mac, mac, ETHER_ADDR_LEN);
new->mac_flag = 1;
}
else
new->mac_flag = 0;
new->next = NULL;
if(! head) // 把新節(jié)點(diǎn)加入鏈表
{
head = new;
tail = new;
}
else
{
tail->next = new;
tail = new;
}
}
return;
}
周期性的向局域網(wǎng)中每一臺(tái)主機(jī)發(fā)送ARP欺騙包 。
創(chuàng)建一個(gè)發(fā)送ARP欺騙包的函數(shù)send_fake_arp_packet() , 遍歷主機(jī)鏈表的每一個(gè)IP地址 , 假如此IP地址的MAC地址已知 , 則遍歷主機(jī)鏈表中其它IP地址 , 以其它IP地址和本機(jī)的MAC地址為發(fā)送端 , 以選中的IP地址和MAC地址為目的端 , 構(gòu)造并發(fā)送ARP應(yīng)答欺騙包;假如此IP地址的MAC地址未知 , 則以本機(jī)IP地址和MAC地址為發(fā)送端 , 以選中的IP地址為目的端 , 構(gòu)造并發(fā)送正常的ARP請(qǐng)求包 。注重 , 這是我們收集網(wǎng)絡(luò)拓樸結(jié)構(gòu)的一種主動(dòng)方法 。
推薦閱讀
- LAPB、X.25和X.25交換配置命令
- 交換機(jī)應(yīng)用點(diǎn)概要
- 華為交換機(jī)端口監(jiān)聽(tīng)配置
- 上海有線網(wǎng)絡(luò)IP優(yōu)化&SDH&三層交換網(wǎng)絡(luò)集成
- 華為交換機(jī)端口鏡像配置
- 華為交換機(jī)中小企業(yè)或大企分支機(jī)構(gòu)的常用配置
- 交換機(jī)WEB網(wǎng)管配置
- 華為交換機(jī)ip mac 端口綁定??!
- 交談名詞解釋 交談的定義
- 軟交換技術(shù)備戰(zhàn)下一代通信網(wǎng)絡(luò)探討
