| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> web安全之挖掘Linux内核漏洞 -> 正文阅读 |
|
[系统运维]web安全之挖掘Linux内核漏洞 |
一、简述Syzkaller是Google开发的一款内核模糊测试工具,简单点说就是自动化向内核输入各种有效的、无效的、完全随机化的参数数据,并观察内核的运行状况,是否发生了panic、内存泄漏等问题,以此发现隐藏在内核中的漏洞。近些年很多内核的CVE发现均来自于此,该工具的开发维护也相对活跃。它不仅支持x86,还支持ARM、Power、MIPS等处理器,而且不仅支持Linux,还支持windows、FreeBSD、Fuchsia等系统,同时还能支持对远程物理机、本地虚拟机的测试,此外还能支持分布式多机器测试。 本篇文章侧重于使用,并无太多原理与代码分析,仅需一点linux使用基础即可,适合用于syzkaller入门,整个环境搭建和使用过程踩了很多坑,有不少是网上没提到的。 二、基础环境
三、环境搭建3.1 Ubuntu虚拟机配置Ubuntu虚拟机配置如下图所示,因为需要编译Linux内核与syzkaller所以内存尽量的设置大一些。 Vmware自带的vmtools安装在Ubunut1804上不能与物理机之间互相拷贝文件可以尝试如下命令解决:
3.2 安装基本软件
安装go编程语言并没有使用apt install golang-go,使用apt安装的go编程语言版本为1.10,使用这个版本的go会在编译syzkaller时报错,所以在这选择下载安装1.17版本的go。
运行go命令可以执行,即为安装成功。 3.3 编译syzkaller使用下面的命令拉取编译syzkaller代码。
如果出现卡死或killed process,使用dmesg | egrep -i -B100 ‘killed process’查看,如果为Out of memory即为内存不足。这时可以先使用如下命令单独编译第一个文件:
查看bin目录下是否有编译好的syz-manager文件: 继续使用make命令完成编译,如下图所示: 如果单独编译第一个文件之后还是存在内存不足的问题,可以通过添加swap分区解决。
3.4 编译Linux内核git拉取linux代码:
如果拉取代码的时候报证书校验错误如下图所示: 通过如下命令解决:
进入linux目录后使用如下命令进行配置:
配置完成后打开当前目录下的.config文件进行手动添加配置,添加内容如下:
再执行如下命令: 如果出现如下图所示: 再次打开.config文件发现刚才添加的配置被删除了,那是因为配置文件中存在如下图所示: 重新执行olddefconfig之前的所有配置命令,然后在.config文件中,删除我们想添加配置的注释命令所在的行如:# CONFIG_KCOV is not set,最后在上面重新添加配置,然后执行make CC=”/usr/bin/gcc” olddefconfig命令可以发现不会出现warning。 如果不删除在之后进行qemu虚拟化时会出现Failed to start Remount Root and Kernel File Systems的错误。 最后执行如下命令即可完成编译。 3.5 制作文件系统使用如下命令:
wget命令下载文件失败,可以直接浏览器访问拷贝一份也不影响使用。 可以看到目录下出现stretch.id_rsa、stretch.id_rsa.pub、stretch.img文件即为成功。 3.6 运行syzkall这里需要打开Vmware虚拟机的虚拟化。 安装qemu虚拟工具。
在当前目录创建boot.sh文件,文件内容如下:
运行boot.sh,出现Failed to start Remount Root and Kernel File Systems是上面配置文件没配置好,出现不能访问KVM为虚拟机设置问题。 运行qemu虚拟机有登录提示输入root如下图所示,无密码登录。 在Vmware虚拟机使用如下命令,以是否能登录qemu虚拟机判断qemu虚拟机的ssh服务是否成功启动(syzkaller需要使用ssh)。
进入之前下载的syzkaller目录,创建my.cfg配置文件,文件内容如下:
使用./bin/syz-manager -config my.cfg命令运行。运行时稍微有些慢需要等待一下。 四、解决Failed to start Raise network interfaces错误执行syz-manager或qemu模拟运行的时候经常会出现Failed to start Raise network interfaces错误。 执行boot.sh脚本,运行起虚拟机,执行ifconfig命令,发现不存在此命令。 目前qemu虚拟机ping不通外网不能使用apt命令进行安装,所以这里选择下载net-tools离线包编译好,拷贝进qemu虚拟机。 qemu虚拟机初始有默认的ip为10.0.2.15,同时也会初始化物理机ip为10.0.2.2。 可以使用如下命令进行文件拷贝操作:
拷贝完成后就可以执行ifconfig命令了,如下图所示: 当使用boot.sh脚本运行qemu虚拟机,出现报错Failed to start Raise network interfaces的时候,再次执行ifconfig命令发现只存在lo网卡、enp0s3网卡未启动或未分配ip地址。进行删除qemu虚拟机中的/etc/network/interfaces文件,新建interfaces文件,文件内容如下,拷贝到到qemu虚拟机/etc/network/interfaces路径。
多次使用boot.sh启动qemu虚拟机,有时报错Failed to start Raise network interfaces,然后使用ifconfig命令查看结果依旧存在ip地址。 本机网卡名不为eth0可以使用如下命令进行更改:
再次使用syzkaller 进行fuzz,效果会好很多,至于根本原因笔者目前也并未分析源码,以后可能会更新。 五、fuzz Linux驱动程序5.1 编译驱动在test.c中存在一个堆溢出的demo: 编译内核模块的时候,涉及到一个linux header的问题。(比如说我在5.4.0的系统下编译5.17的驱动)所以这里的Makefile如下:
创建目录test,将test.c和Makefile拷贝到目录下,运行make命令。 如果找不到 将test.c拷贝到linux/drivers/char目录下: 在char目录下的Kconfig文件中添加如下配置:
在char目录下的Makefile中添加obj-$(CONFIG_TEST_MODULE) += test.o。 进入linux源码目录重新make,编译后使用boot.sh启动虚拟机,进入proc目录,可以看到test,表明成功编译代码并加载。 5.2 添加syzkaller规则进入syzkaller/sys/linux/目录,新建proc_operation.txt,文件内容如下所示:
回到syzkaller目录,编译syz-extract和syz-sysgen:
使用syz-extract生成.const文件:
生成了proc_operation.txt.const内容如下: 接下来执行如下命令:
5.3 fuzz linux 驱动程序使用bin/syz-manager -config my.cfg命令: syzkaller将其识别为空指针解引用错误。 六、总结从使用体验来讲这个框架进行漏洞发掘还是存在一定难度,尤其对一些具有复杂接口的内核模块来说更是如此,并且是使用go编写的增加了学习成本,但它确实挖出了不少漏洞值得学习。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 3:43:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |