Back to Articles

Mimikittenz: Memory Scraping for Post-Exploitation Without Admin Rights

[ View on GitHub ]

Mimikittenz: Memory Scraping for Post-Exploitation Without Admin Rights

Hook

Most credential dumping tools hit a wall without admin privileges. Mimikittenz doesn't—it slurps plaintext passwords, API keys, and OAuth tokens straight from browser memory while running as a regular user.

Context

The post-exploitation landscape has long been dominated by tools like mimikatz, which require administrative privileges to dump credentials from LSASS or extract Kerberos tickets. But real-world compromises don't always grant you admin access immediately. You might land on a developer's workstation through a phishing campaign or exploit a web application running under a service account. In these scenarios, traditional credential dumping fails spectacularly.

Mimikittenz emerged to fill this gap. It recognizes a fundamental truth about modern computing: credentials flow through memory constantly, even on locked-down systems. When a developer authenticates to AWS through the console, when a user checks their Gmail, when someone pastes an API key into Postman—these secrets live in process memory as plaintext, if only briefly. The tool weaponizes the Windows ReadProcessMemory() API, which is accessible to any process that can open a handle to another process running under the same user context. No admin rights required, no driver installation needed, just PowerShell and patience.

Technical Insight

Target Process Space

enumerate processes

process list

PROCESS_VM_READ handle

memory regions

raw memory blocks

matched strings

credential patterns

user-defined regex

read from

read from

Invoke-mimikittenz

Get-Process

OpenProcess API

VirtualQueryEx

ReadProcessMemory API

Regex Pattern Engine

Results Output

Pattern Library

Custom Patterns

Browser Memory

Application Memory

System architecture — auto-generated

At its core, mimikittenz is a pattern-matching engine wrapped around Windows memory APIs. The tool iterates through running processes, reads their memory regions, and applies a battery of regex patterns designed to identify credentials for specific services. The architecture is deceptively simple, but the implementation details matter.

The entry point is the Invoke-mimikittenz function, which orchestrates the scanning process. Here's how you'd invoke it with custom patterns:

# Basic invocation - scans all accessible processes
Invoke-mimikittenz

# Target specific processes by name
Invoke-mimikittenz -ProcessName "chrome","firefox","slack"

# Add custom regex patterns for proprietary systems
$customPatterns = @(
    @{Name="Internal API"; Pattern="api_key=[a-zA-Z0-9]{32}"}
    @{Name="Database Connection"; Pattern="mongodb://[^\s]+"}
)
Invoke-mimikittenz -CustomPatterns $customPatterns

Under the hood, the tool uses Get-Process to enumerate targets, then opens each process with OpenProcess() requesting PROCESS_QUERY_INFORMATION and PROCESS_VM_READ rights. These are relatively unprivileged flags—you can obtain them for any process running under your user context. The real magic happens in the memory scanning loop, which walks the process's virtual address space using VirtualQueryEx() to identify readable, committed memory regions.

The pattern library is where mimikittenz shows its value. Instead of dumping raw memory and hoping you find something, it includes pre-built regex patterns for over 20 services: AWS credentials (AKIA[0-9A-Z]{16}), Slack tokens (xox[pboa]-[0-9]{12}-[0-9]{12}-[a-zA-Z0-9]{24}), GitHub personal access tokens, and credential pairs from webmail login forms. Each pattern is tuned to balance precision and recall—tight enough to avoid drowning in false positives, loose enough to catch variations.

The memory reading itself happens in chunks. The tool allocates a buffer, calls ReadProcessMemory() for each memory region, then applies regex patterns to the resulting byte array after converting to a string. This is where things get interesting from a performance perspective. Reading gigabytes of browser memory is slow, so mimikittenz prioritizes heap regions where credentials are most likely to appear, skipping image sections and other areas unlikely to contain user data.

One subtle but critical design decision: mimikittenz doesn't attempt to parse data structures or understand application internals. It's a pure pattern matcher, which means it's resilient to application updates. When Chrome changes its internal credential storage layout, mimikatz-style tools that rely on hardcoded offsets break. Mimikittenz keeps working because it doesn't care about structure—it just scans for strings that look like credentials. This regex-first approach is both the tool's greatest strength and its Achilles' heel.

Extensibility is baked into the architecture. Adding support for a new service means adding a regex pattern to the patterns array. Want to extract Salesforce session IDs? Add @{Name="Salesforce"; Pattern="00D[a-zA-Z0-9]{15}![\w\.]+"}. Need to catch Kubernetes service account tokens? Pattern: eyJhbGciOiJSUzI1NiIsImtpZCI[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*. The tool becomes a reflection of what you're hunting for.

Gotcha

Mimikittenz's effectiveness is entirely dependent on what's currently in memory, which makes it a roll of the dice. If a user authenticated to AWS an hour ago and the browser's garbage collector has run, those credentials are gone. Modern browsers and applications increasingly use secure string types and zero-out sensitive memory as soon as it's no longer needed. You're racing against cleanup routines that could run at any moment.

The regex-based approach produces noise. A pattern looking for email/password pairs will happily extract example credentials from documentation pages, test data from developer tools, or random strings that happen to match the pattern. You'll get results, but expect to sift through false positives. The tool also can't distinguish between current credentials and expired tokens—that AWS key might have been rotated three weeks ago. There's no built-in validation, so you're manually testing every extracted credential to see if it still works.

Performance becomes a real issue when targeting memory-hungry applications. Scanning Chrome with 50 tabs open means reading through several gigabytes of memory. On a compromised system where you're trying to stay quiet, this kind of disk and CPU activity can trigger alerts. The tool also requires that target processes remain running—kill the browser, and the memory is wiped. You're operating in a narrow window between credential use and process termination.

Verdict

Use if: You've compromised a workstation or server with user-level access but no admin privileges, and you need to escalate or pivot. This tool shines on developer machines, support staff workstations, and any environment where users interact with cloud services through web browsers. It's perfect for red team scenarios where you want to demonstrate the risks of plaintext credentials in memory without requiring privilege escalation. Also valuable when you need credentials for cloud platforms (AWS, Azure, GCP) or SaaS tools that don't store credentials locally in easily accessible formats.

Skip if: You already have admin access—just use mimikatz for more reliable LSASS dumping. Skip it on hardened environments with Credential Guard enabled, where memory protections will block ReadProcessMemory() calls. Not useful for extracting credentials from password managers (which encrypt in-memory), offline scenarios (you need processes actively running), or when you need certainty rather than opportunistic extraction. If your targets use hardware tokens, certificate-based auth, or SSO exclusively, there won't be plaintext credentials in memory to find. Also skip on modern macOS or Linux systems—this is Windows-only, and the equivalent *nix tools work differently.

// ADD TO YOUR README
[![Featured on Starlog](https://starlog.is/api/badge/cybersecurity/orlyjamie-mimikittenz.svg)](https://starlog.is/api/badge-click/cybersecurity/orlyjamie-mimikittenz)