加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

Linux安全系列之启动篇

发布时间:2019-02-25 09:54:05 所属栏目:Windows 来源:不必再等
导读:副标题#e# Linux的自启动项,相对Windows来说简单太多了,在我们应急响应中操作系统的启动方式有哪些这个是一定要知道的,不然后门也清除不干净
副标题[/!--empirenews.page--]

Linux的自启动项,相对Windows来说简单太多了,在我们应急响应中操作系统的启动方式有哪些这个是一定要知道的,不然后门也清除不干净啊。

我们先说下linux的启动过程,十几年前某位黑阔大佬写了一篇文章,说今天面试了一个脚本小子,让他说出linux 的启动过程,他嘤嘤嘤了半天没嘤出个所以然来。看了以后,我也学会了,请问linux的启动过程是什么?哈哈,虽然我自己也不知道,但我就喜欢问。

我们就百度一下Linux的启动过程吧。

Linux安全系列之启动篇

如上图所示,一系列的东西:

BIOS自检-->从BIOS中读取启动顺序-->读取MBR中的bootloader-->加载内核-->读取伪根-->读取根文件中的init

网上还有很多文字说明,但可能你即使把那几大段文字全部背下来也没啥用,过两天就忘了,因为你不知道重点。

我挑些重点来说说:

不愿意看废话的,可直接跳到正文章节initrd

BIOS检查磁盘的MBR信息,从中找到bootloader程序加以执行

GRUB的第一阶段(其实就是bootloader)后,GRUB进入第1.5阶段,这个阶段主要是加载boot分区对应的文件系统的驱动,然后挂载boot分区,此时GRUB才真正完整了,再然后GRUB才能读取/boot上的文件和放在boot上的自身的第二阶段的代码,GRUB第二阶段,程序会根据/boot/grub/grub.conf的配置加载对应的内核。

那么/boot下放了哪些什么东西呢?

  1. Grub第二阶段的配置文件(grub.conf)
  2. 一个名为Vmliunz-版本号的压缩文件,这个其实就是系统的内核(有经验的同学会知道,使用GDB动态调试内核kcore然后跟静态内核比较异常时,就是比较的这个文件里的地址)
  3. 一个名为initrd-版本号*img或者initramfs-版本号*img的压缩映像文件

继续上面的,重点是加载内核这个是怎么加载的,上面已经说了,内核其实就是/boot/vmlinuz这个文件,加载内核就是把这个文件加载进内存,但我们看下面这个配置,你会发现,加载/boot/vmlinuz的同时还加载了一个/boot/initrd*.img的东西。

我们cat/boot/grub/ grub.conf如下:

Linux安全系列之启动篇

这是个什么东西呢,如上图所示,在 linux内核启动前, bootloader会先将存储介质中的 initrd 文件和kernel文件加载进内存,kernel启动时会先访问该内存中的 initrd 文件系统。为什么要把内核分成两块,因为此时你不能挂载真正的根文件系统,想挂载,就得跟上面挂载boot一样先加载必要的驱动,然而根文件系统支持IDE、SCSI、USB等多种介质,如果将这些设备的驱动都编译进内核,内核文件(vmlinuz)将难以想象的庞大。因此才将驱动剥离出来放在initrd文件里加载,我们平时lsmod可能会看到好多正在运行的驱动模块,但是不知道他们是怎么自动加载的。他们事实上是在kernel加载前就加载了,他们被放在initrd里面。

我们可以解压initrd看看:

执行命令

Linux安全系列之启动篇

我这里是2.6的内核所以用的cpio,与2.4使用的 image-initrd不同2.6基本都用的cpio-initrd,至于image-initrd和cpio-initrd有什么区别,自行百度。

我们cat 当前目录的init可以见到一些加载驱动的信息:

Linux安全系列之启动篇

内核启动分两个阶段:

第一阶段当initrd/initramfs*.img这个文件被加载到内存中,它会伪装成一个根文件系统(伪rootfs),在这个伪根下有一个脚本文件/init (2.4内核版本核心文件是 /linuxrc而不是 /init),,执行这个/init,它会负责查找并加载内核访问根文件系统必须的驱动,成功加载根文件系统存储介质所需要的驱动模块后,最后加载真正的根realfs(真rootfs)。

第二阶段才会执行真正的根文件系统中的 /sbin/init 进程。执行到这一点,内核的工作全部结束,完全交给/sbin/init文件处理。在/init脚本的最后有这么一行:init=/sbin/init

该行指定了硬盘realfs中的第一个要执行的程序的位置,该变量init指定了这个脚本最后要执行的进程为/sbin/init。

细心的你可能会发现上面/boot/grub/grub.conf里使用的不是initrd而是initramfs,他们有什么区别和优缺点呢?限于篇幅,请自行百度。

正文

根据上文的梳理,我们来到第一个自启动的利用点:

一.Initrd

如果我们把/boot下的initrd文件解压,把里面的init脚本以及它包含的脚本修改了,再把这个initrd重新打包成*img,替换原有的initrd,那么有什么效果呢?

效果是,系统重启后会加载我们修改过的initrd,实现一些你想要达到的目的。

如:我们可以在init脚本的子脚本functions中自定义要加载的内核模块,也可以直接在load_modules()中加载自己的模块,这些都能让我们的模块随着系统自启动。

Linux安全系列之启动篇

当然更阴险的是,替换initrd内的.ko驱动模块(这个可比替换外面的系统关键模块阴险多了),然后再次打包换掉原有的initrd文件,这样系统重启后,你的替换模块就工作了。

我们演示下:

我们lsmod找一个活着的系统驱动,我们就选定cdrom,我们先把我们的后门rootkit.c编译成rookit.ko

这里注意rootkit.c的编写,执行我们的代码前要先让原本的cdrom_init跑起来,而模块B中要用extern 声明需要用到的A模块提供的函数,所以要这样写:

  1. externint __init cdrom_init(void); 
  2. int__init rootkit(void) { 
  3. cdrom_init(); 

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读