[6.6.0] - 2026-04-25
- Updated Starkiller to v3.5.0
Added
- Added 8 new modules (7 PowerShell, 1 Python) based on Atomic Red Team to fill partial ATT&CK coverage gaps: thread execution hijacking (T1055.003), cached domain credentials (T1003.005), Safe Mode boot defense evasion (T1562.009), default file association hijack (T1546.001), screensaver persistence (T1546.002), Office template macro injection (T1137.001), Wi-Fi credential extraction (T1555, T1016.002), and Linux proc filesystem credential dumping (T1003.007)
- Added 16 new modules (13 PowerShell, 3 Python) based on Atomic Red Team for ATT&CK gap coverage: mshta execution (T1218.005), CHM execution (T1218.001), CMSTP UAC bypass (T1218.003), InstallUtil execution (T1218.004), regasm execution (T1218.009), msiexec execution (T1218.007), indirect command execution (T1202), browser cookie theft (T1539), base64 file encoding (T1027), compile-after-delivery (T1027.004), root certificate installation (T1553.004), hidden user creation (T1564.002), Python startup hooks (T1546.018), Windows Terminal profile persistence (T1547), exfiltration over alternative protocols (T1048.003), and Linux at job scheduling (T1053.002)
- Added 25 new modules (19 PowerShell, 6 Python) based on Atomic Red Team for ATT&CK gap coverage: clear command history (T1070.003), impair history logging (T1562.003), disable firewall (T1562.004), hide artifacts (T1564.001), FSUtil indicator removal (T1070), network share removal (T1070.005), rename system utilities (T1036.003), masquerading (T1036, T1036.005), rundll32 proxy execution (T1218.011), regsvr32 proxy execution (T1218.010), signed script proxy (T1216), jsc.exe compilation (T1127), BITS jobs (T1197), logon script persistence (T1037.001), VM detection (T1497.001), system language discovery (T1614.001), web beaconing (T1071.001), and local data staging (T1074.001)
- Added
./ps-empire testcommand as a convenience wrapper for pytest with passthrough arguments - Added Alembic database migration framework for versioned schema management. Untracked databases are stamped at the baseline revision on first startup; already-tracked databases are left as-is so pending migrations can be applied. Includes
migrate_db()andbackup_db()functions for future update workflows. - Added configurable MySQL connection pool settings (
pool_size,max_overflow,pool_pre_ping,pool_recycle) via server config YAML - Added pool health monitoring that warns at 80% capacity
- Added
mysqlpytest marker for tests requiring MySQL and Docker - Added performance test suite (
empire/test/test_performance/) for pool exhaustion and event loop blocking regression testing - Added performance tests for module obfuscation (event loop blocking detection, latency measurement, pre-obfuscation latency)
- Added
POST /api/v2/obfuscation/modules/preobfuscateendpoint for targeted pre-obfuscation of specific modules by ID (runs in background, returns 202) - Added
strictandsuggested_valuesto boolean switch options in modules for better validation and UI hints - Added dynamic
depends_onoptions to stagers so dependent fields (e.g.Bypasses,Obfuscate,ObfuscateCommand) are shown/hidden based on the selected listener type - Added
nanodumpBOF module for creating minidumps of the LSASS process using various evasion techniques (handle duplication, process forking, snapshot, seclogon handle leaking) - Added 7 new BOF modules sourced from Sliver Armory for defense evasion and credential access:
unhook— refresh DLLs to remove EDR/AV API hooks (T1562.001)patchit— all-in-one AMSI + ETW patch/check/revert (T1562.001)inject_amsi_bypass— AMSI bypass in a remote process via syscalls (T1562.001)inject_etw_bypass— ETW bypass in a remote process via syscalls (T1562.001)credman— dump Windows Credential Manager via SeTrustedCredManAccess (T1555.004)handlekatz— LSASS dump via handle duplication to evade handle-based detection (T1003.001)bofroast— Kerberoasting as a BOF without .NET CLR dependency (T1558.003)
- Added multi-language stager support (powershell, csharp, ironpython, go) to UAC bypass privesc modules:
bypassuac,bypassuac_env,bypassuac_eventvwr,bypassuac_sdctlbypass,bypassuac_wscript - Added configurable
obfuscation.timeoutsetting (default: 300s, set to 0 to disable) for the PowerShell obfuscation subprocess, settable viaconfig.yamlorEMPIRE_OBFUSCATION__TIMEOUTenv var
Changed
- Agent check-in uses single INSERT with ON DUPLICATE KEY UPDATE / ON CONFLICT DO NOTHING instead of SELECT-then-INSERT (2 queries → 1)
- All FastAPI route handlers converted from
async deftodef. FastAPI now dispatches every handler to a thread pool, preventing synchronous SQLAlchemy calls from blocking the uvicorn event loop. Handlers that previously offloaded work viaasyncio.to_thread()no longer need to — the thread pool provides the same isolation automatically. - High-frequency hooks (
AFTER_AGENT_CALLBACK_HOOK,AFTER_TASKING_RESULT_HOOK,AFTER_AGENT_CHECKIN_HOOK,AFTER_TASKING_HOOK) now fire withNoneas the session argument._run_async_hookandrun_hooksprovide a fresh managed session to hook callbacks, eliminating the 2x connection amplification that occurred when hooks opened a second connection while the caller still held the first. - Cleaned up redundant "Switch." prefixes and duplicate description text from module option descriptions
- Marked
ListenerandCommandoptions as conditionally required in 7 lateral movement modules (invoke_psexec,invoke_wmi,invoke_smbexec,invoke_dcom,invoke_psremoting,inveigh_relay,invoke_executemsbuild) so they are validated when theirdepends_oncondition is met
Removed
- Removed legacy
archivefield fromempire_compilerconfig; userepoandrefinstead
Fixed
- Fixed flaky
test_pool_exhaustion_at_concurrency_levels[250]CI failures by marking the 250-concurrency case withpytest.mark.flaky(reruns=2)via the newpytest-rerunfailuresdev dependency. The assertion is preserved exactly (250 stays 250), so a real throughput regression still fails all retries while transient CI resource contention clears on rerun. - Fixed DB pool exhaustion under concurrent load causing 503/504 cascading failures. The root cause was hook connection amplification: async hooks called inside DB session blocks opened a second pool connection via
_run_async_hookwhile the caller still held the first, doubling connection usage per check-in. - Fixed event loop blocking across all API endpoints. Previously only stager, listener, and plugin endpoints were addressed; now all 216 handlers use
defto prevent any synchronous DB call from blocking the event loop. - Fixed
donut-shellcodefailing with "Cannot open file" when a root-ownedloader.binexists in the working directory, breaking all shellcode generation tests and stager paths. Donut calls now run in an isolated temp directory via a shareddonut_create()utility with a threading lock for concurrency safety. - Fixed unnecessary GitHub API call on every server startup when the compiler is already cached locally
- Fixed unhandled
TagInvalidExceptioninparse_routing_packetthat caused request crashes from stale agents or non-agent traffic - Fixed
TypeErrorin BOF module parameter packing when integer values were passed to options that require space-checking - Fixed module option descriptions for
ObfuscateandObfuscateCommandthat contained redundant text - Fixed
evaluate_dependenciescrashing whenDependsOnkey exists but isNone - Fixed strict option validation crashing when
SuggestedValuesisNone - Fixed options with unmet
depends_onconditions being excluded from params, causingKeyErrorin modulegenerate()functions — they now pass through with their default value - Fixed broken
revert_optionslogic instager_servicethat assigned entire option dicts as values, causing circular reference errors during JSON serialization - Fixed
invoke_ntsdmodule setting stager options without the["Value"]key, causingTypeErrorduring launcher generation - Fixed
invoke_executemsbuildCommandoptiondepends_onpointing toPayload=Empireinstead ofPayload=Manual, and added missingdepends_onforListener - Fixed agent staging log messages displaying wrong language (e.g. "Python PUB key" for PowerShell agents, "PS" in C# block) by replacing hardcoded language names with the actual agent language
- Fixed incorrect log levels in agent communication:
log.errorfor normal conditions (agent not active, agent exiting) downgraded tolog.debug/log.info,log.infofor invalid data (bad language spec, malformed sysinfo) upgraded tolog.warning - Fixed typo in SOCKS client error message ("failed to started" -> "failed to start")
- Fixed double-obfuscation in PowerShell module script generation — when a module source was already obfuscated (via
get_module_sourceorauto_get_source),finalize_modulewas re-obfuscating the entire combined script, spawning a redundant PowerShell subprocess per task.finalize_modulenow acceptsscript_already_obfuscatedto skip the expensive re-obfuscation while still obfuscating the invoke command (script_end). - Fixed obfuscation subprocess (
Invoke-Obfuscation) running indefinitely with no timeout. Added 300s timeout, process group isolation (start_new_session), return code checking, and empty output validation. On failure, gracefully falls back to keyword-obfuscated script with error logging. - Fixed background jobs for the python agent.