<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Puma</title>
    <description>The latest articles on DEV Community by Puma (@pumadracon).</description>
    <link>https://dev.to/pumadracon</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4053548%2Fdb3880df-9c89-4aa2-a9ae-183426684a04.png</url>
      <title>DEV Community: Puma</title>
      <link>https://dev.to/pumadracon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pumadracon"/>
    <language>en</language>
    <item>
      <title>Building adhammer — a from-scratch AD security toolkit in Rust</title>
      <dc:creator>Puma</dc:creator>
      <pubDate>Sat, 22 Aug 2026 19:09:56 +0000</pubDate>
      <link>https://dev.to/pumadracon/building-adhammer-a-from-scratch-ad-security-toolkit-in-rust-2fi5</link>
      <guid>https://dev.to/pumadracon/building-adhammer-a-from-scratch-ad-security-toolkit-in-rust-2fi5</guid>
      <description>&lt;p&gt;&lt;a href="https://icedracon.github.io/adhammer/" rel="noopener noreferrer"&gt;&lt;/a&gt;adhammer is a Rust Active Directory security toolkit — one binary that scans a domain for misconfigurations, exercises the real exploitation primitives against them, and prints receipts you can hand to a customer.&lt;/p&gt;

&lt;p&gt;The whole thing sits on a from-scratch protocol stack: DCE/RPC, NTLM, SMB2, Kerberos, DRSUAPI, MS-CRTD, MS-ICPR, and 40+ MS-* sibling crates. No wrappers around other languages' libraries, no shelling out. Ripgrep-scale dependency tree — most crates ship with five to eight direct deps.&lt;/p&gt;

&lt;p&gt;What you can actually do with it&lt;br&gt;
Five top-level verbs. Each does one thing.&lt;/p&gt;

&lt;p&gt;scan — collects the domain over LDAP, feeds it to a rule engine with 41 checks, spits out an HTML or JSON report. Findings score by real blast radius (DcsyncPath, UnconstrainedDelegation, KerberoastableAdmin, PasswordNotRequired, PreWindows2000Compat, RbcdConfigured, ADCS ESC1/6/7/8/10/11/15/16 template rules, and more).&lt;/p&gt;

&lt;p&gt;adhammer scan --url ldaps://dc.corp.local:636 \&lt;br&gt;
              --user auditor \&lt;br&gt;
              --password '&lt;a class="mentioned-user" href="https://dev.to/file"&gt;@file&lt;/a&gt;:/tmp/pw' \&lt;br&gt;
              --out audit.html&lt;br&gt;
attack — the active side. Every one is a real primitive, not a detector:&lt;/p&gt;

&lt;p&gt;coerce — PetitPotam / PrinterBug / DFSCoerce / ShadowyCoerce (typed enum picks the pipe)&lt;br&gt;
relay — SMB → LDAP (RBCD, Shadow Cred) or AD CS HTTP (ESC8) or ICPR (ESC11)&lt;br&gt;
dcsync — GetNCChanges over a sealed DRSUAPI session, single target or --all&lt;br&gt;
roast — Kerberoasting + AS-REP roasting, AES etype accepted&lt;br&gt;
golden / silver — forge TGT/service tickets from a krbtgt/service key&lt;br&gt;
ptt — pass-the-ticket via S4U2Self / S4U2Proxy → AP-REQ over SMB → exec&lt;br&gt;
shadowcred — add msDS-KeyCredentialLink → PKINIT for the target account&lt;br&gt;
pkinit — take a Shadow Cred key .pem, get a TGT&lt;br&gt;
esc1 / esc4 / icpr-esc1 — AD CS abuse (enrol as another principal)&lt;br&gt;
dcshadow --prep / --cleanup — rogue nTDSDSA registration (LDAP path, Server 2016)&lt;br&gt;
abuse — LDAP writes: add-spn, add-member, set-password, write-rbcd, add-keycred&lt;br&gt;
zerologon — CVE-2020-1472 (detect-only by default, --exploit is opt-in)&lt;br&gt;
badsuccessor — CVE-2024-15671 dMSA takeover (Server 2025)&lt;br&gt;
exec / wmiexec / atexec / winrm — post-auth command execution&lt;br&gt;
poison — LLMNR / NBT-NS / mDNS name poisoning&lt;br&gt;
enum — recon that doesn't require replication rights:&lt;/p&gt;

&lt;p&gt;sessions — MS-SRVS NetrSessionEnum&lt;br&gt;
wkssvc — MS-WKST NetrWkstaUserEnum&lt;br&gt;
hku — remote registry HKU walk → logged-on SIDs (often works without local admin)&lt;br&gt;
samr — user / group enum + local group membership on any DC or member&lt;br&gt;
posture — relay-enabler surface (SMB signing, LDAP channel binding, EPA)&lt;br&gt;
esc — AD CS ESC6/7/10/11/16 registry probes over MS-RRP&lt;br&gt;
dns — AD-integrated DNS zone dump&lt;br&gt;
net — network sweep across a /24&lt;br&gt;
check — targeted rule packs (adcs, posture) that don't need a full collection pass.&lt;/p&gt;

&lt;p&gt;dump — offline artifact extraction: laps, gmsa, secretsdump (SAM / SECURITY / SYSTEM hives).&lt;/p&gt;

&lt;p&gt;Design principles worth stating&lt;br&gt;
Nothing sensitive goes on argv. Every --password resolves through a four-tier cascade:&lt;/p&gt;

&lt;p&gt;fn resolve_secret(argv_value: &amp;amp;str, env_key: &amp;amp;str) -&amp;gt; Result {&lt;br&gt;
    // 1. --password &lt;a class="mentioned-user" href="https://dev.to/file"&gt;@file&lt;/a&gt;:/path/to/pw&lt;br&gt;
    if let Some(path) = argv_value.strip_prefix("&lt;a class="mentioned-user" href="https://dev.to/file"&gt;@file&lt;/a&gt;:") {&lt;br&gt;
        let raw = std::fs::read_to_string(path)&lt;br&gt;
            .with_context(|| format!("read password file {path}"))?;&lt;br&gt;
        return Ok(raw.trim_end_matches(['\n', '\r']).to_string());&lt;br&gt;
    }&lt;br&gt;
    // 2. literal (backward compat, still leaky)&lt;br&gt;
    if !argv_value.is_empty() { return Ok(argv_value.to_string()); }&lt;br&gt;
    // 3. $ADHAMMER_PASSWORD env var&lt;br&gt;
    if let Ok(v) = std::env::var(env_key) {&lt;br&gt;
        if !v.is_empty() { return Ok(v); }&lt;br&gt;
    }&lt;br&gt;
    // 4. interactive echo-off prompt (when stdin is a TTY)&lt;br&gt;
    use std::io::IsTerminal;&lt;br&gt;
    if std::io::stdin().is_terminal() {&lt;br&gt;
        let pw = dialoguer::Password::new()&lt;br&gt;
            .with_prompt(format!("password (or set {env_key})"))&lt;br&gt;
            .interact()?;&lt;br&gt;
        return Ok(pw);&lt;br&gt;
    }&lt;br&gt;
    Ok(String::new())&lt;br&gt;
}&lt;br&gt;
Applies to every attack handler and every session-hunt enum. Uses dialoguer::Password — no new dep, no rpassword, no re-implementing termios.&lt;/p&gt;

&lt;p&gt;Bulk destructive actions gate on --yes. attack dcsync --all and attack samr --dump-secrets refuse to run on a TTY without --yes, and both accept --limit N to bound blast radius during a run. Non-TTY (CI) proceeds without the gate.&lt;/p&gt;

&lt;p&gt;Every wire decoder preflights its allocations. Any Vec::with_capacity(n) where n comes off the wire goes through:&lt;/p&gt;

&lt;p&gt;let count = read_u32(d)? as usize;&lt;br&gt;
if count.checked_mul(ENTRY_SIZE).map_or(true, |need| need &amp;gt; d.remaining()) {&lt;br&gt;
    return Err(RpcError::Protocol("count exceeds remaining buffer"));&lt;br&gt;
}&lt;br&gt;
let mut items = Vec::with_capacity(count);&lt;br&gt;
checked_mul catches u32::MAX * 12 overflow; .map_or(true, …) treats overflow as an over-allocation and rejects. Hostile inputs never reach the allocator.&lt;/p&gt;

&lt;p&gt;Clap rejects nonsense at parse time. Subcommands like attack coerce, attack abuse, attack relay take typed enums for their action selector, not free-form strings:&lt;/p&gt;

&lt;p&gt;$ adhammer attack coerce --pipe totallybogus …&lt;br&gt;
error: invalid value 'totallybogus' for '--pipe '&lt;br&gt;
  [possible values: spoolss, lsarpc, efsrpc, netdfs, fssagentrpc]&lt;br&gt;
Old free-form-string versions would open an SMB connection, negotiate DCERPC, then bail on the pipe name. Wasted round trips + a confusing error you had to read past three layers of RPC noise to find.&lt;/p&gt;

&lt;p&gt;Session file is DPAPI-encrypted on Windows. On Unix it's O_CREAT|O_EXCL + mode 0o600 in one syscall — no umask window. Where DPAPI is unavailable the tool refuses to write in cleartext unless you opt in with ADHAMMER_ALLOW_PLAIN_SESSION=1.&lt;/p&gt;

&lt;p&gt;Global --json envelope on every attack / enum / dump subcommand. Output pipes cleanly into jq and CI. scan emits JSON by default with --out report.json, or --out report.html for human review.&lt;/p&gt;

&lt;p&gt;MIT. No telemetry. Never phones home.&lt;/p&gt;

&lt;p&gt;Architecture&lt;br&gt;
12-crate workspace + 43 sibling protocol crates published under icedracon on crates.io.&lt;/p&gt;

&lt;p&gt;adhammer/&lt;br&gt;
├── cli/                — clap CLI, subcommands&lt;br&gt;
├── crates/&lt;br&gt;
│   ├── core/           — Finding, Severity, shared types&lt;br&gt;
│   ├── collector/      — LDAP collection (ldap3)&lt;br&gt;
│   ├── checks/         — 41 security-check rules&lt;br&gt;
│   ├── graph/          — petgraph control-path chains&lt;br&gt;
│   ├── kerberos/       — roasting, ticket forging&lt;br&gt;
│   ├── report/         — HTML + JSON report generation&lt;br&gt;
│   ├── sysvol/         — GPO / GPP / registry-pol parsing&lt;br&gt;
│   ├── ldap/           — LDAP helper extensions&lt;br&gt;
│   ├── bloodhound/     — BloodHound-CE JSON export&lt;br&gt;
│   ├── secrets/        — SAM / SECURITY / LSA / LAPS / gMSA&lt;br&gt;
│   └── sdk/            — one-import facade over all sub-crates&lt;br&gt;
The 43 published sibling crates group into:&lt;/p&gt;

&lt;p&gt;Wire foundation (5) — dcerpc, ntlmssp, smb2-client, windows-sddl, ms-ndr&lt;br&gt;
MS- protocol clients (18)* — ms-drsr, ms-icpr, ms-crtd, ms-csra, ms-gkdi, ms-pkca, ms-pac-forge, ms-dnsp, ms-tsch, ms-lsat, ms-coerce, samr, ms-nrpc, ms-tds, ms-kile-fast, ms-even6, ms-fve, ms-rodc&lt;br&gt;
Auth / crypto / ACL (5) — credssp, dpapi-ng, dpapi-offline, ad-acl, msldap-ext&lt;br&gt;
Offensive extras (5) — gpo-forge, preg, llmnr-poison, ntlm-relay, winrm-pentest&lt;br&gt;
Offline / DFIR (3) — ese-parser, ntds-parse, lsass-parse&lt;br&gt;
Windows platform wrappers (6) — windows-token, windows-scm, windows-lsa, windows-wmi-com, windows-sspi-shim, windows-eventlog-native&lt;br&gt;
BloodHound-CE export (1) — bloodhound-export&lt;br&gt;
Every crate is cargo install-able standalone. Reuse dcerpc in your own DFIR tool without pulling in the attack primitives. Use ese-parser for offline NTDS.dit forensics without any wire code. Consume ms-icpr to build your own CSR helper.&lt;/p&gt;

&lt;p&gt;That "dual-use" rule is enforced: a primitive gets extracted into a sibling crate only when it has genuine defensive / admin / DFIR appeal, not just offensive. Attacker-only compositions stay in the CLI.&lt;/p&gt;

&lt;p&gt;From-scratch, meaning&lt;br&gt;
DCE/RPC — bind (unauth / NTLM / Kerberos / sealed), NDR encoder + decoder, endpoint mapper client, fault-code decoder, association-group support&lt;br&gt;
SMB2 client — NTLM + Kerberos auth, signing, session setup, tree connect, IOCTL, pipe transport, egress via SOCKS5&lt;br&gt;
Kerberos — AS-REQ / AS-REP, TGS-REQ, S4U2Self, S4U2Proxy, PKINIT (DH exchange + AS-REP decrypt), PA-PAC-OPTIONS, ccache reader/writer, AES128 / AES256 / RC4 / DES key derivation&lt;br&gt;
MS-DRSR — GetNCChanges, DsCrackNames, DsGetNCChangesW / X, bounded-alloc reply parser&lt;br&gt;
MS-EFSR / MS-DFSNM / MS-RPRN / MS-FSRVP — all four coerce vectors on the same SMB session interface&lt;br&gt;
MS-ICPR — ADCS certreq over HTTPS and over ncacn_ip_tcp (\PIPE\cert alternative endpoint)&lt;br&gt;
MS-CRTD — certificate template parser + ESC rule pack (ESC1/4/6/7/8/10/11/15/16)&lt;br&gt;
MS-RRP — remote registry, MS-EVEN6 remote event log, MS-TSCH scheduled tasks, MS-NRPC Zerologon&lt;br&gt;
ADCS Web Enrollment — HTTP relay with NTLM handshake and CSR forwarding on the same TCP connection&lt;br&gt;
Install&lt;br&gt;
cargo install --locked adhammer&lt;br&gt;
Rust 1.80+. Windows / macOS / Linux (tested on all three in CI).&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;h1&gt;
  
  
  audit-only scan → HTML report
&lt;/h1&gt;

&lt;p&gt;adhammer scan --url ldaps://dc.corp.local:636 \&lt;br&gt;
              --user auditor \&lt;br&gt;
              --password '&lt;a class="mentioned-user" href="https://dev.to/file"&gt;@file&lt;/a&gt;:/tmp/pw' \&lt;br&gt;
              --out audit.html&lt;/p&gt;

&lt;h1&gt;
  
  
  guided attack menu (interactive TTY prompts everything)
&lt;/h1&gt;

&lt;p&gt;adhammer&lt;/p&gt;

&lt;h1&gt;
  
  
  CI-friendly JSON envelope on a single primitive
&lt;/h1&gt;

&lt;p&gt;ADHAMMER_PASSWORD='…' \&lt;br&gt;
  adhammer --json attack dcsync \&lt;br&gt;
           --host dc.corp.local --domain CORP \&lt;br&gt;
           --user Administrator --target krbtgt&lt;br&gt;
Development discipline&lt;br&gt;
Every release runs the same gate:&lt;/p&gt;

&lt;p&gt;cargo fmt --all&lt;br&gt;
cargo clippy --workspace --all-targets -- -D warnings&lt;br&gt;
cargo test --workspace&lt;br&gt;
CI matrix: ubuntu + windows + macos&lt;br&gt;
MSRV verify job pins the toolchain to whatever rust-version in Cargo.toml says&lt;br&gt;
Wire code validated against at least one live DC before shipping&lt;br&gt;
Every hostile-length wire input has a regression test that feeds 0xFFFF_FFFF and asserts RpcError::Protocol without panic or OOM. Every principal-string function has a test that feeds Cyrillic and rejects it (RFC 4120 IA5String rule).&lt;/p&gt;

&lt;p&gt;Recent releases have been driven by outside code review — an external multi-agent reviewer runs against the diff before ship, and the findings that survive verification become the next milestone. The current release closed 33 of 37 findings from one such pass.&lt;/p&gt;

&lt;p&gt;Roadmap&lt;br&gt;
1.4.x — bulk MSSQL enumeration (via ms-tds), Exchange abuse primitives, SCCM NAA extraction, DCShadow phase-2 push (RPC path, works past the 2019+ LDAP hardening), cross-forest Kerberos (S4U2Proxy across trusts), sealed LDAP bind (Windows Server 2025 channel-binding requirement), bulk DRSUAPI (parallel GetNCChanges across DCs).&lt;/p&gt;

&lt;p&gt;1.5.x — semi-interactive shell (post-auth REPL), cross-forest attack graph, automated coerce → relay → exploit chains.&lt;/p&gt;

&lt;p&gt;Contribute&lt;br&gt;
Issues, PRs, or a hard-critic review of your own — all welcome.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/icedracon/adhammer" rel="noopener noreferrer"&gt;https://github.com/icedracon/adhammer&lt;/a&gt;&lt;br&gt;
Crate: &lt;a href="https://crates.io/crates/adhammer" rel="noopener noreferrer"&gt;https://crates.io/crates/adhammer&lt;/a&gt;&lt;br&gt;
Changelog: &lt;a href="https://github.com/icedracon/adhammer/blob/main/CHANGELOG.md" rel="noopener noreferrer"&gt;https://github.com/icedracon/adhammer/blob/main/CHANGELOG.md&lt;/a&gt;&lt;br&gt;
MIT. Written by zevs.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>rust</category>
      <category>tooling</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Cracking WMI-exec in Rust by turning impacket into a byte-level oracle</title>
      <dc:creator>Puma</dc:creator>
      <pubDate>Mon, 03 Aug 2026 06:36:58 +0000</pubDate>
      <link>https://dev.to/pumadracon/cracking-wmi-exec-in-rust-by-turning-impacket-into-a-byte-level-oracle-54ib</link>
      <guid>https://dev.to/pumadracon/cracking-wmi-exec-in-rust-by-turning-impacket-into-a-byte-level-oracle-54ib</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd4lajsjzsvobz7sfpywd.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd4lajsjzsvobz7sfpywd.gif" alt=" " width="800" height="876"&gt;&lt;/a&gt;How I implemented wmiexec from scratch in Rust — DCOM activation, OXID resolution, and MS-WMIO object marshaling — by using impacket not as a library but as a debugging oracle, and diffing my wire bytes against it until a Windows DC accepted them byte-for-byte.&lt;/p&gt;

&lt;p&gt;This is a build log from ADhammer, an Active Directory audit + validation toolkit I'm writing in Rust on a from-scratch DCE/RPC · NTLM · SMB2 · Kerberos stack (think "impacket for Rust"). The whole project is built with Claude Code, and this post is the single best example of what that actually looks like — not autocomplete, but a tight loop of hypothesis → capture live traffic → diff → fix against a real domain controller.&lt;/p&gt;

&lt;p&gt;The goal: wmiexec, from scratch&lt;br&gt;
wmiexec is the classic "quiet" remote-code-execution technique: instead of creating a service (psexec/SVCCTL) or a scheduled task (atexec), you talk to WMI over DCOM and call Win32_Process.Create. No service-install event, different host telemetry.&lt;/p&gt;

&lt;p&gt;Under the hood it's three stages, each a different flavour of pain:&lt;/p&gt;

</description>
      <category>rust</category>
      <category>security</category>
      <category>microsoft</category>
      <category>showdev</category>
    </item>
    <item>
      <title>ADhammer: a full Active Directory pentest tool in Rust</title>
      <dc:creator>Puma</dc:creator>
      <pubDate>Fri, 31 Jul 2026 08:19:37 +0000</pubDate>
      <link>https://dev.to/pumadracon/adhammer-a-full-active-directory-pentest-tool-in-rust-413a</link>
      <guid>https://dev.to/pumadracon/adhammer-a-full-active-directory-pentest-tool-in-rust-413a</guid>
      <description>&lt;p&gt;Full AD pentest + audit tool in Rust, single static binary. Whole DCE/RPC · NTLM · SMB2 · Kerberos stack written from scratch (no impacket) — split into 4 reusable MIT crates on crates.io. Audits a domain (control-path graph, 10/16 AD CS ESC classes, MITRE-tagged) and validates findings end-to-end: DCSync, golden/silver tickets, pass-the-ticket to SYSTEM, LAPS, WinRM, ADCS. Live-validated against a fully-patched Windows Server 2025 DC. MIT, v1.1.0.&lt;/p&gt;

&lt;p&gt;github.com/icedracon/adhammer&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb0qwl013nbbtc8kvh6tn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb0qwl013nbbtc8kvh6tn.gif" alt=" " width="757" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>security</category>
      <category>cybersecurity</category>
      <category>tools</category>
    </item>
    <item>
      <title>ECHO — a living pixel companion on your taskbar: he fights demons from your screen edge, plays guitar at midnight, and learns your rhythm</title>
      <dc:creator>Puma</dc:creator>
      <pubDate>Fri, 31 Jul 2026 08:17:37 +0000</pubDate>
      <link>https://dev.to/pumadracon/echo-a-living-pixel-companion-on-your-taskbar-he-fights-demons-from-your-screen-edge-plays-4nhp</link>
      <guid>https://dev.to/pumadracon/echo-a-living-pixel-companion-on-your-taskbar-he-fights-demons-from-your-screen-edge-plays-4nhp</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft10ip1e61rhjet5khqkj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft10ip1e61rhjet5khqkj.gif" alt=" " width="256" height="256"&gt;&lt;/a&gt;A pixel-art companion who lives on your Windows taskbar. Two heroes: Corvin the silent Warden (voiced 100-chapter story, midnight guitar, and a daily boss fight where a demon literally walks out of your screen edge) and Dante the demon hunter (Devil Trigger, flaming sword, espresso and doomscrolling). He reacts to your games, music and typing, plays big scenes on a living schedule, and a local learning "director" adapts him to you. Zero network calls, zero telemetry, one exe.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/icedracon" rel="noopener noreferrer"&gt;
        icedracon
      &lt;/a&gt; / &lt;a href="https://github.com/icedracon/ECHO" rel="noopener noreferrer"&gt;
        ECHO
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ECHO — живой пиксельный компаньон для твоего рабочего стола&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Он живёт на панели задач Windows и &lt;strong&gt;сам&lt;/strong&gt; реагирует на твою жизнь за
компьютером: работаешь — он рядом, запустил игру — он дерётся, включил музыку —
он играет с тобой, ушёл ночью — он засыпает. Лёгкий (~45 МБ памяти), ничего не
отправляет в интернет, работает полностью локально.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/icedracon/ECHO/docs/media/corvin-execution.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ficedracon%2FECHO%2FHEAD%2Fdocs%2Fmedia%2Fcorvin-execution.gif" alt="Корвин" width="210"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/icedracon/ECHO/docs/media/taskbar-sword.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ficedracon%2FECHO%2FHEAD%2Fdocs%2Fmedia%2Ftaskbar-sword.gif" alt="Данте" width="240"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Установка — один клик&lt;/h2&gt;
&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Скачай своего героя со &lt;a href="https://github.com/icedracon/ECHO/../../releases" rel="noopener noreferrer"&gt;страницы загрузок&lt;/a&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;Файл&lt;/th&gt;

&lt;th&gt;Кто это&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;🦅 &lt;strong&gt;Echo-Corvin.exe&lt;/strong&gt;&lt;br&gt;
&lt;/td&gt;

&lt;td&gt;
&lt;br&gt;
&lt;strong&gt;Корвин&lt;/strong&gt; — молчаливый Страж с белым орлом. Рассказывает истории своим голосом, играет на гитаре в полночь, дерётся с тем, что лезет из-за Двери&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;🔴 &lt;strong&gt;Echo-Dante.exe&lt;/strong&gt;&lt;br&gt;
&lt;/td&gt;

&lt;td&gt;
&lt;br&gt;
&lt;strong&gt;Данте&lt;/strong&gt; — охотник на демонов: Devil Trigger, огненный меч, пицца и танцы&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;⚪ &lt;strong&gt;ECHO.exe&lt;/strong&gt;&lt;br&gt;
&lt;/td&gt;

&lt;td&gt;Оба в одном — переключайся когда хочешь&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;ol start="2"&gt;
&lt;li&gt;Запусти. Всё. Он выйдет на панель и начнёт жить.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Windows может спросить «запустить неизвестное приложение?» — жми
«Подробнее → Выполнить в любом случае». Код открыт, проверить можно прямо здесь.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Управление — мышкой&lt;/h2&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/icedracon/ECHO" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



</description>
      <category>programming</category>
      <category>security</category>
      <category>architecture</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>I built a full Active Directory pentest + audit tool in Rust — on a protocol stack I wrote from scratch (no impacket)</title>
      <dc:creator>Puma</dc:creator>
      <pubDate>Wed, 29 Jul 2026 15:52:49 +0000</pubDate>
      <link>https://dev.to/pumadracon/i-built-a-full-active-directory-pentest-audit-tool-in-rust-on-a-protocol-stack-i-wrote-from-fl5</link>
      <guid>https://dev.to/pumadracon/i-built-a-full-active-directory-pentest-audit-tool-in-rust-on-a-protocol-stack-i-wrote-from-fl5</guid>
      <description>&lt;p&gt;A single Rust binary that audits an Active Directory domain like PingCastle — and, for authorized red teams, proves each finding by actually running the attack. On a DCE/RPC · NTLM · SMB2 · Kerberos stack I wrote from scratch, because there's no impacket for Rust.&lt;/p&gt;

&lt;p&gt;The itch&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuqtdt20oo17trnsaxds1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuqtdt20oo17trnsaxds1.gif" alt=" " width="757" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two tools own Active Directory security work, and neither is Rust. PingCastle audits beautifully but is Windows/.NET and read-only. impacket has the offensive protocol stack but is Python and offense-only. I wanted one Linux-native binary that does both — and I wanted to actually understand Kerberos/DCE-RPC/NTLM instead of importing someone else's library. So I wrote the stack from the wire up.&lt;/p&gt;

&lt;p&gt;The result is ADhammer.&lt;/p&gt;

&lt;p&gt;Show Image&lt;/p&gt;

&lt;p&gt;What it does — audit, then prove it&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Audit. Collect the domain over LDAP as a low-privileged user (via the SD_FLAGS control), build a BloodHound-style control-path graph in-process, and run 33 checks across the four PingCastle categories — including 10 of the 16 AD CS ESC classes, ADIDNS exposure, and SYSVOL/GPP. Every finding is scored, MITRE ATT&amp;amp;CK-tagged, and exportable to BloodHound.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Validate. A report shouldn't say a path might be exploitable. ADhammer implements the matching tradecraft — Kerberos roasting, DCSync, golden/silver tickets, pass-the-ticket, LAPS/gMSA read, WinRM &amp;amp; SVCCTL exec, ADCS enrollment — each live-validated against a fully-patched Windows Server 2025 DC.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The part I'm proud of: the protocol stack is from scratch&lt;br&gt;
No impacket. No .NET. The whole DCE/RPC · NTLM · SMB2 · Kerberos layer is hand-rolled from the Microsoft open specs — NDR marshaling, NTLMv2 sign+seal, the MS-PAC PAC marshaler, PKINIT — each primitive unit-tested against spec vectors. It's published as four reusable MIT crates that didn't exist in Rust before:&lt;/p&gt;

&lt;p&gt;windows-sddl — no-FFI SECURITY_DESCRIPTOR/DACL/ACE parser + Sid/Guid&lt;br&gt;
ntlmssp — NTLMv2 + RC4 sign+seal (RPC packet privacy)&lt;br&gt;
smb2-client — async SMB2 (negotiate → SPNEGO → pipes, signing)&lt;br&gt;
dcerpc — NDR · PDUs · EPM · SAMR · LSAT · DRSUAPI · SVCCTL · ICPR · …&lt;br&gt;
Interactive, so you don't juggle 20 flags&lt;br&gt;
Run adhammer with no arguments: a wizard asks user → password (or NT hash) → domain → DC, then walks every action with prompts. For golden/silver/pass-the-ticket it auto-fetches the krbtgt/service AES256 key (via DCSync) and the domain SID (via LSAT) from your session — no pasting keys or SIDs.&lt;/p&gt;

&lt;p&gt;Show Image&lt;/p&gt;

&lt;p&gt;The money demo: a golden ticket a patched Server 2025 accepts&lt;br&gt;
"Golden tickets are dead on patched DCs." Not quite — a correctly forged one is still accepted. What changed is the PAC bar: KB5020805 makes PAC_REQUESTOR / PAC_ATTRIBUTES mandatory, and most from-scratch forgers omit them. ADhammer builds the PAC from scratch with them, signs it with the AES256 checksum, and a fully-patched 2025 KDC accepts the forged Domain-Admin TGT → pass-the-ticket over SMB → NT AUTHORITY\SYSTEM, run from Kali.&lt;/p&gt;

&lt;p&gt;I wrote up exactly how the 2025 PAC enforcement works (and the RC4-golden-accepted-but-service-ticket-refused asymmetry) here → Forging a golden ticket for a patched Server 2025 KDC.&lt;/p&gt;

&lt;p&gt;Try it&lt;br&gt;
cargo install adhammer&lt;/p&gt;

&lt;h1&gt;
  
  
  audit a domain (low-priv creds are enough) + export a BloodHound graph
&lt;/h1&gt;

&lt;p&gt;adhammer scan --url ldaps://dc:636 --user 'CORP\svc' --password … --insecure --bloodhound out.zip&lt;br&gt;
Or grab the prebuilt binary from the v1.1.0 release. Rust 1.80+, runs from Kali/Linux or Windows.&lt;/p&gt;

&lt;p&gt;Authorized use only&lt;br&gt;
The validation modules are real offensive techniques (DCSync, ticket forging, relay, RCE). ADhammer is for systems you own or are explicitly authorized to test — authorized engagements, red-team validation, and education. MIT-licensed; built as security research at ITMO, sibling to a Windows kernel 0-day I disclosed to Microsoft MSRC.&lt;/p&gt;

&lt;p&gt;⭐ Repo: &lt;a href="https://github.com/icedracon/adhammer" rel="noopener noreferrer"&gt;https://github.com/icedracon/adhammer&lt;/a&gt; — feedback and issues welcome.&lt;/p&gt;

</description>
      <category>security</category>
      <category>career</category>
      <category>news</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
