中间件常见漏洞之Jetty
2023-3-23 20:6:51 Author: 渗透安全团队(查看原文) 阅读量:26 收藏

现在只对常读和星标的公众号才展示大图推送,建议大家能把渗透安全团队设为星标”,否则可能就看不到了啦

0x01 Jetty简介

Jetty是一个提供HHTP服务器、HTTP客户端和javax.servlet容器的开源项目。
简单来讲,Jetty就是一个开源HTTP服务器和Servlet引擎,它可以为JSP和Servlet提供运行时环境。比如Java web应用最常用的Servlet容器Tomcat。由于其轻量、灵活的特性,Jetty也被应用于一些知名产品中,例如ActiveMQ、Maven、Spark、GoogleAppEngine、Eclipse、Hadoop等。
Jetty工程简介
Jetty所有顶级目录简介:

为什么使用Jetty
异步的Servlet,支持更高的并发量
模块化的设计,更灵活,更容易定制,也意味着更高的资源利用率
在面对大量长连接的业务场景下,Jetty默认采用的NIO模型是更好的选择
将Jetty嵌入到应用中,使一个普通应用可以快速支持HTTP服务
Jetty比较适合微服务(轻量级)
运行Jetty
执行以下代码,Jetty会在默认8080端口运行
cd $JETTY_HOMEjava -jar start.jar
若执行成功会输出以下信息
2023-03-08 17:24:44.806:INFO::main: Logging initialized @334ms2023-03-08 17:24:44.858:WARN:oejs.HomeBaseWarning:main: This instance of Jetty is not running from a separate {jetty.base} directory, this is not recommended. See documentation at http://www.eclipse.org/jetty/documentation/current/startup.html2023-03-08 17:24:44.995:INFO:oejs.Server:main: jetty-9.3.0.v201506012023-03-08 17:24:45.012:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:///opt/jetty-distribution-9.3.0.v20150601/webapps/] at interval 12023-03-08 17:24:45.030:INFO:oejs.ServerConnector:main: Started [email protected]19dfb72a{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}2023-03-08 17:24:45.030:INFO:oejs.Server:main: Started @558ms
你可以通过浏览器访问http://localhost:8080.。然而在$JETTY_HOME/webapps目录下并没有部署任何web应用,所以你将会看到一个Jetty提供的404错误页面,并不推荐在$JETTY_HOME下运行Jetty,而是建议运行一个Jetty基础应用。错误页面如下

Jetty的基本架构
Jetty的框架比较简单,核心组件主要是由Server和Handler组成。其中Server的Handler是其比较重要的一个数据模型,Jetty中所有的组件都是基于Handler来实现的。
Tomcat最顶层是Service,控制了服务器的整个生命周期,每一个Service由一个Container和多个Connector组成,形成一个独立完整的处理单元,对外请求。
Jetty的核心是Server,整体包含了多个Handle,还有一个Connector组成,Connector负责接受请求,将请求分配给一个队列去进行处理。
Jetty的架构设计要比tomcat的更清晰,简单。

与Tomcat的对比
1.Jetty比较容易贴合第三方框架,比如你可以直接用Spring配置一个Jetty服务器
2.直接将Jetty作为提供HTTP服务的组件,嵌入到应用中(SpringBoot也嵌入了Tomcat)
3.Jetty是面向Handler的架构,而Tomcat是面向容器的架构
4.Jetty默认采用NIO技术,而Tomcat默认是BIO
5.Jetty高度模块化,可以很灵活的管理拓展组件,而Tomcat对其他组件的管理则相对困难
6.Jetty可以同时处理大量连接而且可以长时间保持连接,适合于web聊天应用等等。而且按需加载组件,减少了服务器的内存开销,内部默认采用NIO异步处理等特性提高了服务器性能。配置更加的灵活、简单、开发效率快、扩展性强。
7.从技术上来说的话,Jetty不是一个功能全面的J2EE服务器,缺少很多对J2EE功能的支持。而Tomcat适合处理少数非常繁忙的链接,也就是说链接生命周期短的请求服务。它自身扩展了大量的J2EE特性来满足各种企业项目应用的需求,对于很多的Java web项目来说,我们可能并不需要这么多高级特性,从一定程度上浪费了很多的资源。
基础应用例子
标准的Jetty应用,有一个demo-base的文件夹,可以不在$JETTY_HOME下运行Jetty,在demo-base文件夹下执行以下命令:
cd $JETTY_HOME/demo-base/java -jar $JETTY_HOME/start.jar

成功运行将有如下信息输出:

2023-03-08 17:24:24.161:INFO::main: Logging initialized @308ms2023-03-08 17:24:24.431:WARN::main: demo test-realm is deployed. DO NOT USE IN PRODUCTION!2023-03-08 17:24:24.434:INFO:oejs.Server:main: jetty-9.3.0.v201506012023-03-08 17:24:24.457:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:///opt/jetty-distribution-9.3.0.v20150601/demo-base/webapps/] at interval 12023-03-08 17:24:24.826:INFO:oejsh.ContextHandler:main: Started [email protected]{/,file:///opt/jetty-distribution-9.3.0.v20150601/demo-base/webapps/ROOT/,AVAILABLE}{/ROOT}2023-03-08 17:24:24.929:WARN::main: test-jaas webapp is deployed. DO NOT USE IN PRODUCTION!2023-03-08 17:24:24.978:INFO:oejsh.ContextHandler:main: Started [email protected]46238e3f{/test-jaas,file:///tmp/jetty-0.0.0.0-8080-test-jaas.war-_test-jaas-any-9105214562680121772.dir/webapp/,AVAILABLE}{/test-jaas.war}2023-03-08 17:24:25.162:WARN::main: async-rest webapp is deployed. DO NOT USE IN PRODUCTION!2023-03-08 17:24:25.208:INFO:oejsh.ContextHandler:main: Started [email protected]6b67034{/async-rest,[file:///tmp/jetty-0.0.0.0-8080-async-rest.war-_async-rest-any-1023939491558622183.dir/webapp/, jar:file:///tmp/jetty-0.0.0.0-8080-async-rest.war-_async-rest-any-1023939491558622183.dir/webapp/WEB-INF/lib/example-async-rest-jar-9.3.0.v20150601.jar!/META-INF/resources],AVAILABLE}{/async-rest.war}2023-03-08 17:24:25.311:WARN::main: test-jndi webapp is deployed. DO NOT USE IN PRODUCTION!2023-03-08 17:24:25.386:INFO:oejsh.ContextHandler:main: Started [email protected]8b96fde{/test-jndi,file:///tmp/jetty-0.0.0.0-8080-test-jndi.war-_test-jndi-any-1692053319754270133.dir/webapp/,AVAILABLE}{/test-jndi.war}2023-03-08 17:24:25.508:WARN::main: test-spec webapp is deployed. DO NOT USE IN PRODUCTION!2023-03-08 17:24:25.594:INFO:oejsh.ContextHandler:main: Started [email protected]69930714{/test-spec,[file:///tmp/jetty-0.0.0.0-8080-test-spec.war-_test-spec-any-5518740932795802823.dir/webapp/, jar:file:///tmp/jetty-0.0.0.0-8080-test-spec.war-_test-spec-any-5518740932795802823.dir/webapp/WEB-INF/lib/test-web-fragment-9.3.0.v20150601.jar!/META-INF/resources],AVAILABLE}{/test-spec.war}2023-03-08 17:24:25.781:INFO:oejsh.ContextHandler:main: Started [email protected]3eb7fc54{/proxy,file:///tmp/jetty-0.0.0.0-8080-xref-proxy.war-_xref-proxy-any-3068657547009829038.dir/webapp/,AVAILABLE}{/xref-proxy.war}2023-03-08 17:24:25.786:INFO:oejsh.ContextHandler:main: Started [email protected]59662a0b{/oldContextPath,null,AVAILABLE}2023-03-08 17:24:25.951:WARN::main: test webapp is deployed. DO NOT USE IN PRODUCTION!2023-03-08 17:24:26.248:INFO:oejsh.ContextHandler:main: Started [email protected]4f83df68{/test,file:///tmp/jetty-0.0.0.0-8080-test.war-_test-any-5238659347611323540.dir/webapp/,AVAILABLE}{/test.war}2023-03-08 17:24:26.255:INFO:oejs.ServerConnector:main: Started [email protected]5a9c4ad9{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}2023-03-08 17:24:26.259:INFO:oejus.SslContextFactory:main: x509={jetty.eclipse.org=jetty} wild={} alias=null for [email protected]23941fb4(file:///opt/jetty-distribution-9.3.0.v20150601/demo-base/etc/keystore,file:///opt/jetty-distribution-9.3.0.v20150601/demo-base/etc/keystore)2023-03-08 17:24:26.269:INFO:oejs.ServerConnector:main: Started [email protected]5d908d47{SSL,[ssl, http/1.1]}{0.0.0.0:8443}2023-03-08 17:24:26.270:INFO:oejs.Server:main: Started @2417ms

现在可以通过浏览器访问 http://localhost:8080, 此时可以看到一个Jetty的欢迎页面,页面上包含几个简单的例子,欢迎页面如下

注:
示例的web应用程序不一定是安全,所以不建议部署在生产环境上。
你可以通过以下命令查看示例应用的配置信息
cd $JETTY_HOME/demo-base/java -jar $JETTY_HOME/start.jar --list-modules java -jar %JETTY_HOME/start.jar --list-config
--list-modules:此命令将返回当前服务所有可用的模块,同时也会显示本地的模块,信息包括模块实现的顺序,依赖模块以及相应的jar信息
--list-config:显示运行环境和配置文件等信息
改变Jetty的端口
通过在启动命令中设置jetty.http.port属性的值,可以让Jetty运行在修改后的端口上。
cd $JETTY_BASE
java -jar $JETTY_HOME/start.jar jetty.http.port=8081

另外,可以将要设置的端口属性添加到start.ini或者start.d/http.ini文件中。默认情况,在start.d/http.ini文件中定义的jetty.http.port属性可以被修改成另一个值。

配置属性信息通过如下方式获得
1.首先去start.d/http.ini文件中找jetty.http.port=8080配置信息,若找到配置端口即为指定端口
2.据模块modules/http.mod文件找到指定配置默认为etc/jetty-http.xml,在此配置文件中有jetty.http.port配置信息,若找到即为此端口配置
3.若上面两个都没有,则随机一个没有使用的端口

为HTTPS & HTTP2增加SSL

可通过如下命令,添加并激活HTTPS和HTTP2模块

java -jar $JETTY_HOME/start.jar --add-to-startd=https,http2 java -jar $JETTY_HOME/start.jar 2023-03-08 17:27:45.933:INFO:oejs.ServerConnector:main: Started [email protected]{SSL,[ssl, alpn, h2, http/1.1]}{0.0.0.0:8443}
--add-to-startd:此命令在ini文件中设置有效的配置信息,使HTTPS和HTTP2支持SSL连接
输入java -jar $JETTY_HOME/start.jar --add-to-startd=https,http2命令后会提示下载一些jar包,输入y按回车,最终提示信息如下,说明操作成功:

