0x00 简单复现
漏洞相关描述,请参考链接3。 tomcat
本地提权漏洞,准确来说应该是Debian系统给的一个启动脚本有问题。这让我学习到了一种新的漏洞攻击形式。由于之前对shell脚本有所了解,决定通读一下漏洞POC。学习一下漏洞利用知识。
- 首先,用
apt-get
安装tomcat6
(官方似乎没管tomcat6,依然存在漏洞)
安装并且给tomcat6
用户赋予密码和bash
:
1 | sudo usermod -s /bin/bash tomcat6 |
- 运行POC提权
运行链接3中给的POC。重启下tomcat服务,即可获得root shell
。
1 | $ ./ tomcat_CVE-2016-1240.sh /var/lib/tomcat6/logs/catalina.out |
看看/tmp
目录下有一个tomcatrootsh
文件,看看它的权限:
1 | -rwxr-xr-x 1 tomcat6 tomcat6 1017016 11月 1 16:17 tomcatrootsh* |
重启tomcat服务:
1 | sudo service tomcat6 restart |
再来看看这个文件权限:
1 | -rwsrwxrwx 1 root root 1017016 11月 1 16:17 tomcatrootsh* |
该文件权限已经变成了root
用户,并且有个神奇的s
权限。看POC可以发现这个文件就是/bin/bash
。 于是我们就顺利的获得了root权限:
1 | [+] Tomcat restarted. The /etc/ld.so.preload file got created with tomcat privileges: |
0x01 攻击原理
1.巧妙利用软链接读写任意文件
看看启动脚本,/etc/init.d/tomcat6
,关键部分(171行):
1 | # Run the catalina.sh script as a daemon |
运行该启动脚本的是root
权限,所以它什么都可以干~ chown
语句,将catalina.out
这个文件的所有者赋给了tomcat6
用户。没毛病~~ 但是,聪明的hacker
将catalina.out
修改为任意文件的软链接的话。在tomcat重启之后,就可以任意读写catalina.out
所指向的文件了。
2.验证基本原理
用angelwhu
用户新建一个文件:
1 | echo security test > angelwhu_file |
用户tomcat6
建立一个软链接指向angelwhu_file
:
1 | ln -s angelwhu_file tomcat6_ln |
这时,读文件没有权限:
1 | $ cat tomcat6_ln |
用sudo
权限强行将软链接权限变更为tomcat。
1 | sudo chown tomcat6:tomcat6 tomcat6_ln |
神奇的发现angelwhu_file
的所有者变成了tomcat6
。
1 | -r-------- 1 tomcat6 tomcat6 14 11月 1 16:49 angelwhu_file |
自然就可以读写angelwhu_file
文件了:
1 | $ cat tomcat6_ln |
可以参照链接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
中找。这里便进行了函数劫持,我们来看看它做了什么事情:
1 |
|
可以看到,POC
中劫持了geteuid
函数。当二进制文件执行调用该函数时,便执行了如下操作:
1 | chown("$BACKDOORPATH", 0, 0); //chown root:root bash |
这里的$BACKDOORPATH
是cp /bin/bash $BACKDOORPATH
。也就是复制过来的bash
二进制文件。 这两句话的意思就是上面解释的:将复制的bash
文件设成root
用户,并且设置权限加上了s
。能够做这两件事情的,只有root权限了。这里便利用了s
权限了。 请参考Linux权限位(S位) 。 简要解释为:
为了让一般用户在执行某些程序的时候,能够暂时具有该程序拥有者的权限。举例来说,我们知道,账号与密码的存放文件其实是 /etc/passwd与 /etc/shadow。而 /etc/shadow文件的权限是“-r——–”。它的拥有者是root。在这个权限中,仅有root可以“强制”存储,其他人是连看都不行的。
我简要理解为:设置了s
权限的文件,我们可以暂时获得文件宿主的权限。 POC
利用了sudo
命令来进行攻击。首先看看它的权限:
1 | $ ls -al /usr/bin/sudo |
再来看看是否有geteuid
函数:
1 | $ objdump -d /usr/bin/sudo | grep geteuid |
perfect~~POC
中,便有了这句话:
1 | sudo --help 2>/dev/null >/dev/null #to get root privileges temporarily. because sudo has SUID(s). |
就是完成了将复制的bash
文件,设置成了下列权限:
1 | -rwsrwxrwx 1 root root 1017016 11月 1 16:17 tomcatrootsh* |
现在任意用户使用./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
做的事情:
1 | $ bin/bash bashmy / |
总结:分析下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