96SEO 2026-02-19 21:25 18
的设计目标是提供一种更简单、更灵活和更高效的方式来管理网络数据包的流量。

的设计目标是提供一种更简单、更灵活和更高效的方式来管理网络数据包的流量。
钩子点的作用是拦截数据包然后对数据包进行修改比较丢弃和放行等操作。
include/uapi/linux/netfilter_ipv4.h#define
chains链用于指定流量的类型如流入的流量或者是流出的流量并可以指定网络接口如本地回环接口或者以太网接口等。
rules规则规则是用于过滤数据包所依据的规则例如检查协议、来源、目的地、端口等规则。
图片来源于https://blog.dbouman.nl/2022/04/02/How-The-Tables-Have-Turned-CVE-2022-1015-1016/
表达式是对一个数据包具体的操作这里大致介绍后续需要用到的表达式。
include/uapi/linux/netfilter/nf_tables.h
//链路层NFT_PAYLOAD_NETWORK_HEADER,
//网络层NFT_PAYLOAD_TRANSPORT_HEADER,
};下面这个例子则是将传输层的包偏移16个字节的位置取出两个字节的内容存放到目的寄存器中该寄存器的编号为2
nft_payload_set则是与nft_payload相反该表达式是将指定寄存器的值存放到数据包里面
include/net/netfilter/nf_tables_core.h
nft_cmp_expr表达式则是用于比较通常用于判断数据包的端口号是否是需要符合要求。
{NFT_CMP_EQ,NFT_CMP_NEQ,NFT_CMP_LT,NFT_CMP_LTE,NFT_CMP_GT,NFT_CMP_GTE,
nft_bitwise用于对数据包进行比特级别的操作。
例如移位掩码设置等。
{NFT_BITWISE_BOOL,NFT_BITWISE_LSHIFT,NFT_BITWISE_RSHIFT,
};mask当op被指定为NFT_BITWISE_BOOL时sreg的值会与mask中指定的值进行掩码设置操作。
并将结果存放到dreg中
xor当op被指定为NFT_BITWISE_BOOL时sreg的值会与xor中指定的值进行掩码设置操作。
并将结果存放到dreg中
data当op被指定为NFT_BITWISE_LSHIFT或NFT_BITWISE_RSHIFT时data需要被指定移位的数值。
在Nftables中是以寄存器作为存储区用于存放一段连续的内存现在Nftables版本每个寄存器的值存放4字节数据而旧版的Nftables的每个寄存器是存放16个字节的数据为了保持兼容性4字节的寄存与16字节的寄存器都被保留。
寄存器的枚举值如下所示
//判定寄存器NFT_REG_1,NFT_REG_2,NFT_REG_3,NFT_REG_4,__NFT_REG_MAX,NFT_REG32_00
8,NFT_REG32_01,NFT_REG32_02,...NFT_REG32_13,NFT_REG32_14,NFT_REG32_15,
其中NFT_REG_VERDICT被称之为判断寄存器这个寄存器比较特殊是用于判定每个数据包需要怎么处理。
判定的类型如下
NFT_JUMP跳转到其他链执行若其他链将该数据包判定为NFT_CONTINUE则返回当前链
由于Nftables处于内核需要从用户层向内核发送消息去设置需要拦截数据包的属性人工构造成本较大因此使用现成的库libmnl与libnftnl
/home/pwn/CVE/CVE-2022-1015/CVE-2022-1015/linux-5.17
dataIPPROTO_TCP。
该表达式是一个比较的表达式用于比较下标为8的寄存器中的数据是否为TCP的协议。
那么如何将下表为8的寄存器转化为内核中寄存器的内存位置则需要以来下面列举的函数。
nft_parse_register_load函数就是将用户设定的寄存器的下标转化为内核寄存器的下标然后存储在源寄存器中。
//用于提取数据包中的寄存器的下标并转化为Nftables中寄存器的下标
nft_validate_register_load(reg,
nft_parse_register函数用于将用户设置的寄存器下标转化为内核中寄存器的下标。
default://由于4字节寄存器起始下标为8因此要减去起始下标
nft_validate_register_load函数则是用于校验下标是否有问题但是这个检验存在整型溢出的问题。
reg是枚举值而枚举通常会被编译为int类型。
len代表数据包的长度。
0xffffffffint情况下的最大值那么逃入检验则为0xffffffff
0x40000000c由于int最大值为0xffffffff那么最高4个比特会被舍弃那么最后得到的值为0x0000000c此时0xc
nft_validate_register_load(enum
每一个被拦截的数据包都需要经过链上的表达式进行处理而链处理的函数则为nft_do_chains这个函数会提取出相应的表达式最后调用expr_call_ops_eval函数进行处理。
nft_rule_dp_for_each_expr(expr,
expr_call_ops_eval函数则是根据不同的表达式选择不同的处理函数例如若该数据包需要经过nft_payload的表达式处理则会调用nft_payload_eval。
这里可以看到regs存放在栈上面dest这个变量值是通过regs-data[priv-dreg]取出来的而priv-dreg则是通过上述的nft_parse_register_load函数进行提取的那么这里就存在一个非常明显的数组越界的漏洞。
}因此整型溢出结合越界就能够使我们访问到内核栈上的其他数据如下图所示。
现在我们拥有了访问内核栈上其它地址的能力了想要做到任意代码执行则需要考虑下列几种情况
由于返回地址存在在栈上需要判断数组越界是否能够到达返回地址的位置
由于需要进行任意代码执行那么需要用到内核函数则需要得到内核的程序基地址才能够根据函数偏移地址计算出函数的实际地址
由于表达式都会对寄存器空间进行操作因此可以使用表达式对内存空间进行读写操作。
nft_bitwise表达式可以控制源寄存器和目的寄存器那么采用nft_bitwise可以将源寄存器的内容放置到目的寄存器中因此可以利用nft_bitwise进行越界读此时需要分析该数组越界读的边界的大小是多少。
这里需要注意的是由于len是sreg与dreg共同拥有的为了dreg不越界这里的长度最大值只能为0x40而不能为0xff因为拥有16个寄存器每个寄存器的值为4个字节因此16
接着查看regs偏移0x3c0处的地址信息结果发现在该片区域存在一个明显的内核地址因此若能将这个地址进行泄露我们就能获取内核的基地址。
由于需要构建的payload比较长而我们如果利用nft_wise最多只能写入0x43c
0x7c的长度是远远不够的因此对返回地址进行覆盖时不能使用nft_bitwise而得改用nft_payload。
nft_payload需要dreg的下标以及修改的长度len由于我们只需要考虑一个寄存器的值因此该寄存器的长度最大可以达到0xff。
因此我们可以在地址更低的位置去搜索有无可以覆盖的返回地址。
为了检验该地址是否能够修改程序的执行流程可以使用一个方法将该地址的值修改为非法值并观察内核是否会崩溃这里将地址的内容修改为0x1122334455667788接着运行程序。
可以看到内核报错的信息显示RIP的地址为刚刚我们修改的地址因此该地址可以作为被劫持程序执行流程的地址。
利用nft_bitwise泄露地址这里注意的是在使用nft_bitwise泄露地址时需要将data值设置为0这样就不会进行移位而导致我们的内核地址被修改存储最后将泄露的地址值放置在NFT_REG32_05下标的寄存器中
接着使用nft_set_payload将udp数据包的值修改为NFT_REG32_05寄存器的值最后取出udp数据包的值获取内核程序地址值
在数据包中将payload填充进去这里需要说明一下如何在内核中拿到shell权限
首先需要在内核中拿到root权限需要调用commit_creds(prepare_kernel_cred
其次需要切换命名空间由于在普通用户下是无法直接调用Nftables的因为需要管理员的权限因此在普通用户下需要新开辟一个命名空间使得该空间与正常的空间隔离此时才能够正常执行Nftales。
那么如果逃逸这段命名空间则需要进行命名空间的切换则依赖于switch_task_namespace函数可以将命名空间切换为root的命名空间
最后则是实现从内核态切换到用户态由于我们是在内核空间拿到权限而我们需要在用户态执行因此需要完成状态的转换该状态转换依赖于swapgs_restore_regs函数
补丁则是新增一条判断条件属于4字节寄存器的下标单独处理而不在16字节寄存器以及4字节寄存器的范围内的下标都进行报错处理
其次是利用nft_payload改写返回地址并将提权代码注入进去。
不同的内核版本的内核栈布局几乎不同因此不同版本之间的利用手法相差较大因此漏洞的利用十分依赖于内核版本针对不同的版本需要做出针对性的漏洞利用的exp编写。
差别存在于内核栈中存在的内核代码段地址的偏移不同例如有些内核代码段地址偏移距离regs太大导致无法利用漏洞进行泄露或者改写。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback