AWS渗透测试:未授权状态下快速识别目标组织常用区域

5 阅读3分钟

AWS渗透测试:未授权状态下识别目标组织常用区域的速查表

以下是几种在未授权状态下,快速判断目标组织最常使用哪些AWS区域的快捷方法。

我们可以通过Ping域名获取其IP地址,或者使用Nslookup进行查询。

方法一:使用Python脚本查询IP所属AWS区域

运行下面的脚本,需要说明的是,这个脚本源自Pwnedlabs。

import ipaddress
import requests
import json
import sys

def fetch_json(url):
    """从指定URL获取JSON数据。"""
    try:
        response = requests.get(url)
        response.raise_for_status()  # 对于错误的HTTP响应(4xx或5xx)抛出异常
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"从 {url} 获取数据时出错: {e}", file=sys.stderr)
        sys.exit(1)

def get_region_full_name(region_code, regions_data):
    """从区域数据中查找完整的区域名称。"""
    for region in regions_data:
        if region.get('code') == region_code:
            return region.get('full_name', region_code)
    return region_code  # 如果未找到全称,则返回代码

def main():
    if len(sys.argv) < 2:
        print("用法: python3 aws_ip_lookup.py <IP_ADDRESS>", file=sys.stderr)
        print("示例: python3 aws_ip_lookup.py 54.241.40.178", file=sys.stderr)
        print("示例: python3 aws_ip_lookup.py 2620:107:300f::3e35:3", file=sys.stderr)
        sys.exit(1)

    input_ip_str = sys.argv[1]

    AWS_IP_RANGES_URL = "https://ip-ranges.amazonaws.com/ip-ranges.json"
    AWS_REGIONS_URL = "https://raw.githubusercontent.com/jsonmaur/aws-regions/master/regions.json"

    print("正在获取AWS IP范围...", file=sys.stderr)
    ip_ranges_data = fetch_json(AWS_IP_RANGES_URL)
    print("...完成。", file=sys.stderr)

    print("正在获取AWS区域信息...", file=sys.stderr)
    regions_data = fetch_json(AWS_REGIONS_URL)
    print("...完成。", file=sys.stderr)

    # 验证输入的IP
    try:
        ip_obj = ipaddress.ip_address(input_ip_str)
    except ValueError:
        print(f"错误: '{input_ip_str}' 不是有效的IP地址。", file=sys.stderr)
        sys.exit(1)

    print(f"正在搜索 {input_ip_str}...", file=sys.stderr)

    found = False
    result = {}

    # 合并IPv4和IPv6前缀并按特定性排序
    prefixes = ip_ranges_data.get('prefixes', [])
    ipv6_prefixes = ip_ranges_data.get('ipv6_prefixes', [])

    # 按前缀长度排序(越长越具体),然后按前缀字符串排序
    # 反转排序以优先匹配更具体(更长)的前缀
    all_prefixes_raw = prefixes + ipv6_prefixes
    all_prefixes_sorted = sorted(all_prefixes_raw,
                                 key=lambda p: (ipaddress.ip_network(p.get('ip_prefix') or p.get('ipv6_prefix')).prefixlen,
                                                p.get('ip_prefix') or p.get('ipv6_prefix')),
                                 reverse=True  # 将更长前缀排在前面
                                 )

    for p in all_prefixes_sorted:
        cidr_str = p.get('ip_prefix') or p.get('ipv6_prefix')
        if not cidr_str:
            continue
        try:
            network_obj = ipaddress.ip_network(cidr_str)
            if ip_obj in network_obj:
                result = {
                    "region": p.get('region'),
                    "service": p.get('service'),
                    "subnet": cidr_str,
                    "ip_version": "IPv6" if isinstance(ip_obj, ipaddress.IPv6Address) else "IPv4"
                }
                found = True
                break  # 找到最具体的匹配项
        except ValueError:
            # 如果AWS数据有效,这种情况不应发生,但出于良好实践保留
            print(f"警告: 数据中存在无效的CIDR格式: {cidr_str}", file=sys.stderr)
            continue

    if found:
        full_region_name = get_region_full_name(result['region'], regions_data)
        print("--- AWS IP 信息 ---")
        print(f"区域: {full_region_name}")
        print(f"区域代码: {result['region']}")
        print(f"服务: {result['service']}")
        print(f"子网: {result['subnet']}")
    else:
        print("非AWS IP地址或在范围中未找到。")

if __name__ == "__main__":
    # 在执行主函数前确保已安装requests库
    try:
        import requests
    except ImportError:
        print("错误: 未安装 'requests' 库。", file=sys.stderr)
        print("请安装: pip install requests", file=sys.stderr)
        sys.exit(1)
    main()

以下是脚本输出的示例。

方法二:通过分析S3响应头获取区域信息

我们也可以尝试Curl访问托管在S3上的站点,并检查响应头信息。

curl -I https://huge-logistics-dashboard.s3.amazonaws.com

方法三:利用已获取权限的账号进行区域枚举

如果我们已经获得了目标组织拥有的某个账号的访问权限,那么像Cloudfox这样的工具可以自动查询所有区域。FINISHED CSD0tFqvECLokhw9aBeRqtTv15RNmaHdiNZPviuVo93lF6sfWtCwxflQyENsyNEiASHkXQAIEYDnta+EeTN1NB/CkiQy3GryALlJU4N0wmLgyBi9qAOCkW3+8np3cyw8wxYssW8ptMVIvLFpM/bFgA==