Skip to content

Commit 8bfea83

Browse files
committed
feat: Add comprehensive threading support to all scanning modules
- Add threading support to 9 modules: subdomains, dalfox, nuclei, ports, sqlmap, livehosts, tech, urls, backup_scan - Set default thread count to 100 for all tools - Update Discord bot commands with threading parameters - Add performance guidelines and configuration documentation - Improve parallel processing capabilities across all scanning tools Modules updated: - subdomains.sh: Subfinder threading (-t parameter) - dalfox.sh: Dalfox threading (-w parameter) - nuclei.sh: Nuclei threading (-c parameter) - ports.sh: Naabu threading (-tp and -rate parameters) - sqlmap.sh: Interlace threading (-threads parameter) - livehosts.sh: Httpx threading (-threads parameter) - tech.sh: Httpx threading (-threads parameter) - urls.sh: Urlfinder and JSFinder threading (-t and -c parameters) - backup_scan.sh: Fuzzuli threading (-w parameter) Discord commands updated: - All commands now support optional threads parameter (default: 100) - Updated command descriptions and help text - Added performance tuning capabilities Documentation: - Added comprehensive threading configuration section - Updated README with performance guidelines - Added CLI and Discord command examples - Documented all supported tools with threading
1 parent 0082b9f commit 8bfea83

12 files changed

Lines changed: 200 additions & 77 deletions

File tree

README.md

Lines changed: 70 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,31 @@ AutoAR is a comprehensive, modular security automation toolkit designed for bug
3434
- **File Sharing**: Automatic result file uploads
3535
- **Slash Commands**: Easy-to-use Discord commands
3636
- **Progress Tracking**: Real-time scan status updates
37+
- **Configurable Threading**: All tools support custom thread counts for optimal performance
3738

3839
### 🗄️ **Database Support**
3940
- **PostgreSQL Integration**: Full database support for results storage
4041
- **SQLite Fallback**: Lightweight database option
4142
- **Data Export**: Easy data export and analysis
4243
- **Result Management**: Organized result storage and retrieval
4344

45+
### **Performance & Threading**
46+
- **Configurable Threading**: All scanning tools support custom thread counts (default: 100)
47+
- **Parallel Processing**: Optimized for multi-core systems with concurrent operations
48+
- **Resource Management**: Intelligent thread allocation based on tool capabilities
49+
- **Performance Tuning**: Easy adjustment of thread counts via Discord commands or CLI flags
50+
51+
**Supported Tools with Threading:**
52+
- **Subdomain Enumeration**: Subfinder with configurable thread pools
53+
- **Live Host Detection**: Httpx with parallel HTTP probing
54+
- **Vulnerability Scanning**: Nuclei with concurrent template execution
55+
- **Port Scanning**: Naabu with high-speed parallel port discovery
56+
- **XSS Detection**: Dalfox with concurrent payload testing
57+
- **SQL Injection Testing**: SQLMap with Interlace for parallel testing
58+
- **Technology Detection**: Httpx with parallel technology fingerprinting
59+
- **URL Collection**: Urlfinder and JSFinder with concurrent crawling
60+
- **Backup File Discovery**: Fuzzuli with parallel backup file enumeration
61+
4462
## 🚀 Quick Start
4563

4664
### Docker Compose (Recommended)
@@ -119,18 +137,18 @@ python discord_bot.py
119137
Once the bot is running, use these slash commands in Discord:
120138

121139
#### Basic Reconnaissance
122-
- `/subdomains domain:example.com` - Enumerate subdomains
123-
- `/livehosts domain:example.com` - Find live hosts
140+
- `/subdomains domain:example.com [threads:100]` - Enumerate subdomains
141+
- `/livehosts domain:example.com [threads:100]` - Find live hosts
124142
- `/cnames domain:example.com` - Extract CNAME records
125-
- `/urls domain:example.com` - Collect URLs
126-
- `/tech domain:example.com` - Detect technologies
143+
- `/urls domain:example.com [threads:100]` - Collect URLs
144+
- `/tech domain:example.com [threads:100]` - Detect technologies
127145

128146
#### Vulnerability Scanning
129-
- `/nuclei domain:example.com` - Run Nuclei scans
147+
- `/nuclei domain:example.com [threads:100]` - Run Nuclei scans
130148
- `/wpdepconf domain:example.com` - WordPress plugin confusion
131-
- `/dalfox domain:example.com` - XSS detection
132-
- `/sqlmap domain:example.com` - SQL injection testing
133-
- `/backup domain:example.com` - Backup file discovery
149+
- `/dalfox domain:example.com [threads:100]` - XSS detection
150+
- `/sqlmap domain:example.com [threads:100]` - SQL injection testing
151+
- `/backup_scan domain:example.com [threads:100] [full:false]` - Backup file discovery
134152

135153
#### Specialized Scans
136154
- `/js domain:example.com` - JavaScript analysis
@@ -139,7 +157,7 @@ Once the bot is running, use these slash commands in Discord:
139157
- `/github-wordlist org:company` - Generate wordlists from GitHub org
140158
- `/s3 bucket:example-bucket` - S3 bucket scanning
141159
- `/dns domain:example.com` - DNS takeover detection
142-
- `/ports domain:example.com` - Port scanning
160+
- `/ports domain:example.com [threads:100]` - Port scanning
143161

144162
#### GitHub Reconnaissance
145163
- `/github scan repo:microsoft/PowerShell` - Scan specific repository for secrets
@@ -159,17 +177,20 @@ Access the container and use the CLI directly:
159177
# Enter the container
160178
docker exec -it autoar-bot bash
161179

162-
# Basic reconnaissance
163-
/app/main.sh subdomains get -d example.com
164-
/app/main.sh livehosts get -d example.com
180+
# Basic reconnaissance (with threading)
181+
/app/main.sh subdomains get -d example.com -t 100
182+
/app/main.sh livehosts get -d example.com -t 100
165183
/app/main.sh cnames get -d example.com
166-
/app/main.sh urls collect -d example.com
167-
168-
# Vulnerability scanning
169-
/app/main.sh nuclei run -d example.com
184+
/app/main.sh urls collect -d example.com -t 100
185+
/app/main.sh tech detect -d example.com -t 100
186+
187+
# Vulnerability scanning (with threading)
188+
/app/main.sh nuclei run -d example.com -t 100
189+
/app/main.sh dalfox run -d example.com -t 100
190+
/app/main.sh sqlmap run -d example.com -t 100
191+
/app/main.sh ports scan -d example.com -t 100
192+
/app/main.sh backup scan -d example.com -t 100 --full
170193
/app/main.sh wpDepConf scan -d example.com
171-
/app/main.sh dalfox run -d example.com
172-
/app/main.sh sqlmap run -d example.com
173194

174195
# Specialized scans
175196
/app/main.sh js scan -d example.com
@@ -274,6 +295,37 @@ GITHUB_TOKEN=your_github_personal_access_token
274295
- `read:org` - Read organization membership
275296
- `read:user` - Read user profile information
276297

298+
## ⚡ Threading Configuration
299+
300+
AutoAR supports configurable threading across all scanning tools for optimal performance:
301+
302+
### Discord Commands
303+
All Discord commands support optional `threads` parameter (default: 100):
304+
```
305+
/subdomains domain:example.com threads:200
306+
/nuclei domain:example.com threads:50
307+
/ports domain:example.com threads:500
308+
```
309+
310+
### CLI Commands
311+
All CLI commands support `-t` or `--threads` flag:
312+
```bash
313+
# High-performance scanning
314+
./modules/subdomains.sh get -d example.com -t 200
315+
./modules/nuclei.sh run -d example.com -t 50
316+
./modules/ports.sh scan -d example.com -t 500
317+
318+
# Conservative scanning (lower resource usage)
319+
./modules/subdomains.sh get -d example.com -t 25
320+
./modules/nuclei.sh run -d example.com -t 10
321+
```
322+
323+
### Performance Guidelines
324+
- **High-end systems**: 200-500 threads for maximum speed
325+
- **Standard systems**: 100 threads (default) for balanced performance
326+
- **Resource-constrained**: 25-50 threads to avoid overwhelming the system
327+
- **Network-limited**: Lower thread counts to avoid rate limiting
328+
277329
## 🔧 Configuration
278330

279331
### Environment Variables

discord_bot.py

