Tomcat本地提权漏洞分析与防御(CVE-2016-1240)

实验环境

操作机:Windows XP
目标机:Kali 1.1.0
目标服务器:172.16.12.2

实验工具

vim编辑器: vim编辑器是Linux和Unix上最基本的文本编辑器,工作在字符模式下。vim是一款十分高效的文本编辑器,本次实验主要使用该编辑器在Centos6.5下的文本编辑功能。

xshell: Xshell是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。本次实验主要使用了 Xshell 的远程连接 Kali 目标主机,操作 Kali 目标主机的功能。

实验目的

1.掌握Tomcat 本地提权的原理
2.掌握Tomcat 本地提权的方法

实验内容

漏洞危害
Debian系统的Linux上管理员通常利用apt-get进行包管理,CVE-2016-1240这一漏洞其问题出在Tomcat的deb包中,使 deb包安装的Tomcat程序会自动为管理员安装一个启动脚本:/etc/init.d/tocat*利用该脚本,可导致攻击者通过低权限的Tomcat用户获得系统root权限!

影响版本
Tomcat 8 <= 8.0.36-2
Tomcat 7 <= 7.0.70-2
Tomcat 6 <= 6.0.45+dfsg-1~deb8u1

前置知识
提权: 提权顾名思义就是提高自己在服务器中的权限,主要针对网站入侵过程中,当入侵某一网站时,通过各种漏洞提升WEBSHELL权限以夺得该服务器权限。本次实验主要是通过 Tomcat7 的低权限用户提权到 root 权限的用户。
root用户: ROOT存在于Linux系统、UNIX系统等的操作系统中,它是系统中唯一的超级用户,相当于Windows系统中的SYSTEM用户。其具有系统中所有的权限,如启动或停止一个进程,删除或增加用户,增加或者禁用硬件等等。而普通用户,一般权限较低,不能增删修改一些敏感文件。
deb包: Debian包是Unixar的标准归档,将包文件信息以及包内容,经过gzip和tar打包而成。处理这些包的经典程序是dpkg,经常是通过Debian的apt-get来运作。
符号链接:LINUX 下的符号链接相当于Windows下的快捷方式。
poc: 根据漏洞,对应的验证此漏洞存在的脚本即为poc。

实验步骤

步骤1: 漏洞代码分析

本步将根据脚本进行漏洞原理分析

Debian系统的Linux上管理员通常利用apt-get进行包管理,CVE-2016-1240这一漏洞其问题出在Tomcat的deb包中,使用deb包安装的Tomcat程序会自动为管理员安装一个启动脚本:/etc/init.d/tomcat<版本号>.sh。利用该脚本,可导致攻击者通过低权限的Tomcat用户获得系统root权限。
现在我们查看文件 /etc/init.d/tomcat7 操作如下:
首先我们使用 Evrething搜索xshell,选中xshell.exe运行xshell,然后连接上目标机的低权限用户tomcat7,账号是tomcat7,密码是:tomcat7。

Tomcat本地提权漏洞分析与防御(CVE-2016-1240)_第1张图片
Fig.1

然后执行命令 whoami,可以看到,现在是tomcat7的权限,也就是低权限账户
Tomcat本地提权漏洞分析与防御(CVE-2016-1240)_第2张图片
Fig.2

然后执行命令 vim /etc/init.d/tomcat7, 然后按 Esc键,接下来输入英文状态下的字符冒号: set number,找到171行。:

小i提示:vim是一个文本编辑器,vim /etc/init.d/tomcat7的意思是编辑/etc/init.d/文件夹下的tomcat7文件。

Fig.3

其造成漏洞核心代码如下:

# Run the catalina.sh script as a daemon 
set +e 
touch "$CATALINA_PID" "$CATALINA_BASE"/logs/catalina.out
chown $TOMCAT6_USER "$CATALINA_PID" "$CATALINA_BASE"/logs/catalina.out

我们阅读上面的shell脚本

  • 第一行,set +e,要知道set +e是什么意思,得先清楚set -e的含义:
    使用set更改shell特性时,符号"+"和"-"的作用分别是打开和关闭指定的模式,set -e的意思是若指令传回值不等于0,则立即退出shell,而set +e的意思反之
  • 第二行,touch是创建文件夹的意思,创建了catalina.out日志文件,前面的两个字符串定位了PID和BASE,涉及到其他变量这里不做探讨
  • 第三行,chown是改变文件夹权限的命令,它将catalina.out日志文件的所述用户更改为低权限用户

这个脚本看似是没有什么问题的。但是从上面的脚本可以得出三点信息:

  1. 这个脚本运行时的权限必然是root权限。因为普通用户是无法使用chown命令,也就是没有更高的权限。
  1. 该脚本使用touch命令创建文件,此时存在以下:文件存在、不存在、存在为符号链接等情况,当文件为符号链接时会默认地对链接的文件进行操作。
  1. 脚本运行完毕后Tomcat服务器启动,此时catalina.out这个log文件的所属用户为tomcat,所属组为root。

综述上述,这就给漏洞利用创造了可能。

接下来我们来验证是否可以利用:

当前的用户为tomcat7。这就是说我们能够更改所属用户为tomcat7的catalina.out这个log文件的内容和属性。
更改它的属性,让他指向/etc/shadow/文件夹下,现在我们创建一个指向 /etc/shadow 的符号链接。
使用命令ln -fs /etc/shadow /var/log/tomcat7/catalina.out,这时候就可以在/etc/shadow下创建一个链接,就相当于Windows的快捷方式一样。

Tomcat本地提权漏洞分析与防御(CVE-2016-1240)_第3张图片
Fig.4

此时我们查看文件cataline.out的内容,此时是权限不够,禁止读取cataline.out的内容的:
Tomcat本地提权漏洞分析与防御(CVE-2016-1240)_第4张图片
Fig.5

现在我们需要登陆root账户重启tomcat。登陆方法与登陆Tomcat7 用户相同,账号为:root, 密码为:123456 。重启Tomcat的命令为:

service tomcat7 restart

重启成功之后我们再次使用低权限用户读取cataline.out的内容:使用命令

head /var/log/tomcat6/catalina.out

使用head命令可以输出文件前十行的内容,而cat命令则是预览文件的全部内容。

Tomcat本地提权漏洞分析与防御(CVE-2016-1240)_第5张图片
Fig.6

原理:当Tomcat服务重启时,系统默认重新加载 /var/log/tomcat6/catalina.out脚本,由于此时tomcat的日志文件指向了 /etc/shadow文件; 而该文件就是我们之前创建的链接文件,而链接文件属于Tomcat7这个 低权限用户,因此,我们就可以查看其中内容了

步骤2: 漏洞验证

本步将使用poc根据Tomcat7漏洞进行提权

我们访问实验地址file.ichunqiu.com/p96mg145下载poc文件:
然后执行命令cd /tmp进入目录,然后编辑文件vim poc.sh。将桌面的poc.sh使用Notepad++打开,将文件内容粘贴进去。然后按键盘Esc键,再输入:wq,之后按 Enter 键将文件保存。
如果无法写入文件,使用命令

chmod 755 poc.sh

执行命令后,再次重复上一步即可,chmod的意思是改变文件的权限,775是什么权限呢?第一个数字代表文件所属者的权限,第二个数字代表文件所属者所在组的权限,第三个数字代表其它用户的权限,7=4+2+1

4:执行时设置用户ID,用于授权给基于文件属主的进程,而不是给创建此进程的用户。
2:执行时设置用户组ID,用于授权给基于文件所在组的进程,而不是基于创建此进程的用户。
1:设置粘着位。

Tomcat本地提权漏洞分析与防御(CVE-2016-1240)_第6张图片
Fig.7

这时,poc文件就已经构造好了,接下来运行脚本运行命令为:

./poc.sh /var/log/tomcat7/catalina.out

运行之后,会出现卡顿现象,这时候我们切换到root用户,重新启动Tomcat7,这时候使用命令whoami查看当前用户,这时候已经是 root 用户了,这时候就提权成功了。

Tomcat本地提权漏洞分析与防御(CVE-2016-1240)_第7张图片
Fig.8

可以看到,命令提示符的开头为 tomcat低权限用户,而我们执行whoami命令的时候,显示的权限却是root,这样就成功的提权了。

步骤3: 漏洞修复

目前,Debian、Ubuntu等相关操作系统厂商已修复并更新受影响的Tomcat安装包。受影响用户可采取以下解决方案:
1、更新Tomcat服务器版本:
(1)针对Ubuntu公告链接 http://www.ubuntu.com/usn/usn-3081-1/
(2)针对Debian公告链接https://lists.debian.org/debian-security-announce/2016/msg00249.htmlhttps://www.debian.org/security/2016/dsa-3669https://www.debian.org/security/2016/dsa-3670
2、加入-h参数防止其他文件所有者被更改,即更改Tomcat的启动脚本为:

chown -h $TOMCAT6_USER “$CATALINA_PID” “$CATALINA_BASE”/logs/catalina.out

思考

1、针对本次漏洞,请参考试验中的poc,根据理解,自己动手写poc
2.、在本次的Tomcat的提权过程中,目标机是kali操作系统。目标机能不能替换为其他的操作系统,可以的话,应该换为什么操作系统?Tomcat的版本能不能替换?可以的话,应该替换为什么版本?

参考资料

http://www.freebuf.com/vuls/115862.html

课后习题

第1题:在本次Tomcat7提权的过程中,能否在Tomcat7用户下,通过touch创建poc.sh文件,并写入poc()
A、能
B、不能
第2题:在受影响用户采取解决方案中,使用chown -h 参数的作用是()
A、更改文件权限
B、更改 归属组
C、更改归属人
第3题:tomcat7提权成功之后,执行命令,whoami 的执行结果是_________ 。

参考答案:

1、B;2、A;3、root

你可能感兴趣的:(Tomcat本地提权漏洞分析与防御(CVE-2016-1240))