Skip to main content

AzureFox - offensive-focused Azure situational awareness CLI

Project description

AzureFox

AzureFox logo

Azure attack path reconnaissance for identifying privilege escalation paths, over-permissioned identities, and exploitable cloud misconfigurations.

Why AzureFox

Most Azure tools focus on inventory, configuration review, or compliance reporting.

AzureFox is built for offensive security and operator-first cloud triage:

  • What can this identity actually do?
  • Where can it pivot next?
  • Which Azure path matters first?

Install

pipx install azurefox

Run It

Start with the current Azure identity and the strongest visible control paths:

azurefox whoami
azurefox permissions

Example Output

azurefox permissions

principal type high-impact roles scopes operator signal next review
azurefox-lab-sp ServicePrincipal Owner 1 Direct control visible; current foothold. Check privesc for the direct abuse or escalation path.
operator@lab.local User 1 Direct control not confirmed. Check rbac for the exact assignment evidence.

AzureFox is not just listing Azure objects. It ranks the identities that matter, explains why they matter, and points to the next command to run.

What Makes This Different

  • Identity-first, not just resource-first
  • Focused on attack paths, not raw Azure data
  • Output designed for operators who need to decide what matters next

Currently Supported Azure Commands

Section Commands
core inventory
identity whoami, rbac, principals, permissions, privesc, role-trusts, lighthouse, auth-policies, managed-identities
config arm-deployments, env-vars
secrets keyvault, tokens-credentials
resource automation, devops, acr, api-mgmt, databases, resource-trusts
storage storage
network nics, dns, endpoints, network-effective, network-ports
compute workloads, app-services, functions, aks, vms, vmss, snapshots-disks
orchestration chains

Commands without links do not have a dedicated wiki source page in the repo yet.

Need A Test Lab?

Don't have an Azure environment handy? The companion repo AzureFox OpenTofu Proof Lab spins up a deliberately insecure Azure lab for demos, validation, and practice.

Use a disposable subscription you control. It is risky on purpose.

CLI Invocation

Shared flags like --tenant, --subscription, --output, --outdir, and --debug work before or after the command.

These forms are equivalent:

azurefox dns --output json --outdir ./azurefox-demo
azurefox --output json --outdir ./azurefox-demo dns

Use azurefox <command> --help or azurefox help <command> for command-specific help.

Install Profiles

AzureFox installs the live Azure runtime dependencies by default so pip install azurefox is ready for real Azure command execution.

If you prefer an isolated virtual environment:

python -m venv .venv
# macOS/Linux
source .venv/bin/activate
# Windows PowerShell
# .venv\Scripts\Activate.ps1
pip install azurefox

For local source-based development, use pip install -e '.[dev]'.

AzureFox is intended to work on macOS, Linux, and Windows. The command examples below use portable relative paths like ./azurefox-demo; shell syntax mainly differs for virtualenv activation and environment-variable export.

Live operator guidance is built into azurefox help and azurefox help <command>. Longer-form planning and wiki-source material lives under wiki/.

  • pip install azurefox installs the normal operator profile from PyPI, including the Azure SDK dependencies used by the implemented live commands
  • pip install -e . installs the same live Azure command profile from a local checkout
  • pip install -e '.[dev]' installs contributor tooling on top of the default live Azure dependencies; this is the normal repo development profile

Auth Precedence

  1. Azure CLI credential
  2. Environment credential

Supported auth matrix

Path How it starts Current support Metadata auth_mode
Interactive user via Azure CLI az login supported azure_cli_user
Service principal via Azure CLI az login --service-principal ... supported through Azure CLI azure_cli_service_principal
Managed identity via Azure CLI az login --identity supported through Azure CLI azure_cli_managed_identity
Service principal via environment client secret AZURE_TENANT_ID + AZURE_CLIENT_ID + AZURE_CLIENT_SECRET supported environment_client_secret
Service principal via environment certificate AZURE_TENANT_ID + AZURE_CLIENT_ID + AZURE_CLIENT_CERTIFICATE_PATH supported environment_client_certificate

AzureFox does not launch its own browser or managed-identity login flow. It relies on Azure Identity:

  • AzureCliCredential for the active Azure CLI sign-in state
  • EnvironmentCredential for service principal environment variables

Interactive user via Azure CLI

If you want web-based authentication, run az login first (outside AzureFox), then run AzureFox. AzureFox does not currently launch its own browser auth flow.

Azure CLI example:

az login
az account set --subscription <subscription-id>
azurefox inventory --subscription <subscription-id>

Service principal via Azure CLI

This is useful for headless automation that still wants Azure CLI to hold the active login state.

With a client secret:

az login --service-principal \
  --username <client-id> \
  --password <client-secret> \
  --tenant <tenant-id>
az account set --subscription <subscription-id>
azurefox whoami --subscription <subscription-id>

With a certificate:

az login --service-principal \
  --username <client-id> \
  --certificate /path/to/certificate.pem \
  --tenant <tenant-id>
az account set --subscription <subscription-id>
azurefox whoami --subscription <subscription-id>

Service principal via environment client secret

If you do not want to use Azure CLI login state, set service principal environment variables and pass CLI flags for tenant/subscription targeting.

Environment client-secret example:

# macOS/Linux
export AZURE_TENANT_ID=<tenant-id>
export AZURE_CLIENT_ID=<client-id>
export AZURE_CLIENT_SECRET=<client-secret>
export AZUREFOX_DEVOPS_ORG=<org-name> # only needed for the devops command
azurefox whoami --tenant <tenant-id> --subscription <subscription-id>
# Windows PowerShell
$env:AZURE_TENANT_ID="<tenant-id>"
$env:AZURE_CLIENT_ID="<client-id>"
$env:AZURE_CLIENT_SECRET="<client-secret>"
$env:AZUREFOX_DEVOPS_ORG="<org-name>" # only needed for the devops command
azurefox whoami --tenant <tenant-id> --subscription <subscription-id>

Service principal via environment certificate

# macOS/Linux
export AZURE_TENANT_ID=<tenant-id>
export AZURE_CLIENT_ID=<client-id>
export AZURE_CLIENT_CERTIFICATE_PATH=/path/to/certificate.pem
export AZURE_CLIENT_CERTIFICATE_PASSWORD=<optional-password>
azurefox whoami --tenant <tenant-id> --subscription <subscription-id>
# Windows PowerShell
$env:AZURE_TENANT_ID="<tenant-id>"
$env:AZURE_CLIENT_ID="<client-id>"
$env:AZURE_CLIENT_CERTIFICATE_PATH="C:\\path\\to\\certificate.pem"
$env:AZURE_CLIENT_CERTIFICATE_PASSWORD="<optional-password>"
azurefox whoami --tenant <tenant-id> --subscription <subscription-id>

Azure-hosted managed identity via Azure CLI

This works when you are running on an Azure resource that already has a managed identity attached.

az login --identity
az account set --subscription <subscription-id>
azurefox whoami --subscription <subscription-id>

For a user-assigned managed identity:

az login --identity --client-id <user-assigned-managed-identity-client-id>
az account set --subscription <subscription-id>
azurefox whoami --subscription <subscription-id>

AZUREFOX_DEVOPS_ORG is only needed when running the devops command. The identity used for devops still needs access to the Azure DevOps organization, not just ARM access to the tenant or subscription.

Output Modes

  • --output table (default)
  • --output json
  • --output csv

All commands write artifacts under <outdir>/:

  • loot/<command>.json

  • json/<command>.json

  • table/<command>.txt

  • csv/<command>.csv Artifact intent:

  • json/ is the full structured command record.

  • loot/ is the smaller high-value handoff, focused on the top-ranked targets for quick operator follow-up and later chain-oriented workflows.

  • table/ and csv/ are convenience views rendered from the same underlying command result.

Sections And Chains

AzureFox keeps flat standalone commands and also supports grouped execution through chains.

For narrower current work:

  • run the flat commands directly when you already know the lane you want
  • use chains when you want a higher-value grouped answer instead of every source command on its own

Current section mappings:

  • identity: whoami, rbac, principals, permissions, privesc, role-trusts, lighthouse, auth-policies, managed-identities
  • config: arm-deployments, env-vars
  • secrets: keyvault, tokens-credentials
  • resource: automation, devops, acr, api-mgmt, databases, resource-trusts
  • storage: storage
  • network: nics, dns, endpoints, network-effective, network-ports
  • compute: workloads, app-services, functions, aks, vms, vmss, snapshots-disks
  • core: inventory

Help

AzureFox supports generic and scoped help:

azurefox help
azurefox help identity
azurefox help permissions
azurefox dns --help
azurefox -h identity
azurefox -h permissions

Command help includes ATT&CK cloud leads as investigation prompts, not proof that a technique occurred.

Help also points grouped follow-up toward chains where those presets exist.

For ad hoc demos or local testing, use a dedicated path like --outdir ./azurefox-demo so artifacts do not pile up in the repo root.

Fixture Mode

Set AZUREFOX_FIXTURE_DIR to run against local fixture files rather than Azure APIs.

# macOS/Linux
AZUREFOX_FIXTURE_DIR=tests/fixtures/lab_tenant azurefox rbac --output json
# Windows PowerShell
$env:AZUREFOX_FIXTURE_DIR="tests/fixtures/lab_tenant"
azurefox rbac --output json

Development

pip install -e '.[dev]'
ruff check .
pytest

CI runs lint plus unit, contract, and smoke tests. Integration tests are opt-in.

Attribution

AzureFox is inspired by CloudFox, created by Bishop Fox. The command model and operator workflow goals in this project are heavily shaped by CloudFox's approach to cloud situational awareness and attack-path-focused enumeration.

This project is an independent implementation and is not affiliated with or endorsed by Bishop Fox.

License

AzureFox is licensed under the MIT License to match CloudFox's licensing model. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

azurefox-1.3.0.tar.gz (221.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

azurefox-1.3.0-py3-none-any.whl (176.5 kB view details)

Uploaded Python 3

File details

Details for the file azurefox-1.3.0.tar.gz.

File metadata

  • Download URL: azurefox-1.3.0.tar.gz
  • Upload date:
  • Size: 221.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for azurefox-1.3.0.tar.gz
Algorithm Hash digest
SHA256 8fc24a6f46b7f95f31287bcf984e3d5284a1e12e4e9294f40822a3823f2e4395
MD5 4ec635382fa3180e50875e488894d55a
BLAKE2b-256 0d212dafc73dcd76ac2336a5930d66a7d8f2cc21b06c11be5c0a7971cd8c58ca

See more details on using hashes here.

Provenance

The following attestation bundles were made for azurefox-1.3.0.tar.gz:

Publisher: release.yml on TacoRocket/AzureFox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file azurefox-1.3.0-py3-none-any.whl.

File metadata

  • Download URL: azurefox-1.3.0-py3-none-any.whl
  • Upload date:
  • Size: 176.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for azurefox-1.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a2e365296f03356ef859f68be2eda4da31ecdd0a41005745a0e353432c0cfb81
MD5 eeea8a062ded6aa009bd19a6a3ac7f7a
BLAKE2b-256 f2a9648effb4a1da6cb04fe8ce86db132b578fcc7ef3ac0f275c632b1012f17c

See more details on using hashes here.

Provenance

The following attestation bundles were made for azurefox-1.3.0-py3-none-any.whl:

Publisher: release.yml on TacoRocket/AzureFox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page