修改Jetty的HTTPS端口
你可以通过增加jetty.ssl.port启动参数来修改HTTPS的端口信息 例如:5500
cd $JETTY_BASEjava -jar $JETTY_HOME/start.jar jetty.ssl.port=5500
除了在命令行增加参数的方法外,还可以在start.ini和start.d/*.ini文件中进行配置,所以如果用户使用--add-to-startd命令来使HTTPS生效,同样也可以在start.d/https.ini文件中进行修改。
更多的start.jar操作选项
start.jar的工作是用来翻译命令行内容的,start.ini和start.d目录(包含其中的*.ini文件)生成一个classpath环境,各种属性和配置可以使用Jetty相应的xml进行配置,更多的使用方法可以通过使用命令来获得帮助
java -jar $JETTY_HOME/start.jar --help
部署Web应用
Jetty支持热部署,可以自动部署webapps目录下的项目。标准的war文件和Jetty配置文件放置在webapps目录下,通过以下规则进行热部署
1.例如一个包含 WEB-INF/ 子文件夹的example/文件夹做为一个标准的web应用进行部署,否则就按静态资源部署,context路径为/example(访问路径:http://localhost:8080/example/);若文件夹名字为ROOT,则访问路径为/;若文件夹名字末尾为.d则此文件夹被忽略(除非被特殊的配置文件引用)
2.若一个文件example.war被部署在webapps下,则context路径为example/,如果名字为ROOT则访问路径为/,如果example.war文件和example/文件夹同时存在,只有war文件会被部署(这个文件会被当做一个没有被解压的目录来使用)
3.一个像example.xml的配置文件,若文件中是标准的配置信息,也会被部署,文件中必须包含context path,如果context path和example.xml同时存在,只有example.xml会被部署。
如果你有一个标准的web应用,可以直接将其拷贝到webapps文件夹下进行热部署。

Jetty示例Web Application

demo-base/webapps文件下的项目包含如下部署和附加的的文件:
ROOT/:这个文件夹包含各种静态资源。包含Jetty欢迎页面,默认访问路径为/
test.d:一个包含附加配置文件的文件夹,被test.xml使用用来为test.war增加额外的配置
test.xml:一个context配置文件,用来配置和部署test.war,包含上下文环境和test.d里面的配置附加的配置信息
test.war:在test.xml里面配置的示例web程序
async-rest.war:一个异步示例的web应用程序
test-jaas.war:一个使用JAAS身份验证的web应用程序。
test-jaas.xml:用来配置test-jaas.war的配置文件
test-jndi.war:一个使用JNDI的示例应用
test-jndi.xml:用来配置test-jndi.war的配置文件
test-spec.war:一个使用注解,ServletContainerInitializers 和Servlet 3.0/3.1规范的示例应用
test-spec.xml:用来配置test-spec.war的配置文件
xref-proxy.war:使用代理的一个示例应用
example-moved.xml:一个演示MovedContextHandler重定向使用的示例应用

异步Servlet

异步Servlet是Servlet3.0出来的新特性。在并发量较大的情况下,若一个Servlet处理较慢,则会导致所有Servlet需要排队等待之前的Servlet线程处理完后才能继续执行。在加入异步Servlet之后,可以在处理时间较长的Servlet中增加单独的工作线程专门处理该业务,然后Servlet线程继续处理其他的Servlet请求

0x02 Jetty漏洞复现

CVE-2021-28169-敏感信息泄露
漏洞简介:
在9.4.40, 10.0.2, 11.0.2版本前,Jetty Servlets中的ConcatServlet、WelcomeFilter类存在多重解码问题,如果开发者主动使用了这两个类,攻击者可以利用其访问WEB-INF目录下的敏感文件,造成配置文件及代码泄露。
影响版本:
jetty 9.4.40jetty 10.0.2jetty 11.0.2
漏洞复现
访问8080端口,是一个初始的example页面,尝该页面使用到了ConcatServlet来优化静态文件的加载,
正常通过/static?/WEB-INF/web.xml无法访问到敏感文件web.xml.

对字母“W"进行双重URL编码,即可绕过限制进行访问:

/static?/%2557EB-INF/web.xml

CVE-2021-28164  敏感信息泄露

漏洞简介:

在Jetty9.4.37版本中,为了符合RFC3986中的规范,选择性地支持可能有歧义解释的URI,默认模式允许URL编码,简单看下RFC3986(替代RFC2396)的规定

其大致意思是:

.和..称为点段,都是为路径名层次结构中的相对引用而定义的,它们在一些操作系统文件目录结构中分别代表当前目录和父目录。但是与文件系统不同的是,这些点段仅在 URI 路径中解释层次结构,并作为解析过程的一部分被删除。也就是说在解析URI路径时,需要先处理.和..,Jetty为了符合这种处理方式,却导致了一系列的漏洞产生,首先是在9.4.39版本中修复了CVE-2021-28164,然后出现了新的绕过,其又在9.4.43版本中修复了CVE-2021-34429。

漏洞利用
CVE-2021-28164漏洞利用
访问docker搭建的漏洞环境(8080端口),是一个简单的初始化页面。直接访问/WEB-INF/web.xml 会响应一个404d 页面

执行攻击payload读取web.xml。payload: /%2e/WEB-INF/web.xml

CVE-2021-34429 修复绕过-敏感信息泄露
基本绕过原理:
可以使用一些编码字符来制作URI,以访问WEB-INF目录的内容和/或绕过一些安全限制。默认合规模式允许带有包含 %u002e 段的 URI 的请求访问WEB-INF目录中的受保护资源。
例如,/%u002e/WEB-INF/web.xml可以检索 web.xml 文件的请求。这可能会泄露有关 Web 应用程序实现的敏感信息。同样,编码的空字符可能会阻止正确的规范化,因此/.%00/WEB-INF/web.xml也会检索 web.xml 文件。
复现过程:
照常访问/WEB-INF/web.xml,响应404.
使用%u002e绕过:

使用空字符绕过:

0x03 知识星球


付费圈子

欢 迎 加 入 星 球 !

代码审计+免杀+渗透学习资源+各种资料文档+各种工具+付费会员

进成员内部群

星球的最近主题和星球内部工具一些展示

关 注 有 礼

关注下方公众号回复“666”可以领取一套领取黑客成长秘籍

 还在等什么?赶紧点击下方名片关注学习吧!


群聊 | 技术交流群-群除我佬

干货|史上最全一句话木马

干货 | CS绕过vultr特征检测修改算法

实战 | 用中国人写的红队服务器搞一次内网穿透练习

实战 | 渗透某培训平台经历

实战 | 一次曲折的钓鱼溯源反制

免责声明
由于传播、利用本公众号渗透安全团队所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号渗透安全团队及作者不为承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
好文分享收藏赞一下最美点在看哦

文章来源: http://mp.weixin.qq.com/s?__biz=MzkxNDAyNTY2NA==&mid=2247501658&idx=4&sn=d59fd91e1d34d63e9ce305702e28f9a4&chksm=c1763af5f601b3e37cef8ea4af36609d78855dd58453ca066b6d3c62b153e45f1b2e47264b49#rd
如有侵权请联系:admin#unsafe.sh