免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 8069 | 回复: 25
打印 上一主题 下一主题

贴一个能进行IP跳转欺骗的模块给大家玩玩:) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-24 16:36 |只看该作者 |倒序浏览
贴一下能对目标IP进行修改的模块,介绍能对目标IP进行重定位,如本来访问的是baidu.com,通过这么一定位就能自动跳转到google.com,如果放在FORWART链上,那么能对所用通过此机NAT的机器进行IP跳转,比较好玩;但我这边试有点问题,貌似不能正常建立三次握手。。大家贴一下测试结果。。。。


附代码:
#define _KERNEL_

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/skbuff.h>
#include <linux/netdevice.h>
#include <linux/config.h>
#include <linux/ip.h>
#include <linux/inet.h>
#include <linux/in.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>

#define ALERT(fmt,args...) printk("Test: " fmt,##args)

#define REALIP        "10.1.100.20"              /* port that appears on the wire */
#define FAKEIP        "10.1.100.21"              /* port that appears on the wire */


static struct nf_hook_ops nfho_in;
static struct nf_hook_ops nfho_out;

//static unsigned char *drop_ip ="\x2a\xd7\xf1\x1";

__u32 in_aton(const char *);

unsigned long int magic_ip;
char *ip;
//MODULE_PARM(ip, "s");


