亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12
最近訪問(wèn)板塊 發(fā)新帖
樓主: liudeyi545
打印 上一主題 下一主題

[內(nèi)核模塊] 攔截自己編寫的ARP發(fā)包程序發(fā)出去的ARP包不成功 [復(fù)制鏈接]

論壇徽章:
0
11 [報(bào)告]
發(fā)表于 2015-01-05 19:34 |只看該作者
我不是很理解了。。我這個(gè)抓包程序應(yīng)該是可以抓到本機(jī)發(fā)出去的所有ARP包的吧?我的發(fā)包程序發(fā)出去的包自然應(yīng)該被捕獲到吧?我理解的是這樣的。
下面是我的發(fā)包程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <sys/types.h>
#include <asm/types.h>
#include <features.h> /* 需要里面的 glibc 版本號(hào) */
#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
        #include <netpacket/packet.h>
        #include <net/ethernet.h> /* 鏈路層(L2)協(xié)議 */
#else
        #include <asm/types.h>
        #include <linux/if_packet.h>
        #include <linux/if_ether.h> /* 鏈路層協(xié)議 */
#endif
#include <netinet/if_ether.h>

#define INLEN 4
#define MAC_BCAST_ADDR  (uint8_t *) "\xff\xff\xff\xff\xff\xff"

void usage_quit(char *arg0);
int get_ifi(char *dev, char *mac, int macln, struct in_addr *lc_addr, int ipln);
void prmac(u_char *ptr);

int main(int argc, char **argv)
{
        if(argc != 2)
                usage_quit(argv[0]);

        int reqfd, recvfd, salen, n;  
        u_char *mac;
        char recv_buf[120], rep_addr[16];
        struct in_addr lc_addr, req_addr;
        struct sockaddr_ll reqsa, repsa;
        struct arp_pkt {
                struct ether_header eh;
                struct ether_arp ea;
                u_char padding[18];
        } req;
      
        bzero(&reqsa, sizeof(reqsa));
        reqsa.sll_family = PF_PACKET;
        reqsa.sll_ifindex = if_nametoindex("eth0");

        if((reqfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_RARP))) < 0) {
                perror("Socket error");
                exit(1);
        }

        mac = (char *)malloc(ETH_ALEN);
        bzero(&req, sizeof(req));

        if(get_ifi("eth0", mac, ETH_ALEN, &lc_addr, INLEN)) {
                fprintf(stderr, "Error: Get host’s information failed\n");
                exit(0);
        }
        char *temparp="00:31:88:0e:00:45";//隨便構(gòu)造的虛假的mac地址
        /* 填寫以太網(wǎng)頭部*/
        memcpy(req.eh.ether_dhost, MAC_BCAST_ADDR, ETH_ALEN);
        memcpy(req.eh.ether_shost, temparp, ETH_ALEN);
        req.eh.ether_type = htons(ETHERTYPE_ARP);

        /* 填寫arp數(shù)據(jù) */
        req.ea.arp_hrd = htons(ARPHRD_ETHER);
        req.ea.arp_pro = htons(ETHERTYPE_IP);
        req.ea.arp_hln = ETH_ALEN;
        req.ea.arp_pln = INLEN;
        req.ea.arp_op = htons(ARPOP_REQUEST);
        memcpy(req.ea.arp_sha, temparp, ETH_ALEN);
        memcpy(req.ea.arp_spa, &lc_addr, INLEN);
        inet_aton(argv[1], req.ea.arp_tpa);
//下面一直循環(huán)發(fā)送......
        while(1){       

                if((n = sendto(reqfd, &req, sizeof(req), 0, (struct sockaddr *)&reqsa, sizeof(reqsa))) <= 0) {
                        perror("Sendto error");
                        exit(1);
                }
                printf("Broadcast arp request of %s, %d bytes be sent\n\n", argv[1], n);
        sleep(2);
        }

        recvfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ARP));
        bzero(recv_buf, sizeof(recv_buf));
        bzero(&repsa, sizeof(repsa));
        salen = sizeof(struct sockaddr_ll);

        free(mac);
}

int get_ifi(char *dev, char * mac, int macln, struct in_addr *lc_addr, int ipln)
{
        int reqfd, n;
        struct ifreq macreq;

        reqfd = socket(AF_INET, SOCK_DGRAM, 0);
        strcpy(macreq.ifr_name, dev);

        /* 獲MAC地址*/
        if(ioctl(reqfd, SIOCGIFHWADDR, &macreq) != 0)
                return 1;
        memcpy(mac, macreq.ifr_hwaddr.sa_data, macln);

        /* 獲iP地址*/
        if(ioctl(reqfd, SIOCGIFADDR, &macreq) != 0)
                return 1;
        memcpy(lc_addr, &((struct sockaddr_in *)(&macreq.ifr_addr))->sin_addr, ipln);

        return 0;
}      

void prmac(u_char *ptr)
{
        printf("        Peer MAC is: %02x:%02x:%02x:%02x:%02x:%02x\n",*ptr,*(ptr+1),*(ptr+2),*(ptr+3),*(ptr+4),*(ptr+5));
}

void usage_quit(char *arg0)
{
        fprintf(stderr, "Usage: %s <query_IP>\n", arg0);
        exit(1);
}

回復(fù) 10# tc1989tc

論壇徽章:
0
12 [報(bào)告]
發(fā)表于 2015-01-05 19:51 |只看該作者
回復(fù) 9# liudeyi545
10樓說(shuō)的很有道理。

這里分析下可能的原因
你自己發(fā)送arp包應(yīng)該是應(yīng)用程序socket構(gòu)造包吧
那么你使用的socket類型是什么? SOCK_RAW?
linux socket有很強(qiáng)大的功能。可以在網(wǎng)絡(luò)層發(fā)包,也可以在鏈路層發(fā)包

而arp其實(shí)是網(wǎng)絡(luò)層協(xié)議
若果你在鏈路層發(fā)包,而在網(wǎng)絡(luò)層過(guò)濾,那應(yīng)該是過(guò)濾不掉的

當(dāng)然以上是猜想沒(méi)試過(guò)。你可以寫個(gè)鏈路層發(fā)包用iptables一試就知道了。不過(guò)按道理肯定是這樣的。因?yàn)榧热辉阪溌穼影l(fā)包,自己構(gòu)造以太網(wǎng)頭 和網(wǎng)絡(luò)頭 那還有什么必要走網(wǎng)絡(luò)層?



   

論壇徽章:
0
13 [報(bào)告]
發(fā)表于 2015-01-05 19:58 |只看該作者
回復(fù) 11# liudeyi545
剛看到你的程序。應(yīng)該就是鏈路層構(gòu)造包引起的。
其實(shí)一般arp防御都是做在目的機(jī)器上,做在源機(jī)器上還真是少見
如果一定要做,估計(jì)你只能在驅(qū)動(dòng)里面進(jìn)行防御了

另外單純的arp處理一般不能完全杜絕欺騙。因?yàn)檫可能 有mac轉(zhuǎn)移攻擊。一般是arp靜態(tài)綁定 + 網(wǎng)關(guān)或交換機(jī) mac port綁定 就基本解決所有問(wèn)題了


   

論壇徽章:
0
14 [報(bào)告]
發(fā)表于 2015-01-05 20:09 |只看該作者
http:  //3y.uu456.com/bp-c31f46ec4afe04a1b071des1-1.html
試試這個(gè)發(fā)包。sock = socket(AF_INET, SOCK_PACKET, htons(ETH_P_RARP)); 應(yīng)該這種發(fā)包方式是能過(guò)濾掉的
不過(guò)可能存在 arp數(shù)據(jù)源mac 跟 以太網(wǎng)頭源mac不一致的問(wèn)題

論壇徽章:
0
15 [報(bào)告]
發(fā)表于 2015-01-05 20:40 |只看該作者
你好,我其實(shí)是在開發(fā)一款Linux ARP防火墻,想像360一樣實(shí)現(xiàn)雙向攔截,但在做內(nèi)部發(fā)出攔截的時(shí)候遇到了這個(gè)問(wèn)題。因?yàn)楸救藢?duì)網(wǎng)絡(luò)了解比較少,不太明白,我的發(fā)包程序發(fā)出去的包不經(jīng)過(guò)網(wǎng)絡(luò)層直接是從鏈路層發(fā)出去的嗎?如果是這樣的話,如果我想徹底攔截本機(jī)發(fā)出去的所有的包,掛載點(diǎn)又該在哪兒呢?因?yàn)槿绻抑桓淖兾页绦虬l(fā)包的位置最后實(shí)現(xiàn)攔截是沒(méi)有意義的,我還是希望徹底攔截本機(jī)所有ARP包。我參看了netfilter和iptables的源碼,沒(méi)找到關(guān)于掛載點(diǎn)的說(shuō)明。還望大神指點(diǎn)!回復(fù) 13# anyhit


   

論壇徽章:
0
16 [報(bào)告]
發(fā)表于 2015-01-05 20:48 |只看該作者
你好,我剛才經(jīng)過(guò)您的提醒發(fā)現(xiàn)了這個(gè)問(wèn)題,我發(fā)包程序的ARP包是鏈路層產(chǎn)生的,而我ARP攔截是在網(wǎng)絡(luò)層,那如果我想攔截包括鏈路層產(chǎn)生的包,netfilter提供這樣的機(jī)制或者掛載點(diǎn)嗎?回復(fù) 10# tc1989tc


   

論壇徽章:
0
17 [報(bào)告]
發(fā)表于 2015-01-06 10:27 |只看該作者
回復(fù) 15# liudeyi545
netfilter沒(méi)用。這個(gè)工作在網(wǎng)絡(luò)最上層
arp 內(nèi)核模塊應(yīng)該也沒(méi)用。這個(gè)應(yīng)該工作在網(wǎng)絡(luò)最底層。走過(guò)netfilter之后,ip數(shù)據(jù)包里的mac構(gòu)造就是arp模塊的事情

而你要做的事情。因?yàn)闆](méi)做過(guò)。不好貿(mào)然回答。這里有三個(gè) 方案,僅供參考,可實(shí)現(xiàn)性需你自己驗(yàn)證
1. 做在網(wǎng)絡(luò)驅(qū)動(dòng)層的tx函數(shù)里面。這個(gè)肯定是能解決問(wèn)題的。
  但是要處理的事情就很多了。因?yàn)椴煌木W(wǎng)卡對(duì)應(yīng)的驅(qū)動(dòng)可能不一樣。而且需要重新編譯內(nèi)核。主要的工作量在于讀源碼
2.追蹤下socket raw的內(nèi)核代碼?茨懿荒墚a(chǎn)生靈感
3.你提到了應(yīng)用層防火墻的事情
  那么可否換種思路。應(yīng)用層采用socket raw統(tǒng)計(jì)發(fā)出去的arp包。然后如果發(fā)現(xiàn)有問(wèn)題,就報(bào)出一個(gè)警告;蛘呖纯茨芊穸ㄎ话l(fā)包應(yīng)用

最后你那個(gè)過(guò)濾程序 其實(shí)更重要的是匹配源ip是否本地的ip。一般攻擊都是偽造arp包中的ip。有兩種方式1.偽造內(nèi)網(wǎng)pc的所有源ip發(fā)包欺騙網(wǎng)關(guān) 2.偽造網(wǎng)關(guān)源ip欺騙內(nèi)網(wǎng)所有pc

因?yàn)閭卧煸磎ac太難了。mac那么多位很難窮盡。但ip一般就一個(gè)網(wǎng)段。254個(gè)arp包搞定所有

   

論壇徽章:
0
18 [報(bào)告]
發(fā)表于 2023-05-02 12:06 |只看該作者
你hook的位置不對(duì),NF_ARP_OUT只能攔截鏈路層進(jìn)來(lái)的包,沒(méi)法攔截本機(jī)生成的包了。要攔截所有的包,試試egress?
12
返回列表 發(fā)新帖
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP