AzRecon使用教程#

软件介绍#

AzRecon是一款专门用于Microsoft Azure云平台侦察和信息收集的工具。它能够自动发现和枚举Azure订阅中的资源,包括虚拟机、存储账户、数据库、函数应用等,是Azure云安全评估和渗透测试的重要工具。

主要功能#

  • Azure订阅资源枚举
  • 存储账户发现
  • 虚拟机信息收集
  • 权限和角色分析
  • 安全配置检测
  • 漏洞识别
  • 合规性检查
  • 报告生成

适用场景#

  • 云安全评估
  • 渗透测试
  • 资产发现
  • 风险评估
  • 合规性审计
  • 威胁情报收集

入门级使用#

安装AzRecon#

使用Python安装#

# 安装Python依赖
pip install azure-identity
pip install azure-mgmt-resource
pip install azure-mgmt-compute
pip install azure-mgmt-storage
pip install azure-mgmt-network
pip install azure-mgmt-web
pip install azure-mgmt-sql

# 克隆AzRecon仓库
git clone https://github.com/microsoft/AzRecon.git
cd AzRecon

# 安装依赖
pip install -r requirements.txt

使用Docker安装#

# 使用Docker运行
docker run -it --rm azrecon/azrecon:latest

# 或构建本地镜像
git clone https://github.com/microsoft/AzRecon.git
cd AzRecon
docker build -t azrecon .
docker run -it azrecon

配置Azure凭证#

使用Azure CLI登录#

# 安装Azure CLI
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

# 登录Azure
az login

# 设置订阅
az account set --subscription "your-subscription-id"

使用服务主体#

# 创建服务主体
az ad sp create-for-rbac --name "AzRecon" --role Contributor --scopes /subscriptions/your-subscription-id

# 输出将包含:
# - appId (客户端ID)
# - password (客户端密钥)
# - tenant (租户ID)

# 使用服务主体登录
az login --service-principal -u <appId> -p <password> --tenant <tenant>

使用环境变量#

# 设置环境变量
export AZURE_CLIENT_ID="your_client_id"
export AZURE_CLIENT_SECRET="your_client_secret"
export AZURE_TENANT_ID="your_tenant_id"
export AZURE_SUBSCRIPTION_ID="your_subscription_id"

基本侦察#

快速扫描#

# 快速扫描所有资源
python azrecon.py --all

# 扫描特定资源组
python azrecon.py --resource-group my-resource-group

# 扫描特定订阅
python azrecon.py --subscription "your-subscription-id"

枚举虚拟机#

# 枚举所有虚拟机
python azrecon.py --vms

# 枚举特定区域的虚拟机
python azrecon.py --vms --location eastus

# 枚举虚拟机的详细信息
python azrecon.py --vms --detailed

初级使用#

资源枚举#

存储账户枚举#

# 枚举所有存储账户
python azrecon.py --storage

# 枚举存储账户的容器
python azrecon.py --storage --containers

# 检查存储账户的访问级别
python azrecon.py --storage --access-tier

# 检查存储账户的加密设置
python azrecon.py --storage --encryption

数据库枚举#

# 枚举SQL数据库
python azrecon.py --sql

# 枚举Cosmos DB
python azrecon.py --cosmos

# 枚举PostgreSQL数据库
python azrecon.py --postgresql

# 枚举MySQL数据库
python azrecon.py --mysql

网络枚举#

虚拟网络枚举#

# 枚举所有虚拟网络
python azrecon.py --vnets

# 枚举子网
python azrecon.py --vnets --subnets

# 枚举网络安全组
python azrecon.py --nsgs

# 枚举公共IP地址
python azrecon.py --public-ips

负载均衡器枚举#

# 枚举负载均衡器
python azrecon.py --load-balancers

# 枚举应用网关
python azrecon.py --application-gateways

中级使用#

权限分析#

角色和权限枚举#

# 枚举所有角色分配
python azrecon.py --rbac

# 枚举特定用户的权限
python azrecon.py --rbac --user user@example.com

# 枚举特定服务主体的权限
python azrecon.py --rbac --spn <service-principal-id>

# 枚举自定义角色
python azrecon.py --rbac --custom-roles

权限提升检测#

# 检测权限提升路径
python azrecon.py --privilege-escalation

# 检测可写的角色定义
python azrecon.py --rbac --writable-roles

# 检测具有所有者权限的账户
python azrecon.py --rbac --owners

漏洞扫描#

检查不安全的配置#

# 检查未加密的存储
python azrecon.py --scan --unencrypted-storage

# 检查公开的存储账户
python azrecon.py --scan --public-storage

# 检查开放的安全组规则
python azrecon.py --scan --open-nsg-rules

# 检查未启用诊断的资源
python azrecon.py --scan --no-diagnostics

检查合规性问题#

# 检查安全中心配置
python azrecon.py --security-center

# 检查策略合规性
python azrecon.py --policy-compliance

# 检查Azure Defender状态
python azrecon.py --azure-defender

数据导出#

导出为JSON#

# 导出所有侦察结果
python azrecon.py --all --output json > results.json

# 导出特定资源
python azrecon.py --vms --output json > vms.json

# 导出特定订阅
python azrecon.py --subscription "your-subscription-id" --output json > subscription.json

导出为CSV#

# 导出为CSV格式
python azrecon.py --vms --output csv > vms.csv

# 导出存储账户列表
python azrecon.py --storage --output csv > storage.csv

中上级使用#

高级分析#

攻击面分析#

#!/bin/bash
# Azure攻击面分析脚本

OUTPUT_DIR="azure_attack_surface"
mkdir -p "$OUTPUT_DIR"

# 1. 分析公开的端点
echo "[1/5] 分析公开端点..."
python azrecon.py --public-ips --output json > "$OUTPUT_DIR/public_ips.json"
python azrecon.py --load-balancers --output json > "$OUTPUT_DIR/load_balancers.json"

# 2. 分析存储账户
echo "[2/5] 分析存储账户..."
python azrecon.py --storage --output json > "$OUTPUT_DIR/storage.json"
python azrecon.py --storage --containers --output json > "$OUTPUT_DIR/storage_containers.json"

# 3. 分析网络安全组
echo "[3/5] 分析网络安全组..."
python azrecon.py --nsgs --output json > "$OUTPUT_DIR/nsgs.json"

# 4. 分析权限
echo "[4/5] 分析权限..."
python azrecon.py --rbac --output json > "$OUTPUT_DIR/rbac.json"

# 5. 生成攻击面报告
echo "[5/5] 生成攻击面报告..."
python azrecon.py --attack-surface --output json > "$OUTPUT_DIR/attack_surface.json"

echo "攻击面分析完成,结果保存在 $OUTPUT_DIR 目录"

风险评估#

#!/bin/bash
# Azure风险评估脚本

OUTPUT_FILE="azure_risk_assessment.txt"

echo "=== Azure风险评估 ===" > "$OUTPUT_FILE"
echo "评估时间: $(date)" >> "$OUTPUT_FILE"
echo "" >> "$OUTPUT_FILE"

# 检查公开的存储账户
echo "=== 公开存储账户 ===" >> "$OUTPUT_FILE"
python azrecon.py --scan --public-storage >> "$OUTPUT_FILE" 2>&1

echo "" >> "$OUTPUT_FILE"

# 检查开放的安全组
echo "=== 开放的安全组规则 ===" >> "$OUTPUT_FILE"
python azrecon.py --scan --open-nsg-rules >> "$OUTPUT_FILE" 2>&1

echo "" >> "$OUTPUT_FILE"

# 检查未加密的资源
echo "=== 未加密的资源 ===" >> "$OUTPUT_FILE"
python azrecon.py --scan --unencrypted-storage >> "$OUTPUT_FILE" 2>&1

echo "" >> "$OUTPUT_FILE"

# 检查权限提升路径
echo "=== 权限提升路径 ===" >> "$OUTPUT_FILE"
python azrecon.py --privilege-escalation >> "$OUTPUT_FILE" 2>&1

echo "" >> "$OUTPUT_FILE"

# 检查安全中心状态
echo "=== 安全中心状态 ===" >> "$OUTPUT_FILE"
python azrecon.py --security-center >> "$OUTPUT_FILE" 2>&1

echo "风险评估完成,结果已保存到 $OUTPUT_FILE"

自动化侦察#

完整侦察脚本#

#!/bin/bash
# 完整Azure侦察脚本

SUBSCRIPTION_ID=$(az account show --query id -o tsv)
OUTPUT_DIR="azure_recon_$SUBSCRIPTION_ID"
mkdir -p "$OUTPUT_DIR"

