{"adoption": {"forks": 186, "observed_at": "2026-08-28T04:03:35.429073+00:00", "stars": 1100}, "canonical_url": "https://ross.abutalabs.com/products/msolspray", "card": {"archived": false, "artifact_type": "cli-tool", "description": "A password spraying tool for Microsoft Online accounts (Azure/O365). The script logs if a user cred is valid, if MFA is enabled on the account, if a tenant doesn't exist, if a user doesn't exist, if the account is locked, or if the account is disabled. ", "domain": ["security", "penetration-testing", "cloud-computing"], "enriched": true, "function": ["security", "penetration-testing", "auth", "cli"], "health_score": 20, "homepage": null, "language": "PowerShell", "license": "MIT", "license_family": "permissive", "maturity": "stable", "member_repos": ["dafthack/MSOLSpray"], "name": "dafthack/MSOLSpray", "platform": ["windows", "cli"], "pushed_at": "2024-03-19T11:03:06+00:00", "repo": "dafthack/MSOLSpray", "stars": 1100, "tags": ["password-spraying", "azure-ad", "office365", "red-team", "account-enumeration", "powershell"], "topics": [], "urls": [], "use_cases": ["spray a single password against a list of O365 user accounts", "enumerate which Azure AD users exist in a tenant", "detect whether target accounts have MFA enabled", "find valid Microsoft Online credentials during authorized penetration tests", "rotate source IPs with FireProx to avoid Azure Smart Lockout", "identify locked or disabled accounts during a spray"], "what_it_is": "MSOLSpray is a PowerShell-based password spraying tool for Microsoft Online (Azure AD/O365) accounts. It leverages Azure AD OAuth2 error codes to report valid credentials, MFA status, tenant/user existence, and account lockout or disabled states, doubling as a Microsoft Online recon tool.", "when_to_avoid": ["you have no explicit authorization to test the target accounts", "you need multi-password spraying with complex password lists per user", "you need a cross-platform tool outside Windows PowerShell", "you want to avoid any risk of account lockouts on production tenants"], "when_to_choose": ["you need verbose Azure AD error-code feedback beyond just valid/invalid credentials", "you want a lightweight PowerShell tool with no dependencies for O365 password spraying", "you need account enumeration and MFA detection alongside spraying", "you plan to pair spraying with FireProx for IP rotation"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/msolspray", "repo": "dafthack/MSOLSpray", "role": "main", "score": 32}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:35.429073+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:45:47.549395+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "91f60bfc35d6a06bc3ba2c47e7b45485a3b03e64da390acc65fe84071b3fbf18", "fetched_at": "2026-08-28T04:03:35.429073+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dafthack/MSOLSpray"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:35.429073+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:45:47.549395+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "91f60bfc35d6a06bc3ba2c47e7b45485a3b03e64da390acc65fe84071b3fbf18", "fetched_at": "2026-08-28T04:03:35.429073+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dafthack/MSOLSpray"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:45:47.549395+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "91f60bfc35d6a06bc3ba2c47e7b45485a3b03e64da390acc65fe84071b3fbf18", "fetched_at": "2026-08-28T04:03:35.429073+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dafthack/MSOLSpray"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:03:35.429073+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:35.429073+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:35.429073+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:45:47.549395+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "91f60bfc35d6a06bc3ba2c47e7b45485a3b03e64da390acc65fe84071b3fbf18", "fetched_at": "2026-08-28T04:03:35.429073+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dafthack/MSOLSpray"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:35.429073+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:35.429073+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:45:47.549395+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "91f60bfc35d6a06bc3ba2c47e7b45485a3b03e64da390acc65fe84071b3fbf18", "fetched_at": "2026-08-28T04:03:35.429073+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dafthack/MSOLSpray"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:35.429073+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:35.429073+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:35.429073+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:45:47.549395+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "91f60bfc35d6a06bc3ba2c47e7b45485a3b03e64da390acc65fe84071b3fbf18", "fetched_at": "2026-08-28T04:03:35.429073+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dafthack/MSOLSpray"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:35.429073+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:35.429073+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:45:47.549395+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "91f60bfc35d6a06bc3ba2c47e7b45485a3b03e64da390acc65fe84071b3fbf18", "fetched_at": "2026-08-28T04:03:35.429073+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dafthack/MSOLSpray"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:45:47.549395+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "91f60bfc35d6a06bc3ba2c47e7b45485a3b03e64da390acc65fe84071b3fbf18", "fetched_at": "2026-08-28T04:03:35.429073+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dafthack/MSOLSpray"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:45:47.549395+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "91f60bfc35d6a06bc3ba2c47e7b45485a3b03e64da390acc65fe84071b3fbf18", "fetched_at": "2026-08-28T04:03:35.429073+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dafthack/MSOLSpray"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:45:47.549395+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "91f60bfc35d6a06bc3ba2c47e7b45485a3b03e64da390acc65fe84071b3fbf18", "fetched_at": "2026-08-28T04:03:35.429073+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dafthack/MSOLSpray"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2361, "days_push": 897, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 32, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}