手写一个超级简单的tomcat服务器,哈哈~

使用socket通信原理实现简单的http协议,代码很简单

启动后访问自己的tomcat:http://localhost:8080/, 返回结果如下:

 

0

如何优化Tomcat服务器的利用率

要想优化Tomcat的利用率,可以从下面的示例开始:

我们可以想象Tomcat是一个瓶子,如果想在其中放更多的水,并在几秒钟内尽快倒出水,则需要考虑两个因素:

  • 瓶颈的大小。
  • 瓶子本身的体积。

同样,调整Tomcat服务器时,需要关注两个因素。

  • 连接器。 –>瓶颈,在server.xml中定义。
  • JVM(最大内存池)。 –>内存,在Java选项中定义。

首先,取消下面行的注释,使用自定义的executor。默认情况下,executor是禁用的。

通常,maxThreads=”500″ minSpareThreads=”20″ maxIdleTime=”60000″ 这几个就够了。

然后更改连接超时值。

至于jvm优化,以后再说。

0

警惕!Tomcat出现了危险的漏洞

0x01 漏洞背景

2020年02月20日, 360CERT 监测发现 国家信息安全漏洞共享平台(CNVD) 收录了 CNVD-2020-10487 Apache Tomcat文件包含漏洞

Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持。由于Tomcat本身也内含了HTTP服务器,因此也可以视作单独的Web服务器。

CNVD-2020-10487/CVE-2020-1938是文件包含漏洞,攻击者可利用该漏洞读取或包含 Tomcat 上所有 webapp 目录下的任意文件,如:webapp 配置文件、源代码等。

0x02 影响版本

  • Apache Tomcat 9.x < 9.0.31
  • Apache Tomcat 8.x < 8.5.51
  • Apache Tomcat 7.x < 7.0.100
  • Apache Tomcat 6.x

0x03 漏洞分析

3.1 AJP Connector

Apache Tomcat服务器通过Connector连接器组件与客户程序建立连接,Connector表示接收请求并返回响应的端点。即Connector组件负责接收客户的请求,以及把Tomcat服务器的响应结果发送给客户。在Apache Tomcat服务器中我们平时用的最多的8080端口,就是所谓的Http Connector,使用Http(HTTP/1.1)协议在conf/server.xml文件里,他对应的配置为

而 AJP Connector,它使用的是 AJP 协议(Apache Jserv Protocol)是定向包协议。因为性能原因,使用二进制格式来传输可读性文本,它能降低 HTTP 请求的处理成本,因此主要在需要集群、反向代理的场景被使用。Ajp协议对应的配置为

Tomcat服务器默认对外网开启该端口 Web客户访问Tomcat服务器的两种方式:

3.2 代码分析

漏洞产生的主要位置在处理Ajp请求内容的地方

这里首先判断SC_A_REQ_ATTRIBUTE,意思是如果使用的Ajp属性并不在上述的列表中,那么就进入这个条件

SC_A_REQ_REMOTE_PORT对应的是AJP_REMOTE_PORT,这里指的是对远程端口的转发,Ajp13并没有转发远程端口,但是接受转发的数据作为远程端口。

于是这里我们可以进行对Ajp设置特定的属性,封装为request对象的Attribute属性 比如以下三个属性可以被设置

3.3 任意文件读取

当请求被分发到org.apache.catalina.servlets.DefaultServlet#serveResource()方法

调用getRelativePath方法,需要获取到request_uri不为null,然后从request对象中获取并设置pathInfo属性值和servletPath属性值

接着往下看到getResource方法时,会把path作为参数传入,获取到文件的源码

漏洞演示:读取到/WEB-INF/web.xml文件

3.4 命令执行

当在处理 jsp 请求的uri时,会调用 org.apache.jasper.servlet.JspServlet#service()

最后会将pathinfo交给serviceJspFile处理,以jsp解析该文件,所以当我们可以控制服务器上的jsp文件的时候,比如存在jsp的文件上传,这时,就能够造成rce

漏洞演示:造成rce

0x04 修复建议

更新到如下Tomcat 版本

 Tomcat 分支版本号
Tomcat 77.0.0100
Tomcat 88.5.51
Tomcat 99.0.31

Apache Tomcat 6 已经停止维护,请升级到最新受支持的 Tomcat 版本以免遭受漏洞影响。请广大用户时刻关注 Apache Tomcat® – Welcome! 获取最新的 Tomcat Release版本,以及 apache/tomcat: Apache Tomcat 获取最新的 git 版本。

0x05 相关空间测绘数据

360安全大脑-Quake网络空间测绘系统通过对全网资产测绘,发现 Apache Tomcat 在国内存在大范围的使用情况。具体分布如下图所示。

0x06 产品侧解决方案

6.1 360城市级网络安全监测服务

360安全大脑的QUAKE资产测绘平台通过资产测绘技术手段,对该类 漏洞/事件 进行监测,请用户联系相关产品区域负责人获取对应产品。

6.2 360AISA全流量威胁分析系统

360AISA基于360海量安全大数据和实战经验训练的模型,进行全流量威胁检测,实现实时精准攻击告警,还原攻击链。目前产品具备该漏洞/攻击的实时检测能力。

0x07 时间线

2020-02-21 360-CERT 发布分析报告

0

设置Tomcat指定JDK版本代替默认环境变量JDK

简介