echo "=== Azure账户侦察 ==="
echo "订阅ID: $SUBSCRIPTION_ID"
echo "输出目录: $OUTPUT_DIR"

# 1. 枚举虚拟机
echo "[1/12] 枚举虚拟机..."
python azrecon.py --vms --output json > "$OUTPUT_DIR/vms.json"

# 2. 枚举存储账户
echo "[2/12] 枚举存储账户..."
python azrecon.py --storage --output json > "$OUTPUT_DIR/storage.json"

# 3. 枚举SQL数据库
echo "[3/12] 枚举SQL数据库..."
python azrecon.py --sql --output json > "$OUTPUT_DIR/sql.json"

# 4. 枚举Cosmos DB
echo "[4/12] 枚举Cosmos DB..."
python azrecon.py --cosmos --output json > "$OUTPUT_DIR/cosmos.json"

# 5. 枚举虚拟网络
echo "[5/12] 枚举虚拟网络..."
python azrecon.py --vnets --output json > "$OUTPUT_DIR/vnets.json"

# 6. 枚举网络安全组
echo "[6/12] 枚举网络安全组..."
python azrecon.py --nsgs --output json > "$OUTPUT_DIR/nsgs.json"

# 7. 枚举公共IP
echo "[7/12] 枚举公共IP..."
python azrecon.py --public-ips --output json > "$OUTPUT_DIR/public_ips.json"

# 8. 枚举函数应用
echo "[8/12] 枚举函数应用..."
python azrecon.py --functions --output json > "$OUTPUT_DIR/functions.json"

# 9. 枚举应用服务
echo "[9/12] 枚举应用服务..."
python azrecon.py --app-services --output json > "$OUTPUT_DIR/app_services.json"

# 10. 枚举RBAC
echo "[10/12] 枚举RBAC..."
python azrecon.py --rbac --output json > "$OUTPUT_DIR/rbac.json"

# 11. 枚举密钥保管库
echo "[11/12] 枚举密钥保管库..."
python azrecon.py --keyvaults --output json > "$OUTPUT_DIR/keyvaults.json"

# 12. 生成汇总报告
echo "[12/12] 生成汇总报告..."
cat > "$OUTPUT_DIR/summary.txt" << EOF
Azure账户侦察汇总报告
====================
订阅ID: $SUBSCRIPTION_ID
侦察时间: $(date)

资源统计:
- 虚拟机: $(jq length "$OUTPUT_DIR/vms.json")
- 存储账户: $(jq length "$OUTPUT_DIR/storage.json")
- SQL数据库: $(jq length "$OUTPUT_DIR/sql.json")
- Cosmos DB: $(jq length "$OUTPUT_DIR/cosmos.json")
- 虚拟网络: $(jq length "$OUTPUT_DIR/vnets.json")
- 网络安全组: $(jq length "$OUTPUT_DIR/nsgs.json")
- 公共IP: $(jq length "$OUTPUT_DIR/public_ips.json")
- 函数应用: $(jq length "$OUTPUT_DIR/functions.json")
- 应用服务: $(jq length "$OUTPUT_DIR/app_services.json")
- 密钥保管库: $(jq length "$OUTPUT_DIR/keyvaults.json")
EOF

echo "Azure侦察完成!所有结果已保存到 $OUTPUT_DIR 目录"

高级使用#

云安全分析#

攻击路径分析#

#!/usr/bin/env python3
import json
from collections import defaultdict

def analyze_azure_attack_paths(recon_data):
    """分析Azure攻击路径"""
    
    attack_paths = {
        "public_exposure": [],
        "privilege_escalation": [],
        "data_exfiltration": [],
        "lateral_movement": []
    }
    
    # 分析公开暴露
    for vm in recon_data.get("vms", []):
        if vm.get("public_ip"):
            attack_paths["public_exposure"].append({
                "type": "vm",
                "name": vm["name"],
                "public_ip": vm["public_ip"],
                "issue": "虚拟机具有公共IP"
            })
    
    # 分析存储账户
    for storage in recon_data.get("storage", []):
        if storage.get("access_tier") == "Hot":
            attack_paths["data_exfiltration"].append({
                "type": "storage",
                "name": storage["name"],
                "access_tier": storage["access_tier"],
                "issue": "存储账户可能公开访问"
            })
    
    # 分析权限
    for assignment in recon_data.get("rbac", []):
        if assignment.get("role_name") == "Owner":
            attack_paths["privilege_escalation"].append({
                "type": "rbac",
                "principal": assignment["principal_name"],
                "scope": assignment["scope"],
                "issue": "具有所有者权限"
            })
    
    return attack_paths

