All notable changes to the VisionC2 project are documented in this file.
- Web shell — streaming output (
!stream) —!stream <cmd>now renders in real-time; CNC detectsSTDOUT:/STDERR:/EXIT:/EXIT ERROR:/Streaming startedprotocol lines frommachete()and forwards them as typed WebSocket frames (stream_stdout,stream_stderr,stream_start,stream_done) instead of buffering until exit; stderr displayed in red - Web shell — file download (
!download <path>) — new bot command reads the file (≤10MB limit), base64-encodes it, and sends__FILE_START__<name>\n<b64>\n__FILE_END__directly on the C2 connection; CNC assembles the framed payload and delivers{"type":"file"}to the browser which triggers a native download; relative paths resolved against tracked cwd server-side - Web shell — file upload — "Upload" button in the shell toolbar opens a file picker; selected file (≤10MB) is read as base64 in the browser and sent as
{"type":"upload","fileName":"...","data":"..."}over WebSocket; CNC relays as!upload <path> <b64>to the bot which decodes and writes to disk; destination path defaults to current shell cwd - Bot
!rm <path>— directos.Remove()with success/error response; no shell spawn - Bot
!mv <src> <dst>— directos.Rename()with success/error response; no shell spawn - Bot
!chmod <octalmode> <path>— directos.Chmod()with success/error response; no shell spawn - Web shell — background sessions — closing the shell modal parks the WebSocket in a background map (
shellBgSessions) instead of closing it; output received while the modal is closed is buffered; reopening the shell for the same bot reuses the live connection and flushes the buffer; bot table rows with active bg sessions gain a blue dot indicator (.shell-bg-active) - Web shell — context menu download — "↓ Download" entry added to the right-click file context menu; disabled for directories
- Web shell — terminal toolkit — 100+ categorised red-team helpers in a searchable 3-column dropdown (Persistence, Recon, Credentials, Lateral Movement, Evasion, etc.)
- Web shell — terminal themes — 7 themes: Default, Monokai, Dracula, Solarized, Nord, Matrix, Light; persisted to
localStorage; ANSI colour classes rewritten as CSS custom properties so all 16 colours remap per theme - Web shell — font zoom —
A+/A-toolbar buttons andCtrl+=/Ctrl+-shortcuts; zoom level (9–22px) persisted tolocalStorage - Web shell — clickable IPs and paths — IPv4 addresses and absolute paths in terminal output rendered as clickable spans; clicking an IP copies it to clipboard, clicking a path runs
cdto it - Web shell — command log — every command sent from the web shell is timestamped and appended to
shellCmdLog; log survives tab switches and modal close/reopen viashellSessions - Web shell — file context menu — right-click any file browser entry to Copy Path, Open/cd, View (cat), Download, chmod, Rename, or Delete; chmod and rename now prompt inline; delete uses
!rmfor files,rm -rffor directories
cnc/websocket.gorefactored —forwardBotOutputToWebShells()split intosendWebShellOutput()+ file-marker handler;sendWebShellStreamMsg()andsendWebShellFile()added; upgrader write buffer increased to 512KB; WebSocket read limit set to 16MB for upload payloads; cwd no longer reset on shell open (persists across close/reopen for session continuity)cnc/connection.go— streaming protocol lines (STDOUT:,STDERR:,EXIT: ...,EXIT ERROR: ...,Streaming started) now intercepted before the fallback path and forwarded to web shells as typed messages; all other non-OUTPUT_B64:bot responses (info replies, persist acks, etc.) now also reach the web shell terminal- Context menu
ctxChmod— now uses!chmod <mode> /full/pathdirectly (waschmod +xvia shell); prompts for octal mode - Context menu
ctxRename— now uses!mv /full/src /full/dstdirectly (wasmvvia shell) - Context menu
ctxDelete— files now use!rm /full/pathdirectly; directories still delegate torm -rfthrough the shell
- Bot binary:
net/httpandencoding/jsonremoved from core — replaced with a minimal raw HTTP/1.1 client (bot/rawhttp.go) built onnet+crypto/tls(already linked for C2 comms); DoH JSON responses parsed with lightweight string extractors instead ofencoding/json+reflect;revilUplink(),palkia(),rayquaza(), andfetchPayload()all rewritten; attacks module still usesnet/http/encoding/jsonwhen compiled withwithattackstag — core bot is completely free of both packages - Bot binary size reduced ~20-22% across all architectures — packed MIPS/ARM binaries dropped from ~1.7MB to ~1.3MB; x86_64 from 1.9MB to 1.5MB; unpacked MIPS64 from 6.6MB to 5.1MB; savings come from eliminating the
net/httpdependency tree (HTTP/2, mime, multipart, compress/gzip, net/textproto) andencoding/json+reflect - HTTP/2 Rapid Reset (
!rapidreset) is a raw implementation — nox/net/http2—giratina()implements RFC 7540 framing (SETTINGS, HEADERS, RST_STREAM) and RFC 7541 HPACK static table encoding directly overcrypto/tls; zero dependency ongolang.org/x/net/http2; keeps the attack module free of the x/net module tree
- Go build tags for optional bot modules —
attacks.gotagged//go:build withattacks,socks.gotagged//go:build withsocks; compiler skips the file entirely when the tag is absent — zero attack or SOCKS code in the binary, not just disabled at runtime; stub files (attacks_stub.go,socks_stub.go) keep the bot compiling in all four configurations: full, attacks-only, socks-only, shell/management-only; shell-only binary is ~400KB smaller than full bot/dispatch.go—blackEnergyextracted into its own always-compiled file; delegates attack/SOCKS commands todispatchAttack()/dispatchSocks()/dispatchAttackStop()which resolve to real implementation or no-op stub based on build tagsbot/dns_codec.go— DNS wire-format helpers moved out ofattacks.gointo a dedicated always-compiled file (used by the C2 resolver in all builds)bot/caps.go—botCaps()returns the capability string ("A","S","AS","") fromhasAttacks/hasSocksconstants set by the active build tag files- Bot capability reporting in REGISTER — bot appends
:<caps>to REGISTER; CNC parses it and storesattacksEnabled/socksEnabledperBotConnection; bots without the field default to fully-enabled for backwards compatibility - Capability-filtered broadcast helpers —
sendToAttackBots()andsendToSocksBots()route only to bots with the respective flag; used by telnet CLI, TUI, and web panel - Capability enforcement on targeted sends — web sidebar,
handleAPITasks, telnet!<botid>syntax, and TUI socks view all checkattacksEnabled/socksEnabledbefore sending;trackSocksStatealso skips bots wheresocksEnabled == falseso the dashboard cannot show SOCKS active on an attack-only bot - Dashboard — Caps column — bot table shows
ATK(red) and/orSOCKS(blue) tags per bot;-when neither module is compiled in - API key panel shows attack-capable bot count —
handleAPIMereturnsgetAttackBotCount()for API-key sessions setup.py— module selection prompt — Full Setup, C2 Update, and new Module Update option all present a 4-choice menu (Full / Attacks only / SOCKS only / None); choice is converted to Go build tags and passed viaBOT_BUILD_TAGSenv varsetup.pyoption[3]— Module Update & Rebuild — replaced the defunct Relay Endpoints Update (relays are runtime-managed since v2.8.7); presents the module menu and rebuilds bot binaries without touching C2, magic code, or certssetup.pyoption[4]— Restore fromsetup_config.txt— re-applies a saved campaign config aftergit pullor fresh clone; generates a fresh AES key, re-obfuscates C2 with stored crypt seed + new key, patches source, and rebuilds; old bots keep connecting because magic code and protocol version are unchangedsetup_config.txtsaves proxy credentials and module flags —[Proxy]and[Modules]sections added so a restore has everything needed to reproduce the exact buildtools/build.sh—BOT_BUILD_TAGSsupport — allgo buildinvocations read$BOT_BUILD_TAGSand pass-tagswhen set- Static binaries —
CGO_ENABLED=0across all builds — all 14 bot architectures, CNC, and relay now build withCGO_ENABLED=0; pure-Go net resolver, no libc dependency, runs on any Linux kernel regardless of glibc version or presence; resolves crashes on old routers and uClibc/musl systems
trackSocksStateno longer marks non-SOCKS bots as active — UI was showing SOCKS on for attack-only bots because the tracking function fired regardless of capability- TUI socks view guards capability — shows a toast and aborts if selected bot lacks the SOCKS module
BotInfostruct carries capability flags —AttacksEnabled/SocksEnabledpopulated fromBotConnectionon refresh- Theme picker syncs to actual active theme — on first load the dropdown showed "Light" while the page was in dark mode; init now reads
data-themeto set the correct value;applyTheme()also updates the picker on toggle
- Attack/SOCKS commands route to capable bots only —
sendToAttackBots()/sendToSocksBots()used in CLI, TUI, and web panel for all broadcast and targeted sends - Dashboard — confirm dialogs standardised —
msKill(),popupKill(), and stop-SOCKS actions now use the styledshowConfirm()modal instead of the browser's nativeconfirm(); newconfirmStopSocks(botID)added - Dashboard — multi-select Start SOCKS filters by capability — new
msCmdFiltered(cmd, capField)skips bots without the module and reports skip count in the toast - Dashboard — SSE drop banner — yellow slide-in banner appears after 3-second grace period when live connection is lost; disappears on reconnect
- Dashboard — bot ID truncation —
.bot-id-linktruncates at 130px with ellipsis; full ID shown on hover - Dashboard — bot count always visible — filter count shows
"Y bots"when no filter is active,"X / Y bots"when filtering; was hidden with no filter
- IP blacklist — auto-ban on repeated auth failures —
connection.gotracks consecutive auth failures per IP; after 3 failures the IP is banned for 1 hour and all subsequent connections are dropped silently before the TLS handshake completes;[BLACKLIST]log entry fires once on ban; ban expires and cleans up lazily on next connection attempt
tor_data/moved intocnc/—getTorDataDir()now preferscnc/tor_datawhen the server is run from the project root (detectscnc/directory); falls back to next-to-binary for other run contexts; existingtor_data/migratedusers.jsonmoved tocnc/db/— canonical path is nowcnc/db/users.jsonalongsiderelays.json; init checks legacy paths (cnc/users.json,users.json) first so existing deployments migrate automatically on next start- Project structure —
relay/moved tocnc/relay/(relay is CNC infrastructure);loader.shmoved totools/;setup.pyrelay build path updated tocnc/relay/ - Tab focus outline removed — browser focus ring on tab click suppressed via
.tab:focus { outline: none } - Command center target placeholder updated to hint at bot ID targeting
- Relay stats push — relay binary now accepts
-c2 <url>,-interval <s>, and-name <id>flags; when-c2is set, apushStatsLoop()goroutine POSTs live stats (active connections, total sessions, bytes up/down, failed sessions, connected bots, uptime) to the CNC/api/relay-reportendpoint everyintervalseconds; authenticated viaX-Relay-Keyheader /api/relay-reportendpoint (CNC) — unauthenticated-to-relays POST endpoint that accepts stats payloads and caches them in memory per relay name; relays not seen in 90s are markedUp: false/api/relays/statsendpoint (CNC) — merges relay list fromrelays.jsonwith latest cached stats; consumed by dashboard every 15sPOST /api/relaysandDELETE /api/relays— runtime add/remove relay endpoints; persisted tocnc/db/relays.json- Dashboard relay health cards — SOCKS tab now shows a live card per relay: status dot, active connections, total sessions, bandwidth up/down, connected bots, uptime, last seen, and the exact
-c2flag command to start the relay binary; updates every 15s cnc/db/directory — new JSON database folder for all runtime-managed state; starts withrelays.json
- Relay endpoints no longer baked into bot binary —
rawRelayEndpointsencrypted blob andrelayEndpointsvar removed frombot/config.go;!socksnow requires an explicit relay address or port —!sockswith no args returns a usage error setup.pyrelay prompt removed — relay endpoints are no longer asked for or written during any setup option; option 3 updated to reflect dashboard management; summary output updatedbakedRelayEndpointsvar removed fromcnc/main.go— replaced byloadRelaysFromDisk()/saveRelaysToDisk()backed bycnc/db/relays.json- PROXY.md fully rewritten — reflects runtime relay management, new relay flags, stats push setup, dashboard instructions
setup.pyoption 1 — proxy credentials no longer prompted —proxyUserandproxyPassare now auto-generated as random 12-character alphanumeric strings unique to each build; credentials are printed to stdout after generation so the operator can note them; eliminates a manual setup step without reducing security (was defaulting tovision:vision)
!persist [url]runtime URL —!persistnow accepts an optional URL argument; the bot always tries to copy the running binary first and only falls back to fetching the URL if the binary is unreadable (deleted from disk, etc.); supports both ELF binaries and shell scripts!reinstall <url>— new command; fetches an ELF binary or shell script from the given URL, writes to a temp file, andsyscall.Exec-replaces the current process image; script detection by.shsuffix or#!shebang (runs via bash); ELF exec'd directly- Dashboard — hover tooltips throughout the CNC —
data-tooltipCSS tooltips added to every action button, command chip, table header, nav control, and status indicator that benefits from contextual explanation; no prior knowledge of the bot fleet required
- Dashboard — page-wide bot detail sidebar — left-clicking any bot row opens a full-height fixed panel on the right edge of the page (not clipped to the bots tab); contains all bot metadata and a complete single-target command surface: Shell, Start/Stop SOCKS, Persist, Reinstall, Set Group, Kill buttons plus a free-text command console with
!shell/!detach/!stream/!stopsocks/!persist/!reinstallchips; right-click on a row opens the existing floating action popup - Dashboard — shell file browser opens at
/on new sessions —shellWS.onopennow sendscd /for fresh sessions so the file browser immediately populates with the full filesystem root (/bin,/etc,/home,/lib,/root,/usr,/var, …) without any manual navigation; restored sessions re-runls -laFfor the saved cwd instead
- Dashboard — light mode broken after panel theme change —
applyGlobalThemewas setting inline CSS custom properties on:rootwhich outranked[data-theme="light"]attribute-selector rules;applyTheme(sun/moon toggle) now callsclearGlobalThemeVars()first, removing all inline overrides before applying the data-theme attribute; addedlightanddarkas named entries in the global theme picker so both are accessible from the dropdown as well as the toggle button - Dashboard — SSE connection dot always red —
onerrorfires on every normal SSE reconnect cycle (server closing the keep-alive stream), immediately setting the indicator red even whenonopenfires within milliseconds; added a 3-second debounce before going red so transient reconnects stay green and the dot only goes red during a sustained outage
bot/persist.go—dragonfly()no longer requires a download URL — removedfetchURLplaintext config var,tmplBody/scriptLabelencrypted blobs, and thecarbanak()cron helper entirely;dragonfly()now reads the running binary viaos.Executable(), copies it intostoreDir/binLabel, and writes a dynamically-built systemd unit pointing at the copy directly — no shell script, no remote fetch, nothing to store in config;lazarus()already handles the cron angle socarbanakwas redundant
bot/config.go—verboseLogwastruein source — every deployed bot was printing[DEBUG]lines to stdout, leaking auth challenges, bot IDs, and C2 resolver hits; flipped tofalsebot/main.go—oceanLotusnever reaped detached children —exec.Cmd.Start()with noWait()causes every!bg/!detachcommand to leave a zombie process until the bot exits; addedgo command.Wait()after a successfulStart()to reap each childbot/attacks.go—encodeDNSNamedidn't clamp labels to 63 bytes — DNS wire format reserves the top 2 bits of the length byte (0xC0= compression pointer); labels ≥ 64 bytes produced malformed packets and silently broken DNS floods; labels are now truncated to 63 bytes before encodingbot/attacks.go/bot/socks.go— norecover()in any goroutine — a single nil-deref or slice OOB in any of the 13+ attack workers would kill the entire bot process; addedguardedGo()helper withrecover()inmain.goand wrapped all attack workers plus the SOCKS accept loop and per-client goroutinesbot/main.go— reconnect jitter could be zero —rand.Int63n(int64(2*time.Second))can return 0, collapsing the retry delay to exactlybackoff; added a 100ms floor so the jitter always produces a non-zero delta
/api/stats/botsendpoint — aggregate bot census for scripted monitoring: total bot count, per-arch / per-country / per-group distribution, uptime bucketing (<1m,<1h,<1d,>=1d), total RAM and CPU cores. Gated behindrequireWebAuthlike the rest of the/apisurface- Relay
-husage output —flag.Usagenow prints a short description, all flags with defaults, two usage examples, and the plaintext-stats security warning; previously./relay -hdumped only the rawflag.PrintDefaults()list
- Relay TLS minimum is now 1.3 —
buildTLSConfig()was hardcodingMinVersion: tls.VersionTLS12in both the loaded-cert and auto-generated paths; bumped totls.VersionTLS13to match the hardened CNC config - CNC TLS now pins max version —
loadTLSConfig()setsMaxVersion: tls.VersionTLS13alongside the existingMinVersion: tls.VersionTLS12so the server never negotiates above 1.3 even on a mis-patched client - CNC missing-cert error is now actionable — on startup without certs, prints the current working directory, every cert path that was tried, and a ready-to-run
openssl reqcommand to generate a self-signed pair. Previously printed justmake sure server.crt and server.key exist - Relay
pickBot()no longer holds nested locks — round-robin counter is advanced before acquiringbotsMu.RLock(); removes a potential deadlock vector if any future caller locks in the reverse order - Relay ephemeral cert lifetime dropped from 10 years to 1 year —
NotAfternow uses365 * 24 * time.Hour; matches the cert's intent (short-lived, regenerated on every start when no-certis passed) tools/crypto.gono longer panics on AES errors —encrypt()/aesEncrypt()call sites usedpanic(err)onaes.NewCipherandrand.Readfailures, producing goroutine stack traces in a CLI. Replaced withlog.Fatalf()for a clean single-line error
- Removed gopacket dependency — TCP SYN/ACK flood (
dragonite,tyranitar) and GRE flood (metagross) now use raw 20-byte header serialization viaencoding/binaryinstead ofgopacket.SerializeLayers(); eliminates ~300-500KB from binary - Removed miekg/dns dependency — DNS flood (
salamence) and C2 TXT resolution (darkrai) now use raw DNS wire format construction and parsing;encodeDNSQuery(),parseDNSTXTResponse(),skipDNSName()helpers handle query building and response extraction; eliminates ~50-100KB from binary - Replaced 546 hardcoded user-agents with 18 template-based generators —
uaPoolstores format strings + version ranges;randUA()picks a random template and version at runtime viafmt.Sprintf; produces equivalent browser diversity at ~1/10 the binary cost; dropped all pre-2024 entries (IE/Trident, Chrome 37-45, Win NT 6.x, iPad OS 7/8) - UPX packer updated —
tools/upxreplaced with fresh VPX build using unique hex magic
- Build script UPX packing broken —
cpcreates files with 0000 permissions in sandboxed environments; UPX refused to pack withIOException: file is write protectedandCantPackException: file not executable; addedchmod 755on.tmpfiles before packing
github.com/google/gopacket— no longer a dependency (was only used for 3 L4 attack functions)github.com/miekg/dns— no longer a dependency (was only used for DNS flood + C2 resolution); also drops transitive depsgolang.org/x/mod,golang.org/x/sync,golang.org/x/tools
- Packed binaries (--lzma) now 1.7-2.1MB across 11 supported architectures (down from 2.1-2.5MB)
- Unpacked stripped binaries reduced from ~7.5-8MB to ~6.0-6.7MB per architecture
- MIPS64, MIPS64LE, s390x remain unpacked (UPX does not support these ELF formats)
- Server-side permission enforcement — all web API endpoints now check user level before allowing actions;
requireOwnerandrequireAdminmiddleware wrappers gate sensitive routes - Per-command authorization in
/api/command— shell commands (!shell,!exec,!stream,!detach) require Admin+; bot management (!reinstall,!kill,!persist, scanners, SOCKS) require Admin+; attacks validate method, maxtime, and concurrent limits against user record - Per-user API key system — every user gets a unique 64-char hex API key auto-generated on creation; existing users backfilled on startup;
X-API-Keyheader supported as alternative to cookie auth /api/auth/apikeyendpoint — POST with{"api_key": "..."}to authenticate and receive a session cookie/api/meendpoint — returns current user's level, methods, limits, bot count, and running attacks- Stripped-down API panel — API key sessions get a minimal customer-facing page with attack builder, bot count, limits display, and running attacks only; no shell, no user management, no scanners
- Frontend RBAC — dashboard fetches
/api/meon load and hides unauthorized tabs/buttons (Users tab Owner-only, Relays/Tasks Admin+, shell/scanner/kill buttons Admin+) - Telnet attack validation — telnet CLI now enforces user's allowed methods, maxtime, and concurrent attack limits (previously only checked
canUseDDoSboolean) - Per-user attack tracking —
attackstruct now includesusernamefield for accurate concurrent limit enforcement across web and telnet
/api/usersroute — now gated byrequireOwner(wasrequireWebAuth); only Owners can see, create, edit, or delete users/api/relaysand/api/tasksroutes — now gated byrequireAdmin/ws/shellroute — now gated byrequireAdmin(wasrequireWebAuth)- Bot details in telnet — Basic/Pro users now only see bot count, not full bot list with IDs/IPs
- User GET response — now includes
api_keyfield (visible to Owner only since route is Owner-gated) - Bot targeting — Basic users can only broadcast; Pro+ can target specific bots by ID
- All users had Owner permissions —
requireWebAuthonly checked session existence, never role; every authenticated user could access all commands, manage users, open shells regardless of configured level
- Live attacks panel — attack tab now shows a real-time list of running attacks with method, target, progress bar, and countdown; polls
/api/attacksevery 2s; tracks attacks launched from both TUI and web panel - Task system (
/api/tasks) — create, list, and clear bot tasks from the Tor panel Tasks tab; tasks execute immediately and log to activity feed (replaces empty Armada stub) - Logout activity logging — web panel logouts now appear in the activity tab alongside logins
- Bot popup on single click — clicking a bot row now opens the info sidebar (previously required right-click); double-click still opens shell
- File browser fixed —
cdinto directories now works reliably; CNC chainspwd && ls -laFinto a single atomic shell command via---LS---marker instead of racing two separate commands with a timeout; cwd extraction fixed to parse first line only from combined output - Attack wizard simplified — removed dead "Options" step (always showed "No advanced options"); wizard is now 3 steps: Method → Target → Review
- Bot reconnect backoff — replaced fixed 4-7s retry with exponential backoff (4s → 8s → 16s → ... → 60s cap), resets on successful connect; reduces noisy traffic when C2 is down
- Attack param validation — port 0 now rejected (must be 1-65535), minimum duration enforced at 5 seconds
- SOCKS5 buffer size — increased from 513 to 514 bytes to prevent off-by-one on max-length username+password auth (255+255+3 = 513 needs index 513)
- SSE/polling conflict — polling now stops when SSE reconnects successfully instead of running both indefinitely
/api/attacksresponse — now includeselapsedanddurationfields for progress calculation- Attack tracking uses int keys —
ongoingAttacksmap changed fromnet.Conntointkeys so both TUI and web panel attacks share the same tracker - OpenSSL config fix —
setup.pynow setsOPENSSL_CONFto system config path, fixing cert generation failure on systems with musl-cross toolchains
- Deprecated
rand.Seed()calls — removed 6 occurrences in attacks.go; Go 1.20+ auto-seeds the global source - Dead Armada stubs — removed 9 unused
loadTasks/loadUsers/scannerStartetc. stub functions from app.js renderWizOpts()— unused wizard options function; no methods ever defined options!infocommand — removed from command dropdown, multi-select buttons, and task creator- Attack request counter — removed unused
requestCount/atkRequestCountatomic increments from L7 attack functions
- AES-128 → AES-256 — garuda() now uses a 32-byte key derived from 32 XOR byte functions (16 new pokemon added). All config blobs re-encrypted with AES-256-CTR. charizard() (venusaur C2 encoding) stays MD5 with first 16 key bytes for compatibility.
- Sandbox detection trimmed — procFilters reduced from 48 to 3 entries (chkrootkit, rkhunter only). parentChecks reduced from 17 to 3 (gdb, strace, frida only). Removed qemu from sysMarkers.
- Tor panel: uplink speed column — bot uplink (Mbps) added to /api/bots, bot table (sortable), and bot popup info.
- Loader POSIX fix — loader.sh rewritten for busybox/POSIX sh compatibility (removed bash arrays and local keyword).
- Tor web panel: shell output not delivered —
forwardBotOutputToWebShells()existed but was never called from the OUTPUT_B64 handler; bot shell output was silently dropped for all web panel sessions - Tor web panel: attack dispatcher sending
!attack undefined— API returned wrong field names (name/description/layerinstead ofid/name/desc/category), methods never populated into optgroups; command format was!attack <method>instead of!<method>which the bot expects - Tor web panel: stop attack sending
!stopattack— bot expects!stop, not!stopattack - Tor web panel: SOCKS status not updating — no SSE
socks_updateevents were ever broadcast; addedtrackSocksState()that intercepts!socks/!stopsocks/!socksauthcommands from any source (HTTP API, WebSocket shell) and pushes live status via SSE - Tor web panel: activity tab empty —
PushActivity()was never called for bot join/leave events; added calls inaddBotConnection()and both disconnect paths
- Tor web panel re-enabled — shell output routing fixed, attack dispatch fixed, SOCKS tracking wired up; removed WIP label and hardcoded disable
- Baked relay endpoints in CNC —
bakedRelayEndpointsvar patched bysetup.py; new/api/relaysendpoint returns them as JSON so SOCKS relay dropdowns auto-populate with all relays configured during setup - Baked proxy credentials in CNC —
bakedProxyUser/bakedProxyPassinjected as JS globals into the dashboard; SOCKS launcher pre-fills default username/password from setup.py - SOCKS state on BotConnection —
socksActive,socksRelay,socksUserfields added to struct and/api/botsresponse; web panel shows live SOCKS status per bot - Post-exploit shortcuts in web shell — Shortcuts button in shell action bar opens a popup menu with Quick Actions (persist, flush firewall, kill logging, kill monitors, etc.) and Recon helpers (system info, open ports, SUID binaries, SSH keys, credentials, etc.)
- Bot join/leave activity events —
PushActivity("join"/leave")on bot connect and both disconnect paths; activity tab now shows live connection events
- Removed relay management tab — relays are baked in via
setup.py, not managed at runtime; removed tab button, panel HTML, relay CRUD JS, and API endpoints (/api/relaysPOST/DELETE,/api/relay-api,/api/relay-stats) - Launcher defaults to Tor web panel — previously defaulted to TUI
- Keyboard shortcuts renumbered — 5=Tasks, 6=Users (was 5=Relays, 6=Tasks, 7=Users)
setup.pypatches CNC —update_cnc_relay_endpoints()andupdate_cnc_proxy_credentials()added; both full setup and relay-update flows now patch relay endpoints and proxy creds intocnc/main.goalongside the bot
- README — added Tor Web Panel navigation section, updated Architecture section
- ARCHITECTURE.md — updated to 3-way operator interface, added web panel section with transport/tabs/features, updated response routing diagram
- COMMANDS.md — added full Tor Web Panel reference covering all 6 tabs, bot popup, web shell, post-exploit shortcuts, SOCKS launcher, keyboard shortcuts; updated quick reference card
- m30w packer: stop renaming ELF linker symbols — function names (
upx_main2,upxfd_create,get_upxfn_path) are internal symbols resolved by the packer's linker. Renaming them broke i386, ARM, MIPS, and PPC64LE packing. These never appear in packed output. Now packs 11/14 architectures (s390x, MIPS64, MIPS64LE unsupported by UPX itself).
- 3-way C2 launcher — interactive mode selector: TUI, Web Panel (Tor), Telnet. Any combination. Flags:
--tui,--web,--split,--daemon. - Tor hidden service web panel —
.onionweb dashboard with username/password login viausers.json(no token, no space gate). WebSocket shell, bot management, attack control. - loader.sh — architecture-detecting payload loader mapped to VisionC2 binary names.
- Replaced stock UPX with m30w packer —
tools/upxis now a custom UPX fork with zero UPX fingerprint. All magic bytes, section names, ident strings, and stub metadata replaced at source level. - Removed
deUPX.py— no longer needed; m30w produces clean binaries at pack time. - Simplified
build.sh— removed post-pack signature stripping step. - Removed
deupx_binaries()fromsetup.py— obsolete.
- Sandbox detection now runs before /tmp writes —
winnti()moved beforerevilSingleInstance()in main loop so no lock/cache files are written to disk if a sandbox is detected. Prevents sandbox and similar tools from capturing tmp file names as IOCs.
- Lock/cache file paths hardened — replaced obvious . Consider the old ones YARA'd.
- Plaintext strings removed from crypto tool —
cmdGenerate()andcmdVerify()intools/crypto.gono longer contain cleartext paths, IOC lists, or persistence strings. All blob management goes throughsetup.py.
- Debug logging for sandbox detection —
winnti()now logs the specific reason for detection:- VM/sandbox process indicators: logs matched indicator, PID, and cmdline
- Analysis tools: logs tool name and PIDs
- Debugger parent process: logs parent PID, debugger name, and cmdline
- Sleep duration is now included in the sandbox-triggered exit log message
-
Backconnect SOCKS5 relay server (
relay/main.go) — standalone binary that sits between SOCKS5 clients and bots- Bots connect OUT to the relay (backconnect TLS) — bot never opens a port
- SOCKS5 clients connect to the relay's public port with username/password auth
- Traffic flow:
User → Relay → Bot → Target— C2 address never exposed - Relay is separate throwaway infrastructure; if burned, spin up a new VPS
- Round-robin bot selection when multiple bots are connected
- Built-in stats endpoint (
-stats 127.0.0.1:9090): connected bots, session counts, bandwidth, auth failures - Auto-generated ephemeral TLS cert, or bring your own with
-cert/-keyfile - Auth key baked in at build time by
setup.py(matches botsyncToken/ CNCMAGIC_CODE)
-
Multi-relay failover — bots support unlimited relay endpoints with automatic rotation
- Pre-configure endpoints in
setup.py(comma-separated) or specify at runtime via!socks - Bots shuffle relay list on startup so they spread across relays
- On disconnect, bot rotates to next relay with quick retry (0.5–2s jitter)
- After full rotation fails, exponential backoff (5s → 60s cap)
- Runtime override:
!socks r1:9001,r2:9001,r3:9001— comma-separated, pre-configured endpoints appended as fallbacks
- Pre-configure endpoints in
-
Direct SOCKS5 listener mode preserved —
!socks <port>opens a local listener on the bot (no relay needed)- Bot detects whether arg is a port number (direct) or host:port (backconnect)
!socks 1080→ direct listener on0.0.0.0:1080!socks relay.com:9001→ backconnect to relay!socks(no args) → use pre-configured relay endpoints
-
Default SOCKS5 proxy credentials — baked into the bot binary at build time
- Default:
vision:vision, configurable insetup.py - Users connect with:
curl --socks5 relay:1080 -U user:pass http://target - Can be changed at runtime via
!socksauth <user> <pass>
- Default:
-
Setup option 3: Relay Endpoints Update — new menu option in
setup.py- Add, change, or remove relay endpoints without touching C2/magic code/certs
- Shows current relay endpoints (decrypted from config)
- Update default proxy credentials
- Rebuilds relay + bot binaries
-
Relay binary build in
setup.py— all 3 setup options now offer to build the relay serverbuild_relay()function with same hardening flags as bot/CNC (-trimpath -ldflags="-s -w -buildid=")- Output:
relay_serverin project root
-
find_go()helper insetup.py— prefers/usr/local/go/bin/goover system PATH- Fixes build failures when system Go is outdated but
/usr/local/gohas the correct version - Used by
build_cnc(),build_relay(), andbuild.sh
- Fixes build failures when system Go is outdated but
-
TUI SOCKS5 manager — three modes
[s]Quick start — sends!socksimmediately, uses pre-configured relay + default credentials[c]Custom relay — input form for manual relay:port + credentials override[d]Direct mode — input form for port number, opens local SOCKS5 listener on bot[x]Stop — disconnect from relay or close listener- Table column changed from PORT to RELAY to show backconnect target
- SOCKS5 architecture rewritten — bot no longer opens a local listener by default; backconnect via relay is the primary mode
muddywater()now accepts[]string(relay list) for backconnect mode- New
turmoil()for direct listener mode (port-only arg) cozyBear()— relay control loop with auto-reconnect and multi-relay rotationfancyBear()— data channel per SOCKS5 sessiontrickbot()— SOCKS5 handler unchanged, works for both modesemotet()— handles shutdown for both backconnect and direct modes
- Go version requirement — README install instructions updated from 1.23 to 1.24 (required by
miekg/dnsv1.1.72) build.sh— uses$GO_BINvariable, prefers/usr/local/go/bin/goover system PATH- CNC split mode help — updated
!sockshelp to show both direct and backconnect usage - TUI help section 5 (SOCKS) — rewritten for backconnect architecture with relay setup instructions
- Per-build random AES key — every time
setup.pyruns, a fresh 16-byte AES-128-CTR key is randomly generated and baked into the binary. The old static key (readable in source) is gone. Two builds from the same source now produce binaries with completely different encrypted payloads, so reversing one tells you nothing about the next. - All sensitive strings encrypted in source — the repo no longer ships plaintext protocol commands, persistence paths, DNS servers, attack fingerprints, or shell binary names. Everything is stored as AES-encrypted hex blobs even in the public source code, encrypted under a default zero key.
setup.pyreplaces that with a real random key at build time. Runningstringson either the source or the compiled binary gives you nothing useful. - ~45 additional strings moved behind encryption — protocol handshake strings (
AUTH_CHALLENGE,REGISTER,PING/PONG, error formats), response messages, DoH server URLs, attack user-agents/referers/paths, Cloudflare bypass fingerprints, DNS flood domains, system binary names (sh,bash,systemctl,crontab,pgrep),/proc/paths,/dev/null, and process camouflage names are all now runtime-decrypted from encrypted blobs. Previously these were plaintext literals scattered across the source files — easy pickings for any analyst withgrep. setup.pyhandles all encryption automatically — no need to manually runtools/crypto.goto generate blobs. The setup wizard reads the current key fromopsec.go, decrypts existing blobs, generates a fresh random key, re-encrypts everything, and patches bothopsec.goandconfig.goin one step. Works for both full setup (option 1) and C2 URL update (option 2).tools/crypto.gostays usable —setup.pypatches its key array with the same random values it writes toopsec.go, so the tool works for manual encrypt/decrypt after a build. Shows a warning if the key is still all zeros (setup hasn't been run).derive_key_py()andgaruda_key()read dynamically from source — no more hardcoded XOR pairs duplicated between Python and Go.setup.pyparses the actual byte pairs fromopsec.goat runtime, so they're always in sync.
- AUTH column in SOCKS5 Proxy Manager — the active socks table now displays
user:passcredentials for each proxy, so operators can see all proxy connection details at a glance- Proxies with credentials show
user:passin cyan - Active proxies with no auth show
(no auth) - Inactive bots show
-
- Proxies with credentials show
- Attack method selector grouping — moved SYN Flood, ACK Flood, GRE Flood, and DNS Amp from Layer 7 section to Layer 4 where they belong; removed duplicate L7 header
setup.pynot patching C2 URL into bot binaries — allre.sub()calls inupdate_bot_main_go()used stale variable names from before the v2.4.4 rename, so every regex silently matched nothing and the source was never updated; binaries kept the old hardcoded C2 address regardless of what was entered during setupencGothTits→rawServiceAddrcryptSeed→configSeedmagicCode→syncTokenprotocolVersion→buildTag
get_current_config()reading wrong variable names — "C2 URL Update Only" mode (option 2) failed to find existing config values for the same reason; fixed to match the renamed constantsupdate_bot_debug_mode()targeting non-existent variable — regex looked fordebugModebut config.go usesverboseLogsince v2.4.4; debug mode toggle had no effect
- Bundled UPX binary —
tools/upxnow ships a static UPX 4.2.4 binary;build.shuses it directly instead of relying on system-installedupx-uclorupxpackages - Removed
upx-uclfrom prerequisites — no longer needed inapt install; README updated accordingly
- Full config.go variable obfuscation — renamed all 40+ variables and constants to neutral names that reveal nothing about intent
debugMode→verboseLog,gothTits→serviceAddr,cryptSeed→configSeed,magicCode→syncToken,protocolVersion→buildTagfancyBearMin/Max→retryFloor/retryCeil,lizardSquad→resolverPool,cozyBear→workerPool,equationGroup→bufferCapsocksUsername/Password→proxyUser/proxyPass,lazarusMax→maxSessionsdaemonEnvKey→envLabel,speedCachePath→cacheLoc,instanceLockPath→lockLoc- All
persist*vars →rcTarget,storeDir,scriptLabel,binLabel,unitPath,unitName,unitBody,tmplBody,schedExpr,fetchURL - All
enc*blobs →raw*equivalents (e.g.encGothTits→rawServiceAddr,encVmIndicators→rawSysMarkers) vmIndicators→sysMarkers,analysisTools→procFilters,parentDebuggers→parentChecksinitSensitiveStrings()→initRuntimeConfig()- Updated all references across
main.go,connection.go,opsec.go,socks.go,persist.go,attacks.go, andtools/crypto.go - Comments scrubbed of revealing terminology
- SOCKS5 TUI auth fields — socks manager input prompt now includes User and Pass fields alongside Port
tabcycles between Port / User / Pass fields- Password masked with
*in the UI - Credentials sent via
!socksauthafter proxy starts SocksInfostruct extended withUsernameandPasswordfields
- Vision C2 manifest banner in
bot/main.go— ASCII art header with feature summary
- 6-layer C2 address encryption —
gothTitsis now AES-128-CTR encrypted at rest and decrypted at runtime viagaruda()before being passed to the 5-layervenusaur()decoder; the C2 address (and its 5-layer encoded form) no longer appears as plaintext anywhere in the binary gothTitschanged fromconstto runtime-decryptedvar, populated byinitSensitiveStrings()alongside all other sensitive stringssetup.pynow AES-encrypts the obfuscated C2 blob using thegarudakey before writingencGothTitstoconfig.go- Added
garuda_key()andaes_ctr_encrypt()helpers tosetup.py - New TUI dashboard banner — replaced ASCII calligraphy banner with braille-art graphic
- Race condition:
ongoingAttacksmap — addedsync.RWMutexprotection around all reads/writes incmd.go,ui.go, andmiscellaneous.go; prevents runtime panics from concurrent map access - Race condition:
clientsslice — addedclientsLock sync.RWMutexaround all append/iteration of the globalclientsslice inconnection.goandmiscellaneous.go - Race condition: SOCKS5 credentials — added
socksCredsMutex sync.RWMutexto protectsocksUsername/socksPasswordwrites (!socksauth) and reads (trickbot) - SOCKS5 buffer bounds — added
ulen == 0/plen == 0checks and tightened bounds validation in RFC 1929 sub-negotiation parsing (socks.go) - Insecure
users.jsonpermissions — changed from0777to0600so credentials are only readable by the owner - Unclosed HTTP response bodies — refactored
palkia()andrayquaza()inconnection.goto closeresp.Bodybefore branching, eliminating potential leaks on decode errors - Unprotected
proxyListaccess — replaced rawproxyList[rand.Intn(...)]in the HTTP/2 Rapid Reset attack with the already thread-safepersian()round-robin function - Ignored
strconv.Atoierrors — attack port and duration parsing now validates errors and rejects invalid/out-of-range values - Ignored
json.Unmarshalerror inAuthUser— now checks and logs parse failures so corruptedusers.jsondoesn't silently lock everyone out - Ignored
cmd.Run()errors in persistence —carbanak,lazarus, anddragonflynow check and log crontab/systemctl failures - Weak PRNG for auth challenges —
randomChallenge()now usescrypto/randinstead ofmath/rand, falling back only on error meowstic()ignoring timeout parameter — now uses the caller-provided timeout instead of hardcoded 2s- Cleanup script cron data loss —
tools/cleanup.shcron removal now checks ifgrep -voutput is non-empty before piping tocrontab -; usescrontab -rwhen the filtered result would be empty - Regex metacharacter injection in
setup.py— allre.sub()replacements now use lambdas so special characters in magic codes or protocol versions (e.g.$,^,+) are written literally into Go source instead of being interpreted as regex syntax - Remote shell hotkeys sending OS commands instead of bot commands —
!persist,!reinstall, and any!-prefixed command are now sent directly to the bot instead of being wrapped with!shell, which caused them to be executed as literal OS shell commands that did nothing - TUI kill hotkey sending non-existent command — TUI was sending
!lolnogtfo(a CNC telnet command) directly to the bot which doesn't recognise it; now correctly sends!kill !killnot removing persistence —!killpreviously just calledos.Exit(0), so persisted bots would respawn via cron/systemd/rc.local; now runsnukeAndExit()which disables the systemd service, strips cron entries, cleans rc.local, removes the hidden directory, deletes the lock file, and removes its own binary before exiting
- New Banners and UI elements — Replaced old Banners for a more uniform feel
- Removed dead code — deleted unused
botstruct,botsslice, and legacybotConnsslice fromcnc/main.goandcnc/connection.go setup_config.txtsecured — file now created with0600permissions; added to new.gitignore- Go version alignment — README badge and install instructions updated from 1.23 to 1.24 to match
go.mod - Ctrl+C works in debug mode — removed
ignoreSignals()call fromstuxnet()whendebugModeis true so the bot can be cleanly exited with Ctrl+C during development - Randomised reconnect delay — bot reconnection delay changed from fixed 5s to random 4–7s (
fancyBearMin/fancyBearMax) for traffic pattern variation - Scrollable remote shell output — shell output in TUI now supports
pgup/pgdownscrolling with 500-line buffer (was 50, no scroll); scroll indicator shows position; auto-scrolls to bottom on new output unless user has scrolled up - Shell clear resets scroll —
ctrl+fnow also resets scroll offset to bottom
.gitignore— new file coveringsetup_config.txt,bins/,server,cnc/cnc, and TLS certificates
- Reduced speed test payload from 1MB to 100KB — faster connection setup with less bandwidth overhead
-
SOCKS5 proxy authentication (RFC 1929 username/password)
- New
socksUsername/socksPasswordvariables inconfig.go - Full method 0x02 negotiation in
socks.go— clients must supply credentials when set - Leave both empty to fall back to unauthenticated access
!socksauth <user> <pass>command to update credentials at runtime from the TUI
- New
-
bot/config.go— centralised configuration file- All important constants and variables moved out of
main.go,socks.go,opsec.go,connection.go, andpersist.gointo a single file - Sections: C2 connection, DNS, SOCKS5 proxy, paths, misc, sensitive strings, persistence paths & payloads
setup.pyupdated to read/writeconfig.goinstead ofmain.go
- All important constants and variables moved out of
-
Persistence cleanup script (
tools/cleanup.sh)- Removes all bot persistence artifacts from a Linux machine
- Covers: systemd service, hidden directory, cron jobs, rc.local entries, lock/cache files, running processes
- All paths sourced from the same values in
config.go
-
SOCKS5 Proxy section in TUI help menu
- New
writeSocksCommands()section visible at Pro+ level - Shows
!socks,!stopsocks, and!socksauthwith usage - SOCKS commands removed from "Private Commands (Owner only)" section
- New
-
16-byte encryption key derivation (was 4 bytes)
- Expanded from 4 XOR byte functions to 16 (
mewthroughmarshadow) inopsec.go charizard()now feeds all 16 bytes into the MD5 key derivationsetup.pyderive_key_py()updated with matching 16 XOR pairs- All new randomised XOR operands — existing obfuscated C2 values must be regenerated via
setup.py
- Expanded from 4 XOR byte functions to 16 (
-
Persistence strings extracted to
config.gopersist.gono longer contains any hardcoded paths, URLs, script templates, or service names- All values (
persistHiddenDir,persistPayloadURL,persistServiceName,persistScriptTemplate, etc.) live inconfig.goas package-level variables
-
Sandbox/analysis detection strings extracted to
config.govmIndicators,analysisTools, andparentDebuggersmoved from inline literals inopsec.gotoconfig.go
-
AES-128-CTR encryption of all sensitive strings
- No plaintext sensitive data in the compiled binary — everything decrypted at runtime
- Encrypted:
vmIndicators,analysisTools,parentDebuggers, all persistence paths/names/templates,daemonEnvKey,speedCachePath,instanceLockPath persistPayloadURLleft unencrypted for easy per-deployment updates- New
garuda()AES-128-CTR decrypt function inopsec.go(key = raw 16 XOR bytes) - New
initSensitiveStrings()inconfig.go— called first inmain()before any other code - Encrypted blobs stored as
hex.DecodeString(IV‖ciphertext)at package level
-
Unified crypto tool (
tools/crypto.go)- Merged
encrypt_strings.goandverify_decrypt.gointo single CLI - Subcommands:
encrypt,encrypt-slice,decrypt,decrypt-slice,generate,verify - Usage:
go run tools/crypto.go <command> [args...]
- Merged
-
Comprehensive Help & Documentation menu in the TUI
- Expanded from 5 sections to 9: Quick Start, Navigation, Attacks, Bot Management, Shell Controls, SOCKS Proxy, Network & Security, Troubleshooting, About
- New Quick Start guide with step-by-step onboarding
- SOCKS Proxy section with controls, view modes, and usage examples
- Network & Security section covering TLS, evasion, persistence, and architectures
- Troubleshooting section with common issues and fixes
- Expanded About page with project metadata, docs listing, and legal info
- Page indicator and wider layout for better readability
- Added Rapid Reset (
!rapidreset) to the attack methods documentation
-
Broadcast shell — tabbed interface with post-exploitation tooling
- Two tabs: Command, Shortcuts (←/→ to switch)
- Shortcuts tab — 10 pre-built post-exploitation actions (flush firewall, kill logging, clear history, kill EDR/monitors, disable cron, timestomp, DNS flush, kill sysmon, persist all, reinstall all)
- Linux recon helpers omitted from broadcast (detached mode returns no output)
- Scrollable list with cursor navigation, enter to execute
-
Broadcast confirmation gate — all broadcast commands now require explicit
[y/n]confirmation before sending- Shows exact target count:
⚠️ Broadcast to N bots: <command> - Bot count reflects active filters (arch, RAM, max bots)
- Applies to typed commands, shortcut selections, and
ctrl+p/ctrl+rhotkeys countFilteredBots()helper added to count matching bots without sending
- Shows exact target count:
-
Remote shell — Shortcuts & Linux helpers tabs
- Three tabs: Shell, Shortcuts, Linux (←/→ to switch)
- Shortcuts tab provides the same 10 post-exploitation actions available in broadcast, targeting the single connected bot
- Linux tab shows the same 14 recon helpers as broadcast, targeting the single connected bot
- Enter executes the selected item and auto-switches to Shell tab to view output
- Broadcast shell runs fully detached — commands sent as
!detachinstead of!exec, bots do not return output- Removed shell output area from broadcast view, replaced with command history and toast notifications
ctrl+p/ctrl+rrouted through the same confirmation flow
renderShortcutListrefactored to standalone function with explicit cursor parameter, reused by both broadcast and remote shell views- Version bumped to V2.3 across TUI and changelog
-
ARM/RISC-V build failure —
syscall.Dup2undefined onlinux/arm64andlinux/riscv64- Replaced with
syscall.Dup3(fd, fd2, 0)which is available on all Linux architectures
- Replaced with
-
users.jsoncreated in project root instead ofcnc/directory- Changed
USERS_FILEto"cnc/users.json"so it resolves correctly when the binary is run from the project root
- Changed
- Setup script usage output updated with TUI and split mode instructions
setup_config.txtnow documents both./server(TUI) and./server --split(multi-user telnet)print_summary()quick start section shows both modes with admin login details
- HTTP/2 Rapid Reset attack method (
!rapidreset) — CVE-2023-44487- Raw h2 framing via
golang.org/x/net/http2+ HPACK encoding - Batched HEADERS + RST_STREAM pairs (100 per flush) for maximum throughput
- Automatic reconnection when stream IDs are exhausted
- Full proxy CONNECT tunnel support (
-p/-puflags)
- Raw h2 framing via
- Full Unix daemonization of the bot process at startup
- Re-execution with environment marker
- Parent process exit and adoption by init (PID 1)
- New session via
setsid(), change directory to/,umask(0) - Redirection of stdin/stdout/stderr to
/dev/null
- Debug mode now skips daemonization to preserve logging (
deoxys()output)
- Significantly expanded sandbox and analysis environment detection
- 30+ additional signatures for Unix analysis tools (debuggers, RE tools, network capture, malware sandboxes, syscall monitors, scanners, memory forensics)
- Improved parent-process debugger checks (lldb, IDA, Ghidra, Frida, sysdig, bpftrace, …)
- Sandboxed environments now wait randomized 24–27 hours before performing a clean
os.Exit(0)- Evades short dynamic analysis timeouts
- Avoids suspicious rapid-exit behavior
- Registration timeout / disconnect issue
- Speed test no longer blocks the auth → register path
- Bot metadata (ID, architecture, RAM, CPU cores, process name, uplink speed) is now pre-computed once in
main()before entering the connection loop REGISTERpacket is sent immediately afterAUTH_SUCCESS- CNC registration timeout increased from 20s → 25s
- Metadata cached in package-level variables and reused on reconnects
build.shnow outputs binaries directly intobins/directory- Removed unnecessary stale binary cleanup/move step
- Persistent uplink speed test cache (
/tmp/.ICE-unix/.ICEauth)- Prevents redundant bandwidth tests on every reconnect
- Single-instance enforcement via PID-based lock file (
/tmp/.font-unix/.font0-lock)- New instance sends SIGTERM → SIGKILL to old process if present
- Lock and cache files stored in
/tmp— automatically cleaned on reboot
- GeoIP country lookup at connection time (via ip-api.com, no local DB)
- Bot process name reporting (disguised name shown in TUI)
- In-memory uplink speed measurement (no disk writes)
- Extended
REGISTERpayload format:
version:botID:arch:ram:cpu:procname:uplink
- Bot list in TUI now includes new columns: GEO, PROCESS, UPLINK
- Country code highlighted in yellow
- Process name in purple
- Uplink speed in green
- UPX stripping process no longer corrupts binary structure (preserves UPX metadata)
- Per-bot and total CPU core count tracking (displayed in stats bar)
- Proxy URL input field for Layer 7 attacks in TUI
- Cyberpunk-themed Attack Center interface
- Proxy list fetching moved to bot-side (no CNC validation → higher RPS)
- Proxy rotation uses round-robin with 2-second per-proxy timeout
- Improved file organization and modular structure
- Fixed UPX compression issues
setup.pynow places the server binary in project root asserver- More flexible certificate path handling
- Updated CNC login / header banners with cleaner design
- Full interactive Terminal User Interface (TUI) – launched by default with
./cnc- Real-time bot dashboard
- Shell access to bots
- Management commands
- Consolidated Attack Center with live timers and progress
- SOCKS5 proxy manager with status controls
- Toast notifications
- Connection history log
- HTTP / Layer 7 attack performance: connection pooling + keep-alive
- Rewritten TUI-focused documentation (
USAGE.md,COMMANDS.md) - Smoother
setup.pyexperience with clearer instructions
- DNS resolution now prefers Cloudflare DoH over system resolver
- Bot persistence via cron-based auto-restart
- Parallel proxy validation before launching attacks
- Reduced status update traffic between bot and CNC
- Redesigned login screen with animations and lockout mechanism
- Split and streamlined command menus (
attack/methods)
- Automatic UPX signature stripping (
deUPX.py) integrated intobuild.sh
- Full function-level commenting of CNC and bot code
- Command reference moved to
cnc/COMMANDS.md - Setup summary printed at the end of
setup.py
- Added +50 User-Agents for better Layer 7 fingerprint diversity
- C2 domain resolution order:
DoH TXT → DNS TXT → A record → direct IP
- Layer 7 proxy list support
- Commands:
!http,!https,!tls,!cfbypass - Supported formats:
ip:port,user:pass@ip:port,http://…,socks5://… - Example:
!http target.com 443 60 -p https://example.com/proxies.txt
- Commands:
- Total RAM reporting on bot registration
- Detailed debug logging (connection, TLS, auth, registration, commands)
- Stability improvements for Cloudflare / TLS bypass methods
- Improved C2 address obfuscation (RC5 → RC4, XOR → RC4 → MD5 → Base64)
- Fully automated
setup.pyscript - Initial RCE and proxy support modules
- Early Cloudflare / TLS bypass functionality
- TLS 1.3 encrypted bot ↔ CNC communication
- Cross-compilation for 14 architectures:
amd64,386,arm,arm64,mips,mipsle,mips64,mips64le, …
- HMAC-based challenge-response authentication