tomcat本地提权(CVE-2016-1240重现分析)

0x00 简单复现

漏洞相关描述,请参考链接3

tomcat本地提权漏洞,准确来说应该是Debian系统给的一个启动脚本有问题。这让我学习到了一种新的漏洞攻击形式。由于之前对shell脚本有所了解,决定通读一下漏洞POC。学习一下漏洞利用知识。

  • 首先,用apt-get安装tomcat6(官方似乎没管tomcat6,依然存在漏洞)

安装并且给tomcat6用户赋予密码和bash:

  • 运行POC提权

运行链接3中给的POC。重启下tomcat服务,即可获得root shell

看看/tmp目录下有一个tomcatrootsh文件,看看它的权限:

重启tomcat服务:

再来看看这个文件权限:

该文件权限已经变成了root用户,并且有个神奇的s权限。看POC可以发现这个文件就是/bin/bash

于是我们就顺利的获得了root权限:

0x01 攻击原理

1.巧妙利用软链接读写任意文件

看看启动脚本,/etc/init.d/tomcat6,关键部分(171行):

运行该启动脚本的是root权限,所以它什么都可以干~

chown语句,将catalina.out这个文件的所有者赋给了tomcat6用户。没毛病~~

但是,聪明的hackercatalina.out修改为任意文件的软链接的话。在tomcat重启之后,就可以任意读写catalina.out所指向的文件了。

2.验证基本原理

angelwhu用户新建一个文件:

用户tomcat6建立一个软链接指向angelwhu_file:

这时,读文件没有权限:

sudo权限强行将软链接权限变更为tomcat。

神奇的发现angelwhu_file的所有者变成了tomcat6

自然就可以读写angelwhu_file文件了:

可以参照链接4,实际使用软链接,将catalina.out文件指向/etc/shadow文件,读取其中内容。

这样,我们就可以控制任意文件的读写了,那么应该如何获得一个好用的root shell呢?

0x02 ld.so.preload 函数劫持攻击

看POC,得知它会编译一个so文件写到/etc/ld.so.preload中,进行函数劫持攻击。与之前利用LD_PRELOAD环境变量绕过php的disable_functions类似。

在二进制调用系统函数时,会首先去/etc/ld.so.preload中找。这里便进行了函数劫持,我们来看看它做了什么事情:

可以看到,POC中劫持了geteuid函数。当二进制文件执行调用该函数时,便执行了如下操作:

这里的$BACKDOORPATHcp /bin/bash $BACKDOORPATH。也就是复制过来的bash二进制文件。

这两句话的意思就是上面解释的:将复制的bash文件设成root用户,并且设置权限加上了s。能够做这两件事情的,只有root权限了。这里便利用了s权限了。

请参考Linux权限位(S位)

简要解释为:

为了让一般用户在执行某些程序的时候,能够暂时具有该程序拥有者的权限。举例来说,我们知道,账号与密码的存放文件其实是 /etc/passwd与 /etc/shadow。而 /etc/shadow文件的权限是“-r--------”。它的拥有者是root。在这个权限中,仅有root可以“强制”存储,其他人是连看都不行的。

我简要理解为:设置了s权限的文件,我们可以暂时获得文件宿主的权限。

POC利用了sudo命令来进行攻击。首先看看它的权限:

再来看看是否有geteuid函数:

perfect~~POC中,便有了这句话:

就是完成了将复制的bash文件,设置成了下列权限:

现在任意用户使用./tomcatrootsh -p就能获得root shell了。-p参数,我翻了下man,得到英文解释:

If the shell is started with the effective user (group) id not equal to the real user (group) id, and the -p option is not
supplied, no startup files are read, shell functions are not inherited from the environment, the SHELLOPTS, BASHOPTS,
CDPATH, and GLOBIGNORE variables, if they appear in the environment, are ignored, and the effective user id is set to the
real user id. If the -p option is supplied at invocation, the startup behavior is the same, but the effective user id is
not reset.

用它就能获得宿主的shell环境了。

再次做个小实验,模拟下POC做的事情:

总结:分析下POC,让我再次学到了新知识,耐心读读利用代码,可以好好提升自己的能力。

0x03 参考

http://www.freebuf.com/vuls/115862.html
http://www.cnblogs.com/LittleHann/p/5937331.html
http://legalhackers.com/advisories/Tomcat-DebPkgs-Root-Privilege-Escalation-Exploit-CVE-2016-1240.html
http://www.blogsir.com.cn/?p=127
http://binyan17.iteye.com/blog/1444452