# 使用示例
with open("azure_recon_results.json") as f:
    results = json.load(f)
    
attack_paths = analyze_azure_attack_paths(results)
print(json.dumps(attack_paths, indent=2))

漏洞检测#

#!/bin/bash
# Azure漏洞检测脚本

OUTPUT_FILE="azure_vulnerability_scan.txt"

echo "=== Azure漏洞扫描报告 ===" > "$OUTPUT_FILE"
echo "扫描时间: $(date)" >> "$OUTPUT_FILE"
echo "" >> "$OUTPUT_FILE"

# 1. 检测公开的存储账户
echo "[1] 检测公开的存储账户..." >> "$OUTPUT_FILE"
python azrecon.py --scan --public-storage 2>&1 >> "$OUTPUT_FILE" || true
echo "" >> "$OUTPUT_FILE"

# 2. 检测开放SSH的安全组
echo "[2] 检测开放SSH的安全组..." >> "$OUTPUT_FILE"
az network nsg list --query "[?contains(ipConfigurations[0].properties.subnet.properties.addressPrefix, '0.0.0.0/0')]" 2>&1 >> "$OUTPUT_FILE" || true
echo "" >> "$OUTPUT_FILE"

# 3. 检测开放RDP的安全组
echo "[3] 检测开放RDP的安全组..." >> "$OUTPUT_FILE"
az network nsg list --query "[?contains(ipConfigurations[0].properties.subnet.properties.addressPrefix, '0.0.0.0/0')]" 2>&1 >> "$OUTPUT_FILE" || true
echo "" >> "$OUTPUT_FILE"

# 4. 检测未加密的存储
echo "[4] 检测未加密的存储..." >> "$OUTPUT_FILE"
python azrecon.py --scan --unencrypted-storage 2>&1 >> "$OUTPUT_FILE" || true
echo "" >> "$OUTPUT_FILE"

# 5. 检测未启用诊断的资源
echo "[5] 检测未启用诊断的资源..." >> "$OUTPUT_FILE"
python azrecon.py --scan --no-diagnostics 2>&1 >> "$OUTPUT_FILE" || true
echo "" >> "$OUTPUT_FILE"

echo "漏洞扫描完成!"

合规性检查#

Azure安全基准检查#

#!/bin/bash
# Azure安全基准检查脚本

AZURE_CHECKS=(
    "1.1: 确保启用了Azure Defender"
    "1.2: 确保配置了安全中心"
    "1.3: 确保启用了MFA"
    "1.4: 确保配置了条件访问"
    "2.1: 确保存储账户已加密"
    "2.2: 确保虚拟机已加密"
    "2.3: 确保数据库已加密"
    "3.1: 确保网络安全组已配置"
    "3.2: 确保应用了网络安全最佳实践"
    "3.3: 确保配置了网络观察程序"
)

OUTPUT_FILE="azure_compliance.txt"

echo "=== Azure安全基准合规性检查 ===" > "$OUTPUT_FILE"
echo "检查时间: $(date)" >> "$OUTPUT_FILE"
echo "" >> "$OUTPUT_FILE"

for check in "${AZURE_CHECKS[@]}"; do
    echo "检查: $check" >> "$OUTPUT_FILE"
    # 这里可以添加具体的检查逻辑
    echo "状态: 待实现" >> "$OUTPUT_FILE"
    echo "" >> "$OUTPUT_FILE"
done

echo "合规性检查完成!"

大师级使用#

威胁建模#

攻击图构建#

#!/usr/bin/env python3
import json
from collections import defaultdict

