学习KaLi
本文最后更新于:2024年11月8日 下午
💀学习KaLi💀
🛑郑重声明
此文章可能会包含敏感以及危险的命令❗❗❗命令有风险,回车需谨慎。
此文章仅供学习交流与参考使用,禁止运用于任何非法行动或测试中,若有预期之外的后果,将不承担任何责任!!
❌ERHE再次进行警告与提醒!
┌──( root💀KaLi-Erhe )-[ ~ ]
└─# cat 重要的事情说三遍 ❗❗❗
⭕命令有风险,回车需谨慎 ❗
⭕命令有风险,回车需谨慎 ❗
⭕命令有风险,回车需谨慎 ❗
👋一、KaLi系统准备
🪶KaLi终端字体改变
- 放大:Ctrl+Shift+加号
- 缩小:Ctrl+减号
➰了解它的Shell类型
查看系统环境变量和Shell类型的命令
1 |
|
PS:zsh类型的shell比bash类型的shell更强,而且zsh完全兼容bash的用法和命令
💀使用ROOT用户
开启ROOT
1 |
|
如何登录?
点击注销,然后在系统用户登录界面重新登录,用户名填root
就行了。
🌐更改kali源
换中国科技大学的源
1 |
|
PS:vim显示行号
Esc==>:==>set nu
PS:复制粘贴小技巧
1、复制:在kali终端下,使用鼠标选中内容,就可以完成kali下复制,
2、粘贴:移动光标到需要粘贴的位置,按下鼠标中间的滚轮,就可以粘贴
PS:更新源扩展
dists区域 | 软件包组件标准 |
---|---|
main | 遵从 Debian自由软件指导方针(DFSG),并且不依赖于non-free |
contrib | 遵从 Debian自由软件指导方针(DFSG),但依赖于non-free |
non-free | 不遵从Debian自由软件指导方针(DFSG) |
🛠️安装更新
1 |
|
PS:apt upgrade和dist-upgrade的差别
upgrade升级时,如果软件包有相依性的问题,此软件包就不会被升级。
dist-upgrade升级时,如果软件包有相依性问题,会移除旧版,直接安装新版本.(所以通常dist-upgrade会被认为是有点风险的升级)
🧹清理安装包
1 |
|
🔧apt常用命令:
install:安装软件包apt install
remove:移除软件包apt remove
update:更新可用软件包列表apt update
upgrade:通过安装/升级软件来更新系统apt upgrade
full-upgrade:通过卸载/安装/升级来更新系统apt dist-upgrade
edit-sources:编辑软件源信息文件vim /etc/apt/sources.liste
👀关闭锁屏
依次进入:左上角==>设置==>电源管理器==>安全性==>自动锁定会话:从不==>当系统进入睡眠状态··· ··· ,去掉那个勾
PS:init 0
快速关机命令
⚪临时配置IP
1 |
|
🟠永久配置IP
1 |
|
⚪更改DNS
1 |
|
🪛配置SSH,可ROOT直接登录
编辑配置文件
1 |
|
操作此服务
1 |
|
🛠️安装系统功能
文件上传下载功能
1 |
|
📑二、被动信息收集
域名记录:
- A记录:正向解析,IP==>域名
- PTR记录:反向解析,域名==>IP
- CNAME:这个域名引用到其他域名上面
- MX记录:邮件交换记录,指向邮件服务器
- NS记录:域名服务器记录,指定此域名由哪个服务器进行解析
📞获取IP地址 / DNS
1 |
|
1 |
|
1 |
|
📜查询域名注册信息与备案信息
1 |
|
🔀收集子域名的信息
- Maltego 子域名挖掘机
- 谷歌搜索:
site:[主域名]
- 第三方网站查询: http://tool.chinaz.com/subdomain、https://dnsdumpster.com/
- 证书透明度公开日志枚举: https://crt.sh/、http://censys.io/
其他途径: https://phpinfo.me/domain、http://dns.aizhan.com
🕵️MALTEGO信息收集工具
MALTEGO来了解一下~ 启动界面:
打开以后:
🔍使用Shodan暗黑谷歌搜索引擎
搜索地址:https://shodan.io
使用方法:例如:
搜索网络监控 输入:webcam
搜索IP 输入:net:[IP]
搜索端口号 输入:port:[端口]
搜索特定城市 输入:city[城市信息]
📚三、主动信息收集
📡协议了解
OSI扫描,主要是在二三四层进行探测发现
协议
基于OSI模型进行扫描的优缺点
- 二层扫描的优缺点
优点:扫描速度快、可靠
缺点:不可路由 - 三层扫描的优缺点
优点:可路由,速度较快
缺点:速度比二层慢,经常被边界防火墙过滤使用IP、icmp 协议 - 四层扫描的优缺点
优点:可路由且结果可靠不太可能被防火墙过滤、可以发现所有端口都被过滤的主机
缺点:基于状态过滤的防火墙可能过滤扫描、全端口扫描速度慢
📲路由跟踪
1 |
|
查看局域网内的IP是否有冲突,或者是查看IP对应的MAC地址,使用arping
命令
ARP协议工作原理:IP<==>MAC
1 |
|
🐕扫描、嗅探局域网中存活的主机
1 |
|
PS:主动方式容易被抓
💥压力测试,DOS攻击
1 |
|
检测网段内存活的主机
1 |
|
🕵️Nmap网络扫描
1 |
|
nmap扫描有两种模式
- TCP全连接扫描,三次握手完成,且会留记录
- TCP半连接扫描,两次握手完成就断开,不会被记录
1 |
|
🩺nc端口监听与扫描
nc是netcat的简写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单可靠的网络工具
nc的作用:
- 实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
- 端口的扫描,nc可以作为client发起TCP或UDP连接
- 机器之间传输文件
- 机器之间网络测速
1 |
|
查看端口被哪个进程使用
1 |
|
用ps
命令来查看这个进程的PID所对应的文件
1 |
|
用shich
命令来查看这个进程的PID所对应的文件
1 |
|
📡检测到达目标地址的路由设备
1 |
|
🐱👤Scapy工具概述
Scapy是一个可以让用户发送、侦听和解析并伪装网络报文的Python程序。这些功能可以用于制作侦测、扫描和攻击网络的工具还可以查看目标MAC地址。输入scapy
命令即可启动
查看Scapy里面的ARP协议
1 |
|
发ARP包格式
1 |
|
查看Scapy里面的IP协议
1 |
|
查看Scapy里面的ICMP协议
1 |
|
Scapy定制Ping包
1 |
|
查看Scapy里面的TCP协议
1 |
|
Scapy定制TCP协议SYN请求,这种是基于半连接扫描,更隐蔽
1 |
|
最后使用exec()
命令退出Scapy。
☠️四、僵尸扫描
僵尸扫描有极高的隐蔽特性,能够伪造IP,但实施条件苛刻。
僵尸主机:僵尸主机是指感染僵尸程序病毒,从而被黑客程序控制的计算机设备。但是僵尸扫描中的僵尸主机指得是一个闲置的操作系统(这里的闲置是指主机不会主动和任何人通信),且此系统中IP数据包中IPID是递增的。
🐱👤使用Scapy进行僵尸扫描
1、端口开放状态的扫描原理:
TCP三次握手发包过程中,SYN/ACK是第二次包
这里最后看僵尸机(Zombie)返回的IPID+2,即是目标服务器(Target)端口开放
1 |
|
2、端口关闭状态的扫描原理:
1 |
|
⛔PS:此三步的使用命令一定要很快的执行,防止僵尸主机在输入命令的时间里,发送了其他的数据包使得IPID数据不正确。同时这也证实了僵尸机施条件苛刻。
🕵️使用nmap来找僵尸主机
在网段里面找
1 |
|
测试单台能作为僵尸主机
1 |
|
返回的结果
1 |
|
🗃️五、WireShark
🕵️♂️WireShark使用技巧
- 确定Wireshark的物理位置。如果没有一个正确的位置,启动Wireshark后会花费很长的时间捕获一些与自己无关的数据。
- 选择捕获接口。一般都是选择连接到Internet网络的接口,这样才可以捕获到与网络相关的数据。否则,捕获到的其它数据对自己也没有任何帮助。
- 使用捕获过滤器。通过设置捕获过滤器,可以避免产生过大的捕获数据。这样用户在分析数据时,也不会受其它数据干扰。而且,还可以为用户节约大量的时间。
- 用显示过滤器。通常使用捕获过滤器过滤后的数据,往往还是很复杂。为了使过滤的数据包再更细致,此时使用显示过滤器进行过滤。
- 使用着色规则。通常使用显示过滤器过滤后的数据,都是有用的数据包。如果想更加突出的显示某个会话,可以使用着色规则高亮显示。
- 构建图表。如果用户想要更明显的看出一个网络中数据的变化情况,使用图表的形式可以很方便的展现数据分布情况。
- 重组数据。当传输较大的图片或文件时,需要将信息分布在多个数据包中。这时候就需要使用重组数据的方法来抓取完整的数据。Wireshark的重组功能,可以重组一个会话中不同数据包的信息,或者是重组一个完整的图片或文件。
📳抓包模式
- 混杂模式:抓经过网卡是所有数据包
- 普通模式:只抓取流向网卡的数据包
从混杂模式到普通模式的设置
🗑️过滤器的使用
过滤UDP包:输入udp
或者dns
过滤目的IP:输入ip.addr==IP地址
ip.src_host==IP地址
这个是本地的IPip.dst_host==IP地址
这个是目的主机的IP
多条件筛选可也以用or
或者是and
来连接or
是两个条件都成立,and
是两个条件只成立一个就行
🙈对常用协议进行抓包
要换成普通模式,再抓包,可避免一些干扰的数据包存在
- ARP包详解
用抓包信息来看
192.168.1.53向局域网发ARP包说:谁有网关(1.1)的MAC地址发给我?
网关(1.1)向局域网发ARP包回复说:网关(我)的MAC是xx:xx:xx:xx
ARP包中数据详细内容如下
1 |
|
- ICMP协议
用抓包信息来看
requst:问包 reply: 答包
- TCP协议
因为HTTP协议是在TCP协议之上的,所以在过滤TCP协议的数据包的时候会也会包含HTTP数据包
1.14向1.53建立SSH连接,用抓包信息来看:三次握手建立连接
可进入流量图来查看:统计==>流量图
断开连接时的四次握手
第一次挥手:服务端发送一个[FIN+ACK],表示自己没有数据要发送了,想断开连接,并进入FIN_WAIT_1状态
第二次挥手:客户端收到FIN后,知道不会再有数据从服务端传来,发送 ACK进行确认,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),客户端进入CLOSE_WAIT状态。
第三次挥手:客户端发送[FIN+ACK]给对方,表示自己没有数据要发送了,客户端进入LAST_ACK状态,然后直接断开TCP会话的连接,释放相应的资源。
第四次挥手:服务户端收到了客户端的FIN信令后,进入TIMED_WAIT状态,并发送 ACK确认消息。服务端在TIMED WAIT状态下,等待一段时间,没有数据到来,就认为对面已经收到了自己发送的ACK并正确关闭了进入CLOSE状态,自己也断开了TCP连接,释放所有资源。当客户端收到服务端的ACK回应后,会进入CLOSE状态并关闭本端的会话接口,释放相应资源。
- HTTP协议
抓包的时候先进入一个网页
1 |
|
用抓包信息来看
第一步:我们我们发送了一个HTTP的HEAD请求。
第二步:服务器收到我们的请求返回了一个Seq/ACK进行确认。
第三步:服务器将HTTP的头部信息返回给我们客户端状态码为200表示页面正常第四步:客户端收到服务器返回的头部信息向服务器发送Seq/ACK进行确认。发送完成之后客户端就会发送FIN/ACK来进行关闭链接的请求。
📡WireShark抓包解决服务器被黑上不了网
场景:服务器主机TTL值被恶意修改成1,导致可以Ping通网关,但是不能上网。
TTL:数据报文的生存周期
默认Linux操作系统值:64,每经过一个路由节点,TTL值减1,当TTL值为0时,说明目标地址不可达并返回:Time to live exceeded。作用:防止数据包,无限制在公网中转发。
修改TTL值
1 |
|
思路:通过抓混杂模式来进行局域网内部状况的观测,查到哪个IP地址发的包异常,导致的局域网异常,来进一步的进行处理。
🕵️♂️六、NMAP高级使用技巧
🧐NMAP基础
NMAP是一个网络探测和安全扫描程序,系统管理者和个人可以使用这个软件扫描大型的网络,获取那台主机正在运行以及提供什么服务等信息。nmap支持很多扫描技术,例如: UDP、TCP connect()、TCP SYN(半开扫描)、 ftp代理(bounce攻击)、反向标志、ICMP、 FIN、ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描。还可以探测操作系统类型。
NMAP可用于:
- 检测活在网络上的主机(主机发现)
- 检测主机上开放的端口(端口发现或枚举)
- 检测到相应的端口(服务发现)的软件和版本
- 检测操作系统,硬件地址,以及软件版本
- 检测脆弱性的漏洞(Nmap 的脚本)
👽NMAP端口状态解析
- open :应用程序在该端口接收TCP连接或者UDP报文。
- closed :关闭的端口对于nmap 也是可访问的,它接收nmap探测报文并作出响应。但没有应用程序在其上监听。
- filtered :由于包过滤阻止探测报文到达端口,nmap 无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由规则或者主机上的软件防火墙。
- unfiltered :未被过滤状态意味着端口可访问,但是nmap无法确定它是开放还是关闭。只有用于映射防火墙规则集的ACK扫描才会把端口分类到这个状态。
- open / filtered :无法确定端口是开放还是被过滤,开放的端口不响应就是一个例子。没有响应也可能意味着报文过滤器丢弃了探测报文或者它引发的任何反应。UDP,IP协议,FIN,Null等扫描会引起。
- closed | filtered:(关闭或者被过滤的):无法确定端口是关闭的还是被过滤的。
🩺NMAP的使用命令
1 |
|
慢速全面扫描
1 |
|
如果扫描数量较大则可以使用分布式集群扫描dnmap
🎯NESSUS漏洞检测
说明:NESSUS占用内存比较大,建议使用6-8GB的运行内存
安装.deb
包的命令
1 |
|
启动此服务
1 |
|
进入浏览器访问:
进去登录注册激活,然后还要安装部分插件
因为我没有工作邮箱无法完成注册,这个还是留给后期测试
🐱👤七、Metasploit渗透测试框架
Metasploit是一个渗透测试平台,可以进行查找,利用和验证漏洞。它是一个攻击工具开发平台。
🎛️Metasploit体系框架
1、基础库: metasploit基础库文件位于源码根目录路径下的libraries目录中,包括Rex,framework-core和framework-base三部分。
- Rex是整个框架所依赖的最基础的一些组件,如包装的网络套接字、网络应用协议客户端与服务端实现、日志子系统、渗透攻击支持例程、PostgreSQL以及 MySQL数据库支持等。
- framework-core库负责实现所有与各种类型的上层模块及插件的交互接口。
framework-base库扩展了framework-core,提供更加简单的包装例程,并为处理框架各个方面的功能提供了一些功能类,用于支持用户接口与功能程序调用框架本身功能及框架集成模块。
2、模块∶模块组织按照不同的用途分为6种类型的模块(Modules) :
- 分为辅助模块(Aux)、渗透攻击模块(Exploits)、后渗透攻击模块(Post)、攻击载荷模块(payloads)、编码器模块(Encoders)、空指令模块(Nops)。
注: payload又称为攻击载荷,主要是用来建立目标机与攻击机稳定连接的,可返回shell,也可以进行程序注入等。
3、插件:插件能够扩充框架的功能,或者组装已有功能构成高级特性的组件。插件可以集成现有的一些外部安全工具,如Nessus、openVAS漏洞扫描器等,为用户接口提供一些新的功能。
4、接口:包括msfconsole控制终端、msfcli命令行、msfgui图形化界面、armitage图形化界面以及msfapi远程调用接口。
5、功能程序: metasploit还提供了一系列可直接运行的功能程序,支持渗透测试者与安全人员快速地利用metasploit框架内部能力完成一些特定任务。比如msfpayload、msfencode和msfvenom可以将攻击载荷封装为可执行文件、C语言、JavaScript语言等多种形式,并可以进行各种类型的编码。
📋Metasploit的目录结构
进入Metasploit的目录
1 |
|
data:Metasploit使用的可编辑文件
documentation:为框架提供文档lib:框架代码库
modules:实际的MSF模块
eplugins:可以在运行时加载的插件
scripts:Meterpreter 和其他脚本
tools:各种有用的命令行工具
📲Metasploitable2靶机系统
账号:msfadmin
密码:msfadmin
首先使用的时候要部署好环境,更改root密码,设置静态IP
⛏️Metasploit基本使用方法
Metasploit程序需要使用Postgresql数据库
- PostgreSQL概述:
PostgreSQL是一种特性非常齐全的自由软件的对象,
关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES 4.2版本为基础的对象关系型数据库管理系统。
PostgreSQL启动命令:
1 |
|
通过help命令查看帮助,可以对msf有个整体认识,msf相关命令可以分成以下类型:
1 |
|
- 1、核心命令中的connect命令
connect命令主要用于远程连接主机。一般用于内网渗透。比较常用的命令就是connecte
1 |
|
- 2、模块相关的命令show使用方法-show命令用的很多。
“show”命令的有效参数是: all, encoders, nops, exploits, payloads, auxiliary, post, plugins,info, options
1 |
|
- 3、模块相关的命令search搜索的使用方法
1 |
|
每一个漏洞利用模块基于它们对目标系统的潜在影响都被标记了一个Rank字段。
用户可以基于Rank对漏洞利用模块进行搜索,分类以及排序。
- Rank按照可靠性降序排列
- excellent漏洞利用程序绝对不会使目标服务崩溃,就像SQL注入、命令执行、远程文件包含、本地文件包含等等。除非有特殊情况,典型的内存破坏利用程序不可以被评估为该级别。
- great该漏洞利用程序有一个默认的目标系统,并且可以自动检测适当的目标系统,或者在目标服务的版本检查之后可以返回到一个特定的返回地址。
- good该漏洞利用程序有一个默认目标系统,并且是这种类型软件的“常见情况”(桌面应用程序的Windows 7,服务器的2012等)
- normal该漏洞利用程序是可靠的,但是依赖于特定的版本,并且不能或者不能可靠地自动检测。eaverage该漏洞利用程序不可靠或者难以利用。
- low对于通用的平台而言,该漏洞利用程序几乎不能利用(或者低于50%的利用成功率)
- manual该漏洞利用程序不稳定或者难以利用并且基于拒绝服务(DOS)。如果一个模块只有在用户特别配置该模块的时候才会被用到,否则该模块不会被使用到,那么也可以评为该等级。
1 |
|
CVE搜索exploit相关模块
CVE概述:CVE的英文全称是“Common Vulnerabilities & Exposures”公共漏洞和暴露。CVE就好像是一个字典表,为广泛认同的信息安全漏洞或者已经暴露出来的弱点给出一个公共的名称。使用一个共同的名字,可以帮助用户在各自独立的各种漏洞数据库中和漏洞评估工具中共享数据,虽然这些工具很难整合在一起。这样就使得CVE成为了安全信息共享的“关键字”。如果在一个漏洞报告中指明的一个漏洞,如果有CVE名称,你就可以快速地在任何其它CVE兼容的数据库中找到相应修补的信息,解决安全问题。
1 |
|
联合查找:例如要查找mysql的exploit相关漏洞
1 |
|
🔩模块相关的命令use的使用方法
use使用参数。如你要使用到某个模块
1 |
|
查看漏洞模块的信息
1 |
|
🤖Metasploit核心命令
命令 | 注释 |
---|---|
? | 帮助菜单 |
banner | 显示一个metasploit横幅 |
cd | 更改当前的工作目录 |
color | 切换颜色 |
connect | 连接与主机通信 |
exit | 退出控制台 |
get | 获取特定于上下文的变量的值 |
getg | 获取全局变量的值 |
grep grep | 另一个命令的输出如: grep creds help |
help | 帮助菜单 |
history | 显示命令历史 |
irb | 进入irb脚本模式 |
load | 加载一个框架插件 |
quit | 退出控制台 |
route | 通过会话路由流量 |
save | 保存活动的数据存储 |
sessions | 转储会话列表并显示有关会话的信息 |
set | 将特定于上下文的变量设置为一个值 |
setg | 将全局变量设置为一个值 |
sleep | 在指定的秒数内不做任何事情 |
spool | 将控制台输出写入文件以及屏幕 |
threads | 线程查看和操作后台线程 |
unload | 卸载框架插件 |
unset | 取消设置一个或多个特定于上下文的变量 |
unsetg | 取消设置一个或多个全局变量 |
version | 显示框架和控制台库版本号 |
🧩Metasploit模块命令
命令 | 注释 |
---|---|
advanced | 显示一个或多个模块的高级选项 |
back | 从当前上下文返回 |
edit | 使用首选编辑器编辑当前模块 |
info | 显示有关一个或多个模块的信息 |
loadpath | 路径从路径搜索并加载模块 |
options | 显示全局选项或一个或多个模块 |
popm | 将最新的模块从堆栈中弹出并使其处于活动状态 |
previous | 将之前加载的模块设置为当前模块 |
pushm | 将活动或模块列表推入模块堆栈 |
reload_all | 从所有定义的模块路径重新加载所有模块 |
search | 搜索模块名称和描述 |
show | 显示给定类型的模块或所有模块 |
use | 按名称选择模块 |
⛏️Metasploit工作命令
命令 | 注释 |
---|---|
handler | 作为作业启动负载处理程序 |
jobs | 显示和管理作业 |
kill | 杀死一个工作 |
rename job | 重命名作业 |
📚Metasploit数据库后端命令
命令 | 注释 |
---|---|
db_connect | 连接到现有的数据库 |
db_disconnect | 断开与当前数据库实例的连接 |
db_export | 导出包含数据库内容的文件 |
db_import | 导入扫描结果文件(文件类型将被自动检测) |
db_nmap | 执行nmap 并自动记录输出 |
db_rebuild_cache | 重建数据库存储的模块高速缓存 |
db_status | 显示当前的数据库状态 |
hosts | 列出数据库中的所有主机 |
loot | 列出数据库中的所有战利品 |
notes | 列出数据库中的所有笔记 |
services | 列出数据库中的所有服务 |
vulns | 列出数据库中的所有漏洞 |
workspace | 在数据库工作区之间切换 |
💨Metasploit凭证后端命令
1 |
|
👽七、实战-使用msf渗透攻击Win7并执行远程漏洞
🤔PS:真的是越学越有判头了!~🏛️
模拟使用”永恒之蓝”工具,利用Win7系统的MS17-010漏洞,进行渗透攻击,在电脑和服务器中植入勒索软件、远程控制木马、虚拟货币挖矿机等恶意程序。下面是实现流程,
1 |
|
看到这样的反馈就说明,此主机是脆弱的因为这个漏洞,攻击可以执行
back
这个模块以后,准备进入另一个攻击模块拿下
1 |
|
准备后门
1 |
|
从上面可以看出,已经获取到了Windows的终端了,顺手给Windows新建一个新用户admin
1 |
|
以上就是成功渗透Windows7的详细过程
💨被渗透的终端退出或调入后台
退出Ctrl+C
,然后再输入一个Y
即可退出
1 |
|
查看后台,以及后台终端调起
1 |
|
被调起的Windows后台保存至后台
1 |
|
🤔总结Metasploit攻击的步骤
- 1、查找CVE公布的漏洞
- 2、查找对应的exploit模块
- 3、配置模块参数
- 4、添加payload后门
- 5、执行exploit开始攻击
👽八、实战-使用msf扫描靶机上MySQL服务的空密码
使用MySQL的渗透模块
1 |
|
执行成功
📲扫描结果的导入导出
将扫描结果导出
1 |
|
清空Metasploit数据库
1 |
|
导入.xml
文件到数据库
1 |
|
查寻Metasploit数据库
1 |
|
📣特别声明
此文章全部都是依靠自己的学习理解来写的原创文章,难免可能会出现有错误的地方,
如果大家以后阅读的时候发现有问题,那就麻烦到下方评论区来进行错误指出,使错误尽快做出改正,
在此,感谢大家的阅读与支持!🤝💦🎉
🍻支持一下
觉得我写的好的话可以支持一下我哦~持续关注我,会更新其他好玩且实用的项目。
👋如果我能帮助到你,那就请我喝杯🧋呗~👇👇👇
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!