一、本周学习概况
本周主要完成了 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 告诉我用户是谁,但服务端必须正确检查签名、过期时间、受众和权限。