我做的是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)
exp:
https://github.com/zgao264/linux-kernel-exploits/tree/master/2015/CVE-2015-1328
CVE-2016-5195(脏牛)
Linux Kernel >2.6.22
每个linux发行版修复的版本不同
exp:
https://github.com/FireFart/dirtycow
CVE-2017-16995
Linux kernel versions 4.4 ~ 4.14
Ubuntu版本:16.04.01~ 16.04.04
exp:
https://github.com/RealBearcat/CVE-2017-16995
CVE-2018-18955
Linux kernel 4.15.x through 4.19.x before 4.19.2
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
exp:
https://github.com/0x00-0x00/CVE-2018-1000001
CVE-2019-13272
Linux Kernel 4.10 < 5.1.17
该漏洞依赖桌面环境 (略显鸡肋)
exp:
https://github.com/jas502n/CVE-2019-13272
上面是我成功复现的6个洞,只要环境配置对了就能直接提权成功的那种。当然还有些能够提权的成功的洞比如 CVE-2016-0728 ,但我感觉实在太鸡肋了,大家可以看这篇文章分析的
https://www.anquanke.com/post/id/83342
我在我虚拟机执行这个exp,物理机cpu都占满了,跑了半小时是真没跑出来,我裂开。实战中用这个提权太鸡肋了,除非真的是物理渗透。
一开始我认为每复现一个漏洞就得换一个镜像,其实不然,对于只对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
要求的 Linux kernel 范围在 4.15.x 至 4.19.x 低于 4.19.2
所以复现该漏洞需要切换对应的 kernel 版本号
可以下载 4.16.1 的 kernel 作为复现环境
安装指定内核
dpkg -i *.deb
vi /etc/default/grub
编辑 /etc/default/grub 修改启动引导
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.16.1-041601-generic"
update-grub
然后重启生效,但更换内核的时候有可能会遇到提示Warning: you may need to install module-init-tools,那么安装即可
apt install module-init-tools
这里exp提示该漏洞依赖 newuidmap
sudo apt-get install uidmap
再执行exp
提权成功!每个漏洞要求的版本号不同,可通过更换 kernel 尽可能减少复现漏洞配置环境的时间。
复现这些漏洞最终的目的是为了总结本地提权有哪些类型,如何让牧云去检测这些提权,怎么去判断一个进程是在提权?这里我总结的提权分为三类:
条件竞争写入只读(r)文件,如 脏牛
向内核注入代码提权,如 CVE-2017-16995
缓冲区溢出 suid提权 ,如 CVE-2018-1000001
其中最为常见的就是suid提权,像老版本的namp交互模式执行shell其实也是suid提权。
但谷歌之后发现网上对于linux本地提权检测的文章少之又少,于是和师傅讨论了一番,因为linux下一切皆文件,在/porc/目录下有每个进程的pid,提供每个进程的相关信息。
这些进程的文件夹大小都是0,因为都是在内存中。不过直接去分析文件不太方便,这里为了更加直观就用htop命令查看进程信息。
我同时开了两个终端,上面执行exp提权,下面开htop监控进程的变化,沿着这条进程链可以看到执行exploit还是test用户但是他的子进程就变成了root,而test本身也没有sudo权限,所以这里是很可疑的。
虽然可以通过这种方式去做提权检测,但是这里可能会存在误判,这里我和XX师傅都还没有讨论出更好的方式,所以只是这么一个思路,还需要讨论测试更多的情况,只能之后再做补充了。
对于上面的提权漏洞,可能是有不足的,如果有小伙伴还有什么高质量的提权漏洞可以在下面留言,我复现后再补充在上面。
在长亭实习的第二周,感觉进步很快,冲冲冲!
知识点补充:
替换内核版本发生错误时,虚拟机无法启动的解决办法。
这是我在替换内核时发生了错误导致无法启动,直接出现这个界面无法选择其他内核。
解决办法:在虚拟机启动时,长按shift,进入内核版本选择,点击以前的版本就可以。
点赞,转发,在看
作者博客:https://zgao.top