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==