class AzureAttackGraph:
    def __init__(self, recon_data):
        self.data = recon_data
        self.graph = defaultdict(list)
    
    def build_graph(self):
        """构建攻击图"""
        # 从虚拟机开始
        for vm in self.data.get("vms", []):
            self.graph["vm:" + vm["name"]] = []
            
            # 添加公共IP
            if vm.get("public_ip"):
                self.graph["vm:" + vm["name"]].append(
                    f"public_ip:{vm['public_ip']}"
                )
            
            # 添加网络安全组
            if vm.get("nsg"):
                self.graph["vm:" + vm["name"]].append(
                    f"nsg:{vm['nsg']}"
                )
        
        # 从存储账户
        for storage in self.data.get("storage", []):
            self.graph["storage:" + storage["name"]] = []
        
        # 从数据库
        for db in self.data.get("sql", []):
            self.graph["sql:" + db["name"]] = []
        
        return self.graph
    
    def find_attack_paths(self):
        """查找攻击路径"""
        attack_paths = []
        
        # 检查具有所有者权限的账户
        for assignment in self.data.get("rbac", []):
            if assignment.get("role_name") == "Owner":
                attack_paths.append({
                    "principal": assignment["principal_name"],
                    "path": "可以直接控制所有资源",
                    "risk": "高"
                })
        
        return attack_paths
    
    def find_data_exposure(self):
        """查找数据暴露"""
        exposure_paths = []
        
        # 检查公开的存储账户
        for storage in self.data.get("storage", []):
            if storage.get("allow_blob_public_access") == True:
                exposure_paths.append({
                    "storage": storage["name"],
                    "issue": "存储账户允许公共访问",
                    "risk": "高"
                })
        
        # 检查开放的安全组
        for nsg in self.data.get("nsgs", []):
            for rule in nsg.get("security_rules", []):
                if rule.get("access") == "Allow" and \
                   rule.get("direction") == "Inbound":
                    if rule.get("source_address_prefix") == "*":
                        exposure_paths.append({
                            "nsg": nsg["name"],
                            "port": rule.get("destination_port_range"),
                            "issue": f"端口{rule.get('destination_port_range')}对公网开放",
                            "risk": "中"
                        })
        
        return exposure_paths

# 使用示例
with open("azure_recon_results.json") as f:
    data = json.load(f)

graph_builder = AzureAttackGraph(data)
graph = graph_builder.build_graph()
attack_paths = graph_builder.find_attack_paths()
exposure = graph_builder.find_data_exposure()

print("=== 攻击路径 ===")
for path in attack_paths:
    print(json.dumps(path, indent=2))

print("\n=== 数据暴露 ===")
for path in exposure:
    print(json.dumps(path, indent=2))

持续监控#

实时监控脚本#

#!/bin/bash
# Azure资源实时监控脚本

SUBSCRIPTION_ID=$(az account show --query id -o tsv)
OUTPUT_DIR="azure_monitoring"
mkdir -p "$OUTPUT_DIR"

INTERVAL=300  # 每5分钟检查一次

while true; do
    TIMESTAMP=$(date +%Y%m%d_%H%M%S)
    LOG_FILE="$OUTPUT_DIR/monitor_$TIMESTAMP.log"
    
    echo "$(date): 开始监控" > "$LOG_FILE"
    
    # 监控虚拟机状态
    echo "=== 虚拟机状态 ===" >> "$LOG_FILE"
    az vm list --query "[].{Name:name,State:powerState,Location:location}" >> "$LOG_FILE"
    
    # 监控存储账户
    echo "=== 存储账户 ===" >> "$LOG_FILE"
    az storage account list --query "[].{Name:name,Location:location,AccessTier:accessTier}" >> "$LOG_FILE"
    
    # 监控网络安全组
    echo "=== 网络安全组 ===" >> "$LOG_FILE"
    az network nsg list --query "[].{Name:name,Location:location}" >> "$LOG_FILE"
    
    # 监控公共IP
    echo "=== 公共IP ===" >> "$LOG_FILE"
    az network public-ip list --query "[].{Name:name,IPAddress:ipAddress,Location:location}" >> "$LOG_FILE"
    
    # 检查异常
    echo "=== 异常检测 ===" >> "$LOG_FILE"
    
    # 检测新的公共IP
    NEW_PUBLIC_IPS=$(az network public-ip list --query "[?ipAddress != null].{Name:name,IPAddress:ipAddress}" --output json)
    if [ -n "$NEW_PUBLIC_IPS" ]; then
        echo "警告: 发现新的公共IP" >> "$LOG_FILE"
        echo "$NEW_PUBLIC_IPS" >> "$LOG_FILE"
    fi
    
    # 检测公开的存储账户
    PUBLIC_STORAGE=$(az storage account list --query "[?allowBlobPublicAccess == true].{Name:name}" --output json)
    if [ -n "$PUBLIC_STORAGE" ]; then
        echo "警告: 发现公开的存储账户" >> "$LOG_FILE"
        echo "$PUBLIC_STORAGE" >> "$LOG_FILE"
    fi
    
    # 检测开放的安全组
    OPEN_NSG=$(az network nsg list --query "[?contains(to_string(securityRules[?access == 'Allow' && direction == 'Inbound' && sourceAddressPrefix == '*'][].destinationPortRange), '22,3389,80,443')].{Name:name}" --output json)
    if [ -n "$OPEN_NSG" ]; then
        echo "警告: 发现开放的安全组" >> "$LOG_FILE"
        echo "$OPEN_NSG" >> "$LOG_FILE"
    fi
    
    echo "$(date): 监控完成" >> "$LOG_FILE"
    
    sleep "$INTERVAL"
