【THM】JWT Security & Protocols and Servers(AI)

一、本周学习概况

本周主要完成了 TryHackMe 中两个方向的学习:

复制代码
1. JWT Security
2. Protocols and Servers

整体学习目标从"会照着命令做题"推进到"理解协议和认证机制为什么会产生漏洞"。其中 JWT Security 更偏 Web/API 身份认证安全,Protocols and Servers 更偏网络基础协议和服务识别。

二、JWT Security 学习总结

本部分重点学习了 JWT 在 Web/API 登录认证中的使用方式,以及常见的权限绕过和提权问题。

JWT 的基本结构是:

复制代码
Header.Payload.Signature

三部分含义如下:

部分 作用
Header 声明 token 类型和签名算法,如 HS256、RS256
Payload 保存用户身份和声明,如 username、admin、exp、aud
Signature 用于验证 Header 和 Payload 是否被篡改

一个重要认识是:JWT 的 Header 和 Payload 默认只是 Base64URL 编码,不是加密。因此任何拿到 token 的人都可以解码查看其中内容。

1. 敏感信息泄露

在 Example 1 中,服务端把敏感信息直接放进 JWT payload,例如密码、管理员字段或 flag。由于 payload 可以直接解码,攻击者无需破解签名就能读取敏感信息。

核心风险:

复制代码
不要把密码、密钥、内部地址、flag 等敏感数据放进 JWT。

2. 不验证签名

在 Example 2 中,服务端没有正确验证 JWT 签名。攻击者可以修改 payload 中的字段,例如:

复制代码
{
  "admin": 0
}

改成:

复制代码
{
  "admin": 1
}

然后删除签名部分,只保留最后的点:

复制代码
Header.Payload.

如果服务端仍然接受,就能实现普通用户到管理员的权限提升。

3. alg None 绕过

Example 3 学习了 alg: None 绕过。错误实现中,服务端可能相信 JWT Header 里声明的算法。如果攻击者把 Header 改成:

复制代码
{
  "typ": "JWT",
  "alg": "None"
}

并删除签名,服务端可能跳过签名验证。

关键点:

复制代码
服务端不能相信客户端传来的 alg,应该在服务端固定允许的算法。

4. 弱 Secret 爆破

Example 4 学习了 HS256 使用弱 secret 的风险。HS256 是对称签名算法,签名和验签使用同一个 secret。如果 secret 太弱,就可以用字典爆破。

使用 Hashcat 的 JWT 模式:

复制代码
hashcat -m 16500 -a 0 jwt.txt jwt.secrets.list
hashcat -m 16500 jwt.txt --show

参数含义:

参数 含义
-m 16500 JWT 破解模式
-a 0 字典攻击
jwt.txt 保存 JWT 的文件
jwt.secrets.list secret 字典

爆破出 secret 后,可以重新签发一个 admin: 1 的合法 JWT。

5. 签名算法混淆

Example 5 学习了 RS256 与 HS256 的算法混淆问题。

正常情况下:

算法 类型 密钥关系
HS256 对称算法 同一个 secret 签名和验签
RS256 非对称算法 私钥签名,公钥验签

漏洞场景是服务端错误地允许攻击者把算法从 RS256 改成 HS256,并把 public key 当作 HS256 的 secret 使用。这样攻击者可以用公开的 public key 重新签一个管理员 token。

核心认识:

复制代码
服务端必须固定算法,不能根据用户可控的 Header 自动选择验证逻辑。

6. 缺少 exp 过期时间

Example 6 学习了 JWT 缺少 exp 的风险。

exp 表示过期时间,通常是 Unix 时间戳:

复制代码
{
  "iat": 1719820000,
  "exp": 1719823600
}

如果 JWT 没有 exp,只要签名仍然有效,token 就可能长期有效。

时间戳转换命令:

复制代码
date -d @1719823600
date -u -d @1719823600

7. Cross-Service Relay Attack

Example 7 学习了跨服务 token 转发攻击。关键字段是:

复制代码
aud = audience

它表示这个 token 是签给哪个服务使用的。例如:

复制代码
{
  "username": "user",
  "admin": 1,
  "aud": "appB"
}

这个 token 正常只应该被 appB 接受。如果 appA 只检查签名,不检查 aud,就可能错误接受 appB 的管理员 token。

漏洞本质:

复制代码
服务只确认“token 是真的”,但没有确认“token 是不是签给我的”。

三、Protocols and Servers 学习总结

本部分主要学习了常见网络协议的用途、默认端口、手动交互方式和安全风险。

1. 协议和端口速查

协议 默认端口 用途 安全替代
Telnet 23 远程登录/手动测试明文协议 SSH 22
HTTP 80 Web 页面/API HTTPS 443
FTP 21 文件传输 FTPS 990 / SFTP 22
SMTP 25 发送邮件 SMTPS 465 / Submission 587
POP3 110 下载邮件 POP3S 995
IMAP 143 同步和管理邮件 IMAPS 993

一句话理解:

复制代码
HTTP 看网页,FTP 传文件,SMTP 发邮件,POP3/IMAP 收邮件,Telnet 远程交互。

2. Telnet

Telnet 是老式远程登录协议,也可以用来手动测试明文协议。

连接格式:

复制代码
telnet IP PORT

例如用 Telnet 手写 HTTP 请求:

复制代码
telnet 10.48.180.172 80

然后输入:

复制代码
GET /flag.thm HTTP/1.1
Host: 10.48.180.172
​

最后必须空一行,表示 HTTP 请求头结束。

3. HTTP

HTTP 是 Web 访问的基础协议,默认端口是 80,安全版本 HTTPS 默认端口是 443。

常见请求方法:

方法 含义
GET 获取资源
POST 提交数据
PUT 更新资源
DELETE 删除资源
OPTIONS 查询支持的方法

常用 curl:

复制代码
curl http://IP/
curl -i http://IP/
curl -v http://IP/
curl http://IP/flag.thm

4. FTP

FTP 是文件传输协议,默认端口 21。登录后可以像操作远程文件夹一样列目录、下载和上传文件。

连接:

复制代码
ftp 10.48.180.172

常用命令:

命令 作用
ls 列出远程文件
pwd 查看当前远程目录
cd 切换远程目录
get 文件名 下载文件
put 文件名 上传文件
bye / quit 退出

示例:

复制代码
ftp> ls
ftp> get flag.txt
ftp> bye

FTP 的问题是明文传输账号、密码、命令和文件内容。

5. SMTP

SMTP 负责发送邮件,默认端口 25。

常见命令:

命令 作用
HELO / EHLO 声明客户端
MAIL FROM: 发件人
RCPT TO: 收件人
DATA 开始输入邮件正文
. 单独一行的点表示正文结束
QUIT 退出

SMTP 配置不当可能导致开放中继,也可能泄露邮件内容或认证信息。

6. POP3

POP3 是收邮件协议,默认端口 110,偏向把邮件下载到本地。

连接:

复制代码
telnet 10.48.180.172 110

登录和查询:

复制代码
USER frank
PASS D2xc9CgD
STAT

常用命令:

命令 作用
USER 用户名 输入用户名
PASS 密码 输入密码
STAT 查看邮件数量和总大小
LIST 列出每封邮件编号和大小
RETR 编号 读取某封邮件
DELE 编号 删除某封邮件
QUIT 退出

STAT 返回格式:

复制代码
+OK 邮件数量 总大小

实际响应通常是:

复制代码
+OK 0 0

表示 0 封邮件,总大小 0 字节。

7. IMAP

IMAP 也是收邮件协议,默认端口 143,更适合多设备同步。相比 POP3,IMAP 会把邮件保留在服务器上,支持文件夹、状态同步等功能。

IMAP 命令通常带标签:

复制代码
a001 LOGIN frank D2xc9CgD
a002 LIST "" "*"
a003 SELECT INBOX
a004 FETCH 1 BODY[]
a005 LOGOUT

标签如 a001 用来让客户端对应请求和响应。

四、本周掌握的常用命令

