热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

漏洞挖掘之命令注入漏洞

漏洞简介受影响的BitbucketServer和DataCenter版本存在使用环境变量的命令注入漏洞,具有控制其用户名权限的攻击者可以在系统上执行任意命令。影响


漏洞简介

受影响的Bitbucket Server 和 Data Center版本存在使用环境变量的命令注入漏洞,具有控制其用户名权限的攻击者可以在系统上执行任意命令。


影响范围

Bitbucket Server和 Data Center 的8.0 至 8.4 版会受到此漏洞的影响
• 7.0 to 7.5 (all versions)
• 7.6.0 to 7.6.18
• 7.7 to 7.16 (all versions)
• 7.17.0 to 7.17.11
• 7.18 to 7.20 (all versions)
• 7.21.0 to 7.21.5
• 8.0.0 to 8.0.4
• 8.1.0 to 8.1.4
• 8.2.0 to 8.2.3
• 8.3.0 to 8.3.2
• 8.4.0 to 8.4.1


调试环境设置

需要设置jvm参数,在启动文件start-bitbucket.sh中并没有发现相关参数,注意到这里加载了_start-webapp.sh

图片.png

在其中找到了JAVA_OPTS参数并在最后加上:

-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n"
LAUNCHER="com.atlassian.bitbucket.internal.launcher.BitbucketServerLauncher

图片.png



【一一帮助安全学习,所有资源获取处一一】
①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析


执行service atlbitbucket stop、service atlbitbucket start重启Bitbucket,观察进程发现带上了后面加的jvm参数
图片.png

然后配置idea并调试启动

图片.png


漏洞分析

根据漏洞影响范围下载了8.4.2和8.4.1版本进行对比后发现差异太大了,于是又下载了7.6.19和7.6.18版本。根据两个修复版本之间共同的差异最终锁定安全更新的部分为两个jar包:bitbucket-process-.jar和nuprocess-.jar
反编译后进一步对比发现bitbucket-process-*.jar中DefaultNioProcessConfigurer.java、NioProcessParameters.java、RemoteUserNioProcessConfigurer.java中的差异符合官方漏洞描述:有权控制其用户名权限的攻击者能够利用环境变量进行命令注入
在\com\atlassian\bitbucket\internal\process\DefaultNioProcessConfigurer.java中将环境变量的设置改为了NioProcessParameters.environmentPutIfAbsent函数

图片.png

这个函数是\com\atlassian\bitbucket\internal\process\NioProcessParameters.java中新增的,其中调用的函数对key进行了非空判断,对key和valve都进行了空字节的检测
图片.png

图片.png
在\com\atlassian\bitbucket\internal\process\RemoteUserNioProcessConfigurer.java中发现了官方描述的用户名环境变量:REMOTE_USER

图片.png
通过回溯相关类及其继承类的调用找到了路由入口,如:com.atlassian.stash.internal.rest.content.FileListResource
联想到Bitbucket也是用于Git 代码管理,猜测这里会执行git命令
图片.png

创建仓库后根据路由访问:

图片.png

跟进看一下命令在哪里执行的以及环境变量用来干什么
在RemoteUserNioProcessConfigurer中的configure方法成功命中断点,这里发现已经传入了git命令,但是漏洞描述说的是使用用户名环境变量造成的注入,所以只需关注环境变量部分

图片.png

调用DefaultAuthenticationContext.getCurrentUser方法后生成user,其中包含注册的用户名:test

图片.png

其getName方法主要逻辑就是返回注册信息中的用户名

图片.png

随后赋值给环境变量REMOTE_USER

图片.png

返回之后回到NuNioProcessHelper.run方法
图片.png

然后调用NuProcessBuilder.run方法,prepareEnvironment方法进行格式转换,取出环境变量中的key和value以’=’拼接放入字符数组

图片.png

一直跟入后发现在LinuxProcess.prepareProcess方法中环境变量经过toEnvironmentBlock方法处理

图片.png

该函数主要逻辑就是将环境变量数组中的全部环境变量转化为字节后赋值给新的block字节数组并返回。其中每次拷贝一个环境变量字节后新的拷贝位置会加一,以实现环境变量间的分隔。根据漏洞修复方式,在环境变量中使用空字节后,在这里空字节后面部分就是一个新的环境变量,猜测可能是注入了一个恶意环境变量

图片.png

返回赋值给envBlock后调用LibJava10.Java_java_lang_ProcessImpl_forkAndExec方法,这里通过调用java native方法实现命令执行

图片.png

图片.png
图片.png

这里并没有发现环境变量如何造成任意命令执行,回看其它地方也没有发现环境变量引入到命令执行触发点。相关的历史漏洞都是git参数注入

图片.png

才意识到是git环境变量:

https://git-scm.com/book/zh/v2/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F

图片.png

简单来说就是执行git命令时会自动调用相关的环境变量,而某些环境变量可以执行命令如上面的GIT_EXTERNAL_DIFF
根据文章描述该环境变量是在执行git diff时用到的,而上面的git命令用不到该环境变量
按照描述注册一个用户名为:’test GIT_EXTERNAL_DIFF=touch /tmp/test’,然后去仓库执行diff操作

图片.png

根据路由,调用到CommitDiffResource. streamDiff函数。后续流程和上面一样了,只是现在执行的git diff命令,会用到注入的git环境变量‘GIT_EXTERNAL_DIFF‘造成命令执行

图片.png


漏洞复现

注册一个带有环境变量的用户名,然后burp拦截将空格改为%00

图片.png

图片.png

然后进入仓库进行diff

图片.png

成功在/tmp目录下创建test文件

图片.png







推荐阅读
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 本文详细介绍了如何正确配置Java环境变量PATH,以确保JDK安装完成后能够正常运行。文章不仅涵盖了基本的环境变量设置步骤,还提供了针对不同操作系统下的具体操作指南。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
  • Symfony是一个功能强大的PHP框架,以其依赖注入(DI)特性著称。许多流行的PHP框架如Drupal和Laravel的核心组件都基于Symfony构建。本文将详细介绍Symfony的安装方法及其基本使用。 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • 本文详细介绍了Java中的注解功能,包括如何定义注解类型、设置注解的应用范围及生命周期,并通过具体示例展示了如何利用反射机制访问注解信息。 ... [详细]
  • QNX 微内核(procnto-instr)的监测版本内置了高级跟踪与分析工具,能够实现实时系统监控。该模块适用于单处理器及多处理器系统。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
author-avatar
临沂李晓楠
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有