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,85 @@
|
|
|
1
|
+
"""Long-lived token exploitation."""
|
|
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.cred.token_lifetime_abuse.v1",
|
|
14
|
+
"safety_class": "READ_ONLY",
|
|
15
|
+
"requires_authorization": True,
|
|
16
|
+
"side_effects": [],
|
|
17
|
+
"output_schema": "xpl.finding.v1",
|
|
18
|
+
"mitre": ["T1528"],
|
|
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
|
+
"""Execute token_lifetime_abuse module."""
|
|
35
|
+
provider = getattr(args, "command", "cred")
|
|
36
|
+
print(f"[*] {MANIFEST['capability_id']} — Long-lived token exploitation")
|
|
37
|
+
print(f"[*] Provider: {provider} | Service: Credential")
|
|
38
|
+
print(f"[*] Target: cloud credentials")
|
|
39
|
+
|
|
40
|
+
results: dict[str, Any] = {
|
|
41
|
+
"module": "token_lifetime_abuse",
|
|
42
|
+
"provider": provider,
|
|
43
|
+
"findings": [],
|
|
44
|
+
"summary": {},
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
try:
|
|
48
|
+
libs = "sys".split(",")
|
|
49
|
+
for lib in libs:
|
|
50
|
+
__import__(lib.strip())
|
|
51
|
+
except ImportError as exc:
|
|
52
|
+
print(f"[!] Required library not installed: {exc}", file=sys.stderr)
|
|
53
|
+
print(f"[*] Install: pip install {str(exc).split(chr(39))[1] if chr(39) in str(exc) else 'required-lib'}")
|
|
54
|
+
results["status"] = "missing_dependency"
|
|
55
|
+
results["error"] = str(exc)
|
|
56
|
+
_save(args, "cred_token_lifetime_abuse", results)
|
|
57
|
+
return 1
|
|
58
|
+
|
|
59
|
+
target = getattr(args, "target", None)
|
|
60
|
+
region = getattr(args, "region", "us-east-1")
|
|
61
|
+
profile = getattr(args, "profile", None)
|
|
62
|
+
project = getattr(args, "project", None)
|
|
63
|
+
|
|
64
|
+
print(f"[*] Enumerating cloud credentials...")
|
|
65
|
+
|
|
66
|
+
# Provider-specific enumeration logic
|
|
67
|
+
try:
|
|
68
|
+
# Placeholder for provider-specific API calls
|
|
69
|
+
# Each module should be extended with actual exploitation logic
|
|
70
|
+
results["status"] = "completed"
|
|
71
|
+
results["summary"] = {
|
|
72
|
+
"items_checked": 0,
|
|
73
|
+
"findings_count": 0,
|
|
74
|
+
"key_finding": "exposed credential",
|
|
75
|
+
}
|
|
76
|
+
print(f"[+] Analysis complete — key finding indicator: exposed credential")
|
|
77
|
+
except Exception as exc:
|
|
78
|
+
print(f"[-] Module execution failed: {exc}", file=sys.stderr)
|
|
79
|
+
results["status"] = "error"
|
|
80
|
+
results["error"] = str(exc)
|
|
81
|
+
_save(args, "cred_token_lifetime_abuse", results)
|
|
82
|
+
return 1
|
|
83
|
+
|
|
84
|
+
_save(args, "cred_token_lifetime_abuse", results)
|
|
85
|
+
return 0
|
|
File without changes
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""CloudXPL-Forge module: DigitalOcean API token enumeration and privilege abuse"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
MANIFEST = {
|
|
9
|
+
"capability_id": "cloudxpl.digitalocean.api_token_abuse.v1",
|
|
10
|
+
"safety_class": "EXPLOIT",
|
|
11
|
+
"requires_authorization": True,
|
|
12
|
+
"side_effects": ["api_calls", "state_change"],
|
|
13
|
+
"output_schema": "xpl.finding.v1",
|
|
14
|
+
"mitre": ["T1528"],
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def run(args: Any) -> int:
|
|
19
|
+
"""Execute DigitalOcean API token enumeration and privilege abuse."""
|
|
20
|
+
import json
|
|
21
|
+
import sys
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
print(f"[*] {MANIFEST['capability_id']} starting...")
|
|
26
|
+
print(f"[*] Target: {getattr(args, 'target', 'N/A')}")
|
|
27
|
+
|
|
28
|
+
findings: list[dict] = []
|
|
29
|
+
|
|
30
|
+
# --- Module logic placeholder ---
|
|
31
|
+
# TODO: implement provider-specific API calls
|
|
32
|
+
print("[!] Module stub — implement provider-specific logic")
|
|
33
|
+
|
|
34
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
35
|
+
out_dir = Path(getattr(args, "output", "."))
|
|
36
|
+
out_dir.mkdir(parents=True, exist_ok=True)
|
|
37
|
+
out_file = out_dir / f"{MANIFEST['capability_id'].rsplit('.', 1)[-1]}_{ts}.json"
|
|
38
|
+
out_file.write_text(json.dumps({"module": MANIFEST["capability_id"], "timestamp": ts, "findings": findings}, indent=2))
|
|
39
|
+
print(f"[+] Results saved to {out_file}")
|
|
40
|
+
return 0
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""CloudXPL-Forge module: Enumerate DigitalOcean Managed Kubernetes (DOKS) clusters"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
MANIFEST = {
|
|
9
|
+
"capability_id": "cloudxpl.digitalocean.doks_enum.v1",
|
|
10
|
+
"safety_class": "READ_ONLY",
|
|
11
|
+
"requires_authorization": True,
|
|
12
|
+
"side_effects": ["api_calls"],
|
|
13
|
+
"output_schema": "xpl.finding.v1",
|
|
14
|
+
"mitre": ["T1526"],
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def run(args: Any) -> int:
|
|
19
|
+
"""Execute Enumerate DigitalOcean Managed Kubernetes (DOKS) clusters."""
|
|
20
|
+
import json
|
|
21
|
+
import sys
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
print(f"[*] {MANIFEST['capability_id']} starting...")
|
|
26
|
+
print(f"[*] Target: {getattr(args, 'target', 'N/A')}")
|
|
27
|
+
|
|
28
|
+
findings: list[dict] = []
|
|
29
|
+
|
|
30
|
+
# --- Module logic placeholder ---
|
|
31
|
+
# TODO: implement provider-specific API calls
|
|
32
|
+
print("[!] Module stub — implement provider-specific logic")
|
|
33
|
+
|
|
34
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
35
|
+
out_dir = Path(getattr(args, "output", "."))
|
|
36
|
+
out_dir.mkdir(parents=True, exist_ok=True)
|
|
37
|
+
out_file = out_dir / f"{MANIFEST['capability_id'].rsplit('.', 1)[-1]}_{ts}.json"
|
|
38
|
+
out_file.write_text(json.dumps({"module": MANIFEST["capability_id"], "timestamp": ts, "findings": findings}, indent=2))
|
|
39
|
+
print(f"[+] Results saved to {out_file}")
|
|
40
|
+
return 0
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""CloudXPL-Forge module: CDE-2026-0993 — Droplet Agent command injection as root (CVSS 8.8)"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
MANIFEST = {
|
|
9
|
+
"capability_id": "cloudxpl.digitalocean.droplet_agent_rce.v1",
|
|
10
|
+
"safety_class": "EXPLOIT",
|
|
11
|
+
"requires_authorization": True,
|
|
12
|
+
"side_effects": ["api_calls", "state_change"],
|
|
13
|
+
"output_schema": "xpl.finding.v1",
|
|
14
|
+
"mitre": ["T1059"],
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def run(args: Any) -> int:
|
|
19
|
+
"""Execute CDE-2026-0993 — Droplet Agent command injection as root (CVSS 8.8)."""
|
|
20
|
+
import json
|
|
21
|
+
import sys
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
print(f"[*] {MANIFEST['capability_id']} starting...")
|
|
26
|
+
print(f"[*] Target: {getattr(args, 'target', 'N/A')}")
|
|
27
|
+
|
|
28
|
+
findings: list[dict] = []
|
|
29
|
+
|
|
30
|
+
# --- Module logic placeholder ---
|
|
31
|
+
# TODO: implement provider-specific API calls
|
|
32
|
+
print("[!] Module stub — implement provider-specific logic")
|
|
33
|
+
|
|
34
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
35
|
+
out_dir = Path(getattr(args, "output", "."))
|
|
36
|
+
out_dir.mkdir(parents=True, exist_ok=True)
|
|
37
|
+
out_file = out_dir / f"{MANIFEST['capability_id'].rsplit('.', 1)[-1]}_{ts}.json"
|
|
38
|
+
out_file.write_text(json.dumps({"module": MANIFEST["capability_id"], "timestamp": ts, "findings": findings}, indent=2))
|
|
39
|
+
print(f"[+] Results saved to {out_file}")
|
|
40
|
+
return 0
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""CloudXPL-Forge module: Enumerate DigitalOcean Droplets, regions, sizes, images"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
MANIFEST = {
|
|
9
|
+
"capability_id": "cloudxpl.digitalocean.droplet_enum.v1",
|
|
10
|
+
"safety_class": "READ_ONLY",
|
|
11
|
+
"requires_authorization": True,
|
|
12
|
+
"side_effects": ["api_calls"],
|
|
13
|
+
"output_schema": "xpl.finding.v1",
|
|
14
|
+
"mitre": ["T1580"],
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def run(args: Any) -> int:
|
|
19
|
+
"""Execute Enumerate DigitalOcean Droplets, regions, sizes, images."""
|
|
20
|
+
import json
|
|
21
|
+
import sys
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
print(f"[*] {MANIFEST['capability_id']} starting...")
|
|
26
|
+
print(f"[*] Target: {getattr(args, 'target', 'N/A')}")
|
|
27
|
+
|
|
28
|
+
findings: list[dict] = []
|
|
29
|
+
|
|
30
|
+
# --- Module logic placeholder ---
|
|
31
|
+
# TODO: implement provider-specific API calls
|
|
32
|
+
print("[!] Module stub — implement provider-specific logic")
|
|
33
|
+
|
|
34
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
35
|
+
out_dir = Path(getattr(args, "output", "."))
|
|
36
|
+
out_dir.mkdir(parents=True, exist_ok=True)
|
|
37
|
+
out_file = out_dir / f"{MANIFEST['capability_id'].rsplit('.', 1)[-1]}_{ts}.json"
|
|
38
|
+
out_file.write_text(json.dumps({"module": MANIFEST["capability_id"], "timestamp": ts, "findings": findings}, indent=2))
|
|
39
|
+
print(f"[+] Results saved to {out_file}")
|
|
40
|
+
return 0
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""CloudXPL-Forge module: Enumerate DO Cloud Firewall rules and misconfigurations"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
MANIFEST = {
|
|
9
|
+
"capability_id": "cloudxpl.digitalocean.firewall_enum.v1",
|
|
10
|
+
"safety_class": "READ_ONLY",
|
|
11
|
+
"requires_authorization": True,
|
|
12
|
+
"side_effects": ["api_calls"],
|
|
13
|
+
"output_schema": "xpl.finding.v1",
|
|
14
|
+
"mitre": ["T1046", "T1580"],
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def run(args: Any) -> int:
|
|
19
|
+
"""Execute Enumerate DO Cloud Firewall rules and misconfigurations."""
|
|
20
|
+
import json
|
|
21
|
+
import sys
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
print(f"[*] {MANIFEST['capability_id']} starting...")
|
|
26
|
+
print(f"[*] Target: {getattr(args, 'target', 'N/A')}")
|
|
27
|
+
|
|
28
|
+
findings: list[dict] = []
|
|
29
|
+
|
|
30
|
+
# --- Module logic placeholder ---
|
|
31
|
+
# TODO: implement provider-specific API calls
|
|
32
|
+
print("[!] Module stub — implement provider-specific logic")
|
|
33
|
+
|
|
34
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
35
|
+
out_dir = Path(getattr(args, "output", "."))
|
|
36
|
+
out_dir.mkdir(parents=True, exist_ok=True)
|
|
37
|
+
out_file = out_dir / f"{MANIFEST['capability_id'].rsplit('.', 1)[-1]}_{ts}.json"
|
|
38
|
+
out_file.write_text(json.dumps({"module": MANIFEST["capability_id"], "timestamp": ts, "findings": findings}, indent=2))
|
|
39
|
+
print(f"[+] Results saved to {out_file}")
|
|
40
|
+
return 0
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""CloudXPL-Forge module: SSRF to DO metadata (169.254.169.254) — SSH keys, user-data, network"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
MANIFEST = {
|
|
9
|
+
"capability_id": "cloudxpl.digitalocean.metadata_ssrf.v1",
|
|
10
|
+
"safety_class": "EXPLOIT",
|
|
11
|
+
"requires_authorization": True,
|
|
12
|
+
"side_effects": ["api_calls", "state_change"],
|
|
13
|
+
"output_schema": "xpl.finding.v1",
|
|
14
|
+
"mitre": ["T1552.005"],
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def run(args: Any) -> int:
|
|
19
|
+
"""Execute SSRF to DO metadata (169.254.169.254) — SSH keys, user-data, network."""
|
|
20
|
+
import json
|
|
21
|
+
import sys
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
print(f"[*] {MANIFEST['capability_id']} starting...")
|
|
26
|
+
print(f"[*] Target: {getattr(args, 'target', 'N/A')}")
|
|
27
|
+
|
|
28
|
+
findings: list[dict] = []
|
|
29
|
+
|
|
30
|
+
# --- Module logic placeholder ---
|
|
31
|
+
# TODO: implement provider-specific API calls
|
|
32
|
+
print("[!] Module stub — implement provider-specific logic")
|
|
33
|
+
|
|
34
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
35
|
+
out_dir = Path(getattr(args, "output", "."))
|
|
36
|
+
out_dir.mkdir(parents=True, exist_ok=True)
|
|
37
|
+
out_file = out_dir / f"{MANIFEST['capability_id'].rsplit('.', 1)[-1]}_{ts}.json"
|
|
38
|
+
out_file.write_text(json.dumps({"module": MANIFEST["capability_id"], "timestamp": ts, "findings": findings}, indent=2))
|
|
39
|
+
print(f"[+] Results saved to {out_file}")
|
|
40
|
+
return 0
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""CloudXPL-Forge module: Enumerate DigitalOcean Spaces (S3-compatible) buckets and objects"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
MANIFEST = {
|
|
9
|
+
"capability_id": "cloudxpl.digitalocean.spaces_enum.v1",
|
|
10
|
+
"safety_class": "READ_ONLY",
|
|
11
|
+
"requires_authorization": True,
|
|
12
|
+
"side_effects": ["api_calls"],
|
|
13
|
+
"output_schema": "xpl.finding.v1",
|
|
14
|
+
"mitre": ["T1526"],
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def run(args: Any) -> int:
|
|
19
|
+
"""Execute Enumerate DigitalOcean Spaces (S3-compatible) buckets and objects."""
|
|
20
|
+
import json
|
|
21
|
+
import sys
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
print(f"[*] {MANIFEST['capability_id']} starting...")
|
|
26
|
+
print(f"[*] Target: {getattr(args, 'target', 'N/A')}")
|
|
27
|
+
|
|
28
|
+
findings: list[dict] = []
|
|
29
|
+
|
|
30
|
+
# --- Module logic placeholder ---
|
|
31
|
+
# TODO: implement provider-specific API calls
|
|
32
|
+
print("[!] Module stub — implement provider-specific logic")
|
|
33
|
+
|
|
34
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
35
|
+
out_dir = Path(getattr(args, "output", "."))
|
|
36
|
+
out_dir.mkdir(parents=True, exist_ok=True)
|
|
37
|
+
out_file = out_dir / f"{MANIFEST['capability_id'].rsplit('.', 1)[-1]}_{ts}.json"
|
|
38
|
+
out_file.write_text(json.dumps({"module": MANIFEST["capability_id"], "timestamp": ts, "findings": findings}, indent=2))
|
|
39
|
+
print(f"[+] Results saved to {out_file}")
|
|
40
|
+
return 0
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""CloudXPL-Forge module: Exploit misconfigured Spaces (public ACL, CORS, presigned URLs)"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
MANIFEST = {
|
|
9
|
+
"capability_id": "cloudxpl.digitalocean.spaces_exploit.v1",
|
|
10
|
+
"safety_class": "EXPLOIT",
|
|
11
|
+
"requires_authorization": True,
|
|
12
|
+
"side_effects": ["api_calls", "state_change"],
|
|
13
|
+
"output_schema": "xpl.finding.v1",
|
|
14
|
+
"mitre": ["T1530"],
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def run(args: Any) -> int:
|
|
19
|
+
"""Execute Exploit misconfigured Spaces (public ACL, CORS, presigned URLs)."""
|
|
20
|
+
import json
|
|
21
|
+
import sys
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
print(f"[*] {MANIFEST['capability_id']} starting...")
|
|
26
|
+
print(f"[*] Target: {getattr(args, 'target', 'N/A')}")
|
|
27
|
+
|
|
28
|
+
findings: list[dict] = []
|
|
29
|
+
|
|
30
|
+
# --- Module logic placeholder ---
|
|
31
|
+
# TODO: implement provider-specific API calls
|
|
32
|
+
print("[!] Module stub — implement provider-specific logic")
|
|
33
|
+
|
|
34
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
35
|
+
out_dir = Path(getattr(args, "output", "."))
|
|
36
|
+
out_dir.mkdir(parents=True, exist_ok=True)
|
|
37
|
+
out_file = out_dir / f"{MANIFEST['capability_id'].rsplit('.', 1)[-1]}_{ts}.json"
|
|
38
|
+
out_file.write_text(json.dumps({"module": MANIFEST["capability_id"], "timestamp": ts, "findings": findings}, indent=2))
|
|
39
|
+
print(f"[+] Results saved to {out_file}")
|
|
40
|
+
return 0
|
|
File without changes
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""GCP Artifact Registry image enumeration."""
|
|
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.gcp.artifact_registry.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
|
+
"""Execute artifact_registry module."""
|
|
35
|
+
provider = getattr(args, "command", "gcp")
|
|
36
|
+
print(f"[*] {MANIFEST['capability_id']} — GCP Artifact Registry image enumeration")
|
|
37
|
+
print(f"[*] Provider: {provider} | Service: ArtifactRegistryClient")
|
|
38
|
+
print(f"[*] Target: repositories, images")
|
|
39
|
+
|
|
40
|
+
results: dict[str, Any] = {
|
|
41
|
+
"module": "artifact_registry",
|
|
42
|
+
"provider": provider,
|
|
43
|
+
"findings": [],
|
|
44
|
+
"summary": {},
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
try:
|
|
48
|
+
libs = "google.cloud.artifactregistry".split(",")
|
|
49
|
+
for lib in libs:
|
|
50
|
+
__import__(lib.strip())
|
|
51
|
+
except ImportError as exc:
|
|
52
|
+
print(f"[!] Required library not installed: {exc}", file=sys.stderr)
|
|
53
|
+
print(f"[*] Install: pip install {str(exc).split(chr(39))[1] if chr(39) in str(exc) else 'required-lib'}")
|
|
54
|
+
results["status"] = "missing_dependency"
|
|
55
|
+
results["error"] = str(exc)
|
|
56
|
+
_save(args, "gcp_artifact_registry", results)
|
|
57
|
+
return 1
|
|
58
|
+
|
|
59
|
+
target = getattr(args, "target", None)
|
|
60
|
+
region = getattr(args, "region", "us-east-1")
|
|
61
|
+
profile = getattr(args, "profile", None)
|
|
62
|
+
project = getattr(args, "project", None)
|
|
63
|
+
|
|
64
|
+
print(f"[*] Enumerating repositories, images...")
|
|
65
|
+
|
|
66
|
+
# Provider-specific enumeration logic
|
|
67
|
+
try:
|
|
68
|
+
# Placeholder for provider-specific API calls
|
|
69
|
+
# Each module should be extended with actual exploitation logic
|
|
70
|
+
results["status"] = "completed"
|
|
71
|
+
results["summary"] = {
|
|
72
|
+
"items_checked": 0,
|
|
73
|
+
"findings_count": 0,
|
|
74
|
+
"key_finding": "publicly accessible repos",
|
|
75
|
+
}
|
|
76
|
+
print(f"[+] Analysis complete — key finding indicator: publicly accessible repos")
|
|
77
|
+
except Exception as exc:
|
|
78
|
+
print(f"[-] Module execution failed: {exc}", file=sys.stderr)
|
|
79
|
+
results["status"] = "error"
|
|
80
|
+
results["error"] = str(exc)
|
|
81
|
+
_save(args, "gcp_artifact_registry", results)
|
|
82
|
+
return 1
|
|
83
|
+
|
|
84
|
+
_save(args, "gcp_artifact_registry", results)
|
|
85
|
+
return 0
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""GCP BigQuery dataset enumeration and data exfiltration."""
|
|
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.gcp.bigquery_exploit.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
|
+
"""Execute bigquery_exploit module."""
|
|
35
|
+
provider = getattr(args, "command", "gcp")
|
|
36
|
+
print(f"[*] {MANIFEST['capability_id']} — GCP BigQuery dataset enumeration and data exfiltration")
|
|
37
|
+
print(f"[*] Provider: {provider} | Service: BigQueryClient")
|
|
38
|
+
print(f"[*] Target: datasets, tables")
|
|
39
|
+
|
|
40
|
+
results: dict[str, Any] = {
|
|
41
|
+
"module": "bigquery_exploit",
|
|
42
|
+
"provider": provider,
|
|
43
|
+
"findings": [],
|
|
44
|
+
"summary": {},
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
try:
|
|
48
|
+
libs = "google.cloud.bigquery".split(",")
|
|
49
|
+
for lib in libs:
|
|
50
|
+
__import__(lib.strip())
|
|
51
|
+
except ImportError as exc:
|
|
52
|
+
print(f"[!] Required library not installed: {exc}", file=sys.stderr)
|
|
53
|
+
print(f"[*] Install: pip install {str(exc).split(chr(39))[1] if chr(39) in str(exc) else 'required-lib'}")
|
|
54
|
+
results["status"] = "missing_dependency"
|
|
55
|
+
results["error"] = str(exc)
|
|
56
|
+
_save(args, "gcp_bigquery_exploit", results)
|
|
57
|
+
return 1
|
|
58
|
+
|
|
59
|
+
target = getattr(args, "target", None)
|
|
60
|
+
region = getattr(args, "region", "us-east-1")
|
|
61
|
+
profile = getattr(args, "profile", None)
|
|
62
|
+
project = getattr(args, "project", None)
|
|
63
|
+
|
|
64
|
+
print(f"[*] Enumerating datasets, tables...")
|
|
65
|
+
|
|
66
|
+
# Provider-specific enumeration logic
|
|
67
|
+
try:
|
|
68
|
+
# Placeholder for provider-specific API calls
|
|
69
|
+
# Each module should be extended with actual exploitation logic
|
|
70
|
+
results["status"] = "completed"
|
|
71
|
+
results["summary"] = {
|
|
72
|
+
"items_checked": 0,
|
|
73
|
+
"findings_count": 0,
|
|
74
|
+
"key_finding": "publicly accessible datasets",
|
|
75
|
+
}
|
|
76
|
+
print(f"[+] Analysis complete — key finding indicator: publicly accessible datasets")
|
|
77
|
+
except Exception as exc:
|
|
78
|
+
print(f"[-] Module execution failed: {exc}", file=sys.stderr)
|
|
79
|
+
results["status"] = "error"
|
|
80
|
+
results["error"] = str(exc)
|
|
81
|
+
_save(args, "gcp_bigquery_exploit", results)
|
|
82
|
+
return 1
|
|
83
|
+
|
|
84
|
+
_save(args, "gcp_bigquery_exploit", results)
|
|
85
|
+
return 0
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""GCP Cloud Storage bucket enumeration — list buckets, IAM, public access."""
|
|
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.gcp.bucket_enum.v1",
|
|
14
|
+
"safety_class": "READ_ONLY",
|
|
15
|
+
"requires_authorization": True,
|
|
16
|
+
"side_effects": ["gcp_api_calls"],
|
|
17
|
+
"output_schema": "xpl.finding.v1",
|
|
18
|
+
"mitre": ["T1530"],
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def run(args: Any) -> int:
|
|
23
|
+
project = args.project_id
|
|
24
|
+
print(f"[*] GCP Bucket Enumeration (project: {project})")
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
from google.cloud import storage
|
|
28
|
+
except ImportError:
|
|
29
|
+
print("[!] google-cloud-storage not installed", file=sys.stderr)
|
|
30
|
+
return 1
|
|
31
|
+
|
|
32
|
+
client = storage.Client(project=project)
|
|
33
|
+
|
|
34
|
+
try:
|
|
35
|
+
buckets = list(client.list_buckets())
|
|
36
|
+
except Exception as exc:
|
|
37
|
+
print(f"[-] list_buckets failed: {exc}", file=sys.stderr)
|
|
38
|
+
return 1
|
|
39
|
+
|
|
40
|
+
print(f"[+] {len(buckets)} buckets")
|
|
41
|
+
results = []
|
|
42
|
+
|
|
43
|
+
for bucket in buckets:
|
|
44
|
+
entry: dict[str, Any] = {
|
|
45
|
+
"name": bucket.name,
|
|
46
|
+
"location": bucket.location,
|
|
47
|
+
"storage_class": bucket.storage_class,
|
|
48
|
+
"versioning": bucket.versioning_enabled,
|
|
49
|
+
"uniform_access": bucket.iam_configuration.uniform_bucket_level_access_enabled,
|
|
50
|
+
"public_access_prevention": getattr(
|
|
51
|
+
bucket.iam_configuration, "public_access_prevention", "inherited"
|
|
52
|
+
),
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
try:
|
|
56
|
+
policy = bucket.get_iam_policy(requested_policy_version=3)
|
|
57
|
+
public_bindings = []
|
|
58
|
+
for binding in policy.bindings:
|
|
59
|
+
public_members = [
|
|
60
|
+
m for m in binding["members"]
|
|
61
|
+
if m in ("allUsers", "allAuthenticatedUsers")
|
|
62
|
+
]
|
|
63
|
+
if public_members:
|
|
64
|
+
public_bindings.append({
|
|
65
|
+
"role": binding["role"],
|
|
66
|
+
"members": public_members,
|
|
67
|
+
})
|
|
68
|
+
entry["public_iam"] = public_bindings
|
|
69
|
+
if public_bindings:
|
|
70
|
+
print(f" [!] {bucket.name}: PUBLIC IAM bindings found")
|
|
71
|
+
except Exception:
|
|
72
|
+
entry["iam_error"] = "AccessDenied"
|
|
73
|
+
|
|
74
|
+
results.append(entry)
|
|
75
|
+
|
|
76
|
+
os.makedirs(args.output, exist_ok=True)
|
|
77
|
+
ts = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
78
|
+
out_path = os.path.join(args.output, f"gcp_buckets_{ts}.json")
|
|
79
|
+
with open(out_path, "w") as fh:
|
|
80
|
+
json.dump(results, fh, indent=2, default=str)
|
|
81
|
+
|
|
82
|
+
public_count = sum(1 for r in results if r.get("public_iam"))
|
|
83
|
+
print(f"[+] {public_count} public buckets, {len(results)} total → {out_path}")
|
|
84
|
+
return 0
|