1. nmap 服务识别

复制代码
nmap -Pn -sV IP
nmap -Pn -sV -p 21,23,25,80,110,143 IP

2. curl API 测试

复制代码
curl -i http://IP/
curl -v http://IP/
curl -H "Authorization: Bearer $TOKEN" 'http://IP/api/path'
curl -H 'Content-Type: application/json' -X POST -d '{"key":"value"}' 'http://IP/api/path'

3. Telnet 手动协议交互

复制代码
telnet IP PORT

4. FTP 文件下载

复制代码
ftp IP
ls
get flag.txt
bye

5. POP3 邮件查询

复制代码
USER username
PASS password
STAT
LIST
RETR 1
QUIT

6. JWT 变量使用

复制代码
TOKEN='完整JWT'
curl -H "Authorization: Bearer $TOKEN" 'http://IP/api/path'

注意:

复制代码
JWT 必须保持一整行,不能多空格、不能少字符、不能插入真实换行。

检查 token 是否有隐藏换行:

复制代码
printf '%s' "$TOKEN" | cat -A

五、本周遇到的问题与复盘

1. JWT 复制错误导致签名失败

在做 JWT 题时,多次遇到:

复制代码
Signature verification failed

主要原因是 token 被复制错、大小写不一致、漏字符或插入了真实换行。后续应优先用变量和自动提取方式,减少手抄。

2. GET/POST 方法混淆

有些 API 只接受 POST,但直接用:

复制代码
curl http://IP/path

默认是 GET,会导致 404 或错误响应。应根据题目要求加:

复制代码
-X POST
-H 'Content-Type: application/json'
-d '{...}'

3. 路径漏写导致 404

曾经把:

复制代码
/api/v1.0/example3

写成:

复制代码
/v1.0/example3

导致 404。以后遇到 404,要优先检查路径、方法和端口。

4. IP 变更导致连接失败

THM 靶机重启后 IP 会变化。遇到:

复制代码
Could not connect to server

应先确认靶机 IP 是否变化、端口是否开放。

5. 对"提权"概念有了更清楚区分

JWT Security 中的提权不是 Linux 本地提权,而是 Web/API 权限层面的提升:

复制代码
普通用户身份 -> 管理员身份

关键在于服务端身份认证和权限校验逻辑是否正确。

六、本周收获

本周最大的收获是把"端口、协议、认证、权限"串起来理解了。

Protocols and Servers 让自己知道服务通常跑在哪些端口、怎么手动和服务说话;JWT Security 则进一步说明,就算登录认证看起来正常,如果服务端验证逻辑写错,也可能产生越权和提权。

可以总结成两句话:

复制代码
端口告诉我门后面可能是什么服务,协议知识告诉我怎么敲门。
JWT 告诉我用户是谁,但服务端必须正确检查签名、过期时间、受众和权限。
相关推荐
江畔柳前堤1 小时前
第15章:docker故障排查与面试题
大数据·运维·git·elasticsearch·docker·容器·eureka
洪恒远1 小时前
Windows 配置 Gerrit SSH Key
运维·ssh
忡黑梨1 小时前
安装 Claude Code(使用 DeepSeek API)
网络·网络安全
云飞云共享云桌面2 小时前
搭建10人SolidWorks云设计环境:云飞云在非标自动化工厂的实测方案
运维·服务器·网络·数据库·自动化·电脑
江畔柳前堤2 小时前
第07章:Docker 网络模型
运维·网络·git·elasticsearch·docker·容器·架构
深盾科技_Virbox2 小时前
Virbox Protector 从何而来:深盾科技的软件保护演进
运维·数据库·科技
是个西兰花2 小时前
Linux:进程信号
linux·运维·服务器
云飞云共享云桌面2 小时前
智能装备制造数字化实测:10人SolidWorks云桌面部署,云飞云方案替代传统单机工作站
运维·服务器·网络·人工智能·制造
Urbano2 小时前
突破品类边界:数控模板机不止制衣,枕套等家居家纺自动化生产全科普
运维·自动化