1.环境搭建
对于简单验证,您可以使用:
sudo docker pull jetbrains/teamcity-server:2023.11.3
sudo docker run -it -d --name teamcity -u root -p 8111:8111 jetbrains/teamcity-server:2023.11.3
# sudo ufw disable
这里我们使用+IDEA远程调试来调试代码。
首先去官网下载exe文件:
我选择的版本是2023.11.3,如果是2023.05.x版本的话,会出现部分文件位置不正确,缺少部分文件的情况(比如web-.jar)。
然后直接解压然后拖进IDEA中打开:
在conf文件夹中创建一个新的.xml:
<Server port="8105" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
GlobalNamingResources>
<Service name="Catalina">
<Connector port="8111" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="60000"
redirectPort="8543"
useBodyEncodingForURI="true"
tcpNoDelay="1"
maxHttpHeaderSize="16000"
/>
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.ErrorReportValve"
showReport="false"
showServerInfo="false" />
Host>
Engine>
Service>
Server>
打开-2023.11.3\bin\.bat,在第一行插入以下代码:
SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8188
并配置远程JVM调试:
完成后进入bin目录,通过--start启动;如果是第一次启动,需要配置数据库位置,admin账号密码等。
做完这些之后在idea中设置断点开始调试,并通过yakit等包测试配置是否成功进入调试:
2. 漏洞分析
有些文件夹中需要右键点击lib文件夹,点击Add as ... 将其添加到依赖项中,避免出现大量错误影响阅读。建议先用F8、F7一步一步调试整个代码,熟悉路径的函数名。
负责请求处理和分发的函数点位于-2023.11.3\\ROOT\WEB-INF\lib\web-.jar!\\\\.class,我们看到函数最后调用了l,所以我们在l函数这里设置断点,开始调试:
按F7步进可以看到,由于我们请求的/hax不存在,所以直接分发给er去处理:
如果我们请求/app/rest/,它将分发到:
F8继续往下走,经过该函数的时候,大家要警惕,从函数名看,意思是看请求中是否有jsp字段,也就是有没有?jsp=xxx,如果有,那么就更新视图:
按F7查看,程序获取了一个jsp字段,即/app/rest/;.jsp:
继续F8,我们想看的是获取到新的View之后的渲染过程,因此我们进入t函数:
继续按F8,就看到了我们期待的功能:
进入后按 F8 继续。我们想了解 /app/rest/;.jsp 是如何处理的,因此我们进入该函数:
出现两个紫色方块。左键单击第一个进入:
里面的逻辑比较简单,就不细说了,返回的结果是一个view:
官网解释的很清楚了,内部的资源视图解析器会将视图名解析成JSP文件的路径,并包装成对象,再将请求发送给它执行JSP渲染流程;比如之前我们看到的404.jsp,就解析成了404.html:
继续按F8往下走。我们还是点击进入:
继续走,按 F7 进入 del 函数:
进入一个函数的字面意思是获取以下内容的过程:
左键点击第二步进入:
然后一步步按F7,来到org...core.#。可以看到这一步传入的路径被处理了,不存在的/app/rest/;.jsp被改为了存在的/app/rest/。这样就把正在处理的url改了,这样就实现了任意都可以访问了:
但是分析到这儿,还是没有解释一个关键的东西,那就是为什么我们访问一个不存在的URI,比如这里的/hax,它不进行认证呢?要理解这个,我们得去调试一下……#这个方法,我在调试的时候,访问了一个不存在的URI,它显示var4.size() == 1,然后进入了多个方法。
在调试的时候发现由于反编译失败,很多代码都读不出来,但可以肯定是因为uri的不存在导致他们的判断结果为真,从而导致最终结果为真。这个地方以后有待研究,如果大家有什么想法也可以直接留言交流,谢谢指教。
开发
RCE方法主要有两种,一种是请求/app/rest/debug/,一种是在后台上传恶意插件。
但由于之前CVE-2023-42793的原因,官方直接删除了这个端点,也就是说2023.11.x之后的版本只能考虑第二种方法,参考:
这部分可以通过抓包的方式写出来。但是我调了.0的shell之后发现连接不上。抓包后发现403提示:
尝试替换:
发现没用,依然是403:
尝试删除X-Tc-Csrf-Token,仍然403:
继续删除,直接500:
目前我还没有看代码调试,从前面的错误 CSRF X-TC-CSRF-Token does not match CSRF value 来看,我猜测它对应的是一个 csrf token。尝试从浏览器访问目标,得到自动生成的:
然后出现403错误:
替换之后发现冰蝎3已经连接上了:
此时我认为添加自定义请求标头将允许访问,但它仍然不起作用:
原来是冰蝎3没有给你添加,我尝试手动添加,还是不行:
原来这里有两个,一个是冰蝎识别领域后添加的,一个是我们自定义的。
由于之前没有关注过冰蝎4,所以我思考了很久,准备自己去修改冰蝎源码,直到看到了冰蝎4:
结束!
我写的脚本地址如下:
此时,任何版本的漏洞都可以被利用:
根据的博客,即使删除了该插件,它也会在-.xml中留下永久的条目,因为只有先禁用该功能才能删除它,例如C:\\\\\-.xml:
<disabled-plugins>
<disabled-plugin name="WYyVNA6r" />
disabled-plugins>
测试了一下发现不对,直接删除是可以的,但是需要重启,先禁用再删除就不需要重启了。
有关后渗透的更多信息,请参阅:
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。