没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux核心堆栈揭秘:Netfilter与hook后门技术
Linux核心堆栈揭秘:Netfilter与hook后门技术
![](https://csdnimg.cn/release/wenkucmsfe/public/img/star.98a08eaa.png)
深入理解Linux核心堆栈,特别是netfilter模块,是本文的主要议题。netfilter是Linux内核2.4版本中的一项关键组件,它允许网络开发者对数据包进行过滤、网络地址转换(NAT)和连接跟踪等操作。通过一系列内核代码中的hook函数,开发者能够注册回调函数,对特定网络事件进行处理,例如数据包的接收。 文章详细探讨了模块编写者如何巧妙地利用这些hook函数来达成特殊目的,包括可能存在的恶意行为,如创建后门通信。作者着重于IPv4的hook功能,尽管也提及了对其他协议的支持,但以IPv4为例进行了讲解。实验环境基于Linux 2.4.5,作者在环回接口、以太网和点对点连接上进行了测试,并假设读者具备C语言编程基础和可加载模块的知识。 本文的重点并不在于提供Netfilter的全面技术文档或iptables命令手册,而是深入剖析其工作原理及其潜在的应用和安全问题。此外,作者提醒读者,虽然文章中的代码经过了测试,但仍可能存在错误,并明确表示不承担由此产生的任何责任。作者鼓励读者提出反馈和改进意见,尤其是关于netfilter的高级技巧。 阅读这篇深入的文章,读者将能对Linux内核的netfilter系统有更深入的理解,包括其工作机制、潜在风险以及如何避免或应对这些问题。这对于网络安全专业人员、系统管理员和开发者来说,是一篇不可或缺的参考材料。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/9484192/bg8.jpg)
4. conststructnet_device*out,
5. int(*okfn)(structsk_buff*));
6 函数的第一个参数用于指定表 # 中给出的 类型中的一个。第
二个参数是一个指针,(在以前的内核版本中是一个双重指针现在已更改)该指针
指向一个 &6 数据结构,网络堆栈用 &6 数据结构来描述数据包。这个数
据结构在 2& 中定义,由于它的内容太多,在这里我将仅列出其中有意
义的部分。
&6 数据结构中最有用的部分可能就是那三个描述传输层包头(例如:
:=!=!>=0?)、网络层包头(例如:2=?=8))以及链路层
包头(例如:以太网或者 8))的联合了。这三个联合的名字分别是
、 以及 3。这些联合包含了几个结构,依赖于具体的数据包中使用的协议。
使用者应当注意:传输层包头和网络层包头可能是指向内存中的同一个位置。这是
! 数据包可能出现的情况,其中 和 都应当被看作是指向 头结构的指针。
这意味着尝试通过 4@ 获取一个值,并认为该指针指向一个 ! 头,将会得到错
误的结果。因为 4@ 实际上是指向的 头,与 4@ 得到的结果相同。
接下来让我们感兴趣的其它部分是 和 ( 这两个域。 指定了从 ( 开
始的数据包中的数据的总长度。好了,现在我们知道如何在 &6 数据结构中分
别访问协议头和数据包中的数据了。 函数中有用的信息中其它的有趣
的部分是什么呢?
紧跟在 & 之后的两个参数是指向 6( 数据结构的指针,6(
数据结构被 内核用于描述所有类型的网络接口。这两个参数中的第一个 ,
用于描述数据包到达的接口,毫无疑问,参数 用于描述数据包离开的接口。必
须明白,在通常情况下,这两个参数中将只有一个被提供。例如:参数 只用于
7668 689:; 和 7669!6,参数 只用于
7669!69: 和 76690689:;。在这一个阶段中,我还
没有测试对于 766798)8,这两个参数中哪些是有效的,但是如果
你能在使用之前先确定这些指针是非空的,那么你是非常优秀的!
最后,传递给 函数的最后一个参数是一个命名为 函数指针,该函数
以一个 &6 数据结构作为它唯一的参数,并且返回一个整型的值。我不是很确
定这个函数是干什么用的,在 22 中查看,有两个地方调用了这个
函数。这两个地方是分别在函数 66&/中以及函数 65中,
在其中的某个位置,当 的返回值为 76!! 时被调用。
在函数76'99A6'8 0',判断 66& 的返回值如果是 # 那么调用
()。 为一个函数指针指向,根据不同情况分别指向
6/(6&,6&6,66& 等。
BB译注: 核心网络堆栈中有一个全局变量1&&6(
6&C899DC76>?6'99A0D,该变量是一个二维数组,其中第一维用
于指定协议族,第二维用于指定 的类型(表 # 中定义的类型)。注册一个
实际就是在由协议族和 类型确定的链表中添加一个新的节点。
---以下代码摘自22,6.&6函数的实现:
![](https://csdnimg.cn/release/download_crawler_static/9484192/bg9.jpg)
1. intnf_register_hook(structnf_hook_ops*reg)
2. {
3. structnf_hook_ops*elem;
4. interr;
5.
6. err=mutex_lock_interruptible(&nf_hook_mutex);
7. if(err<0)
8. returnerr;
9. list_for_each_entry(elem,&nf_hooks[reg->pf][reg-
>hooknum],list){
10. if(reg->priority<elem->priority)
11. break;
12. }
13. list_add_rcu(®->list,elem->list.prev);
14. mutex_unlock(&nf_hook_mutex);
15. return0;
16. }
17. EXPORT_SYMBOL(nf_register_hook);
2 中定义了一个宏 76'99A,作者在前面提到的
66&/函数实际上就是 76'99A 宏定义最终要调用到的,在 76'99A
中执行注册的 函数。76'99A 在 核心网络堆栈的适当的地方以适当
的参数调用。
例如,在 6函数位于 226的最后部分,调用 76'99A 函数,
执行 7668 689:; 类型的 。
1. returnNF_HOOK(NFPROTO_IPV4,NF_INET_PRE_ROUTING,skb,dev,NUL
L,ip_rcv_finish);
6是 核心网络堆栈中用于接收 数据包的主要函数。在
76'99A 的参数中,页包含一个 函数指针,该函数是用于数据包被接收后
完成后续的操作,例如在 6 中调用的 76'99A 中的 函数指针指向
66&函数位于 226,该函数用于 数据包被接收后的诸
如 选项处理等后续处理。
--如果在内核编译参数中取消 !97;6 7 8 宏定义,76'99A 宏定义
直接被替换为 ,内核代码中的相关部分如下2:
1. #ifdefCONFIG_NETFILTER
2. staticinlineint
3. NF_HOOK(uint8_tpf,unsignedinthook,structsk_buff*skb,
4. structnet_device*in,structnet_device*out,
![](https://csdnimg.cn/release/download_crawler_static/9484192/bga.jpg)
5. int(*okfn)(structsk_buff*))
6. {
7. returnNF_HOOK_THRESH(pf,hook,skb,in,out,okfn,INT
_MIN);
8. }
9.
10. #else/*!CONFIG_NETFILTER*/
11. #defineNF_HOOK(pf,hook,skb,indev,outdev,okfn)(okfn)
(skb)
可见 函数是必不可少的,当 被启用时,它用于完成接收的数据包后
的后续操作,如果不启用 做数据包过滤,则所有的数据包都被接受,直接
调用该函数做后续操作。
--BB译注完
--现在,我们已经了解了我们的 函数接收到的信息中最有趣和最有用的部分,
是该看看我们如何以各种各样的方式来利用这些信息来过滤数据包的时候了!
4.2 - 基于接口进行过滤
这应该是我们能做的最简单的过滤技术了。还记得我们的 函数接收的参数中
的那些 6( 数据结构吗?使用相应的 6( 数据结构的 3 这个成
员,你就可以根据数据包的源接口和目的接口来选择是否丢弃它。如果想丢弃所有
到达接口 $ 的数据包,所有你需要做的仅仅是将 4@3的值与E$E做比较,
如果名字匹配,那么 函数简单的返回 7689 即可,数据包会被自动销毁。
就是这么简单!完成该功能的示例代码见如下的示例代码 。注意,.4).
7) 模块将会提供所有的本文提到的过滤方法的简单示例。它还包含了一个
9! 接口以及用于动态改变其特性的应用程序。
--示例代码 1基于源接口的数据包过滤
1. /*
2. *安装一个丢弃所有到达的数据包的 Netfilterhook 函数的示例代码
3. */
4. #include<linux/kernel.h>
5. #include<linux/init.h>
6. #include<linux/module.h>
7. #include<linux/version.h>
8. #include<linux/skbuff.h>
9. #include<linux/netfilter.h>
10. #include<linux/netfilter_ipv4.h>
11. #include<linux/netdevice.h>//structurenet_device
剩余45页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)