作为一种学习经验,我正在尝试创建一个内核模块来修改来自特定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而不是虚拟机我是欺骗。
感谢您的帮助!