目前遇到这样一个情况,我们的软件只有部署在JDK1.7环境的tomcat下才会比较稳定。而客户的服务器上装的是JDK1.8,而且他们的环境还不能变,因为服务器中的其他程序都是依赖JDK1.8的环境开发的。他们又不能单独部署。后来经过查资料发现可以设置tomcat指定JDK环境的版本和JDK的路径。

下面就把指定的步骤和大家说下,主要是修改文件。根据系统的不同,分为windows的配置和linux的配置。

windows

1、解压下载的tomcat

2、找到bin下的setclasspath.bat文件;在文件的开始出添加如下代码

上面的意思是设定JAVA_HOMEJRE_HOME的路径

通过这里我们可以看出可以不设置JDK的环境变量

linux

bin下找到setclasspath.sh,在文件的最开始加入如下代码

修改了setclasspath文件之后,tomcat在启动时便使用设定的JDK。

但是为什么这样设置之后就可以呢?

我们都知道启动tomcat可以通过运行bin下的startup.batstartup.bat会调用catalina.bat文件,而catalina.bat会调用setclasspath.bat文件来获取JAVA_HOMEJRE_HOME这两个环境变量的值,因此若要在tomcat启动时指向特定的JDK,则需在setclasspath.bat文件的开头处加上JAVA_HOMEJRE_HOME。http://791202.com/

基于上面的运行方式,还有第二种修改方式,如下:

1、修改tomcat/bin/catalina.bat,增加

2、修改tomcat/bin/setclasspath.bat,同样增加

这两种方式使用任何一种都可以实现修改tomcat的依赖JDK环境,同时可以不配置JDK的环境变量。

0

tomcat端口修改,你会吗?

修改Tomcat的端口号:

tomcat默认的端口是8080,如果8080端口号冲突,可以用如下方法修改Tomcat的端口号:

找到Tomcat的根(安装)目录,有一个conf文件夹,在里面找到Server.xml文件,打开该文件。

找到下面这一行:

也有可能是这样的:

将port=”8080″改为其它的就可以了。如port=”8081″等。

保存server.xml文件,重新启动Tomcat服务器,Tomcat就可以使用8081端口了。

注意,有的时候要使用两个tomcat,那么就需要修改其中的一个的端口号才能使得两个同时工作。

修改了上面的以后,还要修改两处:

(1)将如下的8009改为其它的端口。

(2)继续将如下的8005改为其它的端口。

经过以上3个修改,应该就可以了。

更多tomcat使用教程,请持续关注本站:http://791202.com/

0

SpringBoot内嵌Tomcat参数优化

我们都知道SpringBoot默认使用的是Tomcat作为WebServer。为了更好的优化Tomcat使用,我们需要知道一些必要的参数设置。

注意要结合自己系统的实际需求设置哦。

0

Tomcat配置JVM参数(包括单独配置和在eclipse、idea里配置)

环境

Tomcat8.5,jdk8

配置参数说明

-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize:设置年轻代大小
-XX:NewRatio:设置年轻代和年老代的比值
-XX:SurvivorRatio:年轻代中Eden区与两个Survivor区的比值
-XX:PermSize:设置持久代大小
-XX:ParallelGCThreads:设置并行收集器收集时使用的CPU数,并行收集线程数

配置说明

情况一:在catalina.bat或catalina.sh文件里配置

Linux环境

找到 tomcat 的 bin 目录下的 catalina.sh 文件,在第110行 # OS specific support. $var must be set to either true or false.后,也就是shell代码开头,添加如下参数

检验是否生效

运行startup.sh启动tomcat,输入如下命令

如下图所示,JVM启动参数和我们添加的参数一样,说明有效。

Windows环境

找到 tomcat 的 bin 目录下的 catalina.bat 文件,在第127行 set "CURRENT_DIR=%cd%" 后,添加设置JVM参数代码

检验是否生效

运行startup.bat启动tomcat,然后命令行窗口中输入命令jvisualvm(打开JDK自带的JVM工具Java Visual),查看tomcat的JVM参数。

如下图所示,JVM启动参数和我们添加的参数一样,说明有效。

情况二:在setenv.bat或者setenv.sh文件里配置

setenv.bat或者setenv.sh是tomcat的变量通用文件,里面的变量可以被多种启动器调用,可以被daemon.sh和startup.sh等启动器引用。如果tomcat的bin目录下没有这个文件,可以手动创建。以下是setenv.sh样本

这边我们可以加上如下代码,方便查看

检测是否生效

运行catalina.sh,查看日志,可以看到配置的信息

windows下就是在setenv.bat文件里加上如下代码

情况三:Eclipse中修改tomcat配置jvm参数

修改1:

在Eclipse中下面Servers双击Tomcat Server… 然后点击General InformAtion 下的Open launch configuration;

会弹出Edit Configuration,然后在选中Arguments选项卡;在VM arguments文本框中最后面添加

具体如何设置自行参考

修改2:

在Eclipse菜单栏中Window ——》Preferences ——》Server ———》 Runtime Environment

选择您用的Tomcat 然后点击Edit…弹出Edit Server Runtime Ecvironment 下面JRE选项后面的Installed JREs…

点击弹出Installed JREs;在选中您用的Jre在点击Edit..在Defaul VM Arguments:中填入-Xms256m -Xmx512m(具体如何设置自行参考)

情况四:Idea中修改tomcat配置jvm参数

补充说明

上面的jvm参数设置只是举个例子,不一定是最好的,大家自行根据实际情况决定如何配置。

0