{"adoption": {"forks": 358, "observed_at": "2026-08-28T04:06:36.645467+00:00", "stars": 2313}, "canonical_url": "https://ross.abutalabs.com/products/sensepost-ruler", "card": {"archived": false, "artifact_type": "cli-tool", "description": "A tool to abuse Exchange services", "domain": ["penetration-testing", "security", "email"], "enriched": true, "function": ["penetration-testing", "security", "email", "http-client"], "health_score": 20, "homepage": null, "language": "Go", "license": "NOASSERTION", "license_family": "other", "maturity": "maintenance", "member_repos": ["sensepost/ruler"], "name": "sensepost/ruler", "platform": ["windows", "cli", "go"], "pushed_at": "2024-06-10T11:03:07+00:00", "repo": "sensepost/ruler", "stars": 2313, "tags": ["exchange", "mapi", "outlook", "red-team", "offensive-security", "pentesting", "linux", "macos"], "topics": ["mapi", "exchange", "shells", "pentesting"], "urls": [], "use_cases": ["abuse exchange server to get a remote shell", "enumerate valid exchange user accounts", "dump the global address list from exchange", "execute vbscript through outlook forms", "create malicious mail rules for persistence", "brute force exchange user credentials", "pass the hash against exchange mapi"], "what_it_is": "Ruler is a Go-based command-line tool for interacting with and abusing Microsoft Exchange servers via MAPI/HTTP or RPC/HTTP. It enables offensive operations such as user enumeration, GAL dumping, and remote shell execution through malicious Outlook rules, forms, or home pages.", "when_to_avoid": ["you need a defensive or auditing tool rather than an offensive one", "your target is not Microsoft Exchange or Outlook", "you require a permissively licensed tool - it is licensed CC BY-NC-SA (non-commercial)", "you need actively developed features - the project is largely in maintenance mode"], "when_to_choose": ["you are doing authorized penetration testing or red team engagements against Exchange environments", "you need to demonstrate Outlook client-side attack vectors like rules, forms, or homepage persistence", "you want a Go tool with cross-platform binaries for MAPI interaction"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/sensepost-ruler", "repo": "sensepost/ruler", "role": "main", "score": 23}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:06:36.645467+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:39:29.305951+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0dff76e777f4fa967109a86970df16392314a023299784e265f743be6712545a", "fetched_at": "2026-08-28T04:06:36.645467+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sensepost/ruler"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:06:36.645467+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:39:29.305951+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0dff76e777f4fa967109a86970df16392314a023299784e265f743be6712545a", "fetched_at": "2026-08-28T04:06:36.645467+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sensepost/ruler"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:39:29.305951+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0dff76e777f4fa967109a86970df16392314a023299784e265f743be6712545a", "fetched_at": "2026-08-28T04:06:36.645467+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sensepost/ruler"}], "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:06:36.645467+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:06:36.645467+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:06:36.645467+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:39:29.305951+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0dff76e777f4fa967109a86970df16392314a023299784e265f743be6712545a", "fetched_at": "2026-08-28T04:06:36.645467+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sensepost/ruler"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:06:36.645467+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:06:36.645467+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:39:29.305951+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0dff76e777f4fa967109a86970df16392314a023299784e265f743be6712545a", "fetched_at": "2026-08-28T04:06:36.645467+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sensepost/ruler"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:06:36.645467+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:06:36.645467+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:06:36.645467+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:39:29.305951+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0dff76e777f4fa967109a86970df16392314a023299784e265f743be6712545a", "fetched_at": "2026-08-28T04:06:36.645467+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sensepost/ruler"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:06:36.645467+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:06:36.645467+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:39:29.305951+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0dff76e777f4fa967109a86970df16392314a023299784e265f743be6712545a", "fetched_at": "2026-08-28T04:06:36.645467+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sensepost/ruler"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:39:29.305951+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0dff76e777f4fa967109a86970df16392314a023299784e265f743be6712545a", "fetched_at": "2026-08-28T04:06:36.645467+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sensepost/ruler"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:39:29.305951+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0dff76e777f4fa967109a86970df16392314a023299784e265f743be6712545a", "fetched_at": "2026-08-28T04:06:36.645467+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sensepost/ruler"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:39:29.305951+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0dff76e777f4fa967109a86970df16392314a023299784e265f743be6712545a", "fetched_at": "2026-08-28T04:06:36.645467+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sensepost/ruler"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 8}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["no_license"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 3667, "days_push": 814, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 23, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}