done

实战案例#

案例1: Azure账户安全评估#

场景描述#

对Azure订阅进行全面的安全评估,识别潜在的安全风险和配置问题。

实施步骤#

#!/bin/bash
# Azure安全评估脚本

SUBSCRIPTION_ID=$(az account show --query id -o tsv)
OUTPUT_DIR="azure_security_assessment_$SUBSCRIPTION_ID"
mkdir -p "$OUTPUT_DIR"

echo "=== Azure安全评估 ==="
echo "订阅ID: $SUBSCRIPTION_ID"
echo "输出目录: $OUTPUT_DIR"
echo ""

# 1. 身份和访问管理评估
echo "[1/8] 评估IAM配置..."
cat > "$OUTPUT_DIR/iam_assessment.sh" << 'EOF'
#!/bin/bash
echo "=== IAM安全评估 ==="

# 检查订阅信息
echo "订阅信息:"
az account show

# 检查用户
echo "用户列表:"
az ad user list --query "[].{Name:displayName,UPN:userPrincipalName}"

# 检查服务主体
echo "服务主体列表:"
az ad sp list --query "[].{Name:displayName,AppId:appId}"

# 检查角色分配
echo "角色分配:"
az role assignment list --query "[].{Principal:principalName,Role:roleDefinitionName,Scope:scope}"
EOF
chmod +x "$OUTPUT_DIR/iam_assessment.sh"
"$OUTPUT_DIR/iam_assessment.sh" > "$OUTPUT_DIR/iam_report.txt" 2>&1

# 2. 网络安全评估
echo "[2/8] 评估网络安全..."
cat > "$OUTPUT_DIR/network_assessment.sh" << 'EOF'
#!/bin/bash
echo "=== 网络安全评估 ==="

# 检查虚拟网络
echo "虚拟网络列表:"
az network vnet list --query "[].{Name:name,Location:location,AddressSpace:addressSpace.addressPrefixes}"

# 检查网络安全组
echo "网络安全组:"
az network nsg list --query "[].{Name:name,Location:location}"

# 检查公共IP
echo "公共IP:"
az network public-ip list --query "[].{Name:name,IPAddress:ipAddress,Location:location}"

# 检查负载均衡器
echo "负载均衡器:"
az network lb list --query "[].{Name:name,Location:location}"
EOF
chmod +x "$OUTPUT_DIR/network_assessment.sh"
"$OUTPUT_DIR/network_assessment.sh" > "$OUTPUT_DIR/network_report.txt" 2>&1

# 3. 存储安全评估
echo "[3/8] 评估存储安全..."
cat > "$OUTPUT_DIR/storage_assessment.sh" << 'EOF'
#!/bin/bash
echo "=== 存储安全评估 ==="

# 检查存储账户
echo "存储账户列表:"
az storage account list --query "[].{Name:name,Location:location,AccessTier:accessTier,Encryption:encryption.services.blob.enabled}"

# 检查公共访问
echo "公共访问设置:"
az storage account list --query "[].{Name:name,PublicAccess:allowBlobPublicAccess}"

# 检查存储账户的容器
for account in $(az storage account list --query "[].name" -o tsv); do
    echo "存储账户: $account"
    az storage container list --account-name "$account" --query "[].{Name:name}" 2>/dev/null || echo "无法访问"
