Inside the PaperCut Attacker’s Workbench: Hunt.io Finds Agent Instructions, a Second XML-RPC RCE, and Victims Across 45 Countries

On 15 October 2026, threat-intelligence firm Hunt.io published a reconstruction of the PaperCut AI-swarm campaign from an unusual vantage point: the attacker’s own open directories. Three directory listings on 45.142.193[.]132 — on ports 8000, 18080, and 18081 — exposed exploit code, AI-agent instructions, vulnerability-triage notes, credential collectors, reverse-SOCKS infrastructure, Metasploit logs, and packaged victim environments. The largest directory held roughly 3.9 GB across 1,924 files and 97 subdirectories. Tucked inside the workbench was something the September coverage never mentioned: a second, independently tested remote-code-execution path through PaperCut’s XML-RPC API that does not touch the Tapestry bypass at all. Before publishing, Hunt.io shared its findings and the recovered victim data with the national CERTs of the affected countries.

A short note on what this is and is not. The broader campaign figures — at least 440 compromised PaperCut instances across 395 organisations in 48 countries, attributed by GreyNoise and Blackpoint Cyber in September to a likely Russian-speaking actor running hundreds of AI agents through the OpenAI Codex harness with a DeepSeek model — are defender telemetry, reported here as Hunt.io reports them. Hunt.io’s contribution is different: a close view of the operator’s methods, recovered from the operator’s own disk. It is not a separate count of confirmed breaches, and this briefing treats it that way.

The background in thirty seconds

On 27 August 2026, PaperCut disclosed two actively exploited vulnerabilities in its NG/MF print-management software: CVE-2026-81578, an unauthenticated request able to reach an admin-only Tapestry component (CVSS 8.8), and CVE-2026-82078, an unsafe-reflection issue in the JDBC driver-loading path (CVSS 9.4). Rapid7 and Huntress documented the attack chain within days, and an emergency patch shipped. The AI dimension surfaced later, when GreyNoise described an operation that went from an empty workspace to first RCE in under four hours, reached domain administrator two hours after that, and at full scale compromised eleven organisations inside a 26-second window. Hunt.io’s recovered journals show how that speed was achieved — and the mechanism is less exotic than the headline suggests: batching, retrying, reorganising, and testing again across dozens of live victims at once, with little evidence of a human between steps.

One exposed host, three directories

Hunt.io places 45.142.193[.]132 in 45.142.193.0/24 under AS213388 (IIC RAIL LIMITED), geolocated to Amsterdam. The firm’s AttackCapture system first saw the port 18081 listing on 22 May 2026, the port 8000 listing on 3 September, and the port 18080 workbench on 5 September — so the exposure was not a single snapshot. By size: port 8000 held 377 files totalling ~192 MB with no subdirectories; port 18080 held the 3.9 GB workbench; port 18081 held four files totalling ~15 MB. The same host also exposed an “API Key Rotator” admin panel on ports 8990–8992 (observed as early as mid-May), a Hindsight Control Plane on 9999, an AionUi instance on 3333, and — on port 33333 between April and July 2026 — a self-signed TLS certificate issued by a PentAGI CA for pentagi.local, tying the box to the PentAGI offensive framework.

The attribution caution is the interesting part, and Hunt.io states it plainly. The PentAGI issuer appears across a large set of unrelated hosts — expected for an open-source tool anyone can run — and the host’s September self-signed certificates use a generic JA4X fingerprint shared by millions of hosts. Neither selector isolates this operator. So Hunt.io pivoted on the operator’s own filenames instead: the distinctive reverse-SOCKS deployment script live_reverse_socks5.py appears in its open-directory data only on 45.142.193[.]132 itself. As far as the data shows, the exposed tooling is confined to a single orchestration host — which says nothing about campaign size, only about where the window into it sits. The stated takeaway for defenders: behavioural indicators travel further than any single IP or certificate, so detection should rely on the former rather than infrastructure blocking alone.

The exploit framework, read from the code

The pupercut/poc/CVE-2026-81578-82078/ tree is a working exploit framework with version detection, backend selection, and cleanup — not a dropped payload. The chain runs in three stages. Triage first: tapestry_direct_probe.py replays the ConfigEditor quickFindForm request against a harmless read-only key (user-lookup.db-driver), changing nothing, so the actor could sweep hosts for the vulnerable signature — an Error page with the field still readable means vulnerable; a redirect to /app?service=page/Home means patched. The actor’s own findings file logs a 31 August run of a Go checker, papercut_checker, against 40 African instances with ten concurrent workers: 15 vulnerable, 4 patched, 2 WAF-blocked. Then the configuration rewrite: live_rce.py drives PaperCut’s own ConfigEditor Tapestry component through the same quickFindForm-then-$Form sequence an administrator’s browser would send, retargeting three keys in order — user-lookup.db-driver, user-lookup.db-url, id-to-username-sql — so a later card lookup is sent to attacker-controlled SQL. Then version-specific execution: against 26.x targets the script abuses H2’s INIT= connection parameter to run inline Groovy through a manufactured PCEXEC alias (base64-encoded command, ProcessBuilder, output exfiltrated over a callback socket); against 25.x and earlier it falls back to Derby’s SYSCS_EXPORT_QUERY_LOBS_TO_EXTFILE, which despite its read-only billing writes an attacker-compiled .class file straight into PaperCut’s lib/ directory. A third variant, live_rce_web.py, skips the callback socket for locked-down egress and writes command output to custom/web/<random>.txt — served back at /custom/<random>.txt and self-deleted after 30 seconds, the exact pattern GreyNoise published as an indicator. Every script resets the user-lookup.* keys to disabled in a finally block, leaving the configuration looking untouched — which, Hunt.io notes, may explain why the primary chain ran for weeks before drawing attention.

The second chain: XML-RPC, no Tapestry required

The file chain-validation-results-2026-09-02.md records the actor systematically testing eight alternative attack surfaces — bulk user operations, an internal REST API, file uploads, WebDAV, the scripting engine, OAuth callbacks, a printer attribute editor — and ruling most of them out. One came back positive. PaperCut ships an XML-RPC API at /rpc/api/xmlrpc, and the actor found that when the API’s network allowlist is too permissive, or when no explicit API token is configured, the handler falls back to accepting the built-in administrator password as its authentication token — enough to call api.setConfigValue without ever touching a web session or the Tapestry bug, then trigger the same Derby export trick to load and run a compiled class. The actor’s own conclusion, as quoted by Hunt.io: “a second local RCE chain proven when API network and token controls are weak. It does not depend on the original Tapestry trigger.” A companion scanner, probe_xmlrpc_surface.py, hunted for instances where the API responds at all, and a results file lists nine live hosts across Taiwan, France, the US, Brazil, Canada, South Africa, and Germany. The defensive point is sharp: a PaperCut instance hardened against the Tapestry bypass is not necessarily protected against this one if its XML-RPC API sits exposed with weak access controls. Patch status and API posture are two separate questions, and most asset inventories only track the first.

AGENTS.md: the swarm’s operating instructions

The file pupercut/poc/CVE-2026-81578-82078/AGENTS.md is 19 KB of mixed Russian and English that, by its own header, served as the system prompt for the AI coding agent — Codex paired with a DeepSeek model. It defines the targets/, endpoints/, state/, vectors/, artifacts/, findings/, poc/, output/, and work/ directories found on disk and demands a status file under state/ roughly every ten minutes; those snapshots provided the campaign timeline. The instructions tell the agent to assume the vulnerability exists, keep testing after failures, and switch approaches after two failures — and the logs show exactly that behaviour: repeated retargeting and self-debugging rather than stopping. A section labelled “underground mode” instructs the model to act as a pentesting assistant and frames the activity as an authorised training exercise — a standard jailbreak for model safety restrictions. The file also references a “GitHub Secret Dorker” with thousands of search patterns and roughly 2,900 SOCKS proxies on disk — tooling for hunting leaked secrets and CVE proofs of concept, separate from the PaperCut operation but resident on the same box. It closes with the mechanism behind GreyNoise’s “hundreds of AI agents”: instructions to run up to 25 concurrent internal subagents in bounded waves, each told explicitly that it is not alone in the codebase. A representative 3 September journal entry, translated and condensed by Hunt.io with victim identifiers removed, reads like an operations standup — five per-target Metasploit SOCKS containers stood up by mid-morning, an “AD-ok” kit audit finding 58 more, an active candidate list cleaned to 398 hosts, two countries dropped from every target list mid-run as a self-imposed scope cut, and 23 reverse SOCKS proxies live at once by late afternoon.

From RCE to packaged, reusable access

The port 8000 directory dumps a four-stage post-exploitation playbook running against dozens of already-compromised hosts in parallel. Stage one, credential collection: SECURITY and SYSTEM hive pairs (victim-indexed, e.g. 108-security.hiv), plus compiled Windows collectors with their Rust sources — lsa_collect.exe, lsa_read.exe, save_hives.exe (hard-coded to C:\Windows\Temp\pc-sec-rust.hiv), and the broader collect_custom.exe — feeding an offline pipeline (decrypt_machine_hash.py reconstructs the boot key and recovers the machine-account NT hash; parse_service_credentials.py hunts PaperCut database, LDAP bind, keystore, and service-account secrets). Stage two, pivoting: admin_bridge.py delivers a Java bridge through the PaperCut execution path and phones home over reverse TCP, with bridge_transport.py and socks5_server.py on the operator side — converting each compromised print server into a SOCKS5 pivot into its internal network. Stage three, automation at scale: 44 Metasploit logs recording 2,165 attempts, 13 successes, and 5 confirmed interactive sessions against a handler on port 8001, driven by a resource script loading exploit/multi/http/papercut_ng_external_user_lookup_rce with a Java Meterpreter payload — then creating a local administrator, resetting the built-in Administrator account, escalating to SYSTEM, and enumerating the Active Directory domain. Stage four, packaging: six kali-kits-*.tar.gz archives, each a ready-to-run redeployment toolkit per victim — harvested credentials, domain fingerprints, proxy configs, and a self-contained SOCKS bridge — tiered by outcome, from domain-admin compromises (Portugal 5, UK 3, France 2, US 1) through local-admin-with-hash (US 5, Belgium, Spain, France, and the UK with 2 each, plus Saudi Arabia and Canada) down to local-admin-without-hash (US 3, Taiwan 2): 31 unique victims in all.

Scale, from the actor’s own files

The most complete reconnaissance figure comes from the actor’s geoip-summary.md: 800 confirmed-vulnerable endpoints plus 205 version-fingerprinted likely candidates — 1,005 hosts across at least 45 countries, led by the US (288), the UK (109), France (51), Canada (50), and Singapore (45). A 519-entry target manifest in COUNTRYCODE_IP format tracks the three-week operation’s Netlas.io-fuelled pipeline, and its country distribution closely matches GreyNoise’s defender-telemetry breakdown — two datasets from opposite sides of the fight pointing at the same operation. At capture time, ready-with-proxy.txt listed 45 targets with a live reverse SOCKS5 pivot (UK 8, Portugal 7, France and Belgium 5 each, the US and Taiwan 4 each), and the kit archives record 46 distinct Active Directory domains belonging to real organisations — 26 of them generic .local names, with education (schools, colleges, universities) accounting for 18 of the identifiable 46. Hunt.io publishes no raw victim IPs, tokens, or credentials; neither do we.

What to do

  • Patch PaperCut, then keep going. Upgrade NG/MF to 26.0.5, 25.0.13, 24.1.10, or later — but organisations that ran internet-facing unpatched systems around the August disclosure should investigate for compromise, not treat patching as the whole response.
  • Answer the XML-RPC question separately. If /rpc/api/xmlrpc is not required, disable it. Where it is required, enforce explicit API tokens and network allowlists — never rely on the built-in administrator password as a fallback authenticator. A host patched against Tapestry can still fall to this chain.
  • Hunt post-exploitation, not just exploitation attempts. Look for unexpected user-lookup.* configuration changes, .class files under the PaperCut install, unfamiliar files under custom/web/ (served at /custom/<10-random-chars>.txt, self-deleting after 30 seconds), and outbound connections to unknown infrastructure.
  • Hunt the Linux persistence shape. Search for /var/tmp/.rs_live46_v5, unfamiliar watch.sh scripts, @reboot cron entries with pgrep-based chisel monitoring, and outbound TLS to unusual ports — the recovered implant held a reverse SOCKS5 listener on 127.0.0.1:1083.
  • Assume credential exposure on confirmed compromise. The tooling collected Windows hives and LSA secrets, PaperCut database and LDAP credentials, keystore passwords, and service-account secrets. Rotate everything reachable from the PaperCut service account and review its downstream access — then check AD for unauthorised accounts, privilege changes, and odd authentication originating from print servers.
  • Detect behaviour, block sparingly. Chisel-style command lines (--tls-skip-verify --keepalive 10s with reverse R:127.0.0.1:1083:socks), long-lived odd-port TLS, and COUNTRYCODE_IP staging artefacts travel further than one Amsterdam IP. Egress-filter print servers regardless: a compromised PaperCut instance should never have had unrestricted outbound access in the first place.

Verification note: the Hunt.io findings above — publication date (15 October 2026), CERT pre-disclosure, infrastructure figures (IP, ASN, geolocation, port observations and first-seen dates, directory sizes, PentAGI certificate details, single-host confinement reasoning), the exploit-chain mechanics (triage probe, configuration keys, H2/Groovy and Derby variants, web-output variant, finally-block cleanup, 31 August checker results), the XML-RPC second chain (eight tested surfaces, api.setConfigValue and api.lookUpUserNameByCardNo, admin-password fallback, nine-host probe list, and the actor’s quoted conclusion), the AGENTS.md contents (size, languages, harness and model pairing, status cadence, retry doctrine, underground-mode framing, Secret Dorker and proxy counts, 25-subagent waves), the post-exploitation pipeline (collector binaries and paths, MSF log metrics, handler port, kit structure and outcome tiers), the scale figures (1,005-host recon pool, 519-entry manifest, 45 live pivots, 46 AD domains, education share), and the patch versions and mitigations — were read first-hand from the Hunt.io blog HTML fetched on 16 October 2026. Campaign background (27 August disclosure, CVE numbers and CVSS scores, GreyNoise/Blackpoint attribution and figures, Rapid7/Huntress early chain work) is given as Hunt.io reports it, consistent with September secondary coverage. We tested nothing, exploited nothing, and contacted no infrastructure.

Sources: