Linux本地提权漏洞复现与检测思路

我做的是linux本地提权漏洞的复现。但本地提权漏洞并不像其他web漏洞一样,可以直接pull一个docker镜像就ok了,提权的洞复杂在于配置环境,基本都是在虚拟机里复现,一个镜像的大小基本都是上G的,镜像安装时间又长,每个洞要求的kernnel版本号又不同,依赖的库也不一样。环境装好了,漏洞的exp还不一定能打成功,我太难了

所以这周各种踩坑之后,将我复现漏洞的一些经验写下来,或许对大家复现本地提权漏洞有些帮助, 以及在实战中确实可以拿着直接用的exp。

首先分享一下我复现成功的本地提取漏洞以及截图,我花费了大量的时间来做这件事,这些都是质量较高且实际可用的。

CVE-2015-1328

存在于Ubuntu 12.04、14.04、14.10、15.04版本中
我复现该漏洞所使用镜像为 Ubuntu 12.04.5 LTS (GNU/Linux 3.13.0-32-generic x86_64)

Linux本地提权漏洞复现与检测思路_第1张图片

exp:

https://github.com/zgao264/linux-kernel-exploits/tree/master/2015/CVE-2015-1328

CVE-2016-5195(脏牛)

Linux Kernel >2.6.22
每个linux发行版修复的版本不同

Linux本地提权漏洞复现与检测思路_第2张图片

exp:

https://github.com/FireFart/dirtycow

CVE-2017-16995

Linux kernel versions 4.4 ~ 4.14

Ubuntu版本:16.04.01~ 16.04.04

Linux本地提权漏洞复现与检测思路_第3张图片

exp:

https://github.com/RealBearcat/CVE-2017-16995

CVE-2018-18955

Linux kernel 4.15.x through 4.19.x before 4.19.2

Linux本地提权漏洞复现与检测思路_第4张图片

sudo apt-get install uidmap

exp:
https://github.com/bcoles/kernel-exploits/tree/master/CVE-2018-18955

CVE-2018-1000001(glibc)

glibc <= 2.26
复现所使用镜像为 Ubuntu 16.04.3 LTS

Linux本地提权漏洞复现与检测思路_第5张图片

exp:

https://github.com/0x00-0x00/CVE-2018-1000001

CVE-2019-13272

Linux Kernel 4.10 < 5.1.17
该漏洞依赖桌面环境 (略显鸡肋)

Linux本地提权漏洞复现与检测思路_第6张图片

exp:

https://github.com/jas502n/CVE-2019-13272

上面是我成功复现的6个洞,只要环境配置对了就能直接提权成功的那种。当然还有些能够提权的成功的洞比如 CVE-2016-0728 ,但我感觉实在太鸡肋了,大家可以看这篇文章分析的

https://www.anquanke.com/post/id/83342

Linux本地提权漏洞复现与检测思路_第7张图片

我在我虚拟机执行这个exp,物理机cpu都占满了,跑了半小时是真没跑出来,我裂开。实战中用这个提权太鸡肋了,除非真的是物理渗透。

Linux本地提权漏洞复现思路-更换kernel

一开始我认为每复现一个漏洞就得换一个镜像,其实不然,对于只对kernel有要求的可以只更换kernel然后重启即可。因为Ubuntu的漏洞最多,所以ubuntu镜像作为本地提权漏洞复现的基础环境,根据不同漏洞所需要的kernel版本,更换指定的版本启动。

ubuntu历史镜像下载链接:
http://old-releases.ubuntu.com/releases/
ubuntu历史 kernel 下载链接:
https://kernel.ubuntu.com/~kernel-ppa/mainline/
这里使用的基础镜像为 ubuntu 16.04.3 LTS
自带的kennel版本号为4.4.0-87-generic

以CVE-2018-18955为例

要求的 Linux kernel 范围在 4.15.x 至 4.19.x 低于 4.19.2
所以复现该漏洞需要切换对应的 kernel 版本号
可以下载 4.16.1 的 kernel 作为复现环境

Linux本地提权漏洞复现与检测思路_第8张图片

安装指定内核

dpkg -i *.deb

Linux本地提权漏洞复现与检测思路_第9张图片

vi /etc/default/grub
编辑 /etc/default/grub 修改启动引导

GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.16.1-041601-generic" 

Linux本地提权漏洞复现与检测思路_第10张图片

update-grub

然后重启生效,但更换内核的时候有可能会遇到提示Warning: you may need to install module-init-tools,那么安装即可
apt install module-init-tools

Linux本地提权漏洞复现与检测思路_第11张图片

这里exp提示该漏洞依赖 newuidmap

sudo apt-get install uidmap

再执行exp

Linux本地提权漏洞复现与检测思路_第12张图片

提权成功!每个漏洞要求的版本号不同,可通过更换 kernel 尽可能减少复现漏洞配置环境的时间。

复现这些漏洞最终的目的是为了总结本地提权有哪些类型,如何让牧云去检测这些提权,怎么去判断一个进程是在提权?这里我总结的提权分为三类:

  • 条件竞争写入只读(r)文件,如 脏牛

  • 向内核注入代码提权,如 CVE-2017-16995

  • 缓冲区溢出 suid提权 ,如 CVE-2018-1000001

其中最为常见的就是suid提权,像老版本的namp交互模式执行shell其实也是suid提权。

但谷歌之后发现网上对于linux本地提权检测的文章少之又少,于是和师傅讨论了一番,因为linux下一切皆文件,在/porc/目录下有每个进程的pid,提供每个进程的相关信息。

这些进程的文件夹大小都是0,因为都是在内存中。不过直接去分析文件不太方便,这里为了更加直观就用htop命令查看进程信息。

Linux本地提权漏洞复现与检测思路_第13张图片

我同时开了两个终端,上面执行exp提权,下面开htop监控进程的变化,沿着这条进程链可以看到执行exploit还是test用户但是他的子进程就变成了root,而test本身也没有sudo权限,所以这里是很可疑的。

虽然可以通过这种方式去做提权检测,但是这里可能会存在误判,这里我和XX师傅都还没有讨论出更好的方式,所以只是这么一个思路,还需要讨论测试更多的情况,只能之后再做补充了。

对于上面的提权漏洞,可能是有不足的,如果有小伙伴还有什么高质量的提权漏洞可以在下面留言,我复现后再补充在上面。

在长亭实习的第二周,感觉进步很快,冲冲冲!

知识点补充:

替换内核版本发生错误时,虚拟机无法启动的解决办法。

Linux本地提权漏洞复现与检测思路_第14张图片

这是我在替换内核时发生了错误导致无法启动,直接出现这个界面无法选择其他内核。

Linux本地提权漏洞复现与检测思路_第15张图片

解决办法:在虚拟机启动时,长按shift,进入内核版本选择,点击以前的版本就可以。

点赞,转发,在看

作者博客:https://zgao.top

你可能感兴趣的:(内核,linux,docker,java,ubuntu)