Lines changed: 50 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -447,12 +447,12 @@ async def github_wordlist(self, interaction: discord.Interaction, org: str,
447447
@app_commands.command(name="backup_scan", description="Discover backup files using Fuzzuli")
448448
@app_commands.describe(
449449
domain="Target domain to scan for backup files",
450-
threads="Number of threads (default: 10)",
450+
threads="Number of threads (default: 100)",
451451
delay="Delay between requests in ms (default: 100)",
452452
full="Run full backup scan on all subdomains (default: False)"
453453
)
454454
async def backup_scan(self, interaction: discord.Interaction, domain: str,
455-
threads: int = 10, delay: int = 100, full: bool = False):
455+
threads: int = 100, delay: int = 100, full: bool = False):
456456
"""Discover backup files using Fuzzuli."""
457457
scan_id = f"backup_{int(time.time())}"
458458

@@ -592,10 +592,13 @@ async def scan_status(self, interaction: discord.Interaction):
592592
await interaction.response.send_message(embed=embed)
593593

594594
@app_commands.command(name="subdomains", description="Enumerate subdomains")
595-
@app_commands.describe(domain="The domain to enumerate")
596-
async def subdomains_cmd(self, interaction: discord.Interaction, domain: str):
595+
@app_commands.describe(
596+
domain="The domain to enumerate",
597+
threads="Number of threads for subfinder (default: 100)"
598+
)
599+
async def subdomains_cmd(self, interaction: discord.Interaction, domain: str, threads: int = 100):
597600
scan_id = f"subdomains_{int(time.time())}"
598-
command = [AUTOAR_SCRIPT_PATH, "subdomains", "get", "-d", domain]
601+
command = [AUTOAR_SCRIPT_PATH, "subdomains", "get", "-d", domain, "-t", str(threads)]
599602
active_scans[scan_id] = { 'type': 'subdomains', 'target': domain, 'status': 'running', 'start_time': datetime.now(), 'interaction': interaction }
600603
embed = self.create_scan_embed("Subdomains", domain, "running")
601604
await interaction.response.send_message(embed=embed)
@@ -612,20 +615,26 @@ async def cnames_cmd(self, interaction: discord.Interaction, domain: str):
612615
asyncio.create_task(self._run_scan_background(scan_id, command))
613616

614617
@app_commands.command(name="livehosts", description="Filter live hosts from subdomains")
615-
@app_commands.describe(domain="The domain")
616-
async def livehosts_cmd(self, interaction: discord.Interaction, domain: str):
618+
@app_commands.describe(
619+
domain="The domain",
620+
threads="Number of threads for httpx (default: 100)"
621+
)
622+
async def livehosts_cmd(self, interaction: discord.Interaction, domain: str, threads: int = 100):
617623
scan_id = f"live_{int(time.time())}"
618-
command = [AUTOAR_SCRIPT_PATH, "livehosts", "get", "-d", domain]
624+
command = [AUTOAR_SCRIPT_PATH, "livehosts", "get", "-d", domain, "-t", str(threads)]
619625
active_scans[scan_id] = { 'type': 'live', 'target': domain, 'status': 'running', 'start_time': datetime.now(), 'interaction': interaction }
620626
embed = self.create_scan_embed("Live Hosts", domain, "running")
621627
await interaction.response.send_message(embed=embed)
622628
asyncio.create_task(self._run_scan_background(scan_id, command))
623629

624630
@app_commands.command(name="urls", description="Collect URLs and JS URLs")
625-
@app_commands.describe(domain="The domain")
626-
async def urls_cmd(self, interaction: discord.Interaction, domain: str):
631+
@app_commands.describe(
632+
domain="The domain",
633+
threads="Number of threads for urlfinder and jsfinder (default: 100)"
634+
)
635+
async def urls_cmd(self, interaction: discord.Interaction, domain: str, threads: int = 100):
627636
scan_id = f"urls_{int(time.time())}"
628-
command = [AUTOAR_SCRIPT_PATH, "urls", "collect", "-d", domain]
637+
command = [AUTOAR_SCRIPT_PATH, "urls", "collect", "-d", domain, "-t", str(threads)]
629638
active_scans[scan_id] = { 'type': 'urls', 'target': domain, 'status': 'running', 'start_time': datetime.now(), 'interaction': interaction }
630639
embed = self.create_scan_embed("URLs", domain, "running")
631640
await interaction.response.send_message(embed=embed)
@@ -644,30 +653,39 @@ async def reflection_cmd(self, interaction: discord.Interaction, domain: str):
644653
asyncio.create_task(self._run_scan_background(scan_id, command))
645654

646655
@app_commands.command(name="nuclei", description="Run nuclei templates on live subdomains")
647-
@app_commands.describe(domain="The domain")
648-
async def nuclei_cmd(self, interaction: discord.Interaction, domain: str):
656+
@app_commands.describe(
657+
domain="The domain",
658+
threads="Number of threads for nuclei (default: 100)"
659+
)
660+
async def nuclei_cmd(self, interaction: discord.Interaction, domain: str, threads: int = 100):
649661
scan_id = f"nuclei_{int(time.time())}"
650-
command = [AUTOAR_SCRIPT_PATH, "nuclei", "run", "-d", domain]
662+
command = [AUTOAR_SCRIPT_PATH, "nuclei", "run", "-d", domain, "-t", str(threads)]
651663
active_scans[scan_id] = { 'type': 'nuclei', 'target': domain, 'status': 'running', 'start_time': datetime.now(), 'interaction': interaction }
652664
embed = self.create_scan_embed("Nuclei", domain, "running")
653665
await interaction.response.send_message(embed=embed)
654666
asyncio.create_task(self._run_scan_background(scan_id, command))
655667

656668
@app_commands.command(name="tech", description="Detect technologies on live hosts")
657-
@app_commands.describe(domain="The domain")
658-
async def tech_cmd(self, interaction: discord.Interaction, domain: str):
669+
@app_commands.describe(
670+
domain="The domain",
671+
threads="Number of threads for httpx (default: 100)"
672+
)
673+
async def tech_cmd(self, interaction: discord.Interaction, domain: str, threads: int = 100):
659674
scan_id = f"tech_{int(time.time())}"
660-
command = [AUTOAR_SCRIPT_PATH, "tech", "detect", "-d", domain]
675+
command = [AUTOAR_SCRIPT_PATH, "tech", "detect", "-d", domain, "-t", str(threads)]
661676
active_scans[scan_id] = { 'type': 'tech', 'target': domain, 'status': 'running', 'start_time': datetime.now(), 'interaction': interaction }
662677
embed = self.create_scan_embed("Tech Detect", domain, "running")
663678
await interaction.response.send_message(embed=embed)
664679
asyncio.create_task(self._run_scan_background(scan_id, command))
665680

666681
@app_commands.command(name="ports", description="Run port scan (naabu) on live hosts")
667-
@app_commands.describe(domain="The domain")
668-
async def ports_cmd(self, interaction: discord.Interaction, domain: str):
682+
@app_commands.describe(
683+
domain="The domain",
684+
threads="Number of threads for naabu (default: 100)"
685+
)
686+
async def ports_cmd(self, interaction: discord.Interaction, domain: str, threads: int = 100):
669687
scan_id = f"ports_{int(time.time())}"
670-
command = [AUTOAR_SCRIPT_PATH, "ports", "scan", "-d", domain]
688+
command = [AUTOAR_SCRIPT_PATH, "ports", "scan", "-d", domain, "-t", str(threads)]
671689
active_scans[scan_id] = { 'type': 'ports', 'target': domain, 'status': 'running', 'start_time': datetime.now(), 'interaction': interaction }
672690
embed = self.create_scan_embed("Ports", domain, "running")
673691
await interaction.response.send_message(embed=embed)
@@ -684,20 +702,26 @@ async def gf_cmd(self, interaction: discord.Interaction, domain: str):
684702
asyncio.create_task(self._run_scan_background(scan_id, command))
685703

686704
@app_commands.command(name="sqlmap", description="Run SQLMap on GF SQLi results")
687-
@app_commands.describe(domain="The domain")
688-
async def sqlmap_cmd(self, interaction: discord.Interaction, domain: str):
705+
@app_commands.describe(
706+
domain="The domain",
707+
threads="Number of threads for sqlmap (default: 100)"
708+
)
709+
async def sqlmap_cmd(self, interaction: discord.Interaction, domain: str, threads: int = 100):
689710
scan_id = f"sqlmap_{int(time.time())}"
690-
command = [AUTOAR_SCRIPT_PATH, "sqlmap", "run", "-d", domain]
711+
command = [AUTOAR_SCRIPT_PATH, "sqlmap", "run", "-d", domain, "-t", str(threads)]
691712
active_scans[scan_id] = { 'type': 'sqlmap', 'target': domain, 'status': 'running', 'start_time': datetime.now(), 'interaction': interaction }
692713
embed = self.create_scan_embed("SQLMap", domain, "running")
693714
await interaction.response.send_message(embed=embed)
694715
asyncio.create_task(self._run_scan_background(scan_id, command))
695716

696717
@app_commands.command(name="dalfox", description="Run Dalfox XSS scan")
697-
@app_commands.describe(domain="The domain")
698-
async def dalfox_cmd(self, interaction: discord.Interaction, domain: str):
718+
@app_commands.describe(
719+
domain="The domain",
720+
threads="Number of threads for dalfox (default: 100)"
721+
)
722+
async def dalfox_cmd(self, interaction: discord.Interaction, domain: str, threads: int = 100):
699723
scan_id = f"dalfox_{int(time.time())}"
700-
command = [AUTOAR_SCRIPT_PATH, "dalfox", "run", "-d", domain]
724+
command = [AUTOAR_SCRIPT_PATH, "dalfox", "run", "-d", domain, "-t", str(threads)]
701725
active_scans[scan_id] = { 'type': 'dalfox', 'target': domain, 'status': 'running', 'start_time': datetime.now(), 'interaction': interaction }
702726
embed = self.create_scan_embed("Dalfox", domain, "running")
703727
await interaction.response.send_message(embed=embed)

modules/backup_scan.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ usage() {
1616
echo " -d, --domain Target domain to scan"
1717
echo " -l, --live-hosts File containing list of live hosts"
1818
echo " -o, --output Output directory (default: results/<domain>/backup or results/backup)"
19-
echo " -t, --threads Number of threads/workers (default: 10)"
19+
echo " -t, --threads Number of threads/workers (default: 100)"
2020
echo " -d, --delay Delay between requests in ms (default: 100)"
2121
echo " --full Run full backup scan on all subdomains (collects subdomains first)"
2222
}
2323

2424
backup_scan() {
25-
local domain="" live_hosts_file="" output_dir="" threads="10" delay="100" full_mode=false
25+
local domain="" live_hosts_file="" output_dir="" threads="100" delay="100" full_mode=false
2626

2727
while [[ $# -gt 0 ]]; do
2828
case "$1" in

modules/dalfox.sh

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,17 @@ source "$ROOT_DIR/lib/logging.sh"
66
source "$ROOT_DIR/lib/utils.sh"
77
source "$ROOT_DIR/lib/discord.sh"
88

9-
usage() { echo "Usage: dalfox run -d <domain>"; }
9+
usage() {
10+
echo "Usage: dalfox run -d <domain> [-t <threads>]"
11+
echo " -d, --domain Target domain to scan"
12+
echo " -t, --threads Number of threads for dalfox (default: 100)"
13+
}
1014

1115
dalfox_run() {
12-
local domain=""; while [[ $# -gt 0 ]]; do
16+
local domain="" threads="100"; while [[ $# -gt 0 ]]; do
1317
case "$1" in
1418
-d|--domain) domain="$2"; shift 2;;
19+
-t|--threads) threads="$2"; shift 2;;
1520
*) usage; exit 1;;
1621
esac
1722
done
@@ -32,7 +37,8 @@ dalfox_run() {
3237
[[ -s "$in_file" ]] || { log_warn "No XSS candidate file at $in_file after GF scan"; exit 0; }
3338

3439
if command -v dalfox >/dev/null 2>&1; then
35-
dalfox file "$in_file" --no-spinner --only-poc r --ignore-return 302,404,403 --skip-bav -b "0x88.xss.cl" -w 50 -o "$out_file" 2>/dev/null || true
40+
log_info "Running dalfox with $threads threads"
41+
dalfox file "$in_file" --no-spinner --only-poc r --ignore-return 302,404,403 --skip-bav -b "0x88.xss.cl" -w "$threads" -o "$out_file" 2>/dev/null || true
3642
fi
3743
[[ -s "$out_file" ]] && discord_send_file "$out_file" "Dalfox results for $domain"
3844
}

modules/livehosts.sh

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,17 @@ source "$ROOT_DIR/lib/config.sh"
88
source "$ROOT_DIR/lib/discord.sh"
99
source "$ROOT_DIR/lib/db.sh"
1010

11-
usage() { echo "Usage: livehosts get -d <domain>"; }
11+
usage() {
12+
echo "Usage: livehosts get -d <domain> [-t <threads>]"
13+
echo " -d, --domain Target domain to scan"
14+
echo " -t, --threads Number of threads for httpx (default: 100)"
15+
}
1216

1317
livehosts_get() {
14-
local domain=""; while [[ $# -gt 0 ]]; do
18+
local domain="" threads="100"; while [[ $# -gt 0 ]]; do
1519
case "$1" in
1620
-d|--domain) domain="$2"; shift 2;;
21+
-t|--threads) threads="$2"; shift 2;;
1722
*) usage; exit 1;;
1823
esac
1924
done
@@ -26,9 +31,9 @@ livehosts_get() {
2631
# Ensure subdomains exist (from DB or enumeration)
2732
ensure_subdomains "$domain" "$subs_dir/all-subs.txt" || { log_warn "Failed to get subdomains for $domain"; exit 1; }
2833

29-
log_info "Filtering live hosts via httpx"
34+
log_info "Filtering live hosts via httpx with $threads threads"
3035
if command -v httpx >/dev/null 2>&1; then
31-
cat "$subs_dir/all-subs.txt" | httpx -silent -nc -o "$subs_dir/live-subs.txt" >/dev/null 2>&1 || true
36+
cat "$subs_dir/all-subs.txt" | httpx -silent -nc -threads "$threads" -o "$subs_dir/live-subs.txt" >/dev/null 2>&1 || true
3237
else
3338
: > "$subs_dir/live-subs.txt"
3439
fi

modules/nuclei.sh

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,17 @@ source "$ROOT_DIR/lib/utils.sh"
77
source "$ROOT_DIR/lib/config.sh"
88
source "$ROOT_DIR/lib/discord.sh"
99

10-
usage() { echo "Usage: nuclei run -d <domain>"; }
10+
usage() {
11+
echo "Usage: nuclei run -d <domain> [-t <threads>]"
12+
echo " -d, --domain Target domain to scan"
13+
echo " -t, --threads Number of threads for nuclei (default: 100)"
14+
}
1115

1216
nuclei_run() {
13-
local domain=""; while [[ $# -gt 0 ]]; do
17+
local domain="" threads="100"; while [[ $# -gt 0 ]]; do
1418
case "$1" in
1519
-d|--domain) domain="$2"; shift 2;;
20+
-t|--threads) threads="$2"; shift 2;;
1621
*) usage; exit 1;;
1722
esac
1823
done
@@ -29,8 +34,9 @@ nuclei_run() {
2934
ensure_live_hosts "$domain" "$subs_dir/live-subs.txt" || { log_warn "Failed to get live hosts for $domain"; exit 1; }
3035

3136
if command -v nuclei >/dev/null 2>&1; then
32-
[[ -s "$subs_dir/live-subs.txt" ]] && nuclei -l "$subs_dir/live-subs.txt" -t nuclei_templates/Others -o "$out1" >/dev/null 2>&1 || true
33-
[[ -s "$subs_dir/live-subs.txt" ]] && nuclei -l "$subs_dir/live-subs.txt" -t nuclei-templates/http -o "$out2" >/dev/null 2>&1 || true
37+
log_info "Running nuclei with $threads threads"
38+
[[ -s "$subs_dir/live-subs.txt" ]] && nuclei -l "$subs_dir/live-subs.txt" -t nuclei_templates/Others -c "$threads" -o "$out1" >/dev/null 2>&1 || true
39+
[[ -s "$subs_dir/live-subs.txt" ]] && nuclei -l "$subs_dir/live-subs.txt" -t nuclei-templates/http -c "$threads" -o "$out2" >/dev/null 2>&1 || true
3440
fi
3541

3642
[[ -s "$out1" ]] && discord_send_file "$out1" "Nuclei custom template results"

0 commit comments

Comments
 (0)