linux文件提取
date
Mar 25, 2022
slug
take-out-file-from-linux
status
Published
tags
固件安全
summary
实习时候的学习笔记。。。。
type
Post
总体启动流程
BIOS → MBR → LILO,GRUB → Linux →User Space
MBR 这块就是属于引导磁盘头部一段小数据,一段机器码,引导加载Stage 2,一共512字节
GRUB通常启动到下面这个界面的时候一般都是,stage1.5或者是Stage2这个阶段 ,到Stage 2这个 阶段已经把文件系统读取出来了,下图这个界面进去之后会存在一系列的命令,相当于开始执行Stage 2 里面的内容
GRUB下对应上述阶段的一些文件
可以从这个图中可以看出,在grub目录下,存在各种各样的mod文件,可用于加载,此外Linux系统是从第2048个扇区开始的,这表明在前面的扇区中就是放置stage 1和 1.5 阶段的内容,在这个目录下分别就是boot.img和core.img
GRUB 详细页面如下:
一般主要是有几条命令组成,不同系统就会存在不同的命令,下图中linux命令就是加载linux的内核,后面跟上的就应是一些options参数 ,都是这样的一些形式,initrd 用于加载一些内存盘
初始化的相关参数
有rd的是在内存的时候加载初始化的程序,没有的是另外阶段加载初始化的程序,反正就是用来指定初始化程序的
单用户模式
是在Unix系统上工作时拥有的超级用户的权限,通常只有在面对实体主机的时候通过引导菜单进入,是否进入单用户模式的处理逻辑是在init程序中
指定rdinit程序获取shell
使用前提:
1.跟文件系统未加密
2.grub菜单未使用密码保护
3.内核支持rdinit=命令行
4.使用了initrd/initramfs,也就是命令中存在initrd的使用
操作:在grub模式下,按下e键进入编辑模式,在内核参数中使用
rdinit=/bin/bash
,指定initrd/initramfs中init程序为/bin/bash,保存,可绕过初始化流程。操作结果:获取shell,但是这个shell只是initrd/initramfs环境的shell,也就是内存盘环境的shell(本质上是一个临时环境的shel),不是最终系统的shell
对应练习程序:normal-with-initramfs
可以看到命令中是存在initrd这一条命令的
只需要往上面添加上
rdinit=/bin/bash
即可进入shell这只是个中间环境的shell,本身是要执行当前目录下的init文件初始化的,执行完init才把文件系统挂在到正是环境下的
init文件里面的内容
指定init程序获取shell
使用前提:
跟文件系统未加密,grub菜单未使用密码保护,内核支持init=命令行,未使用initrd/initramfs
操作:进入grub模式下进行编辑,在内核参数重使用
init=/bin/bash
,绕过init流程直接获取shell操作结果:直接中断跟文件系统的初始化流程,获取一个根文件系统的shell
对比上一种情况就是没有使用内存盘的那个命令了,但是一般情况下这种跟上述那一种情况都得尝试,因为有些时候内存盘写的比较好,也可以直接使用init命令进入相关的shell,所以还是按照实际情况分析
对应练习程序:normal-without-initramfs
在没有内存盘的情况下使用init命令指定启动命令
可直接获取一个根文件系统的shell
上述两种情况的对抗
在kernel中禁用init/rdinit内核参数,直接编译内核的时候注释掉相关函数的内容,真实环境中的一个案例
单用户模式获取shell
使用前提:根文件系统未加密,grub菜单未使用密码保护,未使用initrd/initramfs,init程序支持单用户模式
操作方法:grub下使用e进入编辑模式,在内核参数重加入单用户模式参数
最终效果:使根文件系统进入单用户模式,获取一个根文件系统的shell
对应l练习程序:normal-without-initramfs
加上single参数命令
可直接获取到文件系统shel
单用户模式也是可以被禁止的
直接操作磁盘
使用前提:根文件系统未加密,所使用的工具支持目标文件系统
操作方法:通过第三方livecd到目标虚拟机,挂在读取相关内容
感觉这个方法用的比较常见易上手,之前挖齐志堡垒机的时候就用的这一种方法
luks磁盘加密的情况
这种方法是建立在前一种方法的分析下
这种情况下的,一般不会全部加密,一般会存在一些不加密的地方,可以让我们去进行下手
使用上面的方法大概率是进不去的,可以使用直接磁盘操作,在livecd里面挂载相关的内容再去操作
对应程序:luks-with-initramfs
使用fdisk命令查看相关内容,可以观察到两个内容,一个是可以挂载的sda1,另外一个是不允许挂载的
此时我们可以进入sda1中找到相关的信息,解压luks-initramfs.gz文件(gzip -kd解压 ),cpio的一个格式,一个内存方案,旧一点可能就是ext4之类的
把上面的那个文件移动到tmp目录下使用
cpio -div < initramfs
解压,得到内存盘里面的那个系统,之前知道后续是会执行init这个文件才会进入真正的文件系统里面此时查看init文件可以发现加密相关代码内容
复制粘贴这几条命令就行了额,此时mnt目录下就是相关的文件目录了
对抗上述提取方法
最好的方法就是将initramfs这个相关文件进行加密,此时就不可以直接
cpio
解密那个文件了,该加密文件会在两个时机进行解密,一个是在grub的bootloader中,一个是在内核处理的时候再对抗上述的防护方法
上面提及到会在两个时候处理这个加密内容,那么就可以从这两个方向进行入手,就会涉及到vmware调试虚拟机,需要提取vmlinux,用ida联动调试,找出相关的密钥,最后尝试用各种解密方法去解密压缩的内容
有空再学学具体怎么调试。。。。。。。