done
EOF
chmod +x "$OUTPUT_DIR/storage_assessment.sh"
"$OUTPUT_DIR/storage_assessment.sh" > "$OUTPUT_DIR/storage_report.txt" 2>&1

# 4. 计算资源评估
echo "[4/8] 评估计算资源..."
cat > "$OUTPUT_DIR/compute_assessment.sh" << 'EOF'
#!/bin/bash
echo "=== 计算资源评估 ==="

# 虚拟机
echo "虚拟机列表:"
az vm list --query "[].{Name:name,Location:location,Size:hardwareProfile.vmSize,State:powerState}"

# 函数应用
echo "函数应用:"
az functionapp list --query "[].{Name:name,Location:location,State:state}"

# 应用服务
echo "应用服务:"
az webapp list --query "[].{Name:name,Location:location,State:state}"
EOF
chmod +x "$OUTPUT_DIR/compute_assessment.sh"
"$OUTPUT_DIR/compute_assessment.sh" > "$OUTPUT_DIR/compute_report.txt" 2>&1

# 5. 数据库评估
echo "[5/8] 评估数据库..."
cat > "$OUTPUT_DIR/database_assessment.sh" << 'EOF'
#!/bin/bash
echo "=== 数据库评估 ==="

# SQL数据库
echo "SQL数据库:"
az sql server list --query "[].{Name:name,Location:location,Admin:administratorLogin}"

# Cosmos DB
echo "Cosmos DB:"
az cosmosdb list --query "[].{Name:name,Location:location,Kind:kind}"

# PostgreSQL
echo "PostgreSQL:"
az postgres server list --query "[].{Name:name,Location:location,Version:version}"

# MySQL
echo "MySQL:"
az mysql server list --query "[].{Name:name,Location:location,Version:version}"
EOF
chmod +x "$OUTPUT_DIR/database_assessment.sh"
"$OUTPUT_DIR/database_assessment.sh" > "$OUTPUT_DIR/database_report.txt" 2>&1

# 6. 安全服务评估
echo "[6/8] 评估安全服务..."
cat > "$OUTPUT_DIR/security_services_assessment.sh" << 'EOF'
#!/bin/bash
echo "=== 安全服务评估 ==="

# 安全中心
echo "安全中心状态:"
az security pricing list --query "[].{Name:name,PricingTier:pricingTier}"

# Azure Defender
echo "Azure Defender状态:"
az security auto-provisioning-settings list --query "[].{Name:name,AutoProvision:properties.autoProvision}"

# 密钥保管库
echo "密钥保管库:"
az keyvault list --query "[].{Name:name,Location:location,SoftDelete:properties.enableSoftDelete}"
EOF
chmod +x "$OUTPUT_DIR/security_services_assessment.sh"
"$OUTPUT_DIR/security_services_assessment.sh" > "$OUTPUT_DIR/security_services_report.txt" 2>&1

# 7. 生成综合报告
echo "[7/8] 生成综合报告..."
cat > "$OUTPUT_DIR/final_report.txt" << EOF
Azure安全评估综合报告
====================
订阅ID: $SUBSCRIPTION_ID
评估时间: $(date)

1. 身份和访问管理
2. 网络安全
3. 存储安全
4. 计算资源
5. 数据库
6. 安全服务

详细报告请查看各分类报告文件。
EOF

# 8. 生成HTML报告
echo "[8/8] 生成HTML报告..."
cat > "$OUTPUT_DIR/report.html" << EOF
<!DOCTYPE html>
<html>
<head>
    <title>Azure安全评估报告</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; }
        h1 { color: #333; }
        h2 { color: #666; }
        .section { margin: 20px 0; padding: 10px; border: 1px solid #ddd; }
        .warning { color: orange; }
        .danger { color: red; }
        .safe { color: green; }
    </style>
</head>
<body>
    <h1>Azure安全评估报告</h1>
    <p>订阅ID: $SUBSCRIPTION_ID</p>
    <p>评估时间: $(date)</p>
    
    <div class="section">
        <h2>身份和访问管理</h2>
        <p>详细报告: iam_report.txt</p>
    </div>
    
    <div class="section">
        <h2>网络安全</h2>
        <p>详细报告: network_report.txt</p>
    </div>
    
    <div class="section">
        <h2>存储安全</h2>
        <p>详细报告: storage_report.txt</p>
    </div>
    
    <div class="section">
        <h2>计算资源</h2>
        <p>详细报告: compute_report.txt</p>
    </div>
    
    <div class="section">
        <h2>数据库</h2>
        <p>详细报告: database_report.txt</p>
    </div>
    
    <div class="section">
        <h2>安全服务</h2>
        <p>详细报告: security_services_report.txt</p>
    </div>
</body>
</html>
EOF

echo ""
echo "Azure安全评估完成!所有结果已保存到 $OUTPUT_DIR 目录"
echo ""
echo "报告文件:"
ls -la "$OUTPUT_DIR"

案例2: 云环境渗透测试#

场景描述#

在授权的Azure环境中进行渗透测试,识别安全漏洞和攻击路径。

实施步骤#

#!/bin/bash
# Azure环境渗透测试脚本

OUTPUT_DIR="azure_pentest_results"
mkdir -p "$OUTPUT_DIR"

echo "=== Azure环境渗透测试 ==="
echo ""

# 1. 信息收集阶段
echo "[1/5] 信息收集..."

# 收集订阅信息
az account show > "$OUTPUT_DIR/subscription.json"

# 收集区域信息
az account list-locations > "$OUTPUT_DIR/locations.json"

# 2. 资产发现阶段
echo "[2/5] 资产发现..."

# 发现虚拟机
az vm list > "$OUTPUT_DIR/vms.json"

# 发现函数应用
az functionapp list > "$OUTPUT_DIR/functions.json"

# 发现存储账户
az storage account list > "$OUTPUT_DIR/storage.json"

# 3. 漏洞识别阶段
echo "[3/5] 漏洞识别..."

# 检查公开的存储账户
cat > "$OUTPUT_DIR/storage_vulns.txt" << 'EOF'
公开存储账户检查:
EOF
az storage account list --query "[?allowBlobPublicAccess == true].{Name:name}" >> "$OUTPUT_DIR/storage_vulns.txt"

# 检查开放的安全组
cat > "$OUTPUT_DIR/nsg_vulns.txt" << 'EOF'
开放安全组检查:
EOF
az network nsg list --query "[?contains(to_string(securityRules[?access == 'Allow' && direction == 'Inbound' && sourceAddressPrefix == '*'][].destinationPortRange), '22,3389')].{Name:name}" >> "$OUTPUT_DIR/nsg_vulns.txt"

# 4. 权限提升尝试
echo "[4/5] 权限提升..."

# 检查当前权限
cat > "$OUTPUT_DIR/current_permissions.txt" << 'EOF'
当前权限检查:
EOF
az role assignment list --query "[].{Principal:principalName,Role:roleDefinitionName}" > "$OUTPUT_DIR/rbac.json"

# 5. 生成测试报告
echo "[5/5] 生成测试报告..."

cat > "$OUTPUT_DIR/pentest_report.txt" << EOF
Azure环境渗透测试报告
==================
测试时间: $(date)

1. 收集的订阅信息
2. 发现的资产
3. 识别的漏洞
4. 权限提升路径
5. 建议修复措施

详细结果请查看各个JSON和TXT文件。
EOF

echo ""
echo "渗透测试完成!所有结果已保存到 $OUTPUT_DIR 目录"

总结#

AzRecon是一款功能强大的Azure云平台侦察工具,为Azure云安全评估和渗透测试提供了全面的支持。

核心优势#

  • 全面覆盖: 支持几乎所有Azure服务的侦察
  • 自动化: 自动枚举和分析Azure资源
  • 漏洞检测: 内置多种漏洞检测规则
  • 报告生成: 支持多种输出格式
  • 易于使用: 简单的命令行界面

应用场景#

  • Azure云安全评估和渗透测试
  • Azure订阅资产发现
  • 安全配置审计
  • 合规性检查
  • 威胁情报收集

最佳实践#

  1. 权限控制: 使用最小权限原则运行侦察
  2. 结果保护: 妥善保管侦察结果,避免泄露敏感信息
  3. 定期扫描: 定期进行安全扫描,及时发现新风险
  4. 结果验证: 对发现的问题进行验证,避免误报
  5. 持续监控: 建立持续监控机制,及时响应安全事件

注意事项#

  • 仅在获得授权的订阅上运行
  • 遵守Azure服务条款和使用政策
  • 注意API调用限制和成本
  • 妥善处理敏感信息
  • 定期更新工具以获取最新功能