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订阅资产发现
- 安全配置审计
- 合规性检查
- 威胁情报收集
最佳实践#
- 权限控制: 使用最小权限原则运行侦察
- 结果保护: 妥善保管侦察结果,避免泄露敏感信息
- 定期扫描: 定期进行安全扫描,及时发现新风险
- 结果验证: 对发现的问题进行验证,避免误报
- 持续监控: 建立持续监控机制,及时响应安全事件
注意事项#
- 仅在获得授权的订阅上运行
- 遵守Azure服务条款和使用政策
- 注意API调用限制和成本
- 妥善处理敏感信息
- 定期更新工具以获取最新功能