static unsigned int my_call_out(unsigned int hooknum,struct sk_buff **skb,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const struct net_device *in,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const struct net_device *out,int(*okfn)(struct sk_buff*))
{
&nbsp;&nbsp;&nbsp;&nbsp;struct sk_buff *sk = *skb;
&nbsp;&nbsp;&nbsp;&nbsp;struct iphdr *iph = (*skb)->nh.iph;
&nbsp;&nbsp;&nbsp;&nbsp;struct tcphdr *th = (struct tcphdr*)((int *)iph+iph->ihl);
&nbsp;&nbsp;&nbsp;&nbsp;unsigned short size;
&nbsp;&nbsp;&nbsp;&nbsp;int doff = 0;
&nbsp;&nbsp;&nbsp;&nbsp;int csum = 0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( iph->daddr == in_aton(FAKEIP) && iph->protocol == IPPROTO_TCP ) {

printk("test IP packet with packet to %d.%d.%d.%d \n",NIPQUAD(iph->daddr));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iph->daddr = in_aton(REALIP);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iph->check = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);  

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size = ntohs(iph->tot_len) - (iph->ihl * 4);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doff = th->doff << 2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sk->csum = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;csum = csum_partial( sk->h.raw + doff, size - doff, 0 );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sk->csum = csum;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;th->check = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;th->check = csum_tcpudp_magic(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iph->saddr,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iph->daddr,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iph->protocol,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;csum_partial(sk->h.raw, doff, sk->csum)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;return NF_ACCEPT;
}

static unsigned int my_call_in(unsigned int hooknum,struct sk_buff **skb,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const struct net_device *in,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const struct net_device *out,int(*okfn)(struct sk_buff*))
{
&nbsp;&nbsp;&nbsp;&nbsp;struct sk_buff *sk = *skb;
&nbsp;&nbsp;&nbsp;&nbsp;struct iphdr *iph = (*skb)->nh.iph;
&nbsp;&nbsp;&nbsp;&nbsp;struct tcphdr *th = (struct tcphdr*)((int *)iph+iph->ihl);
&nbsp;&nbsp;&nbsp;&nbsp;unsigned short size;
&nbsp;&nbsp;&nbsp;&nbsp;int doff = 0;
&nbsp;&nbsp;&nbsp;&nbsp;int csum = 0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (  iph->saddr == in_aton(REALIP)  && iph->protocol == IPPROTO_TCP  ) {

printk("test IP packet with packet from %d.%d.%d.%d \n",NIPQUAD(iph->daddr));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iph->saddr = in_aton(FAKEIP);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iph->check = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);  

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size = ntohs(iph->tot_len) - (iph->ihl * 4);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doff = th->doff << 2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sk->csum = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;csum = csum_partial( sk->h.raw + doff, size - doff, 0 );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sk->csum = csum;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;th->check = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;th->check = csum_tcpudp_magic(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iph->saddr,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iph->daddr,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iph->protocol,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;csum_partial(sk->h.raw, doff, sk->csum)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NF_ACCEPT;
}

__u32 in_aton(const char *str) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned long l;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned int val;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (i = 0; i < 4; i++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l <<= 8;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (*str != '\0') {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (*str != '\0' && *str != '.') {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val *= 10;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val += *str - '0';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l |= val;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (*str != '\0')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return    (htonl(l));
}




static int __init init(void)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ALERT("insmod ok!\n");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfho_in.hook     =my_call_in ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfho_in.hooknum  = NF_IP_PRE_ROUTING; /* First for IPv4 */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfho_in.pf       = PF_INET;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfho_in.priority = NF_IP_PRI_FIRST;   /* Make our func first */

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfho_out.hook     =my_call_out ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfho_out.hooknum  = NF_IP_POST_ROUTING; /* First for IPv4 */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfho_out.pf       = PF_INET;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfho_out.priority = NF_IP_PRI_FIRST;   /* Make our func first */

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nf_register_hook(&nfho_in);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nf_register_hook(&nfho_out);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;

}

static void __exit fini(void)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ALERT("rmsmod ok!\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nf_unregister_hook(&nfho_in);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nf_unregister_hook(&nfho_out);
}


module_init(init);
module_exit(fini);


[ 本帖最后由 platinum 于 2007-9-25 10:18 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-09-24 23:00 |只看该作者
没人给点建议吗???版主??

[ 本帖最后由 GNM 于 2007-9-24 23:02 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-09-25 10:23 |只看该作者
skb->csum 是做什么用的?我没用过这个元素,不知道这个和 IP、TCP 的 check 有什么不同?
另外,my_call_out 挂载为 NF_IP_PRI_LAST 是不是更好?

不能建立三次握手我还要抓包测试一下才知道,现在没有条件,回头再说

[ 本帖最后由 platinum 于 2007-9-25 10:25 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-09-25 11:39 |只看该作者
谢谢platinum,我再调整测试一下,有结果通报给大家。。

论坛徽章:
0
5 [报告]
发表于 2007-09-25 14:02 |只看该作者
唉,试了还是不行,三次握手前两次正常,就是第三次没有响应,要不然是这个流程上就有问题???请platinum贴一下测试结果。。。搞了两三天了,郁闷死了!!!!!!!!!!

论坛徽章:
0
6 [报告]
发表于 2007-09-25 17:02 |只看该作者
把tcp的报文发上来看看,我做过这种重定向,不过我是全部在内核态做的, 是linux自身模拟成了客户端需要访问的目的机器, 和客户端完成3次握手,然后发送重定向http报文

[ 本帖最后由 yj1804 于 2007-9-25 17:03 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-09-25 17:45 |只看该作者
这个模块思路与楼上所说的模块基本上是一模一样(不知能否提供源码学习学习?)
以下为抓包结果:基本上前两次握手是正常的,ack序列号也正常,但就是客户端无法正常发送第三次握手信息给目的端。
在客户端输入:telnet 192.168.253.206 60011  (实际第一个包发给了192.168.255.30,实现跳转,收到的源IP会再次改成192.168.253.206)

13:53:00.185227 IP 192.168.112.199.32792 > 192.168.255.30.60011: S 2719716967:2719716967(0) win 5840 <mss 1460,sackOK,timestamp 98150102 0,nop,wscale 2>
13:53:00.185824 IP 192.168.253.206.60011 > 192.168.112.199.32792: S 390424671:390424671(0) ack 2719716968 win 5792 <mss 1460,sackOK,timestamp 1173758796 98150102,nop,wscale 0>

论坛徽章:
0
8 [报告]
发表于 2007-09-27 17:31 |只看该作者
楼主不用  skb_copy() 就可以修改 报文了 ?

论坛徽章:
0
9 [报告]
发表于 2007-09-28 23:49 |只看该作者
可以,直接修改包就行了,但检验和这步通不过,郁闷死了,能力有限,版主老大们也不帮个忙唉...... .

论坛徽章:
0
10 [报告]
发表于 2007-09-29 08:55 |只看该作者
其实这个很好检查的,
建议用wireshark抓包  如果是校验不过的话,肯定是要用skb_copy()
的,我重来没听说不用就可以改包的,我以前也是校验出错,后来发现是没用skb_copy()。

等下发个我写的nat ,供交流学习。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP