修改数据包有效负载netfilter内核模块

时间:2017-08-02 01:52:10

标签: c linux linux-kernel kernel-module netfilter

作为一种学习经验,我正在尝试创建一个内核模块来修改来自特定IP地址的传入数据包。我的设置如下:

VM1:arpspoofs VM2-> VM3和VM3-> VM2,运行内核模块

VM2:nc主机

VM3:通过nc连接到VM2

现在,我只是试图将整个有效负载更改为随机字符,比如说将来,虽然我将把有效负载完全更改为全新的有效负载或修改的有效负载。现在我只是想让它发挥作用。

这是我的代码:

unsigned int in_hook(void *priv, struct sk_buff * skb, const struct nf_hook_state *state) {
    struct tcphdr *tcph = tcp_hdr(skb);
    struct iphdr *iph = ip_hdr(skb);
    struct tcphdr *modtcph;
    unsigned char *tail;
    unsigned char *user_data;
    unsigned char *it;
    struct sk_buff * modskb;
    char * tempPay;
    char * payload; //Char array to store original payload before modifications
    int lenOrig;
    int lenNew;
    u16 sport, dport;
    u32 saddr, daddr;
    tempPay = kmalloc(1500, GFP_KERNEL);
    payload = kmalloc(1500, GFP_KERNEL);
    if (!skb)
            return NF_ACCEPT;
    saddr = ntohl(iph->saddr);
    daddr = ntohl(iph->daddr);
    sport = ntohs(tcph->source);
    dport = ntohs(tcph->dest);
    tail = skb_tail_pointer(skb);
    if (saddr == 3232249857) { //IP address of computer SSHing to VM1
            return NF_ACCEPT;
    }
    user_data = (unsigned char *)((unsigned char *)tcph + (tcph->doff * 4));

    if(saddr == 3232249868 || saddr == 3232249869) {  //The IP address of VM2 and VM3
            lenOrig = 0;
            for (it = user_data; it != tail; ++it) {
                    char c = *(char *)it;
                    if (c == '\0') {
                            break;
                    }
                    else {
                            *it = 'h';
                    }
                    payload[lenOrig] = c;
                    lenOrig++;
            }
            ip_send_check(iph);
            payload[lenOrig] = '\0';
            printk("NETFILTER.C: DATA OF ORIGINAL SKB: %s", payload);
    }
    return NF_ACCEPT;
}

现在我通过VM2或VM3发送:"你好"或任何其他字符串,我希望在另一个VM" hhhhh"但另一个VM仍然看到了#34;你好",我做错了什么? for循环工作正常,因为有效负载只有原始数据包有效负载。

我的理论是,在进行中间攻击的人时,VM2和VM3之间的原始连接永远不会被切断,所以我的模块正常工作,但是当它将新的套接字缓冲区发送到VM3或VM2时,它会忽略它它没有期待另一个数据包或它通过攻击看到并仍然将VM1视为VM1而不是虚拟机我是欺骗。

感谢您的帮助!

0 